* decl.c (decls_match): Check versions later.
authorJason Merrill <jason@redhat.com>
Sat, 9 Feb 2013 20:38:54 +0000 (15:38 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Sat, 9 Feb 2013 20:38:54 +0000 (15:38 -0500)
From-SVN: r195921

gcc/cp/ChangeLog
gcc/cp/decl.c

index 5793858..26e130c 100644 (file)
@@ -1,5 +1,7 @@
 2013-02-09  Jason Merrill  <jason@redhat.com>
 
+       * decl.c (decls_match): Check versions later.
+
        PR c++/56238
        * pt.c (build_non_dependent_expr): Don't try to fold
        instantiation-dependent expressions.
index 5317fcf..5a9ad2c 100644 (file)
@@ -976,36 +976,6 @@ decls_match (tree newdecl, tree olddecl)
       if (t1 != t2)
        return 0;
 
-      /* The decls dont match if they correspond to two different versions
-        of the same function.   Disallow extern "C" functions to be
-        versions for now.  */
-      if (compparms (p1, p2)
-         && same_type_p (TREE_TYPE (f1), TREE_TYPE (f2))
-         && !DECL_EXTERN_C_P (newdecl)
-         && !DECL_EXTERN_C_P (olddecl)
-         && targetm.target_option.function_versions (newdecl, olddecl))
-       {
-         /* Mark functions as versions if necessary.  Modify the mangled decl
-            name if necessary.  */
-         if (DECL_FUNCTION_VERSIONED (newdecl)
-             && DECL_FUNCTION_VERSIONED (olddecl))
-           return 0;
-         if (!DECL_FUNCTION_VERSIONED (newdecl))
-           {
-             DECL_FUNCTION_VERSIONED (newdecl) = 1;
-             if (DECL_ASSEMBLER_NAME_SET_P (newdecl))
-               mangle_decl (newdecl);
-           }
-         if (!DECL_FUNCTION_VERSIONED (olddecl))
-           {
-             DECL_FUNCTION_VERSIONED (olddecl) = 1;
-             if (DECL_ASSEMBLER_NAME_SET_P (olddecl))
-              mangle_decl (olddecl);
-           }
-         record_function_versions (olddecl, newdecl);
-         return 0;
-       }
-
       if (CP_DECL_CONTEXT (newdecl) != CP_DECL_CONTEXT (olddecl)
          && ! (DECL_EXTERN_C_P (newdecl)
                && DECL_EXTERN_C_P (olddecl)))
@@ -1063,6 +1033,35 @@ decls_match (tree newdecl, tree olddecl)
        }
       else
        types_match = 0;
+
+      /* The decls dont match if they correspond to two different versions
+        of the same function.   Disallow extern "C" functions to be
+        versions for now.  */
+      if (types_match
+         && !DECL_EXTERN_C_P (newdecl)
+         && !DECL_EXTERN_C_P (olddecl)
+         && targetm.target_option.function_versions (newdecl, olddecl))
+       {
+         /* Mark functions as versions if necessary.  Modify the mangled decl
+            name if necessary.  */
+         if (DECL_FUNCTION_VERSIONED (newdecl)
+             && DECL_FUNCTION_VERSIONED (olddecl))
+           return 0;
+         if (!DECL_FUNCTION_VERSIONED (newdecl))
+           {
+             DECL_FUNCTION_VERSIONED (newdecl) = 1;
+             if (DECL_ASSEMBLER_NAME_SET_P (newdecl))
+               mangle_decl (newdecl);
+           }
+         if (!DECL_FUNCTION_VERSIONED (olddecl))
+           {
+             DECL_FUNCTION_VERSIONED (olddecl) = 1;
+             if (DECL_ASSEMBLER_NAME_SET_P (olddecl))
+              mangle_decl (olddecl);
+           }
+         record_function_versions (olddecl, newdecl);
+         return 0;
+       }
     }
   else if (TREE_CODE (newdecl) == TEMPLATE_DECL)
     {