/* note: that we use type_char_ptr here, which is already the
* automatic converted type. revert_automatic_type_conversion
* will construct the array type */
- cnst->base.type = type_char_ptr;
+ cnst->base.type = warning.write_strings ? type_const_char_ptr : type_char_ptr;
cnst->string.value = res;
return cnst;
}
default: {
expression_t *const cnst = allocate_expression_zero(EXPR_WIDE_STRING_LITERAL);
- cnst->base.type = type_wchar_t_ptr;
+ cnst->base.type = warning.write_strings ? type_const_wchar_t_ptr : type_wchar_t_ptr;
cnst->wide_string.value = wres;
return cnst;
}
points_to = skip_typeref(points_to);
if (is_type_incomplete(points_to) &&
- (! (c_mode & _GNUC)
- || !is_type_atomic(points_to, ATOMIC_TYPE_VOID))) {
+ !((c_mode & _GNUC)
+ && is_type_atomic(points_to, ATOMIC_TYPE_VOID))) {
errorf(source_position,
- "arithmetic with pointer to incomplete type '%T' not allowed",
- orig_pointer_type);
+ "arithmetic with pointer to incomplete type '%T' not allowed",
+ orig_pointer_type);
return false;
- } else if (is_type_function(points_to)) {
+ } else if (!(c_mode & _GNUC) && is_type_function(points_to)) {
errorf(source_position,
- "arithmetic with pointer to function type '%T' not allowed",
- orig_pointer_type);
+ "arithmetic with pointer to function type '%T' not allowed",
+ orig_pointer_type);
return false;
}
+ if (warning.pointer_arith) {
+ if (is_type_atomic(points_to, ATOMIC_TYPE_VOID)) {
+ warningf(source_position,
+ "pointer of type '%T' used in arithmetic",
+ orig_pointer_type);
+ } else if (is_type_function(points_to)) {
+ warningf(source_position,
+ "pointer to a function '%T' used in arithmetic",
+ orig_pointer_type);
+ }
+ }
return true;
}
type_ptrdiff_t_ptr = make_pointer_type(type_ptrdiff_t, TYPE_QUALIFIER_NONE);
type_ssize_t_ptr = make_pointer_type(type_ssize_t, TYPE_QUALIFIER_NONE);
type_wchar_t_ptr = make_pointer_type(type_wchar_t, TYPE_QUALIFIER_NONE);
+
+ /* const version of wchar_t */
+ type_const_wchar_t = allocate_type_zero(TYPE_TYPEDEF, &builtin_source_position);
+ type_const_wchar_t->typedeft.declaration = type_wchar_t->typedeft.declaration;
+ type_const_wchar_t->base.modifiers |= TYPE_QUALIFIER_CONST;
+
+ type_const_wchar_t_ptr = make_pointer_type(type_const_wchar_t, TYPE_QUALIFIER_NONE);
}
/**