Commit f2c1da78 by Joseph Myers Committed by Joseph Myers

re PR c/44322 (Bogus warning when assigning pointer-to-array with both "const" and "restrict")

	PR c/44322
	* c-typeck.c (build_unary_op): Merge qualifiers into pointer
	target type for ADDR_EXPR; require no changes to qualifiers except
	for function types.
	* c-tree.h (c_build_type_variant): Remove.

testsuite:
	* gcc.dg/c99-restrict-4.c: New test.

From-SVN: r160312
parent e68edbf6
2010-06-05 Joseph Myers <joseph@codesourcery.com>
PR c/44322
* c-typeck.c (build_unary_op): Merge qualifiers into pointer
target type for ADDR_EXPR; require no changes to qualifiers except
for function types.
* c-tree.h (c_build_type_variant): Remove.
2010-06-05 Segher Boessenkool <segher@kernel.crashing.org>
genautomata.c (get_excl_set): Do work per element, not per char.
......
......@@ -490,11 +490,6 @@ extern bool c_warn_unused_global_decl (const_tree);
extern void c_initialize_diagnostics (diagnostic_context *);
extern bool c_vla_unspec_p (tree x, tree fn);
#define c_build_type_variant(TYPE, CONST_P, VOLATILE_P) \
c_build_qualified_type ((TYPE), \
((CONST_P) ? TYPE_QUAL_CONST : 0) | \
((VOLATILE_P) ? TYPE_QUAL_VOLATILE : 0))
/* in c-typeck.c */
extern bool in_late_binary_op;
extern int in_alignof;
......
......@@ -3744,14 +3744,24 @@ build_unary_op (location_t location,
argtype = TREE_TYPE (arg);
/* If the lvalue is const or volatile, merge that into the type
to which the address will point. Note that you can't get a
restricted pointer by taking the address of something, so we
only have to deal with `const' and `volatile' here. */
to which the address will point. This should only be needed
for function types. */
if ((DECL_P (arg) || REFERENCE_CLASS_P (arg))
&& (TREE_READONLY (arg) || TREE_THIS_VOLATILE (arg)))
argtype = c_build_type_variant (argtype,
TREE_READONLY (arg),
TREE_THIS_VOLATILE (arg));
{
int orig_quals = TYPE_QUALS (strip_array_types (argtype));
int quals = orig_quals;
if (TREE_READONLY (arg))
quals |= TYPE_QUAL_CONST;
if (TREE_THIS_VOLATILE (arg))
quals |= TYPE_QUAL_VOLATILE;
gcc_assert (quals == orig_quals
|| TREE_CODE (argtype) == FUNCTION_TYPE);
argtype = c_build_qualified_type (argtype, quals);
}
if (!c_mark_addressable (arg))
return error_mark_node;
......
2010-06-05 Joseph Myers <joseph@codesourcery.com>
PR c/44322
* gcc.dg/c99-restrict-4.c: New test.
2010-06-04 Magnus Fromreide <magfr@lysator.liu.se>
* g++.dg/cpp0x/nullptr01.C: Test nullptr_t variable.
......
/* Qualifiers lost when taking the address of a const restrict object.
PR 44322. */
/* { dg-do compile } */
/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */
void * restrict const a[2];
void * restrict const (*p2)[2];
void foo(void) {
p2 = &a;
}
void * restrict volatile b[2];
void * restrict volatile (*q2)[2];
void bar(void) {
q2 = &b;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment