From 0fc339a882e3c2095840b3eb7796c7f4aabe7783 Mon Sep 17 00:00:00 2001
From: phython <phython@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Sat, 8 Oct 2005 18:11:02 +0000
Subject: [PATCH] 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.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@105120 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/cp/ChangeLog                     |  6 ++++++
 gcc/cp/parser.c                      |  5 +++--
 gcc/testsuite/ChangeLog              |  5 +++++
 gcc/testsuite/g++.dg/parse/crash30.C | 18 ++++++++++++++++++
 4 files changed, 32 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/parse/crash30.C

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index f3f03619bb96..4055464a28a3 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 08af6e2f49b9..a4eedc178168 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 d189677cebea..811c6cb6dbb6 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 000000000000..9b68535faa48
--- /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" }
+}
-- 
GitLab