]> granicus.if.org Git - clang/commitdiff
Revert [mangle] Fix mangling where an extra mangle context is required.
authorReid Kleckner <rnk@google.com>
Thu, 10 Oct 2019 01:10:01 +0000 (01:10 +0000)
committerReid Kleckner <rnk@google.com>
Thu, 10 Oct 2019 01:10:01 +0000 (01:10 +0000)
This reverts r374200 (git commit fd18e94697c987d5f24e25aa4e27adaffff3cce4)

Causes crashes just compiling `int main() {}` on my machine.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@374268 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/ASTContext.h
include/clang/Sema/Sema.h
lib/AST/ASTContext.cpp
lib/Sema/SemaLambda.cpp
test/CodeGenCXX/mangle-lambdas.cpp

index 7547960b0928a9db497a2db34df9bf1421e17b9e..5105b9c35cda4abed2ab2d7ab3d0999ee47dbc33 100644 (file)
@@ -514,8 +514,6 @@ private:
   /// need to be consistently numbered for the mangler).
   llvm::DenseMap<const DeclContext *, std::unique_ptr<MangleNumberingContext>>
       MangleNumberingContexts;
-  llvm::DenseMap<const Decl *, std::unique_ptr<MangleNumberingContext>>
-      ExtraMangleNumberingContexts;
 
   /// Side-table of mangling numbers for declarations which rarely
   /// need them (like static local vars).
@@ -2814,9 +2812,6 @@ public:
   /// Retrieve the context for computing mangling numbers in the given
   /// DeclContext.
   MangleNumberingContext &getManglingNumberContext(const DeclContext *DC);
-  enum NeedExtraManglingDecl_t { NeedExtraManglingDecl };
-  MangleNumberingContext &getManglingNumberContext(NeedExtraManglingDecl_t,
-                                                   const Decl *D);
 
   std::unique_ptr<MangleNumberingContext> createMangleNumberingContext() const;
 
index 1cc6fc67bc9144ce752a83c6c72306c3be37ef07..b68da4b7f5ca3eb4848301abe020b8b5b98f4f0e 100644 (file)
@@ -1045,6 +1045,13 @@ public:
     /// suffice, e.g., in a default function argument.
     Decl *ManglingContextDecl;
 
+    /// The context information used to mangle lambda expressions
+    /// and block literals within this context.
+    ///
+    /// This mangling information is allocated lazily, since most contexts
+    /// do not have lambda expressions or block literals.
+    std::unique_ptr<MangleNumberingContext> MangleNumbering;
+
     /// If we are processing a decltype type, a set of call expressions
     /// for which we have deferred checking the completeness of the return type.
     SmallVector<CallExpr *, 8> DelayedDecltypeCalls;
@@ -1073,7 +1080,12 @@ public:
                                       ExpressionKind ExprContext)
         : Context(Context), ParentCleanup(ParentCleanup),
           NumCleanupObjects(NumCleanupObjects), NumTypos(0),
-          ManglingContextDecl(ManglingContextDecl), ExprContext(ExprContext) {}
+          ManglingContextDecl(ManglingContextDecl), MangleNumbering(),
+          ExprContext(ExprContext) {}
+
+    /// Retrieve the mangling numbering context, used to consistently
+    /// number constructs like lambdas for mangling.
+    MangleNumberingContext &getMangleNumberingContext(ASTContext &Ctx);
 
     bool isUnevaluated() const {
       return Context == ExpressionEvaluationContext::Unevaluated ||
index 8dd57f2bd28545b8514c0fb62ce004735d11f547..a41b64ffcc81fd1c17c1f945d3626f407218c359 100644 (file)
@@ -10261,16 +10261,6 @@ ASTContext::getManglingNumberContext(const DeclContext *DC) {
   return *MCtx;
 }
 
-MangleNumberingContext &
-ASTContext::getManglingNumberContext(NeedExtraManglingDecl_t, const Decl *D) {
-  assert(LangOpts.CPlusPlus); // We don't need mangling numbers for plain C.
-  std::unique_ptr<MangleNumberingContext> &MCtx =
-      ExtraMangleNumberingContexts[D];
-  if (!MCtx)
-    MCtx = createMangleNumberingContext();
-  return *MCtx;
-}
-
 std::unique_ptr<MangleNumberingContext>
 ASTContext::createMangleNumberingContext() const {
   return ABI->createMangleNumberingContext();
index b05ed75e8791a505cf73fc8460aab73f495d1533..a76a840f26ee55f3f926fbb9bc7041b76e8d005e 100644 (file)
@@ -352,13 +352,21 @@ Sema::getCurrentMangleNumberContext(const DeclContext *DC,
     //  -- the initializers of inline variables
   case VariableTemplate:
     //  -- the initializers of templated variables
-    return &Context.getManglingNumberContext(ASTContext::NeedExtraManglingDecl,
-                                             ManglingContextDecl);
+    return &ExprEvalContexts.back().getMangleNumberingContext(Context);
   }
 
   llvm_unreachable("unexpected context");
 }
 
+MangleNumberingContext &
+Sema::ExpressionEvaluationContextRecord::getMangleNumberingContext(
+    ASTContext &Ctx) {
+  assert(ManglingContextDecl && "Need to have a context declaration");
+  if (!MangleNumbering)
+    MangleNumbering = Ctx.createMangleNumberingContext();
+  return *MangleNumbering;
+}
+
 CXXMethodDecl *Sema::startLambdaDefinition(
     CXXRecordDecl *Class, SourceRange IntroducerRange,
     TypeSourceInfo *MethodTypeInfo, SourceLocation EndLoc,
index fcca878e387e70d4535067993976e7ba411a4ee7..d49ed4b2a5e16a1291bad55fc86d496a05eecc56 100644 (file)
@@ -178,24 +178,18 @@ void use_func_template() {
 }
 
 namespace std {
-  struct type_info {
-    bool before(const type_info &) const noexcept;
-  };
+  struct type_info;
 }
 namespace PR12123 {
   struct A { virtual ~A(); } g;
-  struct C { virtual ~C(); } k;
   struct B {
     void f(const std::type_info& x = typeid([]()->A& { return g; }()));
     void h();
-    void j(bool cond = typeid([]() -> A & { return g; }()).before(typeid([]() -> C & { return k; }())));
   };
-  void B::h() { f(); j(); }
+  void B::h() { f(); }
 }
 
 // CHECK-LABEL: define linkonce_odr dereferenceable({{[0-9]+}}) %"struct.PR12123::A"* @_ZZN7PR121231B1fERKSt9type_infoEd_NKUlvE_clEv
-// CHECK-LABEL: define linkonce_odr dereferenceable({{[0-9]+}}) %"struct.PR12123::A"* @_ZZN7PR121231B1jEbEd_NKUlvE_clEv
-// CHECK-LABEL: define linkonce_odr dereferenceable({{[0-9]+}}) %"struct.PR12123::C"* @_ZZN7PR121231B1jEbEd_NKUlvE0_clEv
 
 // CHECK-LABEL: define {{.*}} @_Z{{[0-9]*}}testVarargsLambdaNumberingv(
 inline int testVarargsLambdaNumbering() {