aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2013-04-16 02:29:15 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2013-04-16 02:29:15 +0000
commit459ef03126f9f0420efb3355e3b2ed3c1fdfb38a (patch)
tree33a638b34e308007b1303204b495a66ef9dc967d
parent148d9223f02dba1ba6e40848d413daa3ffc09dfe (diff)
Correctly propagate the storage class to function template instantiations.
This fixes pr15753. This is another case of the fuzzy definition of the "as written" storage class of an instantiation. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@179581 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Sema/SemaTemplateInstantiateDecl.cpp2
-rw-r--r--test/CodeGenCXX/pr15753.cpp12
2 files changed, 13 insertions, 1 deletions
diff --git a/lib/Sema/SemaTemplateInstantiateDecl.cpp b/lib/Sema/SemaTemplateInstantiateDecl.cpp
index 2dbfeecc86..80c452fb03 100644
--- a/lib/Sema/SemaTemplateInstantiateDecl.cpp
+++ b/lib/Sema/SemaTemplateInstantiateDecl.cpp
@@ -1162,7 +1162,7 @@ Decl *TemplateDeclInstantiator::VisitFunctionDecl(FunctionDecl *D,
FunctionDecl *Function =
FunctionDecl::Create(SemaRef.Context, DC, D->getInnerLocStart(),
D->getNameInfo(), T, TInfo,
- D->getStorageClass(),
+ D->getCanonicalDecl()->getStorageClass(),
D->isInlineSpecified(), D->hasWrittenPrototype(),
D->isConstexpr());
diff --git a/test/CodeGenCXX/pr15753.cpp b/test/CodeGenCXX/pr15753.cpp
new file mode 100644
index 0000000000..fd2000be6e
--- /dev/null
+++ b/test/CodeGenCXX/pr15753.cpp
@@ -0,0 +1,12 @@
+// RUN: %clang_cc1 -emit-llvm %s -o - | FileCheck %s
+
+template <typename T> static int Foo(T t);
+template <typename T>
+int Foo(T t) {
+ return t;
+}
+template<> int Foo<int>(int i) {
+ return i;
+}
+
+// CHECK-NOT: define