r200641 - Sema: Reject templates in all extern "C" contexts.
Benjamin Kramer
benny.kra at googlemail.com
Sun Feb 2 08:35:44 PST 2014
Author: d0k
Date: Sun Feb 2 10:35:43 2014
New Revision: 200641
URL: http://llvm.org/viewvc/llvm-project?rev=200641&view=rev
Log:
Sema: Reject templates in all extern "C" contexts.
Otherwise we'd accept them if the LinkageDecl was not the direct
parent DeclContext. PR17968.
Modified:
cfe/trunk/lib/Sema/SemaTemplate.cpp
cfe/trunk/test/SemaCXX/warn-unused-value.cpp
cfe/trunk/test/SemaTemplate/class-template-decl.cpp
Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=200641&r1=200640&r2=200641&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaTemplate.cpp (original)
+++ cfe/trunk/lib/Sema/SemaTemplate.cpp Sun Feb 2 10:35:43 2014
@@ -5453,18 +5453,19 @@ Sema::CheckTemplateDeclScope(Scope *S, T
(S->getFlags() & Scope::TemplateParamScope) != 0)
S = S->getParent();
- // C++ [temp]p2:
- // A template-declaration can appear only as a namespace scope or
- // class scope declaration.
+ // C++ [temp]p4:
+ // A template [...] shall not have C linkage.
DeclContext *Ctx = S->getEntity();
- if (Ctx && isa<LinkageSpecDecl>(Ctx) &&
- cast<LinkageSpecDecl>(Ctx)->getLanguage() != LinkageSpecDecl::lang_cxx)
+ if (Ctx && Ctx->isExternCContext())
return Diag(TemplateParams->getTemplateLoc(), diag::err_template_linkage)
<< TemplateParams->getSourceRange();
while (Ctx && isa<LinkageSpecDecl>(Ctx))
Ctx = Ctx->getParent();
+ // C++ [temp]p2:
+ // A template-declaration can appear only as a namespace scope or
+ // class scope declaration.
if (Ctx) {
if (Ctx->isFileContext())
return false;
Modified: cfe/trunk/test/SemaCXX/warn-unused-value.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/warn-unused-value.cpp?rev=200641&r1=200640&r2=200641&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/warn-unused-value.cpp (original)
+++ cfe/trunk/test/SemaCXX/warn-unused-value.cpp Sun Feb 2 10:35:43 2014
@@ -32,7 +32,7 @@ void b(Foo f1, Foo f2) {
}
namespace test2 {
- extern "C" {
+ extern "C++" {
namespace std {
template<typename T> struct basic_string {
struct X {};
Modified: cfe/trunk/test/SemaTemplate/class-template-decl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/class-template-decl.cpp?rev=200641&r1=200640&r2=200641&view=diff
==============================================================================
--- cfe/trunk/test/SemaTemplate/class-template-decl.cpp (original)
+++ cfe/trunk/test/SemaTemplate/class-template-decl.cpp Sun Feb 2 10:35:43 2014
@@ -14,6 +14,13 @@ extern "C" {
template<typename T> class D; // expected-error{{templates must have C++ linkage}}
}
+extern "C" {
+ class PR17968 {
+ template<typename T> class D; // expected-error{{templates must have C++ linkage}}
+ template<typename T> void f(); // expected-error{{templates must have C++ linkage}}
+ };
+}
+
template<class U> class A; // expected-note{{previous template declaration is here}}
template<int N> class A; // expected-error{{template parameter has a different kind in template redeclaration}}
More information about the cfe-commits
mailing list