C++ PATCH for c++/78690 (ICE with using and global type with same name)
Jason Merrill
jason@redhat.com
Fri Feb 17 20:29:00 GMT 2017
We entered type_dependent_object_expression_p considering an
IDENTIFIER_NODE, which is always dependent. But because there's a
global type with the same name, the identifier had global_type_node as
its type, which isn't recognized as a dependent type. Fixed by
handling IDENTIFIER_NODE directly.
Tested x86_64-pc-linux-gnu, applying to trunk.
-------------- next part --------------
commit d2b4bcf0dc04ea3ab7909d55bcc8a7d4703b34ca
Author: Jason Merrill <jason@redhat.com>
Date: Fri Feb 17 14:00:10 2017 -0500
PR c++/78690 - ICE with using and global type with same name
* pt.c (type_dependent_object_expression_p): True for
IDENTIFIER_NODE.
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 04479d4..9e6ce8d 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -23932,6 +23932,10 @@ type_dependent_expression_p (tree expression)
bool
type_dependent_object_expression_p (tree object)
{
+ /* An IDENTIFIER_NODE can sometimes have a TREE_TYPE, but it's still
+ dependent. */
+ if (TREE_CODE (object) == IDENTIFIER_NODE)
+ return true;
tree scope = TREE_TYPE (object);
return (!scope || dependent_scope_p (scope));
}
diff --git a/gcc/testsuite/g++.dg/template/dependent-scope1.C b/gcc/testsuite/g++.dg/template/dependent-scope1.C
new file mode 100644
index 0000000..a5c18c4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/dependent-scope1.C
@@ -0,0 +1,17 @@
+// PR c++/78690
+
+struct C;
+
+template <typename T>
+struct A
+{
+ struct C { static void bar (); };
+};
+
+template <typename T>
+struct B
+{
+ using A<T>::C;
+ void
+ foo () { C.bar (); }
+};
More information about the Gcc-patches
mailing list