diff --git a/clang/lib/AST/ODRDiagsEmitter.cpp b/clang/lib/AST/ODRDiagsEmitter.cpp --- a/clang/lib/AST/ODRDiagsEmitter.cpp +++ b/clang/lib/AST/ODRDiagsEmitter.cpp @@ -2096,7 +2096,8 @@ << FirstDecl->getSourceRange(); Diag(SecondDecl->getLocation(), diag::note_module_odr_violation_mismatch_decl_unknown) - << SecondModule << FirstDiffType << SecondDecl->getSourceRange(); + << SecondModule.empty() << SecondModule << FirstDiffType + << SecondDecl->getSourceRange(); return true; } diff --git a/clang/lib/AST/ODRHash.cpp b/clang/lib/AST/ODRHash.cpp --- a/clang/lib/AST/ODRHash.cpp +++ b/clang/lib/AST/ODRHash.cpp @@ -377,7 +377,6 @@ Hash.AddBoolean(Method->isVariadic()); Hash.AddBoolean(Method->isSynthesizedAccessorStub()); Hash.AddBoolean(Method->isDefined()); - Hash.AddBoolean(Method->isOverriding()); Hash.AddBoolean(Method->isDirectMethod()); Hash.AddBoolean(Method->isThisDeclarationADesignatedInitializer()); Hash.AddBoolean(Method->hasSkippedBody()); diff --git a/clang/test/Modules/compare-objc-nonisolated-methods.m b/clang/test/Modules/compare-objc-nonisolated-methods.m new file mode 100644 --- /dev/null +++ b/clang/test/Modules/compare-objc-nonisolated-methods.m @@ -0,0 +1,54 @@ +// RUN: rm -rf %t +// RUN: split-file %s %t + +// Test that different values of `ObjCMethodDecl::isOverriding` in different modules +// is not an error because it depends on the surrounding code and not on the method itself. +// RUN: %clang_cc1 -fsyntax-only -verify -I%t/include -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/modules.cache -fmodule-name=Override %t/test-overriding.m + +//--- include/Common.h +@interface NSObject +@end + +//--- include/Indirection.h +#import + +//--- include/module.modulemap +module Common { + header "Common.h" + export * +} +module Indirection { + header "Indirection.h" + export * +} +module Override { + header "Override.h" + export * +} + +//--- include/Override.h +#import +@interface SubClass: NSObject +- (void)potentialOverride; +@end + +//--- Override_Internal.h +#import +@interface NSObject(InternalCategory) +- (void)potentialOverride; +@end + +//--- test-overriding.m +//expected-no-diagnostics +// Get non-modular version of `SubClass`, so that `-[SubClass potentialOverride]` +// is an override of a method in `InternalCategory`. +#import "Override_Internal.h" +#import + +// Get modular version of `SubClass` where `-[SubClass potentialOverride]` is +// not an override because module "Override" doesn't know about Override_Internal.h. +#import + +void triggerOverrideCheck(SubClass *sc) { + [sc potentialOverride]; +}