[cfe-commits] r82840 - /cfe/trunk/lib/Sema/SemaTemplate.cpp
Douglas Gregor
dgregor at apple.com
Fri Sep 25 20:42:00 PDT 2009
Author: dgregor
Date: Fri Sep 25 22:41:46 2009
New Revision: 82840
URL: http://llvm.org/viewvc/llvm-project?rev=82840&view=rev
Log:
Use Sema::getMostSpecialized to eliminate a redundant implementation of the most-specialized function template
Modified:
cfe/trunk/lib/Sema/SemaTemplate.cpp
Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=82840&r1=82839&r2=82840&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaTemplate.cpp (original)
+++ cfe/trunk/lib/Sema/SemaTemplate.cpp Fri Sep 25 22:41:46 2009
@@ -2953,65 +2953,18 @@
}
}
- if (Candidates.empty()) {
- Diag(FD->getLocation(), diag::err_function_template_spec_no_match)
- << FD->getDeclName();
- // FIXME: Print the almost-ran candidates.
+ // Find the most specialized function template.
+ FunctionDecl *Specialization = getMostSpecialized(Candidates.data(),
+ Candidates.size(),
+ TPOC_Other,
+ FD->getLocation(),
+ PartialDiagnostic(diag::err_function_template_spec_no_match)
+ << FD->getDeclName(),
+ PartialDiagnostic(diag::err_function_template_spec_ambiguous)
+ << FD->getDeclName() << HasExplicitTemplateArgs,
+ PartialDiagnostic(diag::note_function_template_spec_matched));
+ if (!Specialization)
return true;
- }
-
- if (Candidates.size() > 1) {
- // C++ [temp.func.order]p1:
- // Partial ordering of overloaded function template declarations is used
- // [...] when [...] an explicit specialization (14.7.3) refers to a
- // function template specialization.
- CandidateSet::iterator Best = Candidates.begin();
- for (CandidateSet::iterator C = Best + 1, CEnd = Candidates.end();
- C != CEnd; ++C) {
- if (getMoreSpecializedTemplate((*Best)->getPrimaryTemplate(),
- (*C)->getPrimaryTemplate(),
- TPOC_Other)
- == (*C)->getPrimaryTemplate())
- Best = C;
- }
-
- bool Ambiguous = false;
- for (CandidateSet::iterator C = Candidates.begin(), CEnd = Candidates.end();
- C != CEnd; ++C) {
- if (C != Best &&
- getMoreSpecializedTemplate((*Best)->getPrimaryTemplate(),
- (*C)->getPrimaryTemplate(),
- TPOC_Other)
- != (*Best)->getPrimaryTemplate()) {
- Ambiguous = true;
- break;
- }
- }
-
- if (Ambiguous) {
- // Partial ordering was ambiguous.
- Diag(FD->getLocation(), diag::err_function_template_spec_ambiguous)
- << FD->getDeclName()
- << HasExplicitTemplateArgs;
-
- for (CandidateSet::iterator C = Candidates.begin(),
- CEnd = Candidates.end();
- C != CEnd; ++C)
- Diag((*C)->getLocation(), diag::note_function_template_spec_matched)
- << getTemplateArgumentBindingsText(
- (*C)->getPrimaryTemplate()->getTemplateParameters(),
- *(*C)->getTemplateSpecializationArgs());
-
- return true;
- }
-
- // Move the best candidate to the front of the candidates list.
- std::swap(*Best, Candidates.front());
- }
-
- // The first candidate is a prior declaration of the function template
- // specialization we're declared here, which we may have created above.
- FunctionDecl *Specialization = Candidates.front();
// FIXME: Check if the prior specialization has a point of instantiation.
// If so, we have run afoul of C++ [temp.expl.spec]p6.
More information about the cfe-commits
mailing list