]> granicus.if.org Git - clang/commitdiff
Diagnose the instantiation of variables (including static data
authorDouglas Gregor <dgregor@apple.com>
Sun, 12 Sep 2010 07:37:24 +0000 (07:37 +0000)
committerDouglas Gregor <dgregor@apple.com>
Sun, 12 Sep 2010 07:37:24 +0000 (07:37 +0000)
members) with function type. Fixes PR8047.

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

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaTemplateInstantiateDecl.cpp
test/CXX/temp/temp.arg/temp.arg.type/p2.cpp [new file with mode: 0644]

index 9a2102b74316d6aba012432f6dfc08d5aa80dc3d..b79b24f33556df6bf86d5aea55d9c13e47130dbb 100644 (file)
@@ -1602,6 +1602,8 @@ def note_instantiation_contexts_suppressed : Note<
 
 def err_field_instantiates_to_function : Error<
   "data member instantiated with function type %0">;
+def err_variable_instantiates_to_function : Error<
+  "%select{variable|static data member}0 instantiated with function type %1">;
 def err_nested_name_spec_non_tag : Error<
   "type %0 cannot be used prior to '::' because it has no members">;
 
index b8690f6eb287fe404095b0b1bb1305f35710d7bb..c97a8788ef205c037c1b1e99594c7a3b1401ca3b 100644 (file)
@@ -349,6 +349,12 @@ Decl *TemplateDeclInstantiator::VisitVarDecl(VarDecl *D) {
   if (!DI)
     return 0;
 
+  if (DI->getType()->isFunctionType()) {
+    SemaRef.Diag(D->getLocation(), diag::err_variable_instantiates_to_function)
+      << D->isStaticDataMember() << DI->getType();
+    return 0;
+  }
+  
   // Build the instantiated declaration
   VarDecl *Var = VarDecl::Create(SemaRef.Context, Owner,
                                  D->getLocation(), D->getIdentifier(),
diff --git a/test/CXX/temp/temp.arg/temp.arg.type/p2.cpp b/test/CXX/temp/temp.arg/temp.arg.type/p2.cpp
new file mode 100644 (file)
index 0000000..0384aa7
--- /dev/null
@@ -0,0 +1,12 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+template<class T> struct A {
+  static T t; // expected-error{{static data member instantiated with function type 'int ()'}}
+};
+typedef int function();
+A<function> a; // expected-note{{instantiation of}}
+
+template<typename T> struct B {
+  B() { T t; } // expected-error{{variable instantiated with function type 'int ()'}}
+};
+B<function> b; // expected-note{{instantiation of}}
+