forked from OSchip/llvm-project
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:
parent
c76e60b012
commit
64cf3efd47
|
@ -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">;
|
||||
|
|
|
@ -6251,9 +6251,15 @@ bool InitializationSequence::Diagnose(Sema &S,
|
|||
break;
|
||||
|
||||
case OR_No_Viable_Function:
|
||||
S.Diag(Kind.getLocation(), diag::err_typecheck_nonviable_condition)
|
||||
<< Args[0]->getType() << DestType.getNonReferenceType()
|
||||
<< Args[0]->getSourceRange();
|
||||
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() << Args[0]->getSourceRange()
|
||||
<< DestType.getNonReferenceType();
|
||||
|
||||
FailedCandidateSet.NoteCandidates(S, OCD_AllCandidates, Args);
|
||||
break;
|
||||
|
||||
|
|
|
@ -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())
|
||||
Diag(From->getLocStart(),
|
||||
diag::err_typecheck_nonviable_condition)
|
||||
<< From->getType() << ToType << From->getSourceRange();
|
||||
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() << From->getSourceRange() << ToType;
|
||||
}
|
||||
else
|
||||
return false;
|
||||
CandidateSet.NoteCandidates(*this, OCD_AllCandidates, From);
|
||||
|
|
|
@ -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'}}
|
||||
}
|
||||
};
|
||||
|
Loading…
Reference in New Issue