For various reasons, involving dllexport and class linkage compuations, we have to wait until after the semicolon after a class declaration to emit inline methods. These are "deferred" decls. Before this change, finishing the tag decl would trigger us to deserialize some PCH so that we could make a "pretty" IR-level type. Deserializing the PCH triggered calls to HandleTopLevelDecl, which, when done, checked the deferred decl list, and emitted some dllexported decls that weren't ready. Avoid this re-entrancy. Deferred decls should not get emitted when a tag is finished, they should only be emitted after a real top level decl in the main file. llvm-svn: 267186
15 lines
484 B
C++
15 lines
484 B
C++
// RUN: %clang_cc1 -triple x86_64-windows-msvc -fms-extensions -x c++ %S/Inputs/pr27445.h -emit-pch -o %t.pch
|
|
// RUN: %clang_cc1 -triple x86_64-windows-msvc -fms-extensions %s -include-pch %t.pch -emit-llvm -o - | FileCheck %s
|
|
|
|
class A;
|
|
void fn1(A &) {}
|
|
|
|
class __declspec(dllexport) A {
|
|
int operator=(A) { return field_; }
|
|
void (*on_arena_allocation_)(Info);
|
|
int field_;
|
|
};
|
|
|
|
// CHECK: %class.A = type { void (%struct.Info*)*, i32 }
|
|
// CHECK: %struct.Info = type { i32 (...)** }
|