summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2012-04-10 20:43:46 +0000
committerDouglas Gregor <dgregor@apple.com>2012-04-10 20:43:46 +0000
commit85f342350979c5af12c6f5790ac27ac05112d0a2 (patch)
tree050402258bc49cb698d68850cf8aa6ff49c8c16b
parent4f53074cca08419abb550df2cfce0eaf33003c11 (diff)
downloadbcm5719-llvm-85f342350979c5af12c6f5790ac27ac05112d0a2.tar.gz
bcm5719-llvm-85f342350979c5af12c6f5790ac27ac05112d0a2.zip
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
-rw-r--r--clang/include/clang/Sema/Initialization.h12
-rw-r--r--clang/lib/Sema/SemaInit.cpp6
-rw-r--r--clang/test/SemaCXX/cxx0x-initializer-constructor.cpp14
3 files changed, 29 insertions, 3 deletions
diff --git a/clang/include/clang/Sema/Initialization.h b/clang/include/clang/Sema/Initialization.h
index 23cc4455dbc..4433843ff86 100644
--- a/clang/include/clang/Sema/Initialization.h
+++ b/clang/include/clang/Sema/Initialization.h
@@ -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!");
diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp
index ee051428da8..a65b41fd1cb 100644
--- a/clang/lib/Sema/SemaInit.cpp
+++ b/clang/lib/Sema/SemaInit.cpp
@@ -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;
diff --git a/clang/test/SemaCXX/cxx0x-initializer-constructor.cpp b/clang/test/SemaCXX/cxx0x-initializer-constructor.cpp
index 68c149218a7..09aca24b704 100644
--- a/clang/test/SemaCXX/cxx0x-initializer-constructor.cpp
+++ b/clang/test/SemaCXX/cxx0x-initializer-constructor.cpp
@@ -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'}}
+ }
+
+}
OpenPOWER on IntegriCloud