Warn about mangled name change even if DECL_REALLY_EXTERN.
authorJason Merrill <jason@redhat.com>
Mon, 1 Aug 2016 20:20:17 +0000 (16:20 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 1 Aug 2016 20:20:17 +0000 (16:20 -0400)
* mangle.c (mangle_decl): Warn about mangled name change even if
DECL_REALLY_EXTERN.

From-SVN: r238966

gcc/cp/ChangeLog
gcc/cp/mangle.c

index 9d46aaaa5de430d6ca3cf33c1e6219e13b6ced56..38ae44377866249dc4d3f91d227ca6d63067c7df 100644 (file)
@@ -1,5 +1,8 @@
 2016-08-01  Jason Merrill  <jason@redhat.com>
 
+       * mangle.c (mangle_decl): Warn about mangled name change even if
+       DECL_REALLY_EXTERN.
+
        * mangle.c (get_abi_tags): New.
        (find_substitution, write_unqualified_name, write_abi_tags)
        (maybe_check_abi_tags): Use it.
index 29be7fde4982fa9f13b3e0e5d1ec327161a74f13..d1bf3effbd25edef1f1e6653737738be26536e99 100644 (file)
@@ -3700,50 +3700,52 @@ mangle_decl (const tree decl)
   SET_DECL_ASSEMBLER_NAME (decl, id);
 
   if (id != DECL_NAME (decl)
-      && !DECL_REALLY_EXTERN (decl)
       /* Don't do this for a fake symbol we aren't going to emit anyway.  */
       && TREE_CODE (decl) != TYPE_DECL
       && !DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (decl)
       && !DECL_MAYBE_IN_CHARGE_DESTRUCTOR_P (decl))
     {
-      bool set = false;
+      int save_ver = flag_abi_version;
+      tree id2 = NULL_TREE;
 
-      /* Check IDENTIFIER_GLOBAL_VALUE before setting to avoid redundant
-        errors from multiple definitions.  */
-      tree d = IDENTIFIER_GLOBAL_VALUE (id);
-      if (!d || decl_implicit_alias_p (d))
+      if (!DECL_REALLY_EXTERN (decl))
        {
-         set = true;
-         SET_IDENTIFIER_GLOBAL_VALUE (id, decl);
-       }
+         bool set = false;
 
-      if (!G.need_abi_warning)
-       return;
+         /* Check IDENTIFIER_GLOBAL_VALUE before setting to avoid redundant
+            errors from multiple definitions.  */
+         tree d = IDENTIFIER_GLOBAL_VALUE (id);
+         if (!d || decl_implicit_alias_p (d))
+           {
+             set = true;
+             SET_IDENTIFIER_GLOBAL_VALUE (id, decl);
+           }
 
-      /* If the mangling will change in the future, emit an alias with the
-        future mangled name for forward-compatibility.  */
-      int save_ver;
-      tree id2;
+         if (!G.need_abi_warning)
+           return;
 
-      if (!set)
-       {
-         SET_IDENTIFIER_GLOBAL_VALUE (id, decl);
-         inform (DECL_SOURCE_LOCATION (decl), "a later -fabi-version= (or "
-                 "=0) avoids this error with a change in mangling");
-       }
-
-      save_ver = flag_abi_version;
+         /* If the mangling will change in the future, emit an alias with the
+            future mangled name for forward-compatibility.  */
+         if (!set)
+           {
+             SET_IDENTIFIER_GLOBAL_VALUE (id, decl);
+             inform (DECL_SOURCE_LOCATION (decl), "a later -fabi-version= (or "
+                     "=0) avoids this error with a change in mangling");
+           }
 
-      flag_abi_version = flag_abi_compat_version;
-      id2 = mangle_decl_string (decl);
-      id2 = targetm.mangle_decl_assembler_name (decl, id2);
+         flag_abi_version = flag_abi_compat_version;
+         id2 = mangle_decl_string (decl);
+         id2 = targetm.mangle_decl_assembler_name (decl, id2);
+         flag_abi_version = save_ver;
 
-      if (id2 != id)
-       note_mangling_alias (decl, id2);
+         if (id2 != id)
+           note_mangling_alias (decl, id2);
+       }
 
       if (warn_abi)
        {
-         if (flag_abi_compat_version != warn_abi_version)
+         if (flag_abi_compat_version != warn_abi_version
+             || id2 == NULL_TREE)
            {
              flag_abi_version = warn_abi_version;
              id2 = mangle_decl_string (decl);