diff options
author | Richard Trieu <rtrieu@google.com> | 2011-11-23 22:32:32 +0000 |
---|---|---|
committer | Richard Trieu <rtrieu@google.com> | 2011-11-23 22:32:32 +0000 |
commit | caff247882fce352e2589e91d47d108daf466cef (patch) | |
tree | 6b54c50bacfbbcbd291fc58072b711680592a248 /clang/lib/Sema/SemaTemplateDeduction.cpp | |
parent | 049e9e4d2268b27a1a89d37012aa71a8f64d7935 (diff) | |
download | bcm5719-llvm-caff247882fce352e2589e91d47d108daf466cef.tar.gz bcm5719-llvm-caff247882fce352e2589e91d47d108daf466cef.zip |
Add feature to diagnostics that will provide more information on function
pointer mismatch. Cases covered are: initialization, assignment, and function
arguments. Additional text will give the extra information about the nature
of the mismatch: different classes for member functions, wrong number of
parameters, different parameter type, different return type, and function
qualifier mismatch.
llvm-svn: 145114
Diffstat (limited to 'clang/lib/Sema/SemaTemplateDeduction.cpp')
-rw-r--r-- | clang/lib/Sema/SemaTemplateDeduction.cpp | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp index 17987da16ad..28f489a43be 100644 --- a/clang/lib/Sema/SemaTemplateDeduction.cpp +++ b/clang/lib/Sema/SemaTemplateDeduction.cpp @@ -3783,7 +3783,8 @@ Sema::getMostSpecialized(UnresolvedSetIterator SpecBegin, const PartialDiagnostic &NoneDiag, const PartialDiagnostic &AmbigDiag, const PartialDiagnostic &CandidateDiag, - bool Complain) { + bool Complain, + QualType TargetType) { if (SpecBegin == SpecEnd) { if (Complain) Diag(Loc, NoneDiag); @@ -3837,11 +3838,16 @@ Sema::getMostSpecialized(UnresolvedSetIterator SpecBegin, if (Complain) // FIXME: Can we order the candidates in some sane way? - for (UnresolvedSetIterator I = SpecBegin; I != SpecEnd; ++I) - Diag((*I)->getLocation(), CandidateDiag) - << getTemplateArgumentBindingsText( + for (UnresolvedSetIterator I = SpecBegin; I != SpecEnd; ++I) { + PartialDiagnostic PD = CandidateDiag; + PD << getTemplateArgumentBindingsText( cast<FunctionDecl>(*I)->getPrimaryTemplate()->getTemplateParameters(), *cast<FunctionDecl>(*I)->getTemplateSpecializationArgs()); + if (!TargetType.isNull()) + HandleFunctionTypeMismatch(PD, cast<FunctionDecl>(*I)->getType(), + TargetType); + Diag((*I)->getLocation(), PD); + } return SpecEnd; } |