From 5a57f1b2c005ba13c7214d1d4cf8a6d882f43b59 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Thu, 10 Jun 2004 14:28:53 -0400 Subject: [PATCH] re PR c++/15875 (rejects pointer to member in template) PR c++/15875 Revert: 2004-06-01 Kriang Lerdsuwanakij * init.c (build_offset_ref): Build SCOPE_REF with non-null TREE_TYPE for non-dependent names. * pt.c (type_dependent_expression_p): Handle SCOPE_REF with unknown_type_node as its TREE_TYPE. * cxx-pretty_print.c (pp_cxx_unqualified_id): Handle BASELINK. * error.c (dump_decl) : Use pp_expression. (dump_expr) : Likewise. From-SVN: r82933 --- gcc/cp/ChangeLog | 13 +++++++ gcc/cp/cxx-pretty-print.c | 4 --- gcc/cp/error.c | 8 +++-- gcc/cp/init.c | 10 +----- gcc/cp/pt.c | 36 +++++++++---------- .../g++.dg/template/non-dependent10.C | 21 ----------- .../g++.dg/template/non-dependent7.C | 22 ------------ .../g++.dg/template/non-dependent8.C | 22 ------------ .../g++.dg/template/non-dependent9.C | 22 ------------ 9 files changed, 37 insertions(+), 121 deletions(-) delete mode 100644 gcc/testsuite/g++.dg/template/non-dependent10.C delete mode 100644 gcc/testsuite/g++.dg/template/non-dependent7.C delete mode 100644 gcc/testsuite/g++.dg/template/non-dependent8.C delete mode 100644 gcc/testsuite/g++.dg/template/non-dependent9.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5f49e4ba24f..278e4d4a223 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,16 @@ +2004-06-10 Jason Merrill + + PR c++/15875 + Revert: + 2004-06-01 Kriang Lerdsuwanakij + * init.c (build_offset_ref): Build SCOPE_REF with non-null + TREE_TYPE for non-dependent names. + * pt.c (type_dependent_expression_p): Handle SCOPE_REF with + unknown_type_node as its TREE_TYPE. + * cxx-pretty_print.c (pp_cxx_unqualified_id): Handle BASELINK. + * error.c (dump_decl) : Use pp_expression. + (dump_expr) : Likewise. + 2004-06-10 Mark Mitchell PR c++/15227 diff --git a/gcc/cp/cxx-pretty-print.c b/gcc/cp/cxx-pretty-print.c index 328ece0f332..c5e667d9495 100644 --- a/gcc/cp/cxx-pretty-print.c +++ b/gcc/cp/cxx-pretty-print.c @@ -180,10 +180,6 @@ pp_cxx_unqualified_id (cxx_pretty_printer *pp, tree t) pp_cxx_template_id (pp, t); break; - case BASELINK: - pp_cxx_unqualified_id (pp, BASELINK_FUNCTIONS (t)); - break; - case RECORD_TYPE: case UNION_TYPE: case ENUMERAL_TYPE: diff --git a/gcc/cp/error.c b/gcc/cp/error.c index faa2bfbef0c..6e186503bad 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -771,7 +771,9 @@ dump_decl (tree t, int flags) break; case SCOPE_REF: - pp_expression (cxx_pp, t); + dump_decl (TREE_OPERAND (t, 0), flags & ~TFF_DECL_SPECIFIERS); + pp_colon_colon (cxx_pp); + dump_decl (TREE_OPERAND (t, 1), flags); break; case ARRAY_REF: @@ -1697,7 +1699,9 @@ dump_expr (tree t, int flags) break; case SCOPE_REF: - pp_expression (cxx_pp, t); + dump_type (TREE_OPERAND (t, 0), flags); + pp_colon_colon (cxx_pp); + dump_expr (TREE_OPERAND (t, 1), flags | TFF_EXPR_IN_PARENS); break; case CAST_EXPR: diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 5f0872e80cd..1c003566108 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -1368,7 +1368,7 @@ build_offset_ref (tree type, tree name, bool address_p) if (TREE_CODE (name) == TEMPLATE_DECL) return name; - if (dependent_type_p (type) || type_dependent_expression_p (name)) + if (processing_template_decl || uses_template_parms (type)) return build_min_nt (SCOPE_REF, type, name); if (TREE_CODE (name) == TEMPLATE_ID_EXPR) @@ -1450,14 +1450,6 @@ build_offset_ref (tree type, tree name, bool address_p) return error_mark_node; } - if (processing_template_decl) - { - if (TREE_CODE (orig_name) == TEMPLATE_ID_EXPR) - return build_min (SCOPE_REF, TREE_TYPE (member), type, orig_name); - else - return build_min (SCOPE_REF, TREE_TYPE (member), type, name); - } - if (TREE_CODE (member) == TYPE_DECL) { TREE_USED (member) = 1; diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index fd75f78cd9a..ff96eaa83c7 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -11913,6 +11913,22 @@ type_dependent_expression_p (tree expression) return dependent_type_p (type); } + if (TREE_CODE (expression) == SCOPE_REF + && dependent_scope_ref_p (expression, + type_dependent_expression_p)) + return true; + + if (TREE_CODE (expression) == FUNCTION_DECL + && DECL_LANG_SPECIFIC (expression) + && DECL_TEMPLATE_INFO (expression) + && (any_dependent_template_arguments_p + (INNERMOST_TEMPLATE_ARGS (DECL_TI_ARGS (expression))))) + return true; + + if (TREE_CODE (expression) == TEMPLATE_DECL + && !DECL_TEMPLATE_TEMPLATE_PARM_P (expression)) + return false; + if (TREE_TYPE (expression) == unknown_type_node) { if (TREE_CODE (expression) == ADDR_EXPR) @@ -11926,9 +11942,7 @@ type_dependent_expression_p (tree expression) if (TREE_CODE (expression) == IDENTIFIER_NODE) return false; } - if (TREE_CODE (expression) == SCOPE_REF) - return false; - + if (TREE_CODE (expression) == BASELINK) expression = BASELINK_FUNCTIONS (expression); if (TREE_CODE (expression) == TEMPLATE_ID_EXPR) @@ -11951,22 +11965,6 @@ type_dependent_expression_p (tree expression) abort (); } - if (TREE_CODE (expression) == SCOPE_REF - && dependent_scope_ref_p (expression, - type_dependent_expression_p)) - return true; - - if (TREE_CODE (expression) == FUNCTION_DECL - && DECL_LANG_SPECIFIC (expression) - && DECL_TEMPLATE_INFO (expression) - && (any_dependent_template_arguments_p - (INNERMOST_TEMPLATE_ARGS (DECL_TI_ARGS (expression))))) - return true; - - if (TREE_CODE (expression) == TEMPLATE_DECL - && !DECL_TEMPLATE_TEMPLATE_PARM_P (expression)) - return false; - return (dependent_type_p (TREE_TYPE (expression))); } diff --git a/gcc/testsuite/g++.dg/template/non-dependent10.C b/gcc/testsuite/g++.dg/template/non-dependent10.C deleted file mode 100644 index 369e137317c..00000000000 --- a/gcc/testsuite/g++.dg/template/non-dependent10.C +++ /dev/null @@ -1,21 +0,0 @@ -// { dg-do compile } - -// Origin: Giovanni Bajo - -// Two-phase name lookup for address of member: -// Detecting error during parsing - -struct S -{ - char i; -}; - -template -struct X -{}; - -template -struct Foo -{ - X<&S::i> x; // { dg-error "convert|no type" } -}; diff --git a/gcc/testsuite/g++.dg/template/non-dependent7.C b/gcc/testsuite/g++.dg/template/non-dependent7.C deleted file mode 100644 index c046312d558..00000000000 --- a/gcc/testsuite/g++.dg/template/non-dependent7.C +++ /dev/null @@ -1,22 +0,0 @@ -// { dg-do compile } - -// Origin: Giovanni Bajo - -// Two-phase name lookup for address of member: -// Overloading function - -struct S -{ - int f(); - int f(int); -}; - -template -struct X -{}; - -template -struct Foo -{ - X<&S::f> x; -}; diff --git a/gcc/testsuite/g++.dg/template/non-dependent8.C b/gcc/testsuite/g++.dg/template/non-dependent8.C deleted file mode 100644 index 0adac25f08d..00000000000 --- a/gcc/testsuite/g++.dg/template/non-dependent8.C +++ /dev/null @@ -1,22 +0,0 @@ -// { dg-do compile } - -// Origin: Giovanni Bajo - -// Two-phase name lookup for address of member: -// Detecting overloading function error during parsing - -struct S -{ - int f(char); - int f(int); -}; - -template -struct X -{}; - -template -struct Foo -{ - X<&S::f> x; // { dg-error "convert|no type" } -}; diff --git a/gcc/testsuite/g++.dg/template/non-dependent9.C b/gcc/testsuite/g++.dg/template/non-dependent9.C deleted file mode 100644 index ee34327ad63..00000000000 --- a/gcc/testsuite/g++.dg/template/non-dependent9.C +++ /dev/null @@ -1,22 +0,0 @@ -// { dg-do compile } - -// Origin: Giovanni Bajo - -// PR c++/13092: ICE taking address of member which is non-dependent - -struct S -{ - int i; -}; - -template -struct X -{}; - -template -struct Foo -{ - X<&S::i> x; -}; - -template struct Foo; -- 2.30.2