summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2013-02-09 20:38:54 +0000
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2013-02-09 20:38:54 +0000
commit153b25b9acab223c3870f1106ca798c7bf2656f0 (patch)
treefca52d3558017f9fc27923b66d71ab8fdbdb62e5
parent93ad1bbfee51ed4bcb8a6abedbeff7a7073e3bf2 (diff)
* decl.c (decls_match): Check versions later.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@195921 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/cp/ChangeLog2
-rw-r--r--gcc/cp/decl.c59
2 files changed, 31 insertions, 30 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 5793858cd90a..26e130c9db14 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 5317fcf43cbc..5a9ad2c3743a 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -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)
{