forked from OSchip/llvm-project
Make the diagnostic message more consistant. Update the type comparison to
handle non-pointer types. This is for the extra info printed when function types are compared. llvm-svn: 146525
This commit is contained in:
parent
bc96f37253
commit
96ed5b6b47
|
@ -1023,7 +1023,7 @@ def err_init_conversion_failed : Error<
|
|||
"%select{rvalue|lvalue}2 of type %3"
|
||||
"%select{|: different classes (%5 vs %6)"
|
||||
"|: different number of parameters (%5 vs %6)"
|
||||
"|: type mismatch in %ordinal5 parameter (%6 vs %7)"
|
||||
"|: type mismatch at %ordinal5 parameter (%6 vs %7)"
|
||||
"|: different return type (%5 vs %6)"
|
||||
"|: different qualifiers ("
|
||||
"%select{none|const|restrict|const and restrict|volatile|const and volatile|"
|
||||
|
@ -1855,7 +1855,7 @@ def note_ovl_candidate : Note<"candidate "
|
|||
"is an inherited constructor}0%1"
|
||||
"%select{| has different class (expected %3 but has %4)"
|
||||
"| has different number of parameters (expected %3 but has %4)"
|
||||
"| has type mismatch in %ordinal3 parameter (expected %4 but has %5)"
|
||||
"| has type mismatch at %ordinal3 parameter (expected %4 but has %5)"
|
||||
"| has different return type (%3 expected but has %4)"
|
||||
"| has different qualifiers (expected "
|
||||
"%select{none|const|restrict|const and restrict|volatile|const and volatile"
|
||||
|
|
|
@ -2177,6 +2177,12 @@ enum {
|
|||
/// parameter types, and different return types.
|
||||
void Sema::HandleFunctionTypeMismatch(PartialDiagnostic &PDiag,
|
||||
QualType FromType, QualType ToType) {
|
||||
// If either type is not valid, include no extra info.
|
||||
if (FromType.isNull() || ToType.isNull()) {
|
||||
PDiag << ft_default;
|
||||
return;
|
||||
}
|
||||
|
||||
// Get the function type from the pointers.
|
||||
if (FromType->isMemberPointerType() && ToType->isMemberPointerType()) {
|
||||
const MemberPointerType *FromMember = FromType->getAs<MemberPointerType>(),
|
||||
|
@ -2188,24 +2194,17 @@ void Sema::HandleFunctionTypeMismatch(PartialDiagnostic &PDiag,
|
|||
}
|
||||
FromType = FromMember->getPointeeType();
|
||||
ToType = ToMember->getPointeeType();
|
||||
} else if (FromType->isPointerType() && ToType->isPointerType()) {
|
||||
FromType = FromType->getPointeeType();
|
||||
ToType = ToType->getPointeeType();
|
||||
} else {
|
||||
PDiag << ft_default;
|
||||
return;
|
||||
}
|
||||
|
||||
if (FromType->isPointerType())
|
||||
FromType = FromType->getPointeeType();
|
||||
if (ToType->isPointerType())
|
||||
ToType = ToType->getPointeeType();
|
||||
|
||||
// Remove references.
|
||||
FromType = FromType.getNonReferenceType();
|
||||
ToType = ToType.getNonReferenceType();
|
||||
|
||||
// If either type is not valid, of the types are the same, no extra info.
|
||||
if (FromType.isNull() || ToType.isNull() ||
|
||||
Context.hasSameType(FromType, ToType)) {
|
||||
PDiag << ft_default;
|
||||
return;
|
||||
}
|
||||
|
||||
// Don't print extra info for non-specialized template functions.
|
||||
if (FromType->isInstantiationDependentType() &&
|
||||
!FromType->getAs<TemplateSpecializationType>()) {
|
||||
|
@ -2213,6 +2212,12 @@ void Sema::HandleFunctionTypeMismatch(PartialDiagnostic &PDiag,
|
|||
return;
|
||||
}
|
||||
|
||||
// No extra info for same types.
|
||||
if (Context.hasSameType(FromType, ToType)) {
|
||||
PDiag << ft_default;
|
||||
return;
|
||||
}
|
||||
|
||||
const FunctionProtoType *FromFunction = FromType->getAs<FunctionProtoType>(),
|
||||
*ToFunction = ToType->getAs<FunctionProtoType>();
|
||||
|
||||
|
|
|
@ -156,7 +156,7 @@ namespace test1 {
|
|||
}
|
||||
|
||||
void parameter_mismatch() {
|
||||
void (*ptr1)(double) = &fun; // expected-error {{cannot initialize a variable of type 'void (*)(double)' with an rvalue of type 'void (*)(int)': type mismatch in 1st parameter ('double' vs 'int')}}
|
||||
void (*ptr1)(double) = &fun; // expected-error {{cannot initialize a variable of type 'void (*)(double)' with an rvalue of type 'void (*)(int)': type mismatch at 1st parameter ('double' vs 'int')}}
|
||||
void (*ptr2)(double);
|
||||
ptr2 = &fun; // expected-error {{assigning to 'void (*)(double)' from incompatible type 'void (*)(int)': type mismatch at 1st parameter ('double' vs 'int')}}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue