diff options
author | Dodji Seketeli <dodji@gcc.gnu.org> | 2012-01-30 15:54:39 +0100 |
---|---|---|
committer | Dodji Seketeli <dodji@gcc.gnu.org> | 2012-01-30 15:54:39 +0100 |
commit | be5295721cf937f31d88f77e7868884e643016b4 (patch) | |
tree | 51e742f2f8ac2470df8bd3451262a4ccd506bba3 | |
parent | 12e95d87efb8a7a18a247fdec11369948f8e2b10 (diff) | |
download | gcc-be5295721cf937f31d88f77e7868884e643016b4.zip gcc-be5295721cf937f31d88f77e7868884e643016b4.tar.gz gcc-be5295721cf937f31d88f77e7868884e643016b4.tar.bz2 |
Revert "PR c++/51641 - Lookup finds enclosing class member instead of template parameter"
This reverts commit r183726
From-SVN: r183728
-rw-r--r-- | gcc/cp/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 2 | ||||
-rw-r--r-- | gcc/cp/name-lookup.c | 36 | ||||
-rw-r--r-- | gcc/cp/pt.c | 44 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lookup/hidden-class17.C | 22 |
6 files changed, 42 insertions, 78 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 78e0383..5c02259 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,14 +1,3 @@ -2012-01-30 Dodji Seketeli <dodji@redhat.com> - - PR c++/51641 - * cp-tree.h (template_type_parameter_p): Declare new function. - (parameter_of_template_p): Remove - * pt.c (template_type_parameter_p): Define new function. - (parameter_of_template_p): Remove. - * name-lookup.c (binding_to_template_parms_of_scope_p): Don't rely - on parameter_of_template_p anymore. Compare the level of the - template parameter to the depth of the template. - 2012-01-29 Paolo Carlini <paolo.carlini@oracle.com> PR c++/51327 diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 71bca53..f27755e 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -5357,10 +5357,10 @@ extern bool explicit_class_specialization_p (tree); extern int push_tinst_level (tree); extern void pop_tinst_level (void); extern struct tinst_level *outermost_tinst_level(void); +extern bool parameter_of_template_p (tree, tree); extern void init_template_processing (void); extern void print_template_statistics (void); bool template_template_parameter_p (const_tree); -bool template_type_parameter_p (const_tree); extern bool primary_template_instantiation_p (const_tree); extern tree get_primary_template_innermost_parameters (const_tree); extern tree get_template_parms_at_level (tree, int); diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index d39bc1d..2351342 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -4466,39 +4466,21 @@ static bool binding_to_template_parms_of_scope_p (cxx_binding *binding, cp_binding_level *scope) { - tree binding_value, tmpl; - int level; + tree binding_value; if (!binding || !scope) return false; binding_value = binding->value ? binding->value : binding->type; - /* BINDING_VALUE must be a template parm. */ - if (binding_value == NULL_TREE - || (!DECL_P (binding_value) - || !DECL_TEMPLATE_PARM_P (binding_value))) - return false; - /* The level of BINDING_VALUE. */ - level = - template_type_parameter_p (binding_value) - ? TEMPLATE_PARM_LEVEL (TEMPLATE_TYPE_PARM_INDEX - (TREE_TYPE (binding_value))) - : TEMPLATE_PARM_LEVEL (DECL_INITIAL (binding_value)); - - /* The template of the current scope, iff said scope is a primary - template. */ - tmpl = - (scope - && scope->this_entity - && get_template_info (scope->this_entity) - && PRIMARY_TEMPLATE_P (TI_TEMPLATE (get_template_info (scope->this_entity)))) - ? TI_TEMPLATE (get_template_info (scope->this_entity)) - : NULL_TREE; - - /* If the level of the parm BINDING_VALUE equals the depth of TMPL, - then BINDING_VALUE is a parameter of TMPL. */ - return (tmpl && level == TMPL_PARMS_DEPTH (DECL_TEMPLATE_PARMS (tmpl))); + return (scope + && scope->this_entity + && get_template_info (scope->this_entity) + && PRIMARY_TEMPLATE_P (TI_TEMPLATE + (get_template_info (scope->this_entity))) + && parameter_of_template_p (binding_value, + TI_TEMPLATE (get_template_info \ + (scope->this_entity)))); } /* Return the innermost non-namespace binding for NAME from a scope diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 13eef29..ad2b4df 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -2890,18 +2890,6 @@ template_template_parameter_p (const_tree parm) return DECL_TEMPLATE_TEMPLATE_PARM_P (parm); } -/* Return true iff PARM is a DECL representing a type template - parameter. */ - -bool -template_type_parameter_p (const_tree parm) -{ - return (parm - && (TREE_CODE (parm) == TYPE_DECL - || TREE_CODE (parm) == TEMPLATE_DECL) - && DECL_TEMPLATE_PARM_P (parm)); -} - /* Return the template parameters of T if T is a primary template instantiation, NULL otherwise. */ @@ -8149,6 +8137,38 @@ outermost_tinst_level (void) return level; } +/* Returns TRUE if PARM is a parameter of the template TEMPL. */ + +bool +parameter_of_template_p (tree parm, tree templ) +{ + tree parms; + int i; + + if (!parm || !templ) + return false; + + gcc_assert (DECL_TEMPLATE_PARM_P (parm)); + gcc_assert (TREE_CODE (templ) == TEMPLATE_DECL); + + parms = DECL_TEMPLATE_PARMS (templ); + parms = INNERMOST_TEMPLATE_PARMS (parms); + + for (i = 0; i < TREE_VEC_LENGTH (parms); ++i) + { + tree p = TREE_VALUE (TREE_VEC_ELT (parms, i)); + if (p == error_mark_node) + continue; + + if (parm == p + || (DECL_INITIAL (parm) + && DECL_INITIAL (parm) == DECL_INITIAL (p))) + return true; + } + + return false; +} + /* DECL is a friend FUNCTION_DECL or TEMPLATE_DECL. ARGS is the vector of template arguments, as for tsubst. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1159dd4..d80e3ab 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,8 +1,3 @@ -2012-01-30 Dodji Seketeli <dodji@redhat.com> - - PR c++/51641 - * g++.dg/lookup/hidden-class17.C: New test. - 2012-01-30 Jakub Jelinek <jakub@redhat.com> PR debug/52027 diff --git a/gcc/testsuite/g++.dg/lookup/hidden-class17.C b/gcc/testsuite/g++.dg/lookup/hidden-class17.C deleted file mode 100644 index 3d5ccec..0000000 --- a/gcc/testsuite/g++.dg/lookup/hidden-class17.C +++ /dev/null @@ -1,22 +0,0 @@ -// Origin PR c++/51641 -// { dg-do compile } - -struct A { - struct B { typedef int X; }; -}; - -template<class B> struct C : A { - B::X q; // Ok: A::B. - struct U { typedef int X; }; - template<class U> - struct D; -}; - -template<class B> -template<class U> -struct C<B>::D { - typename U::X r; // { dg-error "" } -}; - -C<int>::D<double> y; - |