aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/parser.c5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/parse/crash30.C18
4 files changed, 32 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index f3f0361..4055464 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2005-10-08 James A. Morrison <phython@gcc.gnu.org>
+
+ PR c++/22172
+ * parser.c (cp_parser_postfix_expression) <RID_TYPENAME>: Treat nontype
+ scopes as nondependent.
+
2005-10-06 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
* call.c (resolve_args): Remove redundant test.
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 08af6e2..a4eedc1 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -3986,8 +3986,9 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p)
return error_mark_node;
/* If we look up a template-id in a non-dependent qualifying
scope, there's no need to create a dependent type. */
- else if (TREE_CODE (id) == TYPE_DECL
- && !dependent_type_p (parser->scope))
+ if (TREE_CODE (id) == TYPE_DECL
+ && (!TYPE_P (scope)
+ || !dependent_type_p (parser->scope)))
type = TREE_TYPE (id);
/* Create a TYPENAME_TYPE to represent the type to which the
functional cast is being performed. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d189677..811c6cb 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2005-10-08 James A. Morrison <phython@gcc.gnu.org>
+
+ PR c++/22172
+ * g++.dg/parse/crash30.C: New test.
+
2005-10-07 Richard Guenther <rguenther@suse.de>
PR middle-end/24227
diff --git a/gcc/testsuite/g++.dg/parse/crash30.C b/gcc/testsuite/g++.dg/parse/crash30.C
new file mode 100644
index 0000000..9b68535
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/crash30.C
@@ -0,0 +1,18 @@
+// { dg-do compile }
+namespace N { template<int> struct A { operator int() const; }; }
+namespace M { template<int> struct A {}; }
+namespace P { typedef int I; }
+
+template<typename> void foo()
+{
+ +typename N::A<0>(); // { dg-bogus "expected" }
+}
+
+template<typename> void bar()
+{
+ +typename M::A<0>; // { dg-error "expected" }
+}
+
+template<typename T> void baz() {
+ typename P::I i; // { dg-bogus "expected" }
+}