From 6eeba0cc4337f356d68974b8341e84879ec6cd93 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Fri, 11 Jul 2003 08:20:19 +0000 Subject: [PATCH] re PR c++/8327 (In definition of template static member value of static const member isn't known) PR c++/8327 * pt.c (tsubst_qualified_id): Implement suggested resolution for Core Issue 2. (type_dependent_expression_p): Likewise. PR c++/8327 * g++.dg/template/scope1.C: New test. From-SVN: r69223 --- gcc/cp/ChangeLog | 7 +++++ gcc/cp/pt.c | 50 +++++++++++++++++++++++++++++----- gcc/testsuite/ChangeLog | 3 ++ gcc/testsuite/g++.dg/template/scope1.C | 12 ++++++++ 4 files changed, 65 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/scope1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5722e9f..d64d722 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2003-07-11 Mark Mitchell + + PR c++/8327 + * pt.c (tsubst_qualified_id): Implement suggested resolution for + Core Issue 2. + (type_dependent_expression_p): Likewise. + 2003-07-10 Mark Mitchell * typeck.c (build_binary_op): Do not warn about signed diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index b4c9ced..96edfc9f 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -7142,10 +7142,6 @@ tsubst_qualified_id (tree qualified_id, tree args, my_friendly_assert (TREE_CODE (qualified_id) == SCOPE_REF, 20030706); - /* Look up the qualified name. */ - scope = TREE_OPERAND (qualified_id, 0); - scope = tsubst (scope, args, complain, in_decl); - /* Figure out what name to look up. */ name = TREE_OPERAND (qualified_id, 1); if (TREE_CODE (name) == TEMPLATE_ID_EXPR) @@ -7161,7 +7157,18 @@ tsubst_qualified_id (tree qualified_id, tree args, template_args = NULL_TREE; } - expr = tsubst_copy (name, args, complain, in_decl); + /* Substitute into the qualifying scope. When there are no ARGS, we + are just trying to simplify a non-dependent expression. In that + case the qualifying scope may be dependent, and, in any case, + substituting will not help. */ + scope = TREE_OPERAND (qualified_id, 0); + if (args) + { + scope = tsubst (scope, args, complain, in_decl); + expr = tsubst_copy (name, args, complain, in_decl); + } + else + expr = name; if (!BASELINK_P (name) && !DECL_P (expr)) expr = lookup_qualified_name (scope, expr, /*is_type_p=*/0); @@ -7169,10 +7176,14 @@ tsubst_qualified_id (tree qualified_id, tree args, check_accessibility_of_qualified_id (expr, /*object_type=*/NULL_TREE, scope); - + /* Remember that there was a reference to this entity. */ if (DECL_P (expr)) - mark_used (expr); + { + mark_used (expr); + if (!args && TREE_CODE (expr) == VAR_DECL) + expr = DECL_INITIAL (expr); + } if (is_template) lookup_template_function (expr, template_args); @@ -11594,6 +11605,31 @@ type_dependent_expression_p (tree expression) return dependent_type_p (type); } + /* [temp.dep.expr] + + An id-expression is type-dependent if it contains a + nested-name-specifier that contains a class-name that names a + dependent type. */ + if (TREE_CODE (expression) == SCOPE_REF + && TYPE_P (TREE_OPERAND (expression, 0))) + { + tree scope; + tree name; + + scope = TREE_OPERAND (expression, 0); + name = TREE_OPERAND (expression, 1); + + /* The suggested resolution to Core Issue 2 implies that if the + qualifying type is the current class, then we must peek + inside it. */ + if (DECL_P (name) + && currently_open_class (scope) + && !type_dependent_expression_p (name)) + return false; + if (dependent_type_p (scope)) + return true; + } + if (TREE_CODE (expression) == FUNCTION_DECL && DECL_LANG_SPECIFIC (expression) && DECL_TEMPLATE_INFO (expression) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 968a056..8f45794 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2003-07-11 Mark Mitchell + PR c++/8327 + * g++.dg/template/scope1.C: New test. + * g++.dg/warn/Wsign-compare-1.C: New test. 2003-07-10 Kazu Hirata diff --git a/gcc/testsuite/g++.dg/template/scope1.C b/gcc/testsuite/g++.dg/template/scope1.C new file mode 100644 index 0000000..b017b0b --- /dev/null +++ b/gcc/testsuite/g++.dg/template/scope1.C @@ -0,0 +1,12 @@ +// PR 8327 + +template +class X +{ + static const int a = 5; + + static T b[a]; +}; + +template T X::b[X::a]; + -- 2.7.4