diff options
author | Marek Polacek <polacek@redhat.com> | 2014-05-09 08:24:37 +0000 |
---|---|---|
committer | Marek Polacek <mpolacek@gcc.gnu.org> | 2014-05-09 08:24:37 +0000 |
commit | 661a0813da5f8b3d3085ec3481e6928e6cadca03 (patch) | |
tree | 35edbf8e14134b0cba3c9df371c7f28c16b8e69b | |
parent | ee3958cfe190f6c0925deb9f3c573b87dc6c9ca4 (diff) | |
download | gcc-661a0813da5f8b3d3085ec3481e6928e6cadca03.zip gcc-661a0813da5f8b3d3085ec3481e6928e6cadca03.tar.gz gcc-661a0813da5f8b3d3085ec3481e6928e6cadca03.tar.bz2 |
re PR c/50459 (alignof doesn't work on plain old constant, works with expressions containing it)
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.
From-SVN: r210262
-rw-r--r-- | gcc/c-family/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/c-family/c-common.c | 22 | ||||
-rw-r--r-- | gcc/c/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/c/c-parser.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/attributes-1.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/attributes-2.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/pr50459.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/pr59280.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/nonnull-2.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr55570.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tm/wrap-2.c | 2 |
12 files changed, 74 insertions, 15 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index fc84f31..3a978fa 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,15 @@ +2014-05-09 Marek Polacek <polacek@redhat.com> + + PR c/50459 + * 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. + 2014-05-08 Marek Polacek <polacek@redhat.com> PR c/61053 diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index d7c85fc..a120b5c 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -7443,6 +7443,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))) { @@ -7564,7 +7566,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 @@ -8429,9 +8432,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 { @@ -8558,7 +8563,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)) @@ -8970,8 +8976,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 a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 1c8c435..4b73461 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,9 @@ +2014-05-09 Marek Polacek <polacek@redhat.com> + + PR c/50459 + * c-parser.c (c_parser_attributes): Parse the arguments as an + expression-list if the attribute takes identifier. + 2014-05-08 Marek Polacek <polacek@redhat.com> PR c/61053 diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index 6e8f33b..6e16d8b 100644 --- a/gcc/c/c-parser.c +++ b/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 a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 959763f..52639c0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,14 @@ +2014-05-09 Marek Polacek <polacek@redhat.com> + + PR c/50459 + * 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. + 2014-05-08 Jeff Law <law@redhat.com> PR tree-optimization/61009 diff --git a/gcc/testsuite/c-c++-common/attributes-1.c b/gcc/testsuite/c-c++-common/attributes-1.c index af4dd12..1657da1 100644 --- a/gcc/testsuite/c-c++-common/attributes-1.c +++ b/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 a/gcc/testsuite/c-c++-common/attributes-2.c b/gcc/testsuite/c-c++-common/attributes-2.c new file mode 100644 index 0000000..47b2c7b --- /dev/null +++ b/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 a/gcc/testsuite/c-c++-common/pr50459.c b/gcc/testsuite/c-c++-common/pr50459.c new file mode 100644 index 0000000..f837b63 --- /dev/null +++ b/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 a/gcc/testsuite/c-c++-common/pr59280.c b/gcc/testsuite/c-c++-common/pr59280.c index 779f0fb..581a1cf 100644 --- a/gcc/testsuite/c-c++-common/pr59280.c +++ b/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 a/gcc/testsuite/gcc.dg/nonnull-2.c b/gcc/testsuite/gcc.dg/nonnull-2.c index bd36d232..d570a46 100644 --- a/gcc/testsuite/gcc.dg/nonnull-2.c +++ b/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 a/gcc/testsuite/gcc.dg/pr55570.c b/gcc/testsuite/gcc.dg/pr55570.c index 903bb03..5f5555e 100644 --- a/gcc/testsuite/gcc.dg/pr55570.c +++ b/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 a/gcc/testsuite/gcc.dg/tm/wrap-2.c b/gcc/testsuite/gcc.dg/tm/wrap-2.c index 2948633..372d666 100644 --- a/gcc/testsuite/gcc.dg/tm/wrap-2.c +++ b/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" } */ |