Moved diagnosis of forward declarations of variable templates from Parser to Sema.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@187768 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp
index 80ac116..15e6a49 100644
--- a/lib/Sema/SemaDecl.cpp
+++ b/lib/Sema/SemaDecl.cpp
@@ -4770,6 +4770,21 @@
llvm_unreachable("Unexpected context");
}
+bool Sema::HandleVariableRedeclaration(Decl *D, CXXScopeSpec &SS) {
+ // If this is a redeclaration of a variable template or a forward
+ // declaration of a variable template partial specialization
+ // with nested name specifier, complain.
+
+ if (D && SS.isNotEmpty() &&
+ (isa<VarTemplateDecl>(D) ||
+ isa<VarTemplatePartialSpecializationDecl>(D))) {
+ Diag(SS.getBeginLoc(), diag::err_forward_var_nested_name_specifier)
+ << isa<VarTemplatePartialSpecializationDecl>(D) << SS.getRange();
+ return true;
+ }
+ return false;
+}
+
NamedDecl *
Sema::ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC,
TypeSourceInfo *TInfo, LookupResult &Previous,
@@ -4907,7 +4922,8 @@
case SC_OpenCLWorkGroupLocal:
llvm_unreachable("OpenCL storage class in c++!");
}
- }
+ }
+
if (SC == SC_Static && CurContext->isRecord()) {
if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(DC)) {
if (RD->isLocalClass())
@@ -4966,7 +4982,7 @@
IsPartialSpecialization = TemplateParams->size() > 0;
} else { // if (TemplateParams->size() > 0)
- // This is a template declaration.
+ // This is a template declaration.
// Check that we can declare a template here.
if (CheckTemplateDeclScope(S, TemplateParams))
diff --git a/lib/Sema/SemaTemplateInstantiateDecl.cpp b/lib/Sema/SemaTemplateInstantiateDecl.cpp
index 0ca6611..b93fe9a 100644
--- a/lib/Sema/SemaTemplateInstantiateDecl.cpp
+++ b/lib/Sema/SemaTemplateInstantiateDecl.cpp
@@ -3461,7 +3461,6 @@
VarSpec->getTemplateArgsInfo(), InstantiationDependent) &&
"Only instantiate variable template specializations that are "
"not type-dependent");
- (void)InstantiationDependent;
// Find the variable initialization that we'll be substituting.
assert(VarSpec->getSpecializedTemplate() &&