Index: cfe/trunk/test/Import/local-struct/Inputs/Callee.cpp =================================================================== --- cfe/trunk/test/Import/local-struct/Inputs/Callee.cpp +++ cfe/trunk/test/Import/local-struct/Inputs/Callee.cpp @@ -0,0 +1,12 @@ +struct Bar { + void bar(int _a, bool _b) { + { + struct S { int a; }; + S s = { _a }; + } + { + struct S { bool b; }; + S t = { _b }; + } + }; +}; Index: cfe/trunk/test/Import/local-struct/test.cpp =================================================================== --- cfe/trunk/test/Import/local-struct/test.cpp +++ cfe/trunk/test/Import/local-struct/test.cpp @@ -0,0 +1,8 @@ +// RUN: clang-import-test -dump-ir -import %S/Inputs/Callee.cpp -expression %s | FileCheck %s +// XFAIL: * +// CHECK: %struct.S = type { i +// CHECK: %struct.S.0 = type { i1 } + +void foo() { + return Bar().bar(3, true); +} Index: cfe/trunk/test/Import/struct-layout/Inputs/Callee.cpp =================================================================== --- cfe/trunk/test/Import/struct-layout/Inputs/Callee.cpp +++ cfe/trunk/test/Import/struct-layout/Inputs/Callee.cpp @@ -0,0 +1,9 @@ +struct S { + int a; +}; + +struct Bar { + void bar(int _a) { + S s = { _a }; + }; +}; Index: cfe/trunk/test/Import/struct-layout/test.cpp =================================================================== --- cfe/trunk/test/Import/struct-layout/test.cpp +++ cfe/trunk/test/Import/struct-layout/test.cpp @@ -0,0 +1,6 @@ +// RUN: clang-import-test -dump-ir -import %S/Inputs/Callee.cpp -expression %s | FileCheck %s +// CHECK: %struct.S = type { i + +void foo() { + return Bar().bar(3); +} Index: cfe/trunk/tools/clang-import-test/clang-import-test.cpp =================================================================== --- cfe/trunk/tools/clang-import-test/clang-import-test.cpp +++ cfe/trunk/tools/clang-import-test/clang-import-test.cpp @@ -27,6 +27,7 @@ #include "clang/Parse/ParseAST.h" #include "llvm/IR/LLVMContext.h" +#include "llvm/IR/Module.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Error.h" #include "llvm/Support/Host.h" @@ -63,6 +64,10 @@ DumpAST("dump-ast", llvm::cl::init(false), llvm::cl::desc("Dump combined AST")); +static llvm::cl::opt +DumpIR("dump-ir", llvm::cl::init(false), + llvm::cl::desc("Dump IR from final parse")); + namespace init_convenience { class TestDiagnosticConsumer : public DiagnosticConsumer { private: @@ -264,7 +269,7 @@ llvm::Expected> Parse(const std::string &Path, llvm::ArrayRef> Imports, - bool ShouldDumpAST) { + bool ShouldDumpAST, bool ShouldDumpIR) { std::unique_ptr CI = init_convenience::BuildCompilerInstance(); auto ST = llvm::make_unique(); @@ -279,6 +284,7 @@ auto LLVMCtx = llvm::make_unique(); ASTConsumers.push_back(init_convenience::BuildCodeGen(*CI, *LLVMCtx)); + auto &CG = *static_cast(ASTConsumers.back().get()); if (ShouldDumpAST) ASTConsumers.push_back(CreateASTDumper("", true, false, false)); @@ -292,6 +298,8 @@ return std::move(PE); } CI->getDiagnosticClient().EndSourceFile(); + if (ShouldDumpIR) + CG.GetModule()->print(llvm::outs(), nullptr); if (CI->getDiagnosticClient().getNumErrors()) { return llvm::make_error( "Errors occured while parsing the expression.", std::error_code()); @@ -309,7 +317,7 @@ std::vector> ImportCIs; for (auto I : Imports) { llvm::Expected> ImportCI = - Parse(I, {}, false); + Parse(I, {}, false, false); if (auto E = ImportCI.takeError()) { llvm::errs() << llvm::toString(std::move(E)); exit(-1); @@ -325,7 +333,7 @@ } } llvm::Expected> ExpressionCI = - Parse(Expression, Direct ? ImportCIs : IndirectCIs, DumpAST); + Parse(Expression, Direct ? ImportCIs : IndirectCIs, DumpAST, DumpIR); if (auto E = ExpressionCI.takeError()) { llvm::errs() << llvm::toString(std::move(E)); exit(-1);