Patchwork [C] Make attributes accept enum values (PR c/50459)

login
register
mail settings
Submitter Marek Polacek
Date May 2, 2014, 9:28 a.m.
Message ID <20140502092853.GJ11802@redhat.com>
Download mbox | patch
Permalink /patch/344908/
State New
Headers show

Comments

Marek Polacek - May 2, 2014, 9:28 a.m.
On Thu, May 01, 2014 at 11:20:25PM +0000, Joseph S. Myers wrote:
> On Wed, 23 Apr 2014, Marek Polacek wrote:
> 
> > diff --git gcc/testsuite/c-c++-common/attributes-1.c gcc/testsuite/c-c++-common/attributes-1.c
> > index af4dd12..8458e47 100644
> > --- gcc/testsuite/c-c++-common/attributes-1.c
> > +++ gcc/testsuite/c-c++-common/attributes-1.c
> > @@ -9,7 +9,7 @@ typedef char vec __attribute__((vector_size(bar))); /* { dg-warning "ignored" }
> >  void f1(char*) __attribute__((nonnull(bar))); /* { dg-error "invalid operand" } */
> >  void f2(char*) __attribute__((nonnull(1,bar))); /* { dg-error "invalid operand" } */
> >  
> > -void g() __attribute__((aligned(bar))); /* { dg-error "invalid value|not an integer" } */
> > +void g() __attribute__((aligned(bar)));
> 
> I don't think it's appropriate to remove any test assertion that this 
> invalid code gets diagnosed.
> 
> If the only diagnostic is now one swallowed by the dg-prune-output in this 
> test, either that dg-prune-output needs to be removed (and corresponding 
> more detailed error expectations added), or a separate test needs adding 
> for this erroneous use of this attribute (that separate test not using 
> dg-prune-output).

Yeah, that was a weird thing to do.  I yanked that particular test to
a new testcase.  Otherwise no changes.

Tested again x86_64-linux, ok now?

2014-05-02  Marek Polacek  <polacek@redhat.com>

	PR c/50459
c-family/
	* c-common.c (check_user_alignment): Return -1 if alignment is error
	node.
	(handle_aligned_attribute): Don't call default_conversion on
	FUNCTION_DECLs.
	(handle_vector_size_attribute): Likewise.
	(handle_tm_wrap_attribute): Handle case when wrap_decl is error node.
	(handle_sentinel_attribute): Call default_conversion and allow even
	integral types as an argument.
c/
	* c-parser.c (c_parser_attributes): Parse the arguments as an
	expression-list if the attribute takes identifier.
testsuite/
	* c-c++-common/attributes-1.c: Move test line to a new test.
	* c-c++-common/attributes-2.c: New test.
	* c-c++-common/pr50459.c: New test.
	* c-c++-common/pr59280.c: Add "undeclared" to dg-error.
	* gcc.dg/nonnull-2.c: Likewise.
	* gcc.dg/pr55570.c: Modify dg-error.
	* gcc.dg/tm/wrap-2.c: Likewise.


	Marek
Marek Polacek - May 8, 2014, 6:36 p.m.
Ping.

On Fri, May 02, 2014 at 11:28:54AM +0200, Marek Polacek wrote:
> On Thu, May 01, 2014 at 11:20:25PM +0000, Joseph S. Myers wrote:
> > On Wed, 23 Apr 2014, Marek Polacek wrote:
> > 
> > > diff --git gcc/testsuite/c-c++-common/attributes-1.c gcc/testsuite/c-c++-common/attributes-1.c
> > > index af4dd12..8458e47 100644
> > > --- gcc/testsuite/c-c++-common/attributes-1.c
> > > +++ gcc/testsuite/c-c++-common/attributes-1.c
> > > @@ -9,7 +9,7 @@ typedef char vec __attribute__((vector_size(bar))); /* { dg-warning "ignored" }
> > >  void f1(char*) __attribute__((nonnull(bar))); /* { dg-error "invalid operand" } */
> > >  void f2(char*) __attribute__((nonnull(1,bar))); /* { dg-error "invalid operand" } */
> > >  
> > > -void g() __attribute__((aligned(bar))); /* { dg-error "invalid value|not an integer" } */
> > > +void g() __attribute__((aligned(bar)));
> > 
> > I don't think it's appropriate to remove any test assertion that this 
> > invalid code gets diagnosed.
> > 
> > If the only diagnostic is now one swallowed by the dg-prune-output in this 
> > test, either that dg-prune-output needs to be removed (and corresponding 
> > more detailed error expectations added), or a separate test needs adding 
> > for this erroneous use of this attribute (that separate test not using 
> > dg-prune-output).
> 
> Yeah, that was a weird thing to do.  I yanked that particular test to
> a new testcase.  Otherwise no changes.
> 
> Tested again x86_64-linux, ok now?
> 
> 2014-05-02  Marek Polacek  <polacek@redhat.com>
> 
> 	PR c/50459
> c-family/
> 	* c-common.c (check_user_alignment): Return -1 if alignment is error
> 	node.
> 	(handle_aligned_attribute): Don't call default_conversion on
> 	FUNCTION_DECLs.
> 	(handle_vector_size_attribute): Likewise.
> 	(handle_tm_wrap_attribute): Handle case when wrap_decl is error node.
> 	(handle_sentinel_attribute): Call default_conversion and allow even
> 	integral types as an argument.
> c/
> 	* c-parser.c (c_parser_attributes): Parse the arguments as an
> 	expression-list if the attribute takes identifier.
> testsuite/
> 	* c-c++-common/attributes-1.c: Move test line to a new test.
> 	* c-c++-common/attributes-2.c: New test.
> 	* c-c++-common/pr50459.c: New test.
> 	* c-c++-common/pr59280.c: Add "undeclared" to dg-error.
> 	* gcc.dg/nonnull-2.c: Likewise.
> 	* gcc.dg/pr55570.c: Modify dg-error.
> 	* gcc.dg/tm/wrap-2.c: Likewise.
> 
> diff --git gcc/c-family/c-common.c gcc/c-family/c-common.c
> index 0ad955d..3ebd960 100644
> --- gcc/c-family/c-common.c
> +++ gcc/c-family/c-common.c
> @@ -7438,6 +7438,8 @@ check_user_alignment (const_tree align, bool allow_zero)
>  {
>    int i;
>  
> +  if (error_operand_p (align))
> +    return -1;
>    if (TREE_CODE (align) != INTEGER_CST
>        || !INTEGRAL_TYPE_P (TREE_TYPE (align)))
>      {
> @@ -7559,7 +7561,8 @@ handle_aligned_attribute (tree *node, tree ARG_UNUSED (name), tree args,
>    if (args)
>      {
>        align_expr = TREE_VALUE (args);
> -      if (align_expr && TREE_CODE (align_expr) != IDENTIFIER_NODE)
> +      if (align_expr && TREE_CODE (align_expr) != IDENTIFIER_NODE
> +	  && TREE_CODE (align_expr) != FUNCTION_DECL)
>  	align_expr = default_conversion (align_expr);
>      }
>    else
> @@ -8424,9 +8427,11 @@ handle_tm_wrap_attribute (tree *node, tree name, tree args,
>    else
>      {
>        tree wrap_decl = TREE_VALUE (args);
> -      if (TREE_CODE (wrap_decl) != IDENTIFIER_NODE
> -	  && TREE_CODE (wrap_decl) != VAR_DECL
> -	  && TREE_CODE (wrap_decl) != FUNCTION_DECL)
> +      if (error_operand_p (wrap_decl))
> +        ;
> +      else if (TREE_CODE (wrap_decl) != IDENTIFIER_NODE
> +	       && TREE_CODE (wrap_decl) != VAR_DECL
> +	       && TREE_CODE (wrap_decl) != FUNCTION_DECL)
>  	error ("%qE argument not an identifier", name);
>        else
>  	{
> @@ -8553,7 +8558,8 @@ handle_vector_size_attribute (tree *node, tree name, tree args,
>    *no_add_attrs = true;
>  
>    size = TREE_VALUE (args);
> -  if (size && TREE_CODE (size) != IDENTIFIER_NODE)
> +  if (size && TREE_CODE (size) != IDENTIFIER_NODE
> +      && TREE_CODE (size) != FUNCTION_DECL)
>      size = default_conversion (size);
>  
>    if (!tree_fits_uhwi_p (size))
> @@ -8964,8 +8970,12 @@ handle_sentinel_attribute (tree *node, tree name, tree args,
>    if (args)
>      {
>        tree position = TREE_VALUE (args);
> +      if (position && TREE_CODE (position) != IDENTIFIER_NODE
> +	  && TREE_CODE (position) != FUNCTION_DECL)
> +	position = default_conversion (position);
>  
> -      if (TREE_CODE (position) != INTEGER_CST)
> +      if (TREE_CODE (position) != INTEGER_CST
> +          || !INTEGRAL_TYPE_P (TREE_TYPE (position)))
>  	{
>  	  warning (OPT_Wattributes,
>  		   "requested position is not an integer constant");
> diff --git gcc/c/c-parser.c gcc/c/c-parser.c
> index 7947355..48f8d2f 100644
> --- gcc/c/c-parser.c
> +++ gcc/c/c-parser.c
> @@ -3955,11 +3955,16 @@ c_parser_attributes (c_parser *parser)
>  	     In objective-c the identifier may be a classname.  */
>  	  if (c_parser_next_token_is (parser, CPP_NAME)
>  	      && (c_parser_peek_token (parser)->id_kind == C_ID_ID
> -		  || (c_dialect_objc () 
> -		      && c_parser_peek_token (parser)->id_kind == C_ID_CLASSNAME))
> +		  || (c_dialect_objc ()
> +		      && c_parser_peek_token (parser)->id_kind
> +			 == C_ID_CLASSNAME))
>  	      && ((c_parser_peek_2nd_token (parser)->type == CPP_COMMA)
>  		  || (c_parser_peek_2nd_token (parser)->type
> -		      == CPP_CLOSE_PAREN)))
> +		      == CPP_CLOSE_PAREN))
> +	      && (attribute_takes_identifier_p (attr_name)
> +		  || (c_dialect_objc ()
> +		      && c_parser_peek_token (parser)->id_kind
> +			 == C_ID_CLASSNAME)))
>  	    {
>  	      tree arg1 = c_parser_peek_token (parser)->value;
>  	      c_parser_consume_token (parser);
> diff --git gcc/testsuite/c-c++-common/attributes-1.c gcc/testsuite/c-c++-common/attributes-1.c
> index af4dd12..1657da1 100644
> --- gcc/testsuite/c-c++-common/attributes-1.c
> +++ gcc/testsuite/c-c++-common/attributes-1.c
> @@ -9,8 +9,6 @@ typedef char vec __attribute__((vector_size(bar))); /* { dg-warning "ignored" }
>  void f1(char*) __attribute__((nonnull(bar))); /* { dg-error "invalid operand" } */
>  void f2(char*) __attribute__((nonnull(1,bar))); /* { dg-error "invalid operand" } */
>  
> -void g() __attribute__((aligned(bar))); /* { dg-error "invalid value|not an integer" } */
> -
>  void foo(void);
>  void* my_calloc(unsigned, unsigned) __attribute__((alloc_size(1,foo))); /* { dg-warning "outside range" } */
>  void* my_realloc(void*, unsigned) __attribute__((alloc_size(foo))); /* { dg-warning "outside range" } */
> diff --git gcc/testsuite/c-c++-common/attributes-2.c gcc/testsuite/c-c++-common/attributes-2.c
> index e69de29..47b2c7b 100644
> --- gcc/testsuite/c-c++-common/attributes-2.c
> +++ gcc/testsuite/c-c++-common/attributes-2.c
> @@ -0,0 +1,3 @@
> +/* { dg-do compile } */
> +
> +void g() __attribute__((aligned(bar))); /* { dg-error "undeclared here|not declared" } */
> diff --git gcc/testsuite/c-c++-common/pr50459.c gcc/testsuite/c-c++-common/pr50459.c
> index e69de29..f837b63 100644
> --- gcc/testsuite/c-c++-common/pr50459.c
> +++ gcc/testsuite/c-c++-common/pr50459.c
> @@ -0,0 +1,14 @@
> +/* PR c/50459 */
> +/* { dg-do compile } */
> +/* { dg-options "-Wall -Wextra" } */
> +
> +enum { A = 128, B = 1 };
> +void *fn1 (void) __attribute__((assume_aligned (A)));
> +void *fn2 (void) __attribute__((assume_aligned (A, 4)));
> +void fn3 (void) __attribute__((constructor (A)));
> +void fn4 (void) __attribute__((destructor (A)));
> +void *fn5 (int) __attribute__((alloc_size (B)));
> +void *fn6 (int) __attribute__((alloc_align (B)));
> +void fn7 (const char *, ...) __attribute__ ((sentinel (B)));
> +int __attribute__((vector_size (A))) a;
> +int __attribute__((aligned (A))) foo;
> diff --git gcc/testsuite/c-c++-common/pr59280.c gcc/testsuite/c-c++-common/pr59280.c
> index 779f0fb..581a1cf 100644
> --- gcc/testsuite/c-c++-common/pr59280.c
> +++ gcc/testsuite/c-c++-common/pr59280.c
> @@ -1,4 +1,4 @@
>  /* PR c/59280 */
>  /* { dg-do compile } */
>  
> -void bar (char *) __attribute__((constructor(foo))); /* { dg-error "constructor priorities must be integers|was not declared|constructor priorities are not supported" } */
> +void bar (char *) __attribute__((constructor(foo))); /* { dg-error "constructor priorities must be integers|was not declared|undeclared|constructor priorities are not supported" } */
> diff --git gcc/testsuite/gcc.dg/nonnull-2.c gcc/testsuite/gcc.dg/nonnull-2.c
> index bd36d232..d570a46 100644
> --- gcc/testsuite/gcc.dg/nonnull-2.c
> +++ gcc/testsuite/gcc.dg/nonnull-2.c
> @@ -6,7 +6,7 @@ extern void func1 () __attribute__((nonnull)); /* { dg-error "without arguments"
>  
>  extern void func2 (char *) __attribute__((nonnull(2))); /* { dg-error "out-of-range operand" } */
>  
> -extern void func3 (char *) __attribute__((nonnull(foo))); /* { dg-error "invalid operand number" } */
> +extern void func3 (char *) __attribute__((nonnull(foo))); /* { dg-error "invalid operand number|undeclared" } */
>  
>  extern void func4 (int) __attribute__((nonnull(1))); /* { dg-error "references non-pointer" } */
>  
> diff --git gcc/testsuite/gcc.dg/pr55570.c gcc/testsuite/gcc.dg/pr55570.c
> index 903bb03..5f5555e 100644
> --- gcc/testsuite/gcc.dg/pr55570.c
> +++ gcc/testsuite/gcc.dg/pr55570.c
> @@ -1,4 +1,4 @@
>  /* PR c/55570 */
>  /* { dg-do compile } */
>  
> -char array[16] __attribute__((aligned (SOME_NOT_DEFINED_MACRO))); /* { dg-error "requested alignment is not an integer constant" } */
> +char array[16] __attribute__((aligned (SOME_NOT_DEFINED_MACRO))); /* { dg-error "undeclared here" } */
> diff --git gcc/testsuite/gcc.dg/tm/wrap-2.c gcc/testsuite/gcc.dg/tm/wrap-2.c
> index 2948633..372d666 100644
> --- gcc/testsuite/gcc.dg/tm/wrap-2.c
> +++ gcc/testsuite/gcc.dg/tm/wrap-2.c
> @@ -10,7 +10,7 @@ int f7(void);
>  void g1(void) W(f1);
>  void g2(void) W(f2);	/* { dg-error "is not compatible" } */
>  void g3(void) W(i3);	/* { dg-error "is not a function" } */
> -void g4(void) W(f4);	/* { dg-error "is not a function" } */
> +void g4(void) W(f4);	/* { dg-error "undeclared" } */
>  void g5(void) W(1);	/* { dg-error "not an identifier" } */
>  void g6(void) W("f1");	/* { dg-error "not an identifier" } */
>  void g7(void) W(f7);	/* { dg-error "is not compatible" } */
> 
> 	Marek

	Marek
Joseph S. Myers - May 8, 2014, 9:07 p.m.
On Fri, 2 May 2014, Marek Polacek wrote:

> Yeah, that was a weird thing to do.  I yanked that particular test to
> a new testcase.  Otherwise no changes.
> 
> Tested again x86_64-linux, ok now?
> 
> 2014-05-02  Marek Polacek  <polacek@redhat.com>
> 
> 	PR c/50459
> c-family/
> 	* c-common.c (check_user_alignment): Return -1 if alignment is error
> 	node.
> 	(handle_aligned_attribute): Don't call default_conversion on
> 	FUNCTION_DECLs.
> 	(handle_vector_size_attribute): Likewise.
> 	(handle_tm_wrap_attribute): Handle case when wrap_decl is error node.
> 	(handle_sentinel_attribute): Call default_conversion and allow even
> 	integral types as an argument.
> c/
> 	* c-parser.c (c_parser_attributes): Parse the arguments as an
> 	expression-list if the attribute takes identifier.
> testsuite/
> 	* c-c++-common/attributes-1.c: Move test line to a new test.
> 	* c-c++-common/attributes-2.c: New test.
> 	* c-c++-common/pr50459.c: New test.
> 	* c-c++-common/pr59280.c: Add "undeclared" to dg-error.
> 	* gcc.dg/nonnull-2.c: Likewise.
> 	* gcc.dg/pr55570.c: Modify dg-error.
> 	* gcc.dg/tm/wrap-2.c: Likewise.

OK.

Patch

diff --git gcc/c-family/c-common.c gcc/c-family/c-common.c
index 0ad955d..3ebd960 100644
--- gcc/c-family/c-common.c
+++ gcc/c-family/c-common.c
@@ -7438,6 +7438,8 @@  check_user_alignment (const_tree align, bool allow_zero)
 {
   int i;
 
+  if (error_operand_p (align))
+    return -1;
   if (TREE_CODE (align) != INTEGER_CST
       || !INTEGRAL_TYPE_P (TREE_TYPE (align)))
     {
@@ -7559,7 +7561,8 @@  handle_aligned_attribute (tree *node, tree ARG_UNUSED (name), tree args,
   if (args)
     {
       align_expr = TREE_VALUE (args);
-      if (align_expr && TREE_CODE (align_expr) != IDENTIFIER_NODE)
+      if (align_expr && TREE_CODE (align_expr) != IDENTIFIER_NODE
+	  && TREE_CODE (align_expr) != FUNCTION_DECL)
 	align_expr = default_conversion (align_expr);
     }
   else
@@ -8424,9 +8427,11 @@  handle_tm_wrap_attribute (tree *node, tree name, tree args,
   else
     {
       tree wrap_decl = TREE_VALUE (args);
-      if (TREE_CODE (wrap_decl) != IDENTIFIER_NODE
-	  && TREE_CODE (wrap_decl) != VAR_DECL
-	  && TREE_CODE (wrap_decl) != FUNCTION_DECL)
+      if (error_operand_p (wrap_decl))
+        ;
+      else if (TREE_CODE (wrap_decl) != IDENTIFIER_NODE
+	       && TREE_CODE (wrap_decl) != VAR_DECL
+	       && TREE_CODE (wrap_decl) != FUNCTION_DECL)
 	error ("%qE argument not an identifier", name);
       else
 	{
@@ -8553,7 +8558,8 @@  handle_vector_size_attribute (tree *node, tree name, tree args,
   *no_add_attrs = true;
 
   size = TREE_VALUE (args);
-  if (size && TREE_CODE (size) != IDENTIFIER_NODE)
+  if (size && TREE_CODE (size) != IDENTIFIER_NODE
+      && TREE_CODE (size) != FUNCTION_DECL)
     size = default_conversion (size);
 
   if (!tree_fits_uhwi_p (size))
@@ -8964,8 +8970,12 @@  handle_sentinel_attribute (tree *node, tree name, tree args,
   if (args)
     {
       tree position = TREE_VALUE (args);
+      if (position && TREE_CODE (position) != IDENTIFIER_NODE
+	  && TREE_CODE (position) != FUNCTION_DECL)
+	position = default_conversion (position);
 
-      if (TREE_CODE (position) != INTEGER_CST)
+      if (TREE_CODE (position) != INTEGER_CST
+          || !INTEGRAL_TYPE_P (TREE_TYPE (position)))
 	{
 	  warning (OPT_Wattributes,
 		   "requested position is not an integer constant");
diff --git gcc/c/c-parser.c gcc/c/c-parser.c
index 7947355..48f8d2f 100644
--- gcc/c/c-parser.c
+++ gcc/c/c-parser.c
@@ -3955,11 +3955,16 @@  c_parser_attributes (c_parser *parser)
 	     In objective-c the identifier may be a classname.  */
 	  if (c_parser_next_token_is (parser, CPP_NAME)
 	      && (c_parser_peek_token (parser)->id_kind == C_ID_ID
-		  || (c_dialect_objc () 
-		      && c_parser_peek_token (parser)->id_kind == C_ID_CLASSNAME))
+		  || (c_dialect_objc ()
+		      && c_parser_peek_token (parser)->id_kind
+			 == C_ID_CLASSNAME))
 	      && ((c_parser_peek_2nd_token (parser)->type == CPP_COMMA)
 		  || (c_parser_peek_2nd_token (parser)->type
-		      == CPP_CLOSE_PAREN)))
+		      == CPP_CLOSE_PAREN))
+	      && (attribute_takes_identifier_p (attr_name)
+		  || (c_dialect_objc ()
+		      && c_parser_peek_token (parser)->id_kind
+			 == C_ID_CLASSNAME)))
 	    {
 	      tree arg1 = c_parser_peek_token (parser)->value;
 	      c_parser_consume_token (parser);
diff --git gcc/testsuite/c-c++-common/attributes-1.c gcc/testsuite/c-c++-common/attributes-1.c
index af4dd12..1657da1 100644
--- gcc/testsuite/c-c++-common/attributes-1.c
+++ gcc/testsuite/c-c++-common/attributes-1.c
@@ -9,8 +9,6 @@  typedef char vec __attribute__((vector_size(bar))); /* { dg-warning "ignored" }
 void f1(char*) __attribute__((nonnull(bar))); /* { dg-error "invalid operand" } */
 void f2(char*) __attribute__((nonnull(1,bar))); /* { dg-error "invalid operand" } */
 
-void g() __attribute__((aligned(bar))); /* { dg-error "invalid value|not an integer" } */
-
 void foo(void);
 void* my_calloc(unsigned, unsigned) __attribute__((alloc_size(1,foo))); /* { dg-warning "outside range" } */
 void* my_realloc(void*, unsigned) __attribute__((alloc_size(foo))); /* { dg-warning "outside range" } */
diff --git gcc/testsuite/c-c++-common/attributes-2.c gcc/testsuite/c-c++-common/attributes-2.c
index e69de29..47b2c7b 100644
--- gcc/testsuite/c-c++-common/attributes-2.c
+++ gcc/testsuite/c-c++-common/attributes-2.c
@@ -0,0 +1,3 @@ 
+/* { dg-do compile } */
+
+void g() __attribute__((aligned(bar))); /* { dg-error "undeclared here|not declared" } */
diff --git gcc/testsuite/c-c++-common/pr50459.c gcc/testsuite/c-c++-common/pr50459.c
index e69de29..f837b63 100644
--- gcc/testsuite/c-c++-common/pr50459.c
+++ gcc/testsuite/c-c++-common/pr50459.c
@@ -0,0 +1,14 @@ 
+/* PR c/50459 */
+/* { dg-do compile } */
+/* { dg-options "-Wall -Wextra" } */
+
+enum { A = 128, B = 1 };
+void *fn1 (void) __attribute__((assume_aligned (A)));
+void *fn2 (void) __attribute__((assume_aligned (A, 4)));
+void fn3 (void) __attribute__((constructor (A)));
+void fn4 (void) __attribute__((destructor (A)));
+void *fn5 (int) __attribute__((alloc_size (B)));
+void *fn6 (int) __attribute__((alloc_align (B)));
+void fn7 (const char *, ...) __attribute__ ((sentinel (B)));
+int __attribute__((vector_size (A))) a;
+int __attribute__((aligned (A))) foo;
diff --git gcc/testsuite/c-c++-common/pr59280.c gcc/testsuite/c-c++-common/pr59280.c
index 779f0fb..581a1cf 100644
--- gcc/testsuite/c-c++-common/pr59280.c
+++ gcc/testsuite/c-c++-common/pr59280.c
@@ -1,4 +1,4 @@ 
 /* PR c/59280 */
 /* { dg-do compile } */
 
-void bar (char *) __attribute__((constructor(foo))); /* { dg-error "constructor priorities must be integers|was not declared|constructor priorities are not supported" } */
+void bar (char *) __attribute__((constructor(foo))); /* { dg-error "constructor priorities must be integers|was not declared|undeclared|constructor priorities are not supported" } */
diff --git gcc/testsuite/gcc.dg/nonnull-2.c gcc/testsuite/gcc.dg/nonnull-2.c
index bd36d232..d570a46 100644
--- gcc/testsuite/gcc.dg/nonnull-2.c
+++ gcc/testsuite/gcc.dg/nonnull-2.c
@@ -6,7 +6,7 @@  extern void func1 () __attribute__((nonnull)); /* { dg-error "without arguments"
 
 extern void func2 (char *) __attribute__((nonnull(2))); /* { dg-error "out-of-range operand" } */
 
-extern void func3 (char *) __attribute__((nonnull(foo))); /* { dg-error "invalid operand number" } */
+extern void func3 (char *) __attribute__((nonnull(foo))); /* { dg-error "invalid operand number|undeclared" } */
 
 extern void func4 (int) __attribute__((nonnull(1))); /* { dg-error "references non-pointer" } */
 
diff --git gcc/testsuite/gcc.dg/pr55570.c gcc/testsuite/gcc.dg/pr55570.c
index 903bb03..5f5555e 100644
--- gcc/testsuite/gcc.dg/pr55570.c
+++ gcc/testsuite/gcc.dg/pr55570.c
@@ -1,4 +1,4 @@ 
 /* PR c/55570 */
 /* { dg-do compile } */
 
-char array[16] __attribute__((aligned (SOME_NOT_DEFINED_MACRO))); /* { dg-error "requested alignment is not an integer constant" } */
+char array[16] __attribute__((aligned (SOME_NOT_DEFINED_MACRO))); /* { dg-error "undeclared here" } */
diff --git gcc/testsuite/gcc.dg/tm/wrap-2.c gcc/testsuite/gcc.dg/tm/wrap-2.c
index 2948633..372d666 100644
--- gcc/testsuite/gcc.dg/tm/wrap-2.c
+++ gcc/testsuite/gcc.dg/tm/wrap-2.c
@@ -10,7 +10,7 @@  int f7(void);
 void g1(void) W(f1);
 void g2(void) W(f2);	/* { dg-error "is not compatible" } */
 void g3(void) W(i3);	/* { dg-error "is not a function" } */
-void g4(void) W(f4);	/* { dg-error "is not a function" } */
+void g4(void) W(f4);	/* { dg-error "undeclared" } */
 void g5(void) W(1);	/* { dg-error "not an identifier" } */
 void g6(void) W("f1");	/* { dg-error "not an identifier" } */
 void g7(void) W(f7);	/* { dg-error "is not compatible" } */