Hi!

cplus_decl_attributes assumes that if attributes is NULL, there is nothing
to do in decl_attributes, unfortunately that call can add implicit
attributes based on currently active pragmas, at least for FUNCTION_DECLs.

Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
trunk?

2012-10-22  Jakub Jelinek  <ja...@redhat.com>

        PR c++/54988
        * decl2.c (cplus_decl_attributes): Don't return early
        if attributes is NULL.

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

--- gcc/cp/decl2.c.jj   2012-10-08 21:37:27.000000000 +0200
+++ gcc/cp/decl2.c      2012-10-22 12:43:04.994700609 +0200
@@ -1309,8 +1309,7 @@ void
 cplus_decl_attributes (tree *decl, tree attributes, int flags)
 {
   if (*decl == NULL_TREE || *decl == void_type_node
-      || *decl == error_mark_node
-      || attributes == NULL_TREE)
+      || *decl == error_mark_node)
     return;
 
   if (processing_template_decl)
@@ -1319,8 +1318,6 @@ cplus_decl_attributes (tree *decl, tree
        return;
 
       save_template_attributes (&attributes, decl);
-      if (attributes == NULL_TREE)
-       return;
     }
 
   cp_check_const_attributes (attributes);
--- gcc/testsuite/c-c++-common/pr54988.c.jj     2012-10-22 12:50:56.332853880 
+0200
+++ gcc/testsuite/c-c++-common/pr54988.c        2012-10-22 12:50:04.000000000 
+0200
@@ -0,0 +1,20 @@
+/* PR c++/54988 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* { dg-additional-options "-msse2" { target { i?86-*-* x86_64-*-* } } } */
+
+#if defined(__i386__) || defined(__x86_64__)
+#pragma GCC target "fpmath=sse"
+#endif
+
+static inline __attribute__ ((always_inline)) int
+foo (int x)
+{
+  return x;
+}
+
+int
+bar (int x)
+{
+  return foo (x);
+}

        Jakub

Reply via email to