Index: lldb/source/Plugins/ExpressionParser/Clang/ClangExternalASTSourceCallbacks.cpp =================================================================== --- lldb/source/Plugins/ExpressionParser/Clang/ClangExternalASTSourceCallbacks.cpp +++ lldb/source/Plugins/ExpressionParser/Clang/ClangExternalASTSourceCallbacks.cpp @@ -53,7 +53,8 @@ // Objective-C methods are not added into the LookupPtr when they originate // from an external source. SetExternalVisibleDeclsForName() adds them. if (auto *oid = llvm::dyn_cast(DC)) { - for (auto *omd : oid->methods()) + clang::ObjCContainerDecl::method_range noload_methods(oid->noload_decls()); + for (auto *omd : noload_methods) if (omd->getDeclName() == Name) decls.push_back(omd); } Index: lldb/test/Shell/SymbolFile/DWARF/module-ownership.mm =================================================================== --- lldb/test/Shell/SymbolFile/DWARF/module-ownership.mm +++ lldb/test/Shell/SymbolFile/DWARF/module-ownership.mm @@ -46,7 +46,7 @@ // RUN: lldb-test symbols -dump-clang-ast -find type --language=ObjC++ \ // RUN: -compiler-context 'Module:A,Struct:SomeClass' %t.o \ // RUN: | FileCheck %s --check-prefix=CHECK-OBJC -// CHECK-OBJC: ObjCInterfaceDecl {{.*}} imported in A SomeClass +// CHECK-OBJC: ObjCInterfaceDecl {{.*}} imported in A SomeClass // CHECK-OBJC-NEXT: |-ObjCIvarDecl // CHECK-OBJC-NEXT: |-ObjCMethodDecl 0x[[NUMBER:[0-9a-f]+]]{{.*}} imported in A // CHECK-OBJC-NEXT: `-ObjCPropertyDecl {{.*}} imported in A number 'int' readonly Index: lldb/unittests/Symbol/TestTypeSystemClang.cpp =================================================================== --- lldb/unittests/Symbol/TestTypeSystemClang.cpp +++ lldb/unittests/Symbol/TestTypeSystemClang.cpp @@ -688,3 +688,37 @@ auto *record = llvm::cast(ClangUtil::GetAsTagDecl(t)); EXPECT_TRUE(record->hasUserDeclaredCopyConstructor()); } + +TEST_F(TestTypeSystemClang, AddMethodToObjCObjectType) { + // Create an interface decl and mark it as having external storage. + CompilerType c = m_ast->CreateObjCClass("A", m_ast->GetTranslationUnitDecl(), + OptionalClangModuleID(), + /*IsForwardDecl*/ false, + /*IsInternal*/ false); + ObjCInterfaceDecl *interface = m_ast->GetAsObjCInterfaceDecl(c); + m_ast->SetHasExternalStorage(c.GetOpaqueQualType(), true); + EXPECT_TRUE(interface->hasExternalLexicalStorage()); + + // Add a method to the interface. + std::vector args; + CompilerType func_type = + m_ast->CreateFunctionType(m_ast->GetBasicType(lldb::eBasicTypeInt), + args.data(), args.size(), /*variadic*/ false, + /*quals*/ 0, clang::CallingConv::CC_C); + bool variadic = false; + bool artificial = false; + bool objc_direct = false; + clang::ObjCMethodDecl *method = TypeSystemClang::AddMethodToObjCObjectType( + c, "-[A foo]", func_type, lldb::eAccessPublic, artificial, variadic, + objc_direct); + ASSERT_NE(method, nullptr); + + // The interface decl should still have external lexical storage. + EXPECT_TRUE(interface->hasExternalLexicalStorage()); + + // Test some properties of the created ObjCMethodDecl. + EXPECT_FALSE(method->isVariadic()); + EXPECT_TRUE(method->isImplicit()); + EXPECT_FALSE(method->isDirectMethod()); + EXPECT_EQ(method->getDeclName().getObjCSelector().getAsString(), "foo"); +}