PR c++/44282
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 14 Sep 2015 19:54:27 +0000 (19:54 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 14 Sep 2015 19:54:27 +0000 (19:54 +0000)
* mangle.c (write_CV_qualifiers_for_type): Also warn about regparm
mangling with lower -fabi-version.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@227761 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/mangle.c
gcc/testsuite/g++.dg/abi/mangle-regparm1a.C [new file with mode: 0644]

index 76e3b91..c264f48 100644 (file)
@@ -1,3 +1,9 @@
+2015-09-14  Jason Merrill  <jason@redhat.com>
+
+       PR c++/44282
+       * mangle.c (write_CV_qualifiers_for_type): Also warn about regparm
+       mangling with lower -fabi-version.
+
 2015-09-14  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/51911
index 342cb93..2640d52 100644 (file)
@@ -2196,7 +2196,7 @@ write_CV_qualifiers_for_type (const tree type)
      We don't do this with classes and enums because their attributes
      are part of their definitions, not something added on.  */
 
-  if (abi_version_at_least (10) && !OVERLOAD_TYPE_P (type))
+  if (!OVERLOAD_TYPE_P (type))
     {
       auto_vec<tree> vec;
       for (tree a = TYPE_ATTRIBUTES (type); a; a = TREE_CHAIN (a))
@@ -2207,31 +2207,34 @@ write_CV_qualifiers_for_type (const tree type)
              && !is_attribute_p ("abi_tag", name))
            vec.safe_push (a);
        }
-      vec.qsort (attr_strcmp);
-      while (!vec.is_empty())
+      if (abi_version_crosses (10) && !vec.is_empty ())
+       G.need_abi_warning = true;
+      if (abi_version_at_least (10))
        {
-         tree a = vec.pop();
-         const attribute_spec *as
-           = lookup_attribute_spec (get_attribute_name (a));
-
-         write_char ('U');
-         write_unsigned_number (strlen (as->name));
-         write_string (as->name);
-         if (TREE_VALUE (a))
+         vec.qsort (attr_strcmp);
+         while (!vec.is_empty())
            {
-             write_char ('I');
-             for (tree args = TREE_VALUE (a); args;
-                  args = TREE_CHAIN (args))
+             tree a = vec.pop();
+             const attribute_spec *as
+               = lookup_attribute_spec (get_attribute_name (a));
+
+             write_char ('U');
+             write_unsigned_number (strlen (as->name));
+             write_string (as->name);
+             if (TREE_VALUE (a))
                {
-                 tree arg = TREE_VALUE (args);
-                 write_template_arg (arg);
+                 write_char ('I');
+                 for (tree args = TREE_VALUE (a); args;
+                      args = TREE_CHAIN (args))
+                   {
+                     tree arg = TREE_VALUE (args);
+                     write_template_arg (arg);
+                   }
+                 write_char ('E');
                }
-             write_char ('E');
-           }
 
-         ++num_qualifiers;
-         if (abi_version_crosses (10))
-           G.need_abi_warning = true;
+             ++num_qualifiers;
+           }
        }
     }
 
diff --git a/gcc/testsuite/g++.dg/abi/mangle-regparm1a.C b/gcc/testsuite/g++.dg/abi/mangle-regparm1a.C
new file mode 100644 (file)
index 0000000..bfa6c9b
--- /dev/null
@@ -0,0 +1,21 @@
+// { dg-do run { target { { i?86-*-* x86_64-*-* } && ia32 } } }
+// { dg-options "-fabi-version=8 -Wabi -save-temps" }
+// { dg-final { scan-assembler "_Z18IndirectExternCallIPFviiEiEvT_T0_S3_" } }
+
+template <typename F, typename T>
+void IndirectExternCall(F f, T t1, T t2) { // { dg-warning "mangled name" }
+  typedef F (*WrapF)(F);
+  f (t1, t2);
+}
+
+__attribute__((regparm(3), stdcall))
+void regparm_func (int i, int j)
+{
+  if (i != 24 || j != 42)
+    __builtin_abort();
+}
+
+int main()
+{
+  IndirectExternCall (regparm_func, 24, 42);
+}