Hahnfeld created this revision. Hahnfeld added reviewers: v.g.vassilev, rjmccall, aaron.ballman. Herald added a project: All. Hahnfeld requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
An inline virtual function must be emitted, but we need to remember it and emit the same definition again in the future in case later LLVM optimizations stripped it from the Module. The added test case shows the problem; before this patch, it would fail with: Symbols not found: [ _ZN1AD0Ev, _ZN1AD1Ev ] Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D156537 Files: clang/lib/CodeGen/CodeGenModule.cpp clang/test/Interpreter/inline-virtual.cpp Index: clang/test/Interpreter/inline-virtual.cpp =================================================================== --- /dev/null +++ clang/test/Interpreter/inline-virtual.cpp @@ -0,0 +1,21 @@ +// REQUIRES: host-supports-jit +// UNSUPPORTED: system-aix +// RUN: cat %s | clang-repl | FileCheck %s +// RUN: cat %s | clang-repl -Xcc -O2 | FileCheck %s + +extern "C" int printf(const char *, ...); + +struct A { int a; A(int a) : a(a) {} virtual ~A(); }; + +// Then define the virtual destructor as inline out-of-line, in a separate +// PartialTranslationUnit. +inline A::~A() { printf("~A(%d)\n", a); } + +// Create one instance with new and delete it. +A *a1 = new A(1); +delete a1; +// CHECK: ~A(1) + +// Also create one global that will be auto-destructed. +A a2(2); +// CHECK: ~A(2) Index: clang/lib/CodeGen/CodeGenModule.cpp =================================================================== --- clang/lib/CodeGen/CodeGenModule.cpp +++ clang/lib/CodeGen/CodeGenModule.cpp @@ -3638,6 +3638,7 @@ if (MustBeEmitted(Global) && MayBeEmittedEagerly(Global)) { // Emit the definition if it can't be deferred. EmitGlobalDefinition(GD); + addEmittedDeferredDecl(GD); return; }
Index: clang/test/Interpreter/inline-virtual.cpp =================================================================== --- /dev/null +++ clang/test/Interpreter/inline-virtual.cpp @@ -0,0 +1,21 @@ +// REQUIRES: host-supports-jit +// UNSUPPORTED: system-aix +// RUN: cat %s | clang-repl | FileCheck %s +// RUN: cat %s | clang-repl -Xcc -O2 | FileCheck %s + +extern "C" int printf(const char *, ...); + +struct A { int a; A(int a) : a(a) {} virtual ~A(); }; + +// Then define the virtual destructor as inline out-of-line, in a separate +// PartialTranslationUnit. +inline A::~A() { printf("~A(%d)\n", a); } + +// Create one instance with new and delete it. +A *a1 = new A(1); +delete a1; +// CHECK: ~A(1) + +// Also create one global that will be auto-destructed. +A a2(2); +// CHECK: ~A(2) Index: clang/lib/CodeGen/CodeGenModule.cpp =================================================================== --- clang/lib/CodeGen/CodeGenModule.cpp +++ clang/lib/CodeGen/CodeGenModule.cpp @@ -3638,6 +3638,7 @@ if (MustBeEmitted(Global) && MayBeEmittedEagerly(Global)) { // Emit the definition if it can't be deferred. EmitGlobalDefinition(GD); + addEmittedDeferredDecl(GD); return; }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits