diff options
author | Jason Merrill <jason@redhat.com> | 2004-06-10 14:28:53 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2004-06-10 14:28:53 -0400 |
commit | 5a57f1b2c005ba13c7214d1d4cf8a6d882f43b59 (patch) | |
tree | a5a8617488c066ac09291b56eec8860859a2ef95 /gcc | |
parent | 078c8b08a0a0d7db27f491a4212957c967619f67 (diff) | |
download | gcc-5a57f1b2c005ba13c7214d1d4cf8a6d882f43b59.zip gcc-5a57f1b2c005ba13c7214d1d4cf8a6d882f43b59.tar.gz gcc-5a57f1b2c005ba13c7214d1d4cf8a6d882f43b59.tar.bz2 |
re PR c++/15875 (rejects pointer to member in template)
PR c++/15875
Revert:
2004-06-01 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
* 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) <SCOPE_REF case>: Use pp_expression.
(dump_expr) <SCOPE_REF case>: Likewise.
From-SVN: r82933
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/cp/cxx-pretty-print.c | 4 | ||||
-rw-r--r-- | gcc/cp/error.c | 8 | ||||
-rw-r--r-- | gcc/cp/init.c | 10 | ||||
-rw-r--r-- | gcc/cp/pt.c | 36 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/non-dependent10.C | 21 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/non-dependent7.C | 22 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/non-dependent8.C | 22 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/non-dependent9.C | 22 |
9 files changed, 37 insertions, 121 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5f49e4b..278e4d4 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,16 @@ +2004-06-10 Jason Merrill <jason@redhat.com> + + PR c++/15875 + Revert: + 2004-06-01 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + * 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) <SCOPE_REF case>: Use pp_expression. + (dump_expr) <SCOPE_REF case>: Likewise. + 2004-06-10 Mark Mitchell <mark@codesourcery.com> PR c++/15227 diff --git a/gcc/cp/cxx-pretty-print.c b/gcc/cp/cxx-pretty-print.c index 328ece0..c5e667d 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 faa2bfb..6e18650 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 5f0872e..1c00356 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 fd75f78..ff96eaa 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 369e137..0000000 --- a/gcc/testsuite/g++.dg/template/non-dependent10.C +++ /dev/null @@ -1,21 +0,0 @@ -// { dg-do compile } - -// Origin: Giovanni Bajo <giovannibajo@libero.it> - -// Two-phase name lookup for address of member: -// Detecting error during parsing - -struct S -{ - char i; -}; - -template<int S::*p> -struct X -{}; - -template <class T> -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 c046312..0000000 --- a/gcc/testsuite/g++.dg/template/non-dependent7.C +++ /dev/null @@ -1,22 +0,0 @@ -// { dg-do compile } - -// Origin: Giovanni Bajo <giovannibajo@libero.it> - -// Two-phase name lookup for address of member: -// Overloading function - -struct S -{ - int f(); - int f(int); -}; - -template<int (S::*p)()> -struct X -{}; - -template <class T> -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 0adac25..0000000 --- a/gcc/testsuite/g++.dg/template/non-dependent8.C +++ /dev/null @@ -1,22 +0,0 @@ -// { dg-do compile } - -// Origin: Giovanni Bajo <giovannibajo@libero.it> - -// Two-phase name lookup for address of member: -// Detecting overloading function error during parsing - -struct S -{ - int f(char); - int f(int); -}; - -template<int (S::*p)()> -struct X -{}; - -template <class T> -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 ee34327..0000000 --- a/gcc/testsuite/g++.dg/template/non-dependent9.C +++ /dev/null @@ -1,22 +0,0 @@ -// { dg-do compile } - -// Origin: Giovanni Bajo <giovannibajo@libero.it> - -// PR c++/13092: ICE taking address of member which is non-dependent - -struct S -{ - int i; -}; - -template<int S::*p> -struct X -{}; - -template <class T> -struct Foo -{ - X<&S::i> x; -}; - -template struct Foo<void>; |