// UNSUPPORTED: target={{.*}}-zos{{.*}}, target={{.*}}-aix{{.*}} // RUN: rm -rf %t // RUN: split-file %s %t // RUN: %clang_cc1 -fsyntax-only -fobjc-runtime=macosx-10.9 -verify -I%t/include %t/test-mismatch-in-extension.m // RUN: %clang_cc1 -fsyntax-only -fobjc-runtime=macosx-10.9 -verify -I%t/include %t/test-mismatch-in-extension.m \ // RUN: -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/modules.cache // RUN: %clang_cc1 -fsyntax-only -fobjc-runtime=macosx-10.9 -verify -I%t/include %t/test-mismatch-in-ivars-number.m // RUN: %clang_cc1 -fsyntax-only -fobjc-runtime=macosx-10.9 -verify -I%t/include %t/test-mismatch-in-ivars-number.m \ // RUN: -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/modules.cache // RUN: %clang_cc1 -fsyntax-only -fobjc-runtime=macosx-10.9 -verify -I%t/include %t/test-mismatch-in-methods-protocols.m // RUN: %clang_cc1 -fsyntax-only -fobjc-runtime=macosx-10.9 -verify -I%t/include %t/test-mismatch-in-methods-protocols.m \ // RUN: -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/modules.cache // RUN: %clang_cc1 -fsyntax-only -fobjc-runtime=macosx-10.9 -verify -I%t/include %t/test-redecl-in-subclass.m // RUN: %clang_cc1 -fsyntax-only -fobjc-runtime=macosx-10.9 -verify -I%t/include %t/test-redecl-in-subclass.m \ // RUN: -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/modules.cache // RUN: %clang_cc1 -fsyntax-only -fobjc-runtime=macosx-10.9 -verify -I%t/include %t/test-redecl-in-implementation.m // RUN: %clang_cc1 -fsyntax-only -fobjc-runtime=macosx-10.9 -verify -I%t/include %t/test-redecl-in-implementation.m \ // RUN: -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/modules.cache // Same class extensions with the same ivars but from different modules aren't considered // an error and they are merged together. Test that differences in extensions and/or ivars // are still reported as errors. //--- include/Interfaces.h @interface NSObject @end @interface ObjCInterface : NSObject @end @interface ObjCInterfaceLevel2 : ObjCInterface @end @protocol Protocol1 @end @protocol Protocol2 @end //--- include/IvarsInExtensions.h #import @interface ObjCInterface() { int ivarName; } @end @interface ObjCInterfaceLevel2() { int bitfieldIvarName: 3; } @end //--- include/IvarsInExtensionsWithMethodsProtocols.h #import @interface ObjCInterface() { int methodRelatedIvar; } - (void)test; @end @interface ObjCInterfaceLevel2() { int protocolRelatedIvar; } @end //--- include/IvarInImplementation.h #import @implementation ObjCInterface { int ivarName; } @end //--- include/module.modulemap module Interfaces { header "Interfaces.h" export * } module IvarsInExtensions { header "IvarsInExtensions.h" export * } module IvarsInExtensionsWithMethodsProtocols { header "IvarsInExtensionsWithMethodsProtocols.h" export * } module IvarInImplementation { header "IvarInImplementation.h" export * } //--- test-mismatch-in-extension.m // Different ivars with the same name aren't mergeable and constitute an error. #import @interface ObjCInterface() { float ivarName; // expected-note {{previous definition is here}} } @end @interface ObjCInterfaceLevel2() { int bitfieldIvarName: 5; // expected-note {{previous definition is here}} } @end #import // expected-error@IvarsInExtensions.h:* {{instance variable is already declared}} // expected-error@IvarsInExtensions.h:* {{instance variable is already declared}} @implementation ObjCInterfaceLevel2 @end //--- test-mismatch-in-ivars-number.m // Extensions with different amount of ivars aren't considered to be the same. #import @interface ObjCInterface() { int ivarName; // expected-note {{previous definition is here}} float anotherIvar; } @end #import // expected-error@IvarsInExtensions.h:* {{instance variable is already declared}} @implementation ObjCInterface @end //--- test-mismatch-in-methods-protocols.m // Extensions with different methods or protocols aren't considered to be the same. #import @interface ObjCInterface() { int methodRelatedIvar; // expected-note {{previous definition is here}} } - (void)differentTest; @end @interface ObjCInterfaceLevel2() { int protocolRelatedIvar; // expected-note {{previous definition is here}} } @end #import // expected-error@IvarsInExtensionsWithMethodsProtocols.h:* {{instance variable is already declared}} // expected-error@IvarsInExtensionsWithMethodsProtocols.h:* {{instance variable is already declared}} @implementation ObjCInterfaceLevel2 @end //--- test-redecl-in-subclass.m // Ivar in superclass extension is not added to a subclass, so the ivar with // the same name in subclass extension is not considered a redeclaration. // expected-no-diagnostics #import @interface ObjCInterfaceLevel2() { float ivarName; } @end #import @implementation ObjCInterfaceLevel2 @end //--- test-redecl-in-implementation.m // Ivar redeclaration in `@implementation` is always an error and never mergeable. #import @interface ObjCInterface() { int triggerExtensionIvarDeserialization; } @end #import #if __has_feature(modules) // expected-error@IvarsInExtensions.h:* {{instance variable is already declared}} // expected-note@IvarInImplementation.h:* {{previous definition is here}} #else // expected-error@IvarInImplementation.h:* {{instance variable is already declared}} // expected-note@IvarsInExtensions.h:* {{previous definition is here}} #endif