When we determine that an initialization sequence failed due to an

incomplete type, keep track of the actual type that was
incomplete. Otherwise, we might fail to produce a diagnostic. Fixes
PR12498.

llvm-svn: 154432
This commit is contained in:
Douglas Gregor 2012-04-10 20:43:46 +00:00
parent 4f53074cca
commit 85f3423509
3 changed files with 29 additions and 3 deletions

View File

@ -734,6 +734,9 @@ private:
/// \brief The candidate set created when initialization failed.
OverloadCandidateSet FailedCandidateSet;
/// \brief The incomplete type that caused a failure.
QualType FailedIncompleteType;
/// \brief Prints a follow-up note that highlights the location of
/// the initialized entity, if it's remote.
void PrintInitLocationNote(Sema &S, const InitializedEntity &Entity);
@ -949,6 +952,8 @@ public:
void SetFailed(FailureKind Failure) {
SequenceKind = FailedSequence;
this->Failure = Failure;
assert((Failure != FK_Incomplete || !FailedIncompleteType.isNull()) &&
"Incomplete type failure requires a type!");
}
/// \brief Note that this initialization sequence failed due to failed
@ -967,6 +972,13 @@ public:
return FailedOverloadResult;
}
/// \brief Note that this initialization sequence failed due to an
/// incomplete type.
void setIncompleteTypeFailure(QualType IncompleteType) {
FailedIncompleteType = IncompleteType;
SetFailed(FK_Incomplete);
}
/// \brief Determine why initialization failed.
FailureKind getFailureKind() const {
assert(Failed() && "Not an initialization failure!");

View File

@ -2877,7 +2877,7 @@ static void TryConstructorInitialization(Sema &S,
// The type we're constructing needs to be complete.
if (S.RequireCompleteType(Kind.getLocation(), DestType, 0)) {
Sequence.SetFailed(InitializationSequence::FK_Incomplete);
Sequence.setIncompleteTypeFailure(DestType);
return;
}
@ -3109,7 +3109,7 @@ static void TryListInitialization(Sema &S,
}
if (DestType->isRecordType()) {
if (S.RequireCompleteType(InitList->getLocStart(), DestType, S.PDiag())) {
Sequence.SetFailed(InitializationSequence::FK_Incomplete);
Sequence.setIncompleteTypeFailure(DestType);
return;
}
@ -5687,7 +5687,7 @@ bool InitializationSequence::Diagnose(Sema &S,
break;
case FK_Incomplete:
S.RequireCompleteType(Kind.getLocation(), DestType,
S.RequireCompleteType(Kind.getLocation(), FailedIncompleteType,
diag::err_init_incomplete_type);
break;

View File

@ -267,3 +267,17 @@ namespace PR12120 {
struct B { explicit B(short); B(long); }; // expected-note 2 {{candidate}}
B b = { 0 }; // expected-error {{ambiguous}}
}
namespace PR12498 {
class ArrayRef; // expected-note{{forward declaration}}
struct C {
void foo(const ArrayRef&); // expected-note{{passing argument to parameter here}}
};
static void bar(C* c)
{
c->foo({ nullptr, 1 }); // expected-error{{initialization of incomplete type 'const PR12498::ArrayRef'}}
}
}