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
This commit is contained in:
parent
ee3958cfe1
commit
661a0813da
@ -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
|
||||
|
@ -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");
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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" } */
|
||||
|
3
gcc/testsuite/c-c++-common/attributes-2.c
Normal file
3
gcc/testsuite/c-c++-common/attributes-2.c
Normal file
@ -0,0 +1,3 @@
|
||||
/* { dg-do compile } */
|
||||
|
||||
void g() __attribute__((aligned(bar))); /* { dg-error "undeclared here|not declared" } */
|
14
gcc/testsuite/c-c++-common/pr50459.c
Normal file
14
gcc/testsuite/c-c++-common/pr50459.c
Normal file
@ -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;
|
@ -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" } */
|
||||
|
@ -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" } */
|
||||
|
||||
|
@ -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" } */
|
||||
|
@ -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" } */
|
||||
|
Loading…
Reference in New Issue
Block a user