[PATCH] MS local statics mangling: don't count enum scopes
Hans Wennborg
hans at chromium.org
Mon Jun 16 17:08:19 PDT 2014
Closed by commit rL211078 (authored by @hans).
http://reviews.llvm.org/D4164
Files:
cfe/trunk/include/clang/Sema/Scope.h
cfe/trunk/lib/Parse/ParseDecl.cpp
cfe/trunk/lib/Sema/Scope.cpp
cfe/trunk/test/CodeGenCXX/microsoft-abi-static-initializers.cpp
Index: cfe/trunk/test/CodeGenCXX/microsoft-abi-static-initializers.cpp
===================================================================
--- cfe/trunk/test/CodeGenCXX/microsoft-abi-static-initializers.cpp
+++ cfe/trunk/test/CodeGenCXX/microsoft-abi-static-initializers.cpp
@@ -143,10 +143,31 @@
// init.end:
// CHECK: ret %struct.S* @"\01?TheS@?1??getS@@YAAAUS@@XZ at 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 at 4W4e@?1??1 at YAHXZ@A"
+ static int y;
+ // CHECK: @"\01?y@?1??enum_in_function@@YAHXZ at 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 at T@@QAEHXZ"
+ static int x;
+ // CHECK: @"\01?x@?1??enum_in_struct at T@@QAEHXZ at 4HA"
+ return x++;
+ }
+};
+
void force_usage() {
UnreachableStatic();
getS();
(void)B<int>::foo; // (void) - force usage
+ enum_in_function();
+ (void)&T::enum_in_struct;
}
// CHECK: define linkonce_odr void @"\01??__Efoo@?$B at H@@2VA@@A at YAXXZ"()
Index: cfe/trunk/include/clang/Sema/Scope.h
===================================================================
--- cfe/trunk/include/clang/Sema/Scope.h
+++ cfe/trunk/include/clang/Sema/Scope.h
@@ -110,7 +110,10 @@
/// \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
Index: cfe/trunk/lib/Sema/Scope.cpp
===================================================================
--- cfe/trunk/lib/Sema/Scope.cpp
+++ cfe/trunk/lib/Sema/Scope.cpp
@@ -67,13 +67,16 @@
// If this is a prototype scope, record that.
if (flags & FunctionPrototypeScope) PrototypeDepth++;
+
if (flags & DeclScope) {
if (flags & FunctionPrototypeScope)
; // Prototype scopes are uninteresting.
else if ((flags & ClassScope) && getParent()->isClassScope())
; // 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();
}
Index: cfe/trunk/lib/Parse/ParseDecl.cpp
===================================================================
--- cfe/trunk/lib/Parse/ParseDecl.cpp
+++ cfe/trunk/lib/Parse/ParseDecl.cpp
@@ -3780,7 +3780,7 @@
///
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);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D4164.10470.patch
Type: text/x-patch
Size: 3218 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140617/21fce19a/attachment.bin>
More information about the cfe-commits
mailing list