From 8d40d877c01a2ab5ad2350cdc284660b36618f95 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Sat, 9 Feb 2013 15:38:54 -0500 Subject: [PATCH] * decl.c (decls_match): Check versions later. From-SVN: r195921 --- gcc/cp/ChangeLog | 2 ++ gcc/cp/decl.c | 59 ++++++++++++++++++++++++++++---------------------------- 2 files changed, 31 insertions(+), 30 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5793858..26e130c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,7 @@ 2013-02-09 Jason Merrill + * 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 5317fcf..5a9ad2c 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) { -- 2.7.4