Index: cfe/trunk/lib/AST/ExternalASTMerger.cpp =================================================================== --- cfe/trunk/lib/AST/ExternalASTMerger.cpp +++ cfe/trunk/lib/AST/ExternalASTMerger.cpp @@ -44,6 +44,9 @@ ToTag->setMustBuildLookupTable(); } else if (auto ToNamespace = dyn_cast(To)) { ToNamespace->setHasExternalVisibleStorage(); + } else if (auto ToContainer = dyn_cast(To)) { + ToContainer->setHasExternalLexicalStorage(); + ToContainer->setMustBuildLookupTable(); } return ASTImporter::Imported(From, To); } @@ -80,11 +83,12 @@ } bool IsForwardDeclaration(Decl *D) { - assert(!isa(D)); // TODO handle this case if (auto TD = dyn_cast(D)) { return !TD->isThisDeclarationADefinition(); } else if (auto FD = dyn_cast(D)) { return !FD->isThisDeclarationADefinition(); + } else if (auto OID = dyn_cast(D)) { + return OID->isThisDeclarationADefinition(); } else { return false; } Index: cfe/trunk/test/Import/objc-method/Inputs/S.m =================================================================== --- cfe/trunk/test/Import/objc-method/Inputs/S.m +++ cfe/trunk/test/Import/objc-method/Inputs/S.m @@ -0,0 +1,4 @@ +@interface C { +} +-(int)m; +@end Index: cfe/trunk/test/Import/objc-method/test.m =================================================================== --- cfe/trunk/test/Import/objc-method/test.m +++ cfe/trunk/test/Import/objc-method/test.m @@ -0,0 +1,5 @@ +// RUN: clang-import-test -x objective-c++ -import %S/Inputs/S.m -expression %s +void expr() { + C *c; + int i = [c m]; +} 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 @@ -17,6 +17,7 @@ #include "clang/Basic/TargetInfo.h" #include "clang/Basic/TargetOptions.h" #include "clang/CodeGen/ModuleBuilder.h" +#include "clang/Driver/Types.h" #include "clang/Frontend/ASTConsumers.h" #include "clang/Frontend/CompilerInstance.h" #include "clang/Frontend/MultiplexConsumer.h" @@ -53,6 +54,11 @@ llvm::cl::desc("Argument to pass to the CompilerInvocation"), llvm::cl::CommaSeparated); +static llvm::cl::opt + Input("x", llvm::cl::Optional, + llvm::cl::desc("The language to parse (default: c++)"), + llvm::cl::init("c++")); + static llvm::cl::opt DumpAST("dump-ast", llvm::cl::init(false), llvm::cl::desc("Dump combined AST")); @@ -110,6 +116,7 @@ llvm::errs() << LineString << '\n'; llvm::errs().indent(LocColumn); llvm::errs() << '^'; + llvm::errs() << '\n'; } virtual void HandleDiagnostic(DiagnosticsEngine::Level DiagLevel, @@ -143,7 +150,7 @@ }; std::unique_ptr -BuildCompilerInstance(ArrayRef ClangArgv) { +BuildCompilerInstance() { auto Ins = llvm::make_unique(); auto DC = llvm::make_unique(); const bool ShouldOwnClient = true; @@ -151,13 +158,27 @@ auto Inv = llvm::make_unique(); + std::vector ClangArgv(ClangArgs.size()); + std::transform(ClangArgs.begin(), ClangArgs.end(), ClangArgv.begin(), + [](const std::string &s) -> const char * { return s.data(); }); CompilerInvocation::CreateFromArgs(*Inv, ClangArgv.data(), &ClangArgv.data()[ClangArgv.size()], Ins->getDiagnostics()); - Inv->getLangOpts()->CPlusPlus = true; - Inv->getLangOpts()->CPlusPlus11 = true; - Inv->getHeaderSearchOpts().UseLibcxx = true; + { + using namespace driver::types; + ID Id = lookupTypeForTypeSpecifier(Input.c_str()); + assert(Id != TY_INVALID); + if (isCXX(Id)) { + Inv->getLangOpts()->CPlusPlus = true; + Inv->getLangOpts()->CPlusPlus11 = true; + Inv->getHeaderSearchOpts().UseLibcxx = true; + } + if (isObjC(Id)) { + Inv->getLangOpts()->ObjC1 = 1; + Inv->getLangOpts()->ObjC2 = 1; + } + } Inv->getLangOpts()->Bool = true; Inv->getLangOpts()->WChar = true; Inv->getLangOpts()->Blocks = true; @@ -216,11 +237,8 @@ } std::unique_ptr BuildIndirect(std::unique_ptr &CI) { - std::vector ClangArgv(ClangArgs.size()); - std::transform(ClangArgs.begin(), ClangArgs.end(), ClangArgv.begin(), - [](const std::string &s) -> const char * { return s.data(); }); std::unique_ptr IndirectCI = - init_convenience::BuildCompilerInstance(ClangArgv); + init_convenience::BuildCompilerInstance(); auto ST = llvm::make_unique(); auto BC = llvm::make_unique(); std::unique_ptr AST = @@ -247,11 +265,8 @@ Parse(const std::string &Path, llvm::ArrayRef> Imports, bool ShouldDumpAST) { - std::vector ClangArgv(ClangArgs.size()); - std::transform(ClangArgs.begin(), ClangArgs.end(), ClangArgv.begin(), - [](const std::string &s) -> const char * { return s.data(); }); std::unique_ptr CI = - init_convenience::BuildCompilerInstance(ClangArgv); + init_convenience::BuildCompilerInstance(); auto ST = llvm::make_unique(); auto BC = llvm::make_unique(); std::unique_ptr AST =