================
Comment at: ../llvm/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td:3395
@@ -3394,1 +3394,3 @@
"explicit specialization of %0 after instantiation">;
+def err_part_specialization_after_instantiation : Error<
+ "partial specialization of %0 after instantiation">;
----------------
Please use `partial_spec` or `partial_specialization` rather than
`part_specialization`, like other diagnostics do.
================
Comment at: ../llvm/tools/clang/lib/Sema/SemaTemplate.cpp:6225
@@ +6224,3 @@
+ // unit in which such a use occurs; no diagnostic is required.
+ if (isPartialSpecialization) {
+ auto *ThisPartialSpec =
----------------
We don't need these checks for a redeclaration:
if (isPartialSpecialization && !PrevDecl) {
================
Comment at: ../llvm/tools/clang/lib/Sema/SemaTemplate.cpp:6227
@@ +6226,3 @@
+ auto *ThisPartialSpec =
+ static_cast<ClassTemplatePartialSpecializationDecl *>(Specialization);
+ for (const auto &S : ClassTemplate->specializations()) {
----------------
Use `cast`, not `static_cast`, here. (It'll assert if the type doesn't match.)
================
Comment at: ../llvm/tools/clang/lib/Sema/SemaTemplate.cpp:6232
@@ +6231,3 @@
+ S->hasDefinition() &&
+ !DeduceTemplateArguments(ThisPartialSpec, S->getTemplateArgs(),
Info)) {
+ auto *InstantiatedFrom =
----------------
Hmm, what happens if we get an error outside of the immediate context during
this deduction? Are we allowed to reject the program for that reason?
For instance:
template<typename T> struct X { typedef typename T::type type; };
template<typename T, typename U> struct A {};
A<int, int> Aint;
template<typename T> struct A<T, typename X<T>::type> {};
Do we provide a sufficiently useful template instantiation backtrace in this
case?
http://reviews.llvm.org/D5744
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits