Fix a conversion to incomplete type bug -- The error message now specifically states that the type is incomplete and points to the forward declaration of the incomplete type.

llvm-svn: 185056
This commit is contained in:
Larisse Voufo 2013-06-27 01:50:25 +00:00
parent c76e60b012
commit 64cf3efd47
4 changed files with 43 additions and 7 deletions

View File

@ -5014,6 +5014,8 @@ def err_typecheck_ambiguous_condition : Error<
"conversion %diff{from $ to $|between types}0,1 is ambiguous">;
def err_typecheck_nonviable_condition : Error<
"no viable conversion%diff{ from $ to $|}0,1">;
def err_typecheck_nonviable_condition_incomplete : Error<
"no viable conversion%diff{ from $ to incomplete type $|}0,1">;
def err_typecheck_deleted_function : Error<
"conversion function %diff{from $ to $|between types}0,1 "
"invokes a deleted function">;

View File

@ -6251,9 +6251,15 @@ bool InitializationSequence::Diagnose(Sema &S,
break;
case OR_No_Viable_Function:
if (!DestType.getNonReferenceType()->isIncompleteType() ||
!S.RequireCompleteType(Kind.getLocation(),
DestType.getNonReferenceType(),
diag::err_typecheck_nonviable_condition_incomplete,
Args[0]->getType(), Args[0]->getSourceRange()))
S.Diag(Kind.getLocation(), diag::err_typecheck_nonviable_condition)
<< Args[0]->getType() << DestType.getNonReferenceType()
<< Args[0]->getSourceRange();
<< Args[0]->getType() << Args[0]->getSourceRange()
<< DestType.getNonReferenceType();
FailedCandidateSet.NoteCandidates(S, OCD_AllCandidates, Args);
break;

View File

@ -3231,10 +3231,15 @@ Sema::DiagnoseMultipleUserDefinedConversion(Expr *From, QualType ToType) {
Diag(From->getLocStart(),
diag::err_typecheck_ambiguous_condition)
<< From->getType() << ToType << From->getSourceRange();
else if (OvResult == OR_No_Viable_Function && !CandidateSet.empty())
else if (OvResult == OR_No_Viable_Function && !CandidateSet.empty()) {
if (!ToType->isIncompleteType() ||
!RequireCompleteType(From->getLocStart(), ToType,
diag::err_typecheck_nonviable_condition_incomplete,
From->getType(), From->getSourceRange()))
Diag(From->getLocStart(),
diag::err_typecheck_nonviable_condition)
<< From->getType() << ToType << From->getSourceRange();
<< From->getType() << From->getSourceRange() << ToType;
}
else
return false;
CandidateSet.NoteCandidates(*this, OCD_AllCandidates, From);

View File

@ -0,0 +1,23 @@
// RUN: %clang_cc1 -fsyntax-only -verify %s
struct string {};
class StringPiece; // expected-note {{forward declaration of 'StringPiece'}} \
// expected-note {{forward declaration of 'StringPiece'}}
struct Test {
void expectStringPiece(const StringPiece& blah) {}; // expected-note {{passing argument to parameter 'blah' here}}
void test(const string& s) {
expectStringPiece(s); // expected-error {{no viable conversion from 'const string' to incomplete type 'const StringPiece'}}
}
};
struct TestStatic {
static void expectStringPiece(const StringPiece& blah) {}; // expected-note {{passing argument to parameter 'blah' here}}
static void test(const string& s) {
expectStringPiece(s); // expected-error {{no viable conversion from 'const string' to incomplete type 'const StringPiece'}}
}
};