diff mbox series

[PR,c++/90754] name lookup ICE

Message ID f2f0d48e-8e9a-0a09-e7d2-26ac54f3f31f@acm.org
State New
Headers show
Series [PR,c++/90754] name lookup ICE | expand

Commit Message

Nathan Sidwell June 17, 2019, 1:42 p.m. UTC
It turned out qualify_lookup was rejecting non-decls, and hence the 
ordering of that call relative to other tests was significant.  I've 
restored the relative ordering to that prior to my reimplementation of 
lookup_type_scope_1.

applying to trunk.

nathan
diff mbox series

Patch

2019-06-17  Nathan Sidwell  <nathan@acm.org>

	PR c++/90754
	* name-lookup.c (lookup_type_scope_1): Calll qualify_lookup before
	checking context.

	PR c++/90754
	* g++.dg/lookup/pr90754.C: New.

Index: gcc/cp/name-lookup.c
===================================================================
--- gcc/cp/name-lookup.c	(revision 272381)
+++ gcc/cp/name-lookup.c	(working copy)
@@ -6488,13 +6488,13 @@  lookup_type_scope_1 (tree name, tag_scop
 	   correctly.  */
 	if (tree type = iter->type)
-	  if ((scope != ts_current
-	       || LOCAL_BINDING_P (iter)
-	       || DECL_CONTEXT (type) == iter->scope->this_entity)
-	      && qualify_lookup (iter->type, LOOKUP_PREFER_TYPES))
-	    return iter->type;
+	  if (qualify_lookup (type, LOOKUP_PREFER_TYPES)
+	      && (scope != ts_current
+		  || LOCAL_BINDING_P (iter)
+		  || DECL_CONTEXT (type) == iter->scope->this_entity))
+	    return type;
 
-	if ((scope != ts_current
-	     || !INHERITED_VALUE_BINDING_P (iter))
-	    && qualify_lookup (iter->value, LOOKUP_PREFER_TYPES))
+	if (qualify_lookup (iter->value, LOOKUP_PREFER_TYPES)
+	    && (scope != ts_current
+		|| !INHERITED_VALUE_BINDING_P (iter)))
 	  return iter->value;
       }
Index: gcc/testsuite/g++.dg/lookup/pr90754.C
===================================================================
--- gcc/testsuite/g++.dg/lookup/pr90754.C	(revision 0)
+++ gcc/testsuite/g++.dg/lookup/pr90754.C	(working copy)
@@ -0,0 +1,11 @@ 
+// PR c++/90754 ICE in type lookup.
+
+class A {
+  struct COMTypeInfo;
+};
+class B {
+  struct COMTypeInfo;
+};
+class C : A, B {
+  struct COMTypeInfo;
+};