aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2004-06-10 14:28:53 -0400
committerJason Merrill <jason@gcc.gnu.org>2004-06-10 14:28:53 -0400
commit5a57f1b2c005ba13c7214d1d4cf8a6d882f43b59 (patch)
treea5a8617488c066ac09291b56eec8860859a2ef95 /gcc
parent078c8b08a0a0d7db27f491a4212957c967619f67 (diff)
downloadgcc-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/ChangeLog13
-rw-r--r--gcc/cp/cxx-pretty-print.c4
-rw-r--r--gcc/cp/error.c8
-rw-r--r--gcc/cp/init.c10
-rw-r--r--gcc/cp/pt.c36
-rw-r--r--gcc/testsuite/g++.dg/template/non-dependent10.C21
-rw-r--r--gcc/testsuite/g++.dg/template/non-dependent7.C22
-rw-r--r--gcc/testsuite/g++.dg/template/non-dependent8.C22
-rw-r--r--gcc/testsuite/g++.dg/template/non-dependent9.C22
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>;