]> granicus.if.org Git - clang/commitdiff
Remove a bogus diagnostic preventing static data member templates from being
authorRichard Smith <richard-llvm@metafoo.co.uk>
Wed, 18 Sep 2013 23:09:24 +0000 (23:09 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Wed, 18 Sep 2013 23:09:24 +0000 (23:09 +0000)
defined with no initializer.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@190970 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
include/clang/Sema/Sema.h
lib/Parse/ParseDecl.cpp
lib/Sema/SemaDecl.cpp
test/SemaCXX/cxx1y-variable-templates_in_class.cpp

index f53ca666d55112620f74720d65b821c65296df7d..46733b086992ef766c3dca5e7a10a1eca60c3064 100644 (file)
@@ -4459,9 +4459,6 @@ def ext_standalone_specifier : ExtWarn<"'%0' is not permitted on a declaration "
 def err_standalone_class_nested_name_specifier : Error<
   "forward declaration of %select{class|struct|interface|union|enum}0 cannot "
   "have a nested name specifier">;
-def err_forward_var_nested_name_specifier : Error<
-  "forward declaration of variable template%select{| partial specialization}0 cannot "
-  "have a nested name specifier">;
 def err_typecheck_sclass_func : Error<"illegal storage class on function">;
 def err_static_block_func : Error<
   "function declared in block scope cannot have 'static' storage class">;
index 5d0f0813910b5ed7b1e174c32052a5d6d53bc9a2..b914cb2b209293f47a4acc03e3f57faad049e8bf 100644 (file)
@@ -1460,7 +1460,6 @@ public:
                                     LookupResult &Previous);
   NamedDecl* ActOnTypedefNameDecl(Scope* S, DeclContext* DC, TypedefNameDecl *D,
                                   LookupResult &Previous, bool &Redeclaration);
-  bool HandleVariableRedeclaration(Decl *D, CXXScopeSpec &SS);
   NamedDecl *ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC,
                                      TypeSourceInfo *TInfo,
                                      LookupResult &Previous,
index 915fb607a68d43de15552e3cb1c1e8355807e7a5..a1a796de4140072d6280e6f1d807a7abc13525b1 100644 (file)
@@ -1804,11 +1804,6 @@ Decl *Parser::ParseDeclarationAfterDeclaratorAndAttributes(Declarator &D,
     ThisDecl = Actions.ActOnTemplateDeclarator(getCurScope(),
                                                *TemplateInfo.TemplateParams,
                                                D);
-    if (Tok.is(tok::semi) &&
-       Actions.HandleVariableRedeclaration(ThisDecl, D.getCXXScopeSpec())) {
-      SkipUntil(tok::semi, true, true);
-      return 0;
-    }
     if (VarTemplateDecl *VT = dyn_cast_or_null<VarTemplateDecl>(ThisDecl))
       // Re-direct this decl to refer to the templated decl so that we can
       // initialize it.
index beffe414f56792ed1f315f8577e0b69f7a9c4c94..4d4637fd1430131fd6b8335fbe6a4ad4f8a4ba8c 100644 (file)
@@ -4808,21 +4808,6 @@ static bool shouldConsiderLinkage(const FunctionDecl *FD) {
   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,
index c878c13906dde525f4e1d7b7f434969a3a1a9a68..139dd982b3b1861d7e9188b2029748d59d6b145d 100644 (file)
@@ -49,8 +49,8 @@ namespace out_of_line {
     template<typename T, typename T0> static CONST T right = T(100);
     template<typename T> static CONST T right<T,int> = T(5);
   };
-  template<typename T, typename T0> CONST T B3::right;  // expected-error {{forward declaration of variable template cannot have a nested name specifier}}
-  template<typename T> CONST T B3::right<T,int>;        // expected-error {{forward declaration of variable template partial specialization cannot have a nested name specifier}}
+  template<typename T, typename T0> CONST T B3::right;
+  template<typename T> CONST T B3::right<T,int>;
 
   class B4 {
     template<typename T, typename T0> static CONST T right;
@@ -58,9 +58,8 @@ namespace out_of_line {
     template<typename T, typename T0> static CONST T right_def = T(100);
     template<typename T> static CONST T right_def<T,int>;   // expected-note {{explicit instantiation refers here}}
   };
-  template<typename T, typename T0> CONST T B4::right;  // expected-error {{forward declaration of variable template cannot have a nested name specifier}}
-  template<typename T> CONST T B4::right<T,int>;        // expected-error {{forward declaration of variable template partial specialization cannot have a nested name specifier}} \
-                                                        // expected-note {{explicit instantiation refers here}}
+  template<typename T, typename T0> CONST T B4::right;
+  template<typename T> CONST T B4::right<T,int>; // expected-note {{explicit instantiation refers here}}
   template CONST int B4::right<int,int>;  // expected-error {{explicit instantiation of undefined static data member template 'right' of class}}
   template CONST int B4::right_def<int,int>;  // expected-error {{explicit instantiation of undefined static data member template 'right_def' of class}}
 }
@@ -245,7 +244,7 @@ namespace in_class_template {
 
     // FIXME: These cases should be accepted.
     int *use_before_definition = A<int>::x<char>;
-    template<typename T> template<typename U> T A<T>::x<U>[sizeof(U)]; // expected-error {{forward declaration}}
+    template<typename T> template<typename U> T A<T>::x<U>[sizeof(U)];
     static_assert(sizeof(A<int>::x<char>) == 1, ""); // expected-error {{incomplete}}
 
     template<typename T> template<typename...U> T A<T>::y<tuple<U...> >[] = { U()... };