}
void EmitDeferredDecls() {
+ if (DeferredInlineMethodDefinitions.empty())
+ return;
+
// Emit any deferred inline method definitions. Note that more deferred
// methods may be added during this loop, since ASTConsumer callbacks
// can be invoked if AST inspection results in declarations being added.
- for (unsigned I = 0; I < DeferredInlineMethodDefinitions.size(); ++I)
+ HandlingTopLevelDeclRAII HandlingDecl(*this);
+ for (unsigned I = 0; I != DeferredInlineMethodDefinitions.size(); ++I)
Builder->EmitTopLevelDecl(DeferredInlineMethodDefinitions[I]);
DeferredInlineMethodDefinitions.clear();
}
template<typename T> struct B { void operator delete(void*); virtual ~B() {} typedef int t; };
typedef B<int>::t b_int_instantated;
}
+
+namespace EmitInlineMethods {
+ struct A {
+ void f() {}
+ void g();
+ };
+ struct B {
+ void f();
+ void g() {}
+ };
+}
// RUN: rm -rf %t
// RUN: %clang_cc1 -fmodules -x objective-c++ -std=c++11 -fmodules-cache-path=%t -I %S/Inputs -triple %itanium_abi_triple -disable-llvm-optzns -emit-llvm -o - %s | FileCheck %s
+// RUN: %clang_cc1 -fmodules -x objective-c++ -std=c++11 -fmodules-cache-path=%t -I %S/Inputs -triple %itanium_abi_triple -disable-llvm-optzns -emit-llvm -g -o - %s | FileCheck %s
// FIXME: When we have a syntax for modules in C++, use that.
@import cxx_irgen_top;
@import cxx_irgen_left;
@import cxx_irgen_right;
+// Keep these two namespace definitions separate; merging them hides the bug.
+namespace EmitInlineMethods {
+ // CHECK-DAG: define linkonce_odr void @_ZN17EmitInlineMethods1C1fEPNS_1AE(
+ // CHECK-DAG: declare void @_ZN17EmitInlineMethods1A1gEv(
+ struct C {
+ __attribute__((used)) void f(A *p) { p->g(); }
+ };
+}
+namespace EmitInlineMethods {
+ // CHECK-DAG: define linkonce_odr void @_ZN17EmitInlineMethods1D1fEPNS_1BE(
+ // CHECK-DAG: define linkonce_odr void @_ZN17EmitInlineMethods1B1gEv(
+ struct D {
+ __attribute__((used)) void f(B *p) { p->g(); }
+ };
+}
+
// CHECK-DAG: define available_externally hidden {{signext i32|i32}} @_ZN1SIiE1gEv({{.*}} #[[ALWAYS_INLINE:.*]] align
int a = S<int>::g();