16ba4afb4SVolodymyr Sapsai// RUN: rm -rf %t 26ba4afb4SVolodymyr Sapsai// RUN: split-file %s %t 36ba4afb4SVolodymyr Sapsai 46ba4afb4SVolodymyr Sapsai// Build first header file 56ba4afb4SVolodymyr Sapsai// RUN: echo "#define FIRST" >> %t/include/first.h 66ba4afb4SVolodymyr Sapsai// RUN: cat %t/test.m >> %t/include/first.h 76ba4afb4SVolodymyr Sapsai// RUN: echo "#undef FIRST" >> %t/include/first.h 86ba4afb4SVolodymyr Sapsai 96ba4afb4SVolodymyr Sapsai// Build second header file 106ba4afb4SVolodymyr Sapsai// RUN: echo "#define SECOND" >> %t/include/second.h 116ba4afb4SVolodymyr Sapsai// RUN: cat %t/test.m >> %t/include/second.h 126ba4afb4SVolodymyr Sapsai// RUN: echo "#undef SECOND" >> %t/include/second.h 136ba4afb4SVolodymyr Sapsai 146ba4afb4SVolodymyr Sapsai// Test that each header can compile 156ba4afb4SVolodymyr Sapsai// RUN: %clang_cc1 -fsyntax-only -x objective-c %t/include/first.h -fblocks -fobjc-arc 166ba4afb4SVolodymyr Sapsai// RUN: %clang_cc1 -fsyntax-only -x objective-c %t/include/second.h -fblocks -fobjc-arc 176ba4afb4SVolodymyr Sapsai 186ba4afb4SVolodymyr Sapsai// Run test 196ba4afb4SVolodymyr Sapsai// RUN: %clang_cc1 -I%t/include -verify %t/test.m -fblocks -fobjc-arc \ 206ba4afb4SVolodymyr Sapsai// RUN: -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/modules.cache 216ba4afb4SVolodymyr Sapsai 22ed7a46a8SVolodymyr Sapsai// Run the same test with second.h being modular 23ed7a46a8SVolodymyr Sapsai// RUN: cat %t/include/second.modulemap >> %t/include/module.modulemap 24ed7a46a8SVolodymyr Sapsai// RUN: %clang_cc1 -I%t/include -verify %t/test.m -fblocks -fobjc-arc -DTEST_MODULAR=1 \ 25ed7a46a8SVolodymyr Sapsai// RUN: -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/modules.cache 26ed7a46a8SVolodymyr Sapsai 276ba4afb4SVolodymyr Sapsai// Test that we don't accept different class definitions with the same name 286ba4afb4SVolodymyr Sapsai// from multiple modules but detect mismatches and provide actionable 296ba4afb4SVolodymyr Sapsai// diagnostic. 306ba4afb4SVolodymyr Sapsai 316ba4afb4SVolodymyr Sapsai//--- include/common.h 326ba4afb4SVolodymyr Sapsai#ifndef COMMON_H 336ba4afb4SVolodymyr Sapsai#define COMMON_H 346ba4afb4SVolodymyr Sapsai@interface NSObject @end 356ba4afb4SVolodymyr Sapsai@protocol CommonProtocol @end 366ba4afb4SVolodymyr Sapsai@protocol ExtraProtocol @end 376ba4afb4SVolodymyr Sapsai#endif 386ba4afb4SVolodymyr Sapsai 396ba4afb4SVolodymyr Sapsai//--- include/first-empty.h 406ba4afb4SVolodymyr Sapsai//--- include/module.modulemap 416ba4afb4SVolodymyr Sapsaimodule First { 426ba4afb4SVolodymyr Sapsai module Empty { 436ba4afb4SVolodymyr Sapsai header "first-empty.h" 446ba4afb4SVolodymyr Sapsai } 456ba4afb4SVolodymyr Sapsai module Hidden { 466ba4afb4SVolodymyr Sapsai header "first.h" 476ba4afb4SVolodymyr Sapsai export * 486ba4afb4SVolodymyr Sapsai } 496ba4afb4SVolodymyr Sapsai} 50ed7a46a8SVolodymyr Sapsai 51ed7a46a8SVolodymyr Sapsai//--- include/second.modulemap 526ba4afb4SVolodymyr Sapsaimodule Second { 536ba4afb4SVolodymyr Sapsai header "second.h" 546ba4afb4SVolodymyr Sapsai export * 556ba4afb4SVolodymyr Sapsai} 566ba4afb4SVolodymyr Sapsai 576ba4afb4SVolodymyr Sapsai//--- test.m 586ba4afb4SVolodymyr Sapsai#if defined(FIRST) || defined(SECOND) 596ba4afb4SVolodymyr Sapsai# include "common.h" 606ba4afb4SVolodymyr Sapsai#endif 616ba4afb4SVolodymyr Sapsai 626ba4afb4SVolodymyr Sapsai#if !defined(FIRST) && !defined(SECOND) 636ba4afb4SVolodymyr Sapsai# include "first-empty.h" 646ba4afb4SVolodymyr Sapsai# include "second.h" 656ba4afb4SVolodymyr Sapsai#endif 666ba4afb4SVolodymyr Sapsai 676ba4afb4SVolodymyr Sapsai#if defined(FIRST) 686ba4afb4SVolodymyr Sapsai@class CompareForwardDeclaration1; 696ba4afb4SVolodymyr Sapsai@interface CompareForwardDeclaration2: NSObject @end 706ba4afb4SVolodymyr Sapsai#elif defined(SECOND) 716ba4afb4SVolodymyr Sapsai@interface CompareForwardDeclaration1: NSObject @end 726ba4afb4SVolodymyr Sapsai@class CompareForwardDeclaration2; 736ba4afb4SVolodymyr Sapsai#else 746ba4afb4SVolodymyr SapsaiCompareForwardDeclaration1 *compareForwardDeclaration1; 756ba4afb4SVolodymyr SapsaiCompareForwardDeclaration2 *compareForwardDeclaration2; 766ba4afb4SVolodymyr Sapsai#endif 776ba4afb4SVolodymyr Sapsai 786ba4afb4SVolodymyr Sapsai#if defined(FIRST) 796ba4afb4SVolodymyr Sapsai@interface CompareMatchingSuperclass: NSObject @end 806ba4afb4SVolodymyr Sapsai 816ba4afb4SVolodymyr Sapsai@interface CompareSuperclassPresence1: NSObject @end 826ba4afb4SVolodymyr Sapsai@interface CompareSuperclassPresence2 @end 836ba4afb4SVolodymyr Sapsai 846ba4afb4SVolodymyr Sapsai@interface CompareDifferentSuperclass: NSObject @end 856ba4afb4SVolodymyr Sapsai#elif defined(SECOND) 866ba4afb4SVolodymyr Sapsai@interface CompareMatchingSuperclass: NSObject @end 876ba4afb4SVolodymyr Sapsai 886ba4afb4SVolodymyr Sapsai@interface CompareSuperclassPresence1 @end 896ba4afb4SVolodymyr Sapsai@interface CompareSuperclassPresence2: NSObject @end 906ba4afb4SVolodymyr Sapsai 916ba4afb4SVolodymyr Sapsai@interface DifferentSuperclass: NSObject @end 926ba4afb4SVolodymyr Sapsai@interface CompareDifferentSuperclass: DifferentSuperclass @end 936ba4afb4SVolodymyr Sapsai#else 946ba4afb4SVolodymyr SapsaiCompareMatchingSuperclass *compareMatchingSuperclass; 956ba4afb4SVolodymyr SapsaiCompareSuperclassPresence1 *compareSuperclassPresence1; 966ba4afb4SVolodymyr Sapsai// expected-error@first.h:* {{'CompareSuperclassPresence1' has different definitions in different modules; first difference is definition in module 'First.Hidden' found super class with type 'NSObject'}} 97ed7a46a8SVolodymyr Sapsai// expected-note-re@second.h:* {{but in {{'Second'|definition here}} found no super class}} 986ba4afb4SVolodymyr SapsaiCompareSuperclassPresence2 *compareSuperclassPresence2; 996ba4afb4SVolodymyr Sapsai// expected-error@first.h:* {{'CompareSuperclassPresence2' has different definitions in different modules; first difference is definition in module 'First.Hidden' found no super class}} 100ed7a46a8SVolodymyr Sapsai// expected-note-re@second.h:* {{but in {{'Second'|definition here}} found super class with type 'NSObject'}} 1016ba4afb4SVolodymyr SapsaiCompareDifferentSuperclass *compareDifferentSuperclass; 1026ba4afb4SVolodymyr Sapsai// expected-error@first.h:* {{'CompareDifferentSuperclass' has different definitions in different modules; first difference is definition in module 'First.Hidden' found super class with type 'NSObject'}} 103ed7a46a8SVolodymyr Sapsai// expected-note-re@second.h:* {{but in {{'Second'|definition here}} found super class with type 'DifferentSuperclass'}} 1046ba4afb4SVolodymyr Sapsai#endif 1056ba4afb4SVolodymyr Sapsai 1066ba4afb4SVolodymyr Sapsai#if defined(FIRST) 1076ba4afb4SVolodymyr Sapsai@interface CompareMatchingConformingProtocols: NSObject<CommonProtocol> @end 1086ba4afb4SVolodymyr Sapsai@protocol ForwardProtocol; 1096ba4afb4SVolodymyr Sapsai@interface CompareMatchingConformingForwardProtocols: NSObject<ForwardProtocol> @end 1106ba4afb4SVolodymyr Sapsai 1116ba4afb4SVolodymyr Sapsai@interface CompareProtocolPresence1: NSObject<CommonProtocol> @end 1126ba4afb4SVolodymyr Sapsai@interface CompareProtocolPresence2: NSObject @end 1136ba4afb4SVolodymyr Sapsai 1146ba4afb4SVolodymyr Sapsai@interface CompareDifferentProtocols: NSObject<CommonProtocol> @end 1156ba4afb4SVolodymyr Sapsai@interface CompareProtocolOrder: NSObject<CommonProtocol, ExtraProtocol> @end 1166ba4afb4SVolodymyr Sapsai#elif defined(SECOND) 1176ba4afb4SVolodymyr Sapsai@interface CompareMatchingConformingProtocols: NSObject<CommonProtocol> @end 1186ba4afb4SVolodymyr Sapsai@protocol ForwardProtocol @end 1196ba4afb4SVolodymyr Sapsai@interface CompareMatchingConformingForwardProtocols: NSObject<ForwardProtocol> @end 1206ba4afb4SVolodymyr Sapsai 1216ba4afb4SVolodymyr Sapsai@interface CompareProtocolPresence1: NSObject @end 1226ba4afb4SVolodymyr Sapsai@interface CompareProtocolPresence2: NSObject<CommonProtocol> @end 1236ba4afb4SVolodymyr Sapsai 1246ba4afb4SVolodymyr Sapsai@interface CompareDifferentProtocols: NSObject<ExtraProtocol> @end 1256ba4afb4SVolodymyr Sapsai@interface CompareProtocolOrder: NSObject<ExtraProtocol, CommonProtocol> @end 1266ba4afb4SVolodymyr Sapsai#else 1276ba4afb4SVolodymyr SapsaiCompareMatchingConformingProtocols *compareMatchingConformingProtocols; 1286ba4afb4SVolodymyr SapsaiCompareMatchingConformingForwardProtocols *compareMatchingConformingForwardProtocols; 1296ba4afb4SVolodymyr Sapsai 1306ba4afb4SVolodymyr SapsaiCompareProtocolPresence1 *compareProtocolPresence1; 1316ba4afb4SVolodymyr Sapsai// expected-error@first.h:* {{'CompareProtocolPresence1' has different definitions in different modules; first difference is definition in module 'First.Hidden' found 1 referenced protocol}} 132ed7a46a8SVolodymyr Sapsai// expected-note-re@second.h:* {{but in {{'Second'|definition here}} found 0 referenced protocols}} 1336ba4afb4SVolodymyr SapsaiCompareProtocolPresence2 *compareProtocolPresence2; 1346ba4afb4SVolodymyr Sapsai// expected-error@first.h:* {{'CompareProtocolPresence2' has different definitions in different modules; first difference is definition in module 'First.Hidden' found 0 referenced protocols}} 135ed7a46a8SVolodymyr Sapsai// expected-note-re@second.h:* {{but in {{'Second'|definition here}} found 1 referenced protocol}} 1366ba4afb4SVolodymyr Sapsai 1376ba4afb4SVolodymyr SapsaiCompareDifferentProtocols *compareDifferentProtocols; 1386ba4afb4SVolodymyr Sapsai// expected-error@first.h:* {{'CompareDifferentProtocols' has different definitions in different modules; first difference is definition in module 'First.Hidden' found 1st referenced protocol with name 'CommonProtocol'}} 139ed7a46a8SVolodymyr Sapsai// expected-note-re@second.h:* {{but in {{'Second'|definition here}} found 1st referenced protocol with different name 'ExtraProtocol'}} 1406ba4afb4SVolodymyr SapsaiCompareProtocolOrder *compareProtocolOrder; 1416ba4afb4SVolodymyr Sapsai// expected-error@first.h:* {{'CompareProtocolOrder' has different definitions in different modules; first difference is definition in module 'First.Hidden' found 1st referenced protocol with name 'CommonProtocol'}} 142ed7a46a8SVolodymyr Sapsai// expected-note-re@second.h:* {{but in {{'Second'|definition here}} found 1st referenced protocol with different name 'ExtraProtocol'}} 1436ba4afb4SVolodymyr Sapsai#endif 1446ba4afb4SVolodymyr Sapsai 1456ba4afb4SVolodymyr Sapsai#if defined(FIRST) 1466ba4afb4SVolodymyr Sapsai@interface CompareMatchingIVars: NSObject { int ivarName; } @end 1476ba4afb4SVolodymyr Sapsai 1486ba4afb4SVolodymyr Sapsai@interface CompareIVarPresence1: NSObject @end 1496ba4afb4SVolodymyr Sapsai@interface CompareIVarPresence2: NSObject { int ivarPresence2; } @end 1506ba4afb4SVolodymyr Sapsai 1516ba4afb4SVolodymyr Sapsai@interface CompareIVarName: NSObject { int ivarName; } @end 1526ba4afb4SVolodymyr Sapsai@interface CompareIVarType: NSObject { int ivarType; } @end 1536ba4afb4SVolodymyr Sapsai@interface CompareIVarOrder: NSObject { 1546ba4afb4SVolodymyr Sapsai int ivarNameInt; 1556ba4afb4SVolodymyr Sapsai float ivarNameFloat; 1566ba4afb4SVolodymyr Sapsai} 1576ba4afb4SVolodymyr Sapsai@end 1586ba4afb4SVolodymyr Sapsai 1596ba4afb4SVolodymyr Sapsai@interface CompareIVarVisibilityExplicit: NSObject { 1606ba4afb4SVolodymyr Sapsai@public 1616ba4afb4SVolodymyr Sapsai int ivarVisibility; 1626ba4afb4SVolodymyr Sapsai} 1636ba4afb4SVolodymyr Sapsai@end 1646ba4afb4SVolodymyr Sapsai@interface CompareIVarVisibilityDefault: NSObject { 1656ba4afb4SVolodymyr Sapsai int ivarVisibilityDefault; 1666ba4afb4SVolodymyr Sapsai} 1676ba4afb4SVolodymyr Sapsai@end 1686ba4afb4SVolodymyr Sapsai#elif defined(SECOND) 1696ba4afb4SVolodymyr Sapsai@interface CompareMatchingIVars: NSObject { int ivarName; } @end 1706ba4afb4SVolodymyr Sapsai 1716ba4afb4SVolodymyr Sapsai@interface CompareIVarPresence1: NSObject { int ivarPresence1; } @end 1726ba4afb4SVolodymyr Sapsai@interface CompareIVarPresence2: NSObject @end 1736ba4afb4SVolodymyr Sapsai 1746ba4afb4SVolodymyr Sapsai@interface CompareIVarName: NSObject { int differentIvarName; } @end 1756ba4afb4SVolodymyr Sapsai@interface CompareIVarType: NSObject { float ivarType; } @end 1766ba4afb4SVolodymyr Sapsai@interface CompareIVarOrder: NSObject { 1776ba4afb4SVolodymyr Sapsai float ivarNameFloat; 1786ba4afb4SVolodymyr Sapsai int ivarNameInt; 1796ba4afb4SVolodymyr Sapsai} 1806ba4afb4SVolodymyr Sapsai@end 1816ba4afb4SVolodymyr Sapsai 1826ba4afb4SVolodymyr Sapsai@interface CompareIVarVisibilityExplicit: NSObject { 1836ba4afb4SVolodymyr Sapsai@private 1846ba4afb4SVolodymyr Sapsai int ivarVisibility; 1856ba4afb4SVolodymyr Sapsai} 1866ba4afb4SVolodymyr Sapsai@end 1876ba4afb4SVolodymyr Sapsai@interface CompareIVarVisibilityDefault: NSObject { 1886ba4afb4SVolodymyr Sapsai@public 1896ba4afb4SVolodymyr Sapsai int ivarVisibilityDefault; 1906ba4afb4SVolodymyr Sapsai} 1916ba4afb4SVolodymyr Sapsai@end 1926ba4afb4SVolodymyr Sapsai#else 1936ba4afb4SVolodymyr SapsaiCompareMatchingIVars *compareMatchingIVars; 1946ba4afb4SVolodymyr Sapsai 1956ba4afb4SVolodymyr SapsaiCompareIVarPresence1 *compareIVarPresence1; 196ed7a46a8SVolodymyr Sapsai#ifdef TEST_MODULAR 1976ba4afb4SVolodymyr Sapsai// expected-error@second.h:* {{'CompareIVarPresence1::ivarPresence1' from module 'Second' is not present in definition of 'CompareIVarPresence1' in module 'First.Hidden'}} 1986ba4afb4SVolodymyr Sapsai// expected-note@first.h:* {{definition has no member 'ivarPresence1'}} 199ed7a46a8SVolodymyr Sapsai#else 200ed7a46a8SVolodymyr Sapsai// expected-error@first.h:* {{'CompareIVarPresence1' has different definitions in different modules; first difference is definition in module 'First.Hidden' found end of class}} 201ed7a46a8SVolodymyr Sapsai// expected-note@second.h:* {{but in definition here found instance variable}} 202ed7a46a8SVolodymyr Sapsai#endif 2036ba4afb4SVolodymyr SapsaiCompareIVarPresence2 *compareIVarPresence2; 2046ba4afb4SVolodymyr Sapsai// expected-error@first.h:* {{'CompareIVarPresence2' has different definitions in different modules; first difference is definition in module 'First.Hidden' found instance variable}} 205ed7a46a8SVolodymyr Sapsai// expected-note-re@second.h:* {{but in {{'Second'|definition here}} found end of class}} 2066ba4afb4SVolodymyr Sapsai 2076ba4afb4SVolodymyr SapsaiCompareIVarName *compareIVarName; 208ed7a46a8SVolodymyr Sapsai#ifdef TEST_MODULAR 2096ba4afb4SVolodymyr Sapsai// expected-error@second.h:* {{'CompareIVarName::differentIvarName' from module 'Second' is not present in definition of 'CompareIVarName' in module 'First.Hidden'}} 2106ba4afb4SVolodymyr Sapsai// expected-note@first.h:* {{definition has no member 'differentIvarName'}} 211ed7a46a8SVolodymyr Sapsai#else 212ed7a46a8SVolodymyr Sapsai// expected-error@first.h:* {{'CompareIVarName' has different definitions in different modules; first difference is definition in module 'First.Hidden' found field 'ivarName'}} 213ed7a46a8SVolodymyr Sapsai// expected-note@second.h:* {{but in definition here found field 'differentIvarName'}} 214ed7a46a8SVolodymyr Sapsai#endif 2156ba4afb4SVolodymyr SapsaiCompareIVarType *compareIVarType; 216ed7a46a8SVolodymyr Sapsai#ifdef TEST_MODULAR 2176ba4afb4SVolodymyr Sapsai// expected-error@second.h:* {{'CompareIVarType::ivarType' from module 'Second' is not present in definition of 'CompareIVarType' in module 'First.Hidden'}} 2186ba4afb4SVolodymyr Sapsai// expected-note@first.h:* {{declaration of 'ivarType' does not match}} 219ed7a46a8SVolodymyr Sapsai#else 220ed7a46a8SVolodymyr Sapsai// expected-error@first.h:* {{'CompareIVarType' has different definitions in different modules; first difference is definition in module 'First.Hidden' found field 'ivarType' with type 'int'}} 221ed7a46a8SVolodymyr Sapsai// expected-note@second.h:* {{but in definition here found field 'ivarType' with type 'float'}} 222ed7a46a8SVolodymyr Sapsai#endif 2236ba4afb4SVolodymyr SapsaiCompareIVarOrder *compareIVarOrder; 2246ba4afb4SVolodymyr Sapsai// expected-error@first.h:* {{'CompareIVarOrder' has different definitions in different modules; first difference is definition in module 'First.Hidden' found field 'ivarNameInt'}} 225ed7a46a8SVolodymyr Sapsai// expected-note-re@second.h:* {{but in {{'Second'|definition here}} found field 'ivarNameFloat'}} 2266ba4afb4SVolodymyr Sapsai 2276ba4afb4SVolodymyr SapsaiCompareIVarVisibilityExplicit *compareIVarVisibilityExplicit; 2286ba4afb4SVolodymyr Sapsai// expected-error@first.h:* {{'CompareIVarVisibilityExplicit' has different definitions in different modules; first difference is definition in module 'First.Hidden' found instance variable 'ivarVisibility' access control is @public}} 229ed7a46a8SVolodymyr Sapsai// expected-note-re@second.h:* {{but in {{'Second'|definition here}} found instance variable 'ivarVisibility' access control is @private}} 2306ba4afb4SVolodymyr SapsaiCompareIVarVisibilityDefault *compareIVarVisibilityDefault; 2316ba4afb4SVolodymyr Sapsai// expected-error@first.h:* {{'CompareIVarVisibilityDefault' has different definitions in different modules; first difference is definition in module 'First.Hidden' found instance variable 'ivarVisibilityDefault' access control is @protected}} 232ed7a46a8SVolodymyr Sapsai// expected-note-re@second.h:* {{but in {{'Second'|definition here}} found instance variable 'ivarVisibilityDefault' access control is @public}} 2336ba4afb4SVolodymyr Sapsai#endif 2346ba4afb4SVolodymyr Sapsai 2356ba4afb4SVolodymyr Sapsai#if defined(FIRST) 2366ba4afb4SVolodymyr Sapsai@interface CompareMatchingMethods: NSObject 2376ba4afb4SVolodymyr Sapsai- (float)matchingMethod:(int)arg; 2386ba4afb4SVolodymyr Sapsai@end 2396ba4afb4SVolodymyr Sapsai 2406ba4afb4SVolodymyr Sapsai@interface CompareMethodPresence1: NSObject 2416ba4afb4SVolodymyr Sapsai- (void)presenceMethod1; 2426ba4afb4SVolodymyr Sapsai@end 2436ba4afb4SVolodymyr Sapsai@interface CompareMethodPresence2: NSObject 2446ba4afb4SVolodymyr Sapsai@end 2456ba4afb4SVolodymyr Sapsai 2466ba4afb4SVolodymyr Sapsai@interface CompareMethodName: NSObject 2476ba4afb4SVolodymyr Sapsai- (void)methodNameA; 2486ba4afb4SVolodymyr Sapsai@end 2496ba4afb4SVolodymyr Sapsai 2506ba4afb4SVolodymyr Sapsai@interface CompareMethodArgCount: NSObject 2516ba4afb4SVolodymyr Sapsai- (void)methodArgCount:(int)arg0 :(int)arg1; 2526ba4afb4SVolodymyr Sapsai@end 2536ba4afb4SVolodymyr Sapsai@interface CompareMethodArgName: NSObject 2546ba4afb4SVolodymyr Sapsai- (void)methodArgName:(int)argNameA; 2556ba4afb4SVolodymyr Sapsai@end 2566ba4afb4SVolodymyr Sapsai@interface CompareMethodArgType: NSObject 2576ba4afb4SVolodymyr Sapsai- (void)methodArgType:(int)argType; 2586ba4afb4SVolodymyr Sapsai@end 2596ba4afb4SVolodymyr Sapsai 2606ba4afb4SVolodymyr Sapsai@interface CompareMethodReturnType: NSObject 2616ba4afb4SVolodymyr Sapsai- (int)methodReturnType; 2626ba4afb4SVolodymyr Sapsai@end 2636ba4afb4SVolodymyr Sapsai 2646ba4afb4SVolodymyr Sapsai@interface CompareMethodOrder: NSObject 2656ba4afb4SVolodymyr Sapsai- (void)methodOrderFirst; 2666ba4afb4SVolodymyr Sapsai- (void)methodOrderSecond; 2676ba4afb4SVolodymyr Sapsai@end 2686ba4afb4SVolodymyr Sapsai 2696ba4afb4SVolodymyr Sapsai@interface CompareMethodClassInstance: NSObject 2706ba4afb4SVolodymyr Sapsai+ (void)methodClassInstance; 2716ba4afb4SVolodymyr Sapsai@end 2726ba4afb4SVolodymyr Sapsai#elif defined(SECOND) 2736ba4afb4SVolodymyr Sapsai@interface CompareMatchingMethods: NSObject 2746ba4afb4SVolodymyr Sapsai- (float)matchingMethod:(int)arg; 2756ba4afb4SVolodymyr Sapsai@end 2766ba4afb4SVolodymyr Sapsai 2776ba4afb4SVolodymyr Sapsai@interface CompareMethodPresence1: NSObject 2786ba4afb4SVolodymyr Sapsai@end 2796ba4afb4SVolodymyr Sapsai@interface CompareMethodPresence2: NSObject 2806ba4afb4SVolodymyr Sapsai- (void)presenceMethod2; 2816ba4afb4SVolodymyr Sapsai@end 2826ba4afb4SVolodymyr Sapsai 2836ba4afb4SVolodymyr Sapsai@interface CompareMethodName: NSObject 2846ba4afb4SVolodymyr Sapsai- (void)methodNameB; 2856ba4afb4SVolodymyr Sapsai@end 2866ba4afb4SVolodymyr Sapsai 2876ba4afb4SVolodymyr Sapsai@interface CompareMethodArgCount: NSObject 2886ba4afb4SVolodymyr Sapsai- (void)methodArgCount:(int)arg0; 2896ba4afb4SVolodymyr Sapsai@end 2906ba4afb4SVolodymyr Sapsai@interface CompareMethodArgName: NSObject 2916ba4afb4SVolodymyr Sapsai- (void)methodArgName:(int)argNameB; 2926ba4afb4SVolodymyr Sapsai@end 2936ba4afb4SVolodymyr Sapsai@interface CompareMethodArgType: NSObject 2946ba4afb4SVolodymyr Sapsai- (void)methodArgType:(float)argType; 2956ba4afb4SVolodymyr Sapsai@end 2966ba4afb4SVolodymyr Sapsai 2976ba4afb4SVolodymyr Sapsai@interface CompareMethodReturnType: NSObject 2986ba4afb4SVolodymyr Sapsai- (float)methodReturnType; 2996ba4afb4SVolodymyr Sapsai@end 3006ba4afb4SVolodymyr Sapsai 3016ba4afb4SVolodymyr Sapsai@interface CompareMethodOrder: NSObject 3026ba4afb4SVolodymyr Sapsai- (void)methodOrderSecond; 3036ba4afb4SVolodymyr Sapsai- (void)methodOrderFirst; 3046ba4afb4SVolodymyr Sapsai@end 3056ba4afb4SVolodymyr Sapsai 3066ba4afb4SVolodymyr Sapsai@interface CompareMethodClassInstance: NSObject 3076ba4afb4SVolodymyr Sapsai- (void)methodClassInstance; 3086ba4afb4SVolodymyr Sapsai@end 3096ba4afb4SVolodymyr Sapsai#else 3106ba4afb4SVolodymyr SapsaiCompareMatchingMethods *compareMatchingMethods; 3116ba4afb4SVolodymyr SapsaiCompareMethodPresence1 *compareMethodPresence1; 3126ba4afb4SVolodymyr Sapsai// expected-error@first.h:* {{'CompareMethodPresence1' has different definitions in different modules; first difference is definition in module 'First.Hidden' found method}} 313ed7a46a8SVolodymyr Sapsai// expected-note-re@second.h:* {{but in {{'Second'|definition here}} found end of class}} 3146ba4afb4SVolodymyr SapsaiCompareMethodPresence2 *compareMethodPresence2; 3156ba4afb4SVolodymyr Sapsai// expected-error@first.h:* {{'CompareMethodPresence2' has different definitions in different modules; first difference is definition in module 'First.Hidden' found end of class}} 316ed7a46a8SVolodymyr Sapsai// expected-note-re@second.h:* {{but in {{'Second'|definition here}} found method}} 3176ba4afb4SVolodymyr SapsaiCompareMethodName *compareMethodName; 3186ba4afb4SVolodymyr Sapsai// expected-error@first.h:* {{'CompareMethodName' has different definitions in different modules; first difference is definition in module 'First.Hidden' found method 'methodNameA'}} 319ed7a46a8SVolodymyr Sapsai// expected-note-re@second.h:* {{but in {{'Second'|definition here}} found different method 'methodNameB'}} 3206ba4afb4SVolodymyr Sapsai 3216ba4afb4SVolodymyr SapsaiCompareMethodArgCount *compareMethodArgCount; 3226ba4afb4SVolodymyr Sapsai// expected-error@first.h:* {{'CompareMethodArgCount' has different definitions in different modules; first difference is definition in module 'First.Hidden' found method 'methodArgCount::' that has 2 parameters}} 323ed7a46a8SVolodymyr Sapsai// expected-note-re@second.h:* {{but in {{'Second'|definition here}} found method 'methodArgCount:' that has 1 parameter}} 3246ba4afb4SVolodymyr SapsaiCompareMethodArgName *compareMethodArgName; 3256ba4afb4SVolodymyr Sapsai// expected-error@first.h:* {{'CompareMethodArgName' has different definitions in different modules; first difference is definition in module 'First.Hidden' found method 'methodArgName:' with 1st parameter named 'argNameA'}} 326ed7a46a8SVolodymyr Sapsai// expected-note-re@second.h:* {{but in {{'Second'|definition here}} found method 'methodArgName:' with 1st parameter named 'argNameB'}} 3276ba4afb4SVolodymyr SapsaiCompareMethodArgType *compareMethodArgType; 3286ba4afb4SVolodymyr Sapsai// expected-error@first.h:* {{'CompareMethodArgType' has different definitions in different modules; first difference is definition in module 'First.Hidden' found method 'methodArgType:' with 1st parameter of type 'int'}} 329ed7a46a8SVolodymyr Sapsai// expected-note-re@second.h:* {{but in {{'Second'|definition here}} found method 'methodArgType:' with 1st parameter of type 'float'}} 3306ba4afb4SVolodymyr Sapsai 3316ba4afb4SVolodymyr SapsaiCompareMethodReturnType *compareMethodReturnType; 3326ba4afb4SVolodymyr Sapsai// expected-error@first.h:* {{'CompareMethodReturnType' has different definitions in different modules; first difference is definition in module 'First.Hidden' found method 'methodReturnType' with return type 'int'}} 333ed7a46a8SVolodymyr Sapsai// expected-note-re@second.h:* {{but in {{'Second'|definition here}} found method 'methodReturnType' with different return type 'float'}} 3346ba4afb4SVolodymyr Sapsai 3356ba4afb4SVolodymyr SapsaiCompareMethodOrder *compareMethodOrder; 3366ba4afb4SVolodymyr Sapsai// expected-error@first.h:* {{'CompareMethodOrder' has different definitions in different modules; first difference is definition in module 'First.Hidden' found method 'methodOrderFirst'}} 337ed7a46a8SVolodymyr Sapsai// expected-note-re@second.h:* {{but in {{'Second'|definition here}} found different method 'methodOrderSecond'}} 3386ba4afb4SVolodymyr SapsaiCompareMethodClassInstance *compareMethodClassInstance; 3396ba4afb4SVolodymyr Sapsai// expected-error@first.h:* {{'CompareMethodClassInstance' has different definitions in different modules; first difference is definition in module 'First.Hidden' found class method 'methodClassInstance'}} 340ed7a46a8SVolodymyr Sapsai// expected-note-re@second.h:* {{but in {{'Second'|definition here}} found method 'methodClassInstance' as instance method}} 3416ba4afb4SVolodymyr Sapsai#endif 3426ba4afb4SVolodymyr Sapsai 3436ba4afb4SVolodymyr Sapsai#if defined(FIRST) 3446ba4afb4SVolodymyr Sapsai@interface CompareMatchingProperties: NSObject 3456ba4afb4SVolodymyr Sapsai@property int matchingPropName; 3466ba4afb4SVolodymyr Sapsai@end 3476ba4afb4SVolodymyr Sapsai 3486ba4afb4SVolodymyr Sapsai@interface ComparePropertyPresence1: NSObject 3496ba4afb4SVolodymyr Sapsai@property int propPresence1; 3506ba4afb4SVolodymyr Sapsai@end 3516ba4afb4SVolodymyr Sapsai@interface ComparePropertyPresence2: NSObject 3526ba4afb4SVolodymyr Sapsai@end 3536ba4afb4SVolodymyr Sapsai 3546ba4afb4SVolodymyr Sapsai@interface ComparePropertyName: NSObject 3556ba4afb4SVolodymyr Sapsai@property int propNameA; 3566ba4afb4SVolodymyr Sapsai@end 3576ba4afb4SVolodymyr Sapsai 3586ba4afb4SVolodymyr Sapsai@interface ComparePropertyType: NSObject 3596ba4afb4SVolodymyr Sapsai@property int propType; 3606ba4afb4SVolodymyr Sapsai@end 3616ba4afb4SVolodymyr Sapsai 3626ba4afb4SVolodymyr Sapsai@interface ComparePropertyOrder: NSObject 3636ba4afb4SVolodymyr Sapsai@property int propOrderX; 3646ba4afb4SVolodymyr Sapsai@property int propOrderY; 3656ba4afb4SVolodymyr Sapsai@end 3666ba4afb4SVolodymyr Sapsai 3676ba4afb4SVolodymyr Sapsai@interface CompareMatchingPropertyAttributes: NSObject 3686ba4afb4SVolodymyr Sapsai@property (nonatomic, assign) int matchingProp; 3696ba4afb4SVolodymyr Sapsai@end 3706ba4afb4SVolodymyr Sapsai@interface ComparePropertyAttributes: NSObject 3716ba4afb4SVolodymyr Sapsai@property (readonly) int propAttributes; 3726ba4afb4SVolodymyr Sapsai@end 3736ba4afb4SVolodymyr Sapsai// Edge cases. 3746ba4afb4SVolodymyr Sapsai@interface CompareFirstImplAttribute: NSObject 3756ba4afb4SVolodymyr Sapsai@property int firstImplAttribute; 3766ba4afb4SVolodymyr Sapsai@end 3776ba4afb4SVolodymyr Sapsai@interface CompareLastImplAttribute: NSObject 3786ba4afb4SVolodymyr Sapsai@property (direct) int lastImplAttribute; 3796ba4afb4SVolodymyr Sapsai@end 3806ba4afb4SVolodymyr Sapsai#elif defined(SECOND) 3816ba4afb4SVolodymyr Sapsai@interface CompareMatchingProperties: NSObject 3826ba4afb4SVolodymyr Sapsai@property int matchingPropName; 3836ba4afb4SVolodymyr Sapsai@end 3846ba4afb4SVolodymyr Sapsai 3856ba4afb4SVolodymyr Sapsai@interface ComparePropertyPresence1: NSObject 3866ba4afb4SVolodymyr Sapsai@end 3876ba4afb4SVolodymyr Sapsai@interface ComparePropertyPresence2: NSObject 3886ba4afb4SVolodymyr Sapsai@property int propPresence2; 3896ba4afb4SVolodymyr Sapsai@end 3906ba4afb4SVolodymyr Sapsai 3916ba4afb4SVolodymyr Sapsai@interface ComparePropertyName: NSObject 3926ba4afb4SVolodymyr Sapsai@property int propNameB; 3936ba4afb4SVolodymyr Sapsai@end 3946ba4afb4SVolodymyr Sapsai 3956ba4afb4SVolodymyr Sapsai@interface ComparePropertyType: NSObject 3966ba4afb4SVolodymyr Sapsai@property float propType; 3976ba4afb4SVolodymyr Sapsai@end 3986ba4afb4SVolodymyr Sapsai 3996ba4afb4SVolodymyr Sapsai@interface ComparePropertyOrder: NSObject 4006ba4afb4SVolodymyr Sapsai@property int propOrderY; 4016ba4afb4SVolodymyr Sapsai@property int propOrderX; 4026ba4afb4SVolodymyr Sapsai@end 4036ba4afb4SVolodymyr Sapsai 4046ba4afb4SVolodymyr Sapsai@interface CompareMatchingPropertyAttributes: NSObject 4056ba4afb4SVolodymyr Sapsai@property (assign, nonatomic) int matchingProp; 4066ba4afb4SVolodymyr Sapsai@end 4076ba4afb4SVolodymyr Sapsai@interface ComparePropertyAttributes: NSObject 4086ba4afb4SVolodymyr Sapsai@property (readwrite) int propAttributes; 4096ba4afb4SVolodymyr Sapsai@end 4106ba4afb4SVolodymyr Sapsai// Edge cases. 4116ba4afb4SVolodymyr Sapsai@interface CompareFirstImplAttribute: NSObject 4126ba4afb4SVolodymyr Sapsai@property (readonly) int firstImplAttribute; 4136ba4afb4SVolodymyr Sapsai@end 4146ba4afb4SVolodymyr Sapsai@interface CompareLastImplAttribute: NSObject 4156ba4afb4SVolodymyr Sapsai@property int lastImplAttribute; 4166ba4afb4SVolodymyr Sapsai@end 4176ba4afb4SVolodymyr Sapsai#else 4186ba4afb4SVolodymyr SapsaiCompareMatchingProperties *compareMatchingProperties; 4196ba4afb4SVolodymyr SapsaiComparePropertyPresence1 *comparePropertyPresence1; 4206ba4afb4SVolodymyr Sapsai// expected-error@first.h:* {{'ComparePropertyPresence1' has different definitions in different modules; first difference is definition in module 'First.Hidden' found property}} 421ed7a46a8SVolodymyr Sapsai// expected-note-re@second.h:* {{but in {{'Second'|definition here}} found end of class}} 4226ba4afb4SVolodymyr SapsaiComparePropertyPresence2 *comparePropertyPresence2; 4236ba4afb4SVolodymyr Sapsai// expected-error@first.h:* {{'ComparePropertyPresence2' has different definitions in different modules; first difference is definition in module 'First.Hidden' found end of class}} 424ed7a46a8SVolodymyr Sapsai// expected-note-re@second.h:* {{but in {{'Second'|definition here}} found property}} 4256ba4afb4SVolodymyr Sapsai 4266ba4afb4SVolodymyr SapsaiComparePropertyName *comparePropertyName; 4276ba4afb4SVolodymyr Sapsai// expected-error@first.h:* {{'ComparePropertyName' has different definitions in different modules; first difference is definition in module 'First.Hidden' found property 'propNameA'}} 428ed7a46a8SVolodymyr Sapsai// expected-note-re@second.h:* {{but in {{'Second'|definition here}} found property 'propNameB'}} 4296ba4afb4SVolodymyr SapsaiComparePropertyType *comparePropertyType; 4306ba4afb4SVolodymyr Sapsai// expected-error@first.h:* {{'ComparePropertyType' has different definitions in different modules; first difference is definition in module 'First.Hidden' found property 'propType' with type 'int'}} 431ed7a46a8SVolodymyr Sapsai// expected-note-re@second.h:* {{but in {{'Second'|definition here}} found property 'propType' with type 'float'}} 4326ba4afb4SVolodymyr SapsaiComparePropertyOrder *comparePropertyOrder; 4336ba4afb4SVolodymyr Sapsai// expected-error@first.h:* {{'ComparePropertyOrder' has different definitions in different modules; first difference is definition in module 'First.Hidden' found property 'propOrderX'}} 434ed7a46a8SVolodymyr Sapsai// expected-note-re@second.h:* {{but in {{'Second'|definition here}} found property 'propOrderY'}} 4356ba4afb4SVolodymyr Sapsai 4366ba4afb4SVolodymyr SapsaiCompareMatchingPropertyAttributes *compareMatchingPropertyAttributes; 4376ba4afb4SVolodymyr SapsaiComparePropertyAttributes *comparePropertyAttributes; 4386ba4afb4SVolodymyr Sapsai// expected-error@first.h:* {{'ComparePropertyAttributes' has different definitions in different modules; first difference is definition in module 'First.Hidden' found property 'propAttributes' with 'readonly' attribute}} 439ed7a46a8SVolodymyr Sapsai// expected-note-re@second.h:* {{but in {{'Second'|definition here}} found property 'propAttributes' with different 'readonly' attribute}} 4406ba4afb4SVolodymyr SapsaiCompareFirstImplAttribute *compareFirstImplAttribute; 4416ba4afb4SVolodymyr Sapsai// expected-error@first.h:* {{'CompareFirstImplAttribute' has different definitions in different modules; first difference is definition in module 'First.Hidden' found property 'firstImplAttribute' with default 'readonly' attribute}} 442ed7a46a8SVolodymyr Sapsai// expected-note-re@second.h:* {{but in {{'Second'|definition here}} found property 'firstImplAttribute' with different 'readonly' attribute}} 4436ba4afb4SVolodymyr SapsaiCompareLastImplAttribute *compareLastImplAttribute; 4446ba4afb4SVolodymyr Sapsai// expected-error@first.h:* {{'CompareLastImplAttribute' has different definitions in different modules; first difference is definition in module 'First.Hidden' found property 'lastImplAttribute' with 'direct' attribute}} 445ed7a46a8SVolodymyr Sapsai// expected-note-re@second.h:* {{but in {{'Second'|definition here}} found property 'lastImplAttribute' with different 'direct' attribute}} 4466ba4afb4SVolodymyr Sapsai#endif 447*2893d55fSVolodymyr Sapsai 448*2893d55fSVolodymyr Sapsai#if defined(FIRST) 449*2893d55fSVolodymyr Sapsai@interface CompareMatchingCategories: NSObject @end 450*2893d55fSVolodymyr Sapsai@interface CompareMatchingCategories(Matching) 451*2893d55fSVolodymyr Sapsai- (int)testMethod; 452*2893d55fSVolodymyr Sapsai@end 453*2893d55fSVolodymyr Sapsai 454*2893d55fSVolodymyr Sapsai@interface CompareMismatchingCategories1: NSObject @end 455*2893d55fSVolodymyr Sapsai@interface CompareMismatchingCategories1(Category1) 456*2893d55fSVolodymyr Sapsai- (void)presentMethod; 457*2893d55fSVolodymyr Sapsai@end 458*2893d55fSVolodymyr Sapsai@interface CompareMismatchingCategories2: NSObject @end 459*2893d55fSVolodymyr Sapsai@interface CompareMismatchingCategories2(Category2) 460*2893d55fSVolodymyr Sapsai@end 461*2893d55fSVolodymyr Sapsai 462*2893d55fSVolodymyr Sapsai@interface CompareDifferentCategoryNames: NSObject @end 463*2893d55fSVolodymyr Sapsai@interface CompareDifferentCategoryNames(CategoryFirst) 464*2893d55fSVolodymyr Sapsai- (void)firstMethod:(int)x; 465*2893d55fSVolodymyr Sapsai@end 466*2893d55fSVolodymyr Sapsai#elif defined(SECOND) 467*2893d55fSVolodymyr Sapsai@interface CompareMatchingCategories: NSObject @end 468*2893d55fSVolodymyr Sapsai@interface CompareMatchingCategories(Matching) 469*2893d55fSVolodymyr Sapsai- (int)testMethod; 470*2893d55fSVolodymyr Sapsai@end 471*2893d55fSVolodymyr Sapsai 472*2893d55fSVolodymyr Sapsai@interface CompareMismatchingCategories1: NSObject @end 473*2893d55fSVolodymyr Sapsai@interface CompareMismatchingCategories1(Category1) 474*2893d55fSVolodymyr Sapsai@end 475*2893d55fSVolodymyr Sapsai@interface CompareMismatchingCategories2: NSObject @end 476*2893d55fSVolodymyr Sapsai@interface CompareMismatchingCategories2(Category2) 477*2893d55fSVolodymyr Sapsai- (void)presentMethod; 478*2893d55fSVolodymyr Sapsai@end 479*2893d55fSVolodymyr Sapsai 480*2893d55fSVolodymyr Sapsai@interface CompareDifferentCategoryNames: NSObject @end 481*2893d55fSVolodymyr Sapsai@interface CompareDifferentCategoryNames(CategorySecond) 482*2893d55fSVolodymyr Sapsai- (void)secondMethod; 483*2893d55fSVolodymyr Sapsai@end 484*2893d55fSVolodymyr Sapsai#else 485*2893d55fSVolodymyr SapsaiCompareMatchingCategories *compareMatchingCategories; // no diagnostic 486*2893d55fSVolodymyr SapsaiCompareMismatchingCategories1 *compareMismatchingCategories1; 487*2893d55fSVolodymyr Sapsai#ifdef TEST_MODULAR 488*2893d55fSVolodymyr Sapsai// expected-warning@second.h:* {{duplicate definition of category 'Category1' on interface 'CompareMismatchingCategories1'}} 489*2893d55fSVolodymyr Sapsai// expected-note@first.h:* {{previous definition is here}} 490*2893d55fSVolodymyr Sapsai#endif 491*2893d55fSVolodymyr SapsaiCompareMismatchingCategories2 *compareMismatchingCategories2; 492*2893d55fSVolodymyr Sapsai#ifdef TEST_MODULAR 493*2893d55fSVolodymyr Sapsai// expected-warning@second.h:* {{duplicate definition of category 'Category2' on interface 'CompareMismatchingCategories2'}} 494*2893d55fSVolodymyr Sapsai// expected-note@first.h:* {{previous definition is here}} 495*2893d55fSVolodymyr Sapsai#endif 496*2893d55fSVolodymyr SapsaiCompareDifferentCategoryNames *compareDifferentCategoryNames; // no diagnostic 497*2893d55fSVolodymyr Sapsai#endif 498