PR c++/77379 - ABI tag on thunk
authorJason Merrill <jason@redhat.com>
Mon, 29 Aug 2016 16:42:57 +0000 (12:42 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 29 Aug 2016 16:42:57 +0000 (12:42 -0400)
* mangle.c (maybe_check_abi_tags): Add version parm, handle thunks.
(mangle_thunk): Add thunk parameter.
* method.c (finish_thunk): Pass it.
* cp-tree.h: Declare it.

From-SVN: r239830

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/mangle.c
gcc/cp/method.c
gcc/testsuite/g++.dg/abi/abi-tag23.C [new file with mode: 0644]
gcc/testsuite/g++.dg/abi/abi-tag23a.C [new file with mode: 0644]

index e8e2e038b43695daaf68306f10ba0ec1ee315e3d..55651bc83b0319a8d9467dd0f52862864b3776e7 100644 (file)
@@ -1,3 +1,11 @@
+2016-08-29  Jason Merrill  <jason@redhat.com>
+
+       PR c++/77379
+       * mangle.c (maybe_check_abi_tags): Add version parm, handle thunks.
+       (mangle_thunk): Add thunk parameter.
+       * method.c (finish_thunk): Pass it.
+       * cp-tree.h: Declare it.
+
 2016-08-15  Jason Merrill  <jason@redhat.com>
 
        Avoid calling a trivial default constructor.
index 72a128d90dd832551c9db25e1cc091e40fcff670..5bcb98b97561b4607defa3b4863a9d36c6a7d476 100644 (file)
@@ -6802,7 +6802,7 @@ extern tree mangle_typeinfo_string_for_type       (tree);
 extern tree mangle_vtbl_for_type               (tree);
 extern tree mangle_vtt_for_type                        (tree);
 extern tree mangle_ctor_vtbl_for_type          (tree, tree);
-extern tree mangle_thunk                       (tree, int, tree, tree);
+extern tree mangle_thunk                       (tree, int, tree, tree, tree);
 extern tree mangle_conv_op_name_for_type       (tree);
 extern tree mangle_guard_variable              (tree);
 extern tree mangle_tls_init_fn                 (tree);
index d8b5c45577f3ee126ba785bd7e77e5c4e0f6e0ef..d34743c9c68c9d970a023f0c51417049d3d7f538 100644 (file)
@@ -231,7 +231,7 @@ static void write_local_name (tree, const tree, const tree);
 static void dump_substitution_candidates (void);
 static tree mangle_decl_string (const tree);
 static int local_class_index (tree);
-static void maybe_check_abi_tags (tree, tree = NULL_TREE);
+static void maybe_check_abi_tags (tree, tree = NULL_TREE, int = 10);
 static bool equal_abi_tags (tree, tree);
 
 /* Control functions.  */
@@ -4024,10 +4024,13 @@ mangle_call_offset (const tree fixed_offset, const tree virtual_offset)
 
 tree
 mangle_thunk (tree fn_decl, const int this_adjusting, tree fixed_offset,
-             tree virtual_offset)
+             tree virtual_offset, tree thunk)
 {
   tree result;
 
+  if (abi_version_at_least (11))
+    maybe_check_abi_tags (fn_decl, thunk, 11);
+
   start_mangling (fn_decl);
 
   write_string ("_Z");
@@ -4142,7 +4145,7 @@ mangle_conv_op_name_for_type (const tree type)
    guard variable for T.  */
 
 static void
-maybe_check_abi_tags (tree t, tree for_decl)
+maybe_check_abi_tags (tree t, tree for_decl, int ver)
 {
   if (DECL_ASSEMBLER_NAME_SET_P (t))
     return;
@@ -4153,9 +4156,14 @@ maybe_check_abi_tags (tree t, tree for_decl)
 
   tree newtags = get_abi_tags (t);
   if (newtags && newtags != oldtags
-      && abi_version_crosses (10))
+      && abi_version_crosses (ver))
     {
-      if (for_decl)
+      if (for_decl && DECL_THUNK_P (for_decl))
+       warning_at (DECL_SOURCE_LOCATION (t), OPT_Wabi,
+                   "the mangled name of a thunk for %qD changes between "
+                   "-fabi-version=%d and -fabi-version=%d",
+                   t, flag_abi_version, warn_abi_version);
+      else if (for_decl)
        warning_at (DECL_SOURCE_LOCATION (for_decl), OPT_Wabi,
                    "the mangled name of %qD changes between "
                    "-fabi-version=%d and -fabi-version=%d",
index 75342ae5d28f2ea3158227f85724e2a5898dad18..957ea391383c50e4ea680a4ef204debb89b664b5 100644 (file)
@@ -169,7 +169,7 @@ finish_thunk (tree thunk)
     virtual_offset = BINFO_VPTR_FIELD (virtual_offset);
   function = THUNK_TARGET (thunk);
   name = mangle_thunk (function, DECL_THIS_THUNK_P (thunk),
-                      fixed_offset, virtual_offset);
+                      fixed_offset, virtual_offset, thunk);
 
   /* We can end up with declarations of (logically) different
      covariant thunks, that do identical adjustments.  The two thunks
diff --git a/gcc/testsuite/g++.dg/abi/abi-tag23.C b/gcc/testsuite/g++.dg/abi/abi-tag23.C
new file mode 100644 (file)
index 0000000..5e310a4
--- /dev/null
@@ -0,0 +1,35 @@
+// PR c++/77379
+// { dg-options "-fabi-version=0 -Wabi=10" }
+
+struct __attribute ((abi_tag ("bar"))) string { };
+
+struct Mother
+{
+  virtual ~Mother() {};
+  int bar;
+};
+
+struct Father
+{
+  virtual string get_foo()  = 0;
+};
+
+class Derived:
+  public Mother,
+  public Father
+{
+public:
+  string get_foo();            // { dg-warning "mangled name" }
+};
+
+struct Final:
+    public Derived
+{
+};
+
+int main()
+{
+  Final().get_foo();
+}
+
+// { dg-final { scan-assembler "_ZThn16_N7Derived7get_fooB3barEv" } }
diff --git a/gcc/testsuite/g++.dg/abi/abi-tag23a.C b/gcc/testsuite/g++.dg/abi/abi-tag23a.C
new file mode 100644 (file)
index 0000000..72aa037
--- /dev/null
@@ -0,0 +1,35 @@
+// PR c++/77379
+// { dg-options -fabi-version=10 }
+
+struct __attribute ((abi_tag ("bar"))) string { };
+
+struct Mother
+{
+  virtual ~Mother() {};
+  int bar;
+};
+
+struct Father
+{
+  virtual string get_foo()  = 0;
+};
+
+class Derived:
+  public Mother,
+  public Father
+{
+public:
+  string get_foo();
+};
+
+struct Final:
+    public Derived
+{
+};
+
+int main()
+{
+  Final().get_foo();
+}
+
+// { dg-final { scan-assembler "_ZThn16_N7Derived7get_fooEv" } }