forked from OSchip/llvm-project
Re-land [mangle] Fix mangling where an extra mangle context is required.
This reverts r374268 (git commit c34385d07c
)
I think I reverted this by mistake, so I'm relanding it. While my bisect
found this revision, I think the crashes I'm seeing locally must be
environmental. Maybe the version of clang I'm using miscompiles tot
clang.
llvm-svn: 374269
This commit is contained in:
parent
c34385d07c
commit
da2bde9e34
|
@ -514,6 +514,8 @@ 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).
|
||||
|
@ -2812,6 +2814,9 @@ 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;
|
||||
|
||||
|
|
|
@ -1045,13 +1045,6 @@ 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;
|
||||
|
@ -1080,12 +1073,7 @@ public:
|
|||
ExpressionKind ExprContext)
|
||||
: Context(Context), ParentCleanup(ParentCleanup),
|
||||
NumCleanupObjects(NumCleanupObjects), NumTypos(0),
|
||||
ManglingContextDecl(ManglingContextDecl), MangleNumbering(),
|
||||
ExprContext(ExprContext) {}
|
||||
|
||||
/// Retrieve the mangling numbering context, used to consistently
|
||||
/// number constructs like lambdas for mangling.
|
||||
MangleNumberingContext &getMangleNumberingContext(ASTContext &Ctx);
|
||||
ManglingContextDecl(ManglingContextDecl), ExprContext(ExprContext) {}
|
||||
|
||||
bool isUnevaluated() const {
|
||||
return Context == ExpressionEvaluationContext::Unevaluated ||
|
||||
|
|
|
@ -10261,6 +10261,16 @@ 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();
|
||||
|
|
|
@ -352,21 +352,13 @@ Sema::getCurrentMangleNumberContext(const DeclContext *DC,
|
|||
// -- the initializers of inline variables
|
||||
case VariableTemplate:
|
||||
// -- the initializers of templated variables
|
||||
return &ExprEvalContexts.back().getMangleNumberingContext(Context);
|
||||
return &Context.getManglingNumberContext(ASTContext::NeedExtraManglingDecl,
|
||||
ManglingContextDecl);
|
||||
}
|
||||
|
||||
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,
|
||||
|
|
|
@ -178,18 +178,24 @@ void use_func_template() {
|
|||
}
|
||||
|
||||
namespace std {
|
||||
struct type_info;
|
||||
struct type_info {
|
||||
bool before(const type_info &) const noexcept;
|
||||
};
|
||||
}
|
||||
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(); }
|
||||
void B::h() { f(); j(); }
|
||||
}
|
||||
|
||||
// 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() {
|
||||
|
|
Loading…
Reference in New Issue