diff options
author | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-02-09 20:38:54 +0000 |
---|---|---|
committer | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-02-09 20:38:54 +0000 |
commit | 153b25b9acab223c3870f1106ca798c7bf2656f0 (patch) | |
tree | fca52d3558017f9fc27923b66d71ab8fdbdb62e5 | |
parent | 93ad1bbfee51ed4bcb8a6abedbeff7a7073e3bf2 (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/ChangeLog | 2 | ||||
-rw-r--r-- | gcc/cp/decl.c | 59 |
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) { |