xref: /llvm-project/clang/test/Modules/compare-objc-interface.m (revision 2893d55f8f61edb2c253b960cab1107ea6c163c2)
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