re PR c/71574 (ICE on code with alloc_align attribute on x86_64-linux-gnu: in default...
authorMarek Polacek <polacek@redhat.com>
Fri, 29 Jul 2016 11:28:57 +0000 (11:28 +0000)
committerMarek Polacek <mpolacek@gcc.gnu.org>
Fri, 29 Jul 2016 11:28:57 +0000 (11:28 +0000)
PR c/71574
* c-common.c (handle_alloc_align_attribute): Also check FUNCTION_DECL.

* c-c++-common/pr71574.c: New test.

From-SVN: r238859

gcc/c-family/ChangeLog
gcc/c-family/c-common.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/pr71574.c [new file with mode: 0644]

index 10073406963852313bf71a8eb3f8c88405992873..705d00cee0e29441bb2357cee0624b961d3ae8a7 100644 (file)
@@ -1,3 +1,8 @@
+2016-07-29  Marek Polacek  <polacek@redhat.com>
+
+       PR c/71574
+       * c-common.c (handle_alloc_align_attribute): Also check FUNCTION_DECL.
+
 2016-07-28  Martin Liska  <mliska@suse.cz>
 
        PR gcov-profile/68025
index 16e3965cbd00c4d50d472b17d16d6f16eb0d0ccb..efd98157a629e45c72258a626451a324e9a78c0e 100644 (file)
@@ -8370,7 +8370,8 @@ handle_alloc_align_attribute (tree *node, tree, tree args, int,
 {
   unsigned arg_count = type_num_arguments (*node);
   tree position = TREE_VALUE (args);
-  if (position && TREE_CODE (position) != IDENTIFIER_NODE)
+  if (position && TREE_CODE (position) != IDENTIFIER_NODE
+      && TREE_CODE (position) != FUNCTION_DECL)
     position = default_conversion (position);
 
   if (!tree_fits_uhwi_p (position)
index ebb2c2fb7bdfd9cad473f2002316f6b64a2e3945..9960fb0c4ac7971a988729c04e9162c0169bf350 100644 (file)
@@ -1,3 +1,8 @@
+2016-07-29  Marek Polacek  <polacek@redhat.com>
+
+       PR c/71574
+       * c-c++-common/pr71574.c: New test.
+
 2016-07-29  Kugan Vivekanandarajah  <kuganv@linaro.org>
 
        PR middle-end/68217
diff --git a/gcc/testsuite/c-c++-common/pr71574.c b/gcc/testsuite/c-c++-common/pr71574.c
new file mode 100644 (file)
index 0000000..320ae38
--- /dev/null
@@ -0,0 +1,12 @@
+/* PR c/71574 */
+/* { dg-do compile } */
+
+int fn1 (void);
+int fn2 (void) __attribute__ ((alloc_align (fn1))); /* { dg-warning "parameter outside range" } */
+int fn3 (void) __attribute__ ((alloc_size (fn1))); /* { dg-warning "parameter outside range" } */
+int fn4 (void) __attribute__ ((assume_aligned (fn1))); /* { dg-warning "not integer constant" } */
+int fn5 (char *, char *) __attribute__((nonnull (fn1))); /* { dg-error "nonnull argument has invalid operand" } */
+int fn6 (const char *, ...) __attribute__ ((sentinel (fn1))); /* { dg-warning "not an integer constant" } */
+
+typedef int __attribute__((vector_size (fn1))) v4si; /* { dg-warning "attribute ignored" } */
+typedef int T __attribute__((aligned (fn1))); /* { dg-error "requested alignment is not" } */