From eeabe910490a68fa42281571554bf8c76a1e4bef Mon Sep 17 00:00:00 2001 From: Richard Smith <richard-llvm@metafoo.co.uk> Date: Mon, 17 Feb 2014 23:34:47 +0000 Subject: [PATCH] PR18839: 'extern "C++"' also adds an implicit 'extern', not just 'extern "C"'. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@201537 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/AST/Decl.cpp | 8 ++++---- test/CodeGenCXX/extern-c.cpp | 10 +++++++--- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index 1a7e8f7af8c..ee9f07278f2 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -512,9 +512,9 @@ template <typename T> static bool isFirstInExternCContext(T *D) { return First->isInExternCContext(); } -static bool isSingleLineExternC(const Decl &D) { +static bool isSingleLineLanguageLinkage(const Decl &D) { if (const LinkageSpecDecl *SD = dyn_cast<LinkageSpecDecl>(D.getDeclContext())) - if (SD->getLanguage() == LinkageSpecDecl::lang_c && !SD->hasBraces()) + if (!SD->hasBraces()) return true; return false; } @@ -548,7 +548,7 @@ static LinkageInfo getLVForNamespaceScopeDecl(const NamedDecl *D, if (Var->getStorageClass() != SC_Extern && Var->getStorageClass() != SC_PrivateExtern && - !isSingleLineExternC(*Var)) + !isSingleLineLanguageLinkage(*Var)) return LinkageInfo::internal(); } @@ -1771,7 +1771,7 @@ VarDecl::DefinitionKind VarDecl::isThisDeclarationADefinition( // A declaration directly contained in a linkage-specification is treated // as if it contains the extern specifier for the purpose of determining // the linkage of the declared name and whether it is a definition. - if (isSingleLineExternC(*this)) + if (isSingleLineLanguageLinkage(*this)) return DeclarationOnly; // C99 6.9.2p2: diff --git a/test/CodeGenCXX/extern-c.cpp b/test/CodeGenCXX/extern-c.cpp index bca86c6352c..f8d334cc858 100644 --- a/test/CodeGenCXX/extern-c.cpp +++ b/test/CodeGenCXX/extern-c.cpp @@ -1,18 +1,22 @@ // RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck %s namespace foo { -// CHECK-NOT: @a = global i32 +// CHECK-NOT: @a = global extern "C" int a; -// CHECK-NOT: @_ZN3foo1bE = global i32 +// CHECK-NOT: @_ZN3foo1bE = global extern int b; -// CHECK: @_ZN3foo1cE = global i32 +// CHECK: @_ZN3foo1cE = global int c = 5; // CHECK-NOT: @_ZN3foo1dE extern "C" struct d; +// CHECK-NOT: @e = global +// CHECK-NOT: @_ZN3foo1eE = global +extern "C++" int a2; + } namespace test1 { -- GitLab