shafik created this revision.
shafik added reviewers: erichkeane, aaron.ballman.
Herald added a project: All.
shafik requested review of this revision.

In `Sema::LookupTemplateName(...)` seeks to assert that the `ObjectType` is 
complete or being defined. If the type is incomplete it will attempt to 
unconditionally cast it to a `TagType` and not all incomplete types are a 
`TagType`. For example the type could be `void` or it could be an 
`IncompleteArray`.

This change adds an additional check to confirm it is a `TagType` before 
attempting to check if it is incomplete or being defined.


https://reviews.llvm.org/D132712

Files:
  clang/lib/Sema/SemaTemplate.cpp
  clang/test/SemaCXX/member-expr.cpp


Index: clang/test/SemaCXX/member-expr.cpp
===================================================================
--- clang/test/SemaCXX/member-expr.cpp
+++ clang/test/SemaCXX/member-expr.cpp
@@ -228,3 +228,19 @@
         .i;  // expected-error {{member reference type 'S *' is a pointer; did 
you mean to use '->'}}
   }
 }
+
+namespace LookupTemplateNameAssert {
+void f() {}
+
+typedef int at[];
+const at& f2(){}
+
+void g() {
+  f().junk<int>(); // expected-error {{member reference base type 'void' is 
not a structure or union}}
+// expected-error@-1 {{expected '(' for function-style cast or type 
construction}}
+// expected-error@-2 {{expected expression}}
+  f2().junk<int>(); // expected-error {{member reference base type 'const at' 
(aka 'const int[]') is not a structure or union}}
+// expected-error@-1 {{expected '(' for function-style cast or type 
construction}}
+// expected-error@-2 {{expected expression}}
+}
+}
Index: clang/lib/Sema/SemaTemplate.cpp
===================================================================
--- clang/lib/Sema/SemaTemplate.cpp
+++ clang/lib/Sema/SemaTemplate.cpp
@@ -398,7 +398,7 @@
     assert(SS.isEmpty() && "ObjectType and scope specifier cannot coexist");
     LookupCtx = computeDeclContext(ObjectType);
     IsDependent = !LookupCtx && ObjectType->isDependentType();
-    assert((IsDependent || !ObjectType->isIncompleteType() ||
+    assert((IsDependent || !ObjectType->getAs<TagType>() || 
!ObjectType->isIncompleteType() ||
             ObjectType->castAs<TagType>()->isBeingDefined()) &&
            "Caller should have completed object type");
 


Index: clang/test/SemaCXX/member-expr.cpp
===================================================================
--- clang/test/SemaCXX/member-expr.cpp
+++ clang/test/SemaCXX/member-expr.cpp
@@ -228,3 +228,19 @@
         .i;  // expected-error {{member reference type 'S *' is a pointer; did you mean to use '->'}}
   }
 }
+
+namespace LookupTemplateNameAssert {
+void f() {}
+
+typedef int at[];
+const at& f2(){}
+
+void g() {
+  f().junk<int>(); // expected-error {{member reference base type 'void' is not a structure or union}}
+// expected-error@-1 {{expected '(' for function-style cast or type construction}}
+// expected-error@-2 {{expected expression}}
+  f2().junk<int>(); // expected-error {{member reference base type 'const at' (aka 'const int[]') is not a structure or union}}
+// expected-error@-1 {{expected '(' for function-style cast or type construction}}
+// expected-error@-2 {{expected expression}}
+}
+}
Index: clang/lib/Sema/SemaTemplate.cpp
===================================================================
--- clang/lib/Sema/SemaTemplate.cpp
+++ clang/lib/Sema/SemaTemplate.cpp
@@ -398,7 +398,7 @@
     assert(SS.isEmpty() && "ObjectType and scope specifier cannot coexist");
     LookupCtx = computeDeclContext(ObjectType);
     IsDependent = !LookupCtx && ObjectType->isDependentType();
-    assert((IsDependent || !ObjectType->isIncompleteType() ||
+    assert((IsDependent || !ObjectType->getAs<TagType>() || !ObjectType->isIncompleteType() ||
             ObjectType->castAs<TagType>()->isBeingDefined()) &&
            "Caller should have completed object type");
 
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to