]> granicus.if.org Git - clang/commitdiff
PR5520: Make sure to check whether the base type is complete before looking for
authorEli Friedman <eli.friedman@gmail.com>
Wed, 18 Nov 2009 01:28:03 +0000 (01:28 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Wed, 18 Nov 2009 01:28:03 +0000 (01:28 +0000)
operator->.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@89180 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaOverload.cpp
test/SemaCXX/arrow-operator.cpp

index 938a5d769dd4159fd10e11dbd48a75308618b519..634c9ceefc73694ad632c347538007ce99141e6b 100644 (file)
@@ -5503,6 +5503,11 @@ Sema::BuildOverloadedArrowExpr(Scope *S, ExprArg BaseIn, SourceLocation OpLoc) {
   OverloadCandidateSet CandidateSet;
   const RecordType *BaseRecord = Base->getType()->getAs<RecordType>();
 
+  if (RequireCompleteType(Base->getLocStart(), Base->getType(),
+                          PDiag(diag::err_typecheck_incomplete_tag)
+                            << Base->getSourceRange()))
+    return ExprError();
+
   LookupResult R(*this, OpName, OpLoc, LookupOrdinaryName);
   LookupQualifiedName(R, BaseRecord->getDecl());
   R.suppressDiagnostics();
index a2264958bce3018c826f211e0f33164951ee4d6b..08b3cd4cc71690b39e9f1bc1bf1e456c2fc5e601 100644 (file)
@@ -16,7 +16,10 @@ struct C : A, B {
 
 struct D : A { };
 
-void f(C &c, D& d) {
+struct E; // expected-note {{forward declaration of 'struct E'}}
+
+void f(C &c, D& d, E& e) {
   c->f(); // expected-error{{use of overloaded operator '->' is ambiguous}}
   d->f();
+  e->f(); // expected-error{{incomplete definition of type}}
 }