From fbacebe345512b6aa2549856a9a8dbced88451bf Mon Sep 17 00:00:00 2001 From: Hans Wennborg Date: Tue, 17 Jun 2014 00:00:18 +0000 Subject: [PATCH] MS static locals mangling: don't count enum scopes We may not have the mangling for static locals vs. enums completely figured out, but at least for my simple test cases, enums should not increment the mangling number. Differential Revision: http://reviews.llvm.org/D4164 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@211078 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Sema/Scope.h | 5 ++++- lib/Parse/ParseDecl.cpp | 2 +- lib/Sema/Scope.cpp | 3 +++ .../microsoft-abi-static-initializers.cpp | 21 +++++++++++++++++++ 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/include/clang/Sema/Scope.h b/include/clang/Sema/Scope.h index 35488450ac..5d2eab98b6 100644 --- a/include/clang/Sema/Scope.h +++ b/include/clang/Sema/Scope.h @@ -110,7 +110,10 @@ public: /// \brief This is the scope of some OpenMP simd directive. /// For example, it is used for 'omp simd', 'omp for simd'. /// This flag is propagated to children scopes. - OpenMPSimdDirectiveScope = 0x20000 + OpenMPSimdDirectiveScope = 0x20000, + + /// This scope corresponds to an enum. + EnumScope = 0x40000, }; private: /// The parent scope for this scope. This is null for the translation-unit diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index 92a13659ea..0b59fef2f8 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -3780,7 +3780,7 @@ void Parser::ParseEnumSpecifier(SourceLocation StartLoc, DeclSpec &DS, /// void Parser::ParseEnumBody(SourceLocation StartLoc, Decl *EnumDecl) { // Enter the scope of the enum body and start the definition. - ParseScope EnumScope(this, Scope::DeclScope); + ParseScope EnumScope(this, Scope::DeclScope | Scope::EnumScope); Actions.ActOnTagStartDefinition(getCurScope(), EnumDecl); BalancedDelimiterTracker T(*this, tok::l_brace); diff --git a/lib/Sema/Scope.cpp b/lib/Sema/Scope.cpp index 860b7c66ec..c49133d472 100644 --- a/lib/Sema/Scope.cpp +++ b/lib/Sema/Scope.cpp @@ -67,6 +67,7 @@ void Scope::Init(Scope *parent, unsigned flags) { // If this is a prototype scope, record that. if (flags & FunctionPrototypeScope) PrototypeDepth++; + if (flags & DeclScope) { if (flags & FunctionPrototypeScope) ; // Prototype scopes are uninteresting. @@ -74,6 +75,8 @@ void Scope::Init(Scope *parent, unsigned flags) { ; // Nested class scopes aren't ambiguous. else if ((flags & ClassScope) && getParent()->getFlags() == DeclScope) ; // Classes inside of namespaces aren't ambiguous. + else if ((flags & EnumScope)) + ; // Don't increment for enum scopes. else incrementMSLocalManglingNumber(); } diff --git a/test/CodeGenCXX/microsoft-abi-static-initializers.cpp b/test/CodeGenCXX/microsoft-abi-static-initializers.cpp index 5666553f3a..e96a5edd65 100644 --- a/test/CodeGenCXX/microsoft-abi-static-initializers.cpp +++ b/test/CodeGenCXX/microsoft-abi-static-initializers.cpp @@ -143,10 +143,31 @@ inline S &getS() { // init.end: // CHECK: ret %struct.S* @"\01?TheS@?1??getS@@YAAAUS@@XZ@4U2@A" +inline int enum_in_function() { + // CHECK-LABEL: define linkonce_odr i32 @"\01?enum_in_function@@YAHXZ"() + static enum e { foo, bar, baz } x; + // CHECK: @"\01?x@?1??enum_in_function@@YAHXZ@4W4e@?1??1@YAHXZ@A" + static int y; + // CHECK: @"\01?y@?1??enum_in_function@@YAHXZ@4HA" + return x + y; +}; + +struct T { + enum e { foo, bar, baz }; + int enum_in_struct() { + // CHECK-LABEL: define linkonce_odr x86_thiscallcc i32 @"\01?enum_in_struct@T@@QAEHXZ" + static int x; + // CHECK: @"\01?x@?1??enum_in_struct@T@@QAEHXZ@4HA" + return x++; + } +}; + void force_usage() { UnreachableStatic(); getS(); (void)B::foo; // (void) - force usage + enum_in_function(); + (void)&T::enum_in_struct; } // CHECK: define linkonce_odr void @"\01??__Efoo@?$B@H@@2VA@@A@YAXXZ"() -- 2.40.0