[cfe-commits] r99390 - /cfe/trunk/lib/Sema/SemaDecl.cpp
John McCall
rjmccall at apple.com
Wed Mar 24 01:27:58 PDT 2010
Author: rjmccall
Date: Wed Mar 24 03:27:58 2010
New Revision: 99390
URL: http://llvm.org/viewvc/llvm-project?rev=99390&view=rev
Log:
Correct that last fixit: if the user wrote
template <> friend void foo(int);
we need to change it to
friend void foo<>(int);
or else the user won't get the template specialization they obviously want.
Modified:
cfe/trunk/lib/Sema/SemaDecl.cpp
Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=99390&r1=99389&r2=99390&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Wed Mar 24 03:27:58 2010
@@ -2921,9 +2921,24 @@
// C++0x [temp.expl.spec]p20 forbids "template<> void foo(int);".
if (isFriend && isFunctionTemplateSpecialization) {
- SourceRange Range = TemplateParams->getSourceRange();
+ // We want to remove the "template<>", found here.
+ SourceRange RemoveRange = TemplateParams->getSourceRange();
+
+ // If we remove the template<> and the name is not a
+ // template-id, we're actually silently creating a problem:
+ // the friend declaration will refer to an untemplated decl,
+ // and clearly the user wants a template specialization. So
+ // we need to insert '<>' after the name.
+ SourceLocation InsertLoc;
+ if (D.getName().getKind() != UnqualifiedId::IK_TemplateId) {
+ InsertLoc = D.getName().getSourceRange().getEnd();
+ InsertLoc = PP.getLocForEndOfToken(InsertLoc);
+ }
+
Diag(D.getIdentifierLoc(), diag::err_template_spec_decl_friend)
- << Name << Range << CodeModificationHint::CreateRemoval(Range);
+ << Name << RemoveRange
+ << CodeModificationHint::CreateRemoval(RemoveRange)
+ << CodeModificationHint::CreateInsertion(InsertLoc, "<>");
}
}
More information about the cfe-commits
mailing list