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 <pola...@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