aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDodji Seketeli <dodji@gcc.gnu.org>2012-01-30 15:54:39 +0100
committerDodji Seketeli <dodji@gcc.gnu.org>2012-01-30 15:54:39 +0100
commitbe5295721cf937f31d88f77e7868884e643016b4 (patch)
tree51e742f2f8ac2470df8bd3451262a4ccd506bba3
parent12e95d87efb8a7a18a247fdec11369948f8e2b10 (diff)
downloadgcc-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/ChangeLog11
-rw-r--r--gcc/cp/cp-tree.h2
-rw-r--r--gcc/cp/name-lookup.c36
-rw-r--r--gcc/cp/pt.c44
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/lookup/hidden-class17.C22
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;
-