[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