Index: cfe/trunk/include/clang/AST/ExternalASTMerger.h =================================================================== --- cfe/trunk/include/clang/AST/ExternalASTMerger.h +++ cfe/trunk/include/clang/AST/ExternalASTMerger.h @@ -14,6 +14,7 @@ #define LLVM_CLANG_AST_EXTERNALASTMERGER_H #include "clang/AST/ASTImporter.h" +#include "clang/AST/ASTImporterSharedState.h" #include "clang/AST/ExternalASTSource.h" #include "llvm/Support/raw_ostream.h" @@ -88,6 +89,11 @@ private: /// The target for this ExtenralASTMerger. ImporterTarget Target; + /// ExternalASTMerger has multiple ASTImporters that import into the same + /// TU. This is the shared state for all ASTImporters of this + /// ExternalASTMerger. + /// See also the CrossTranslationUnitContext that has a similar setup. + std::shared_ptr SharedState; public: ExternalASTMerger(const ImporterTarget &Target, Index: cfe/trunk/lib/AST/ExternalASTMerger.cpp =================================================================== --- cfe/trunk/lib/AST/ExternalASTMerger.cpp +++ cfe/trunk/lib/AST/ExternalASTMerger.cpp @@ -107,11 +107,13 @@ LazyASTImporter(ExternalASTMerger &_Parent, ASTContext &ToContext, FileManager &ToFileManager, ASTContext &FromContext, FileManager &FromFileManager, - const ExternalASTMerger::OriginMap &_FromOrigins) + const ExternalASTMerger::OriginMap &_FromOrigins, + std::shared_ptr SharedState) : ASTImporter(ToContext, ToFileManager, FromContext, FromFileManager, - /*MinimalImport=*/true), + /*MinimalImport=*/true, SharedState), Parent(_Parent), Reverse(FromContext, FromFileManager, ToContext, - ToFileManager, /*MinimalImport=*/true), FromOrigins(_FromOrigins) {} + ToFileManager, /*MinimalImport=*/true), + FromOrigins(_FromOrigins) {} /// Whenever a DeclContext is imported, ensure that ExternalASTSource's origin /// map is kept up to date. Also set the appropriate flags. @@ -314,6 +316,8 @@ ExternalASTMerger::ExternalASTMerger(const ImporterTarget &Target, llvm::ArrayRef Sources) : LogStream(&llvm::nulls()), Target(Target) { + SharedState = std::make_shared( + *Target.AST.getTranslationUnitDecl()); AddSources(Sources); } @@ -321,7 +325,7 @@ for (const ImporterSource &S : Sources) { assert(&S.AST != &Target.AST); Importers.push_back(std::make_unique( - *this, Target.AST, Target.FM, S.AST, S.FM, S.OM)); + *this, Target.AST, Target.FM, S.AST, S.FM, S.OM, SharedState)); } } Index: lldb/trunk/packages/Python/lldbsuite/test/functionalities/modern-type-lookup/libcxx/Makefile =================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/functionalities/modern-type-lookup/libcxx/Makefile +++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/modern-type-lookup/libcxx/Makefile @@ -0,0 +1,3 @@ +CXX_SOURCES := main.cpp +USE_LIBCPP := 1 +include Makefile.rules Index: lldb/trunk/packages/Python/lldbsuite/test/functionalities/modern-type-lookup/libcxx/TestLibCxxModernTypeLookup.py =================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/functionalities/modern-type-lookup/libcxx/TestLibCxxModernTypeLookup.py +++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/modern-type-lookup/libcxx/TestLibCxxModernTypeLookup.py @@ -0,0 +1,20 @@ +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil + +class LibcxxModernTypeLookup(TestBase): + + mydir = TestBase.compute_mydir(__file__) + + @add_test_categories(["libc++"]) + def test(self): + self.build() + + # Activate modern-type-lookup. + self.runCmd("settings set target.experimental.use-modern-type-lookup true") + + lldbutil.run_to_source_breakpoint(self, + "// Set break point at this line.", lldb.SBFileSpec("main.cpp")) + + # Test a few simple expressions that should still work with modern-type-lookup. + self.expect("expr pair", substrs=["(std::", "pair + +int main(int argc, char **argv) { + std::pair pair = std::make_pair(1, 2L); + return pair.first; // Set break point at this line. +}