From 024c1199fa9d28e00160d5f05ed7dc3d25264837 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Tue, 12 Mar 2013 16:45:13 +0000 Subject: [PATCH] We already reported an error for extern "C" { void test5_f() { extern int test5_b; } } static float test5_b; This patch makes us report one for extern "C" { void test6_f() { extern int test6_b; } } extern "C" { static float test6_b; } Not because we think the declaration would be extern C, but because of the rule: An entity with C language linkage shall not be declared with the same name as an entity in global scope... We were just not looking past the extern "C" to see if the decl was in global scope. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@176875 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaDecl.cpp | 3 ++- test/SemaCXX/function-redecl.cpp | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 252f94dc22..659d9638f4 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -5004,7 +5004,8 @@ void Sema::CheckShadow(Scope *S, VarDecl *D) { template static bool mayConflictWithNonVisibleExternC(const T *ND) { - return ND->isExternC() || ND->getDeclContext()->isTranslationUnit(); + return ND->isExternC() || + ND->getDeclContext()->getRedeclContext()->isTranslationUnit(); } /// \brief Perform semantic checking on a newly-created variable diff --git a/test/SemaCXX/function-redecl.cpp b/test/SemaCXX/function-redecl.cpp index 7bf44b1c36..8cbda82c0b 100644 --- a/test/SemaCXX/function-redecl.cpp +++ b/test/SemaCXX/function-redecl.cpp @@ -145,3 +145,19 @@ namespace test4 { float b; // expected-error {{redefinition of 'b' with a different type: 'float' vs 'int'}} } } + +extern "C" { + void test5_f() { + extern int test5_b; // expected-note {{previous definition is here}} + } +} +static float test5_b; // expected-error {{redefinition of 'test5_b' with a different type: 'float' vs 'int'}} + +extern "C" { + void test6_f() { + extern int test6_b; // expected-note {{previous definition is here}} + } +} +extern "C" { + static float test6_b; // expected-error {{redefinition of 'test6_b' with a different type: 'float' vs 'int'}} +} -- 2.40.0