blob: 8afb00e121aab4c1ad90c1ab0344ba0a4a76ed1d [file] [log] [blame]
// 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 <Interfaces.h>
@interface ObjCInterface() {
int ivarName;
}
@end
@interface ObjCInterfaceLevel2() {
int bitfieldIvarName: 3;
}
@end
//--- include/IvarsInExtensionsWithMethodsProtocols.h
#import <Interfaces.h>
@interface ObjCInterface() {
int methodRelatedIvar;
}
- (void)test;
@end
@interface ObjCInterfaceLevel2() <Protocol1> {
int protocolRelatedIvar;
}
@end
//--- include/IvarInImplementation.h
#import <Interfaces.h>
@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 <Interfaces.h>
@interface ObjCInterface() {
float ivarName; // expected-note {{previous definition is here}}
}
@end
@interface ObjCInterfaceLevel2() {
int bitfieldIvarName: 5; // expected-note {{previous definition is here}}
}
@end
#import <IvarsInExtensions.h>
// 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 <Interfaces.h>
@interface ObjCInterface() {
int ivarName; // expected-note {{previous definition is here}}
float anotherIvar;
}
@end
#import <IvarsInExtensions.h>
// 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 <Interfaces.h>
@interface ObjCInterface() {
int methodRelatedIvar; // expected-note {{previous definition is here}}
}
- (void)differentTest;
@end
@interface ObjCInterfaceLevel2() <Protocol2> {
int protocolRelatedIvar; // expected-note {{previous definition is here}}
}
@end
#import <IvarsInExtensionsWithMethodsProtocols.h>
// 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 <Interfaces.h>
@interface ObjCInterfaceLevel2() {
float ivarName;
}
@end
#import <IvarsInExtensions.h>
@implementation ObjCInterfaceLevel2
@end
//--- test-redecl-in-implementation.m
// Ivar redeclaration in `@implementation` is always an error and never mergeable.
#import <IvarsInExtensions.h>
@interface ObjCInterface() {
int triggerExtensionIvarDeserialization;
}
@end
#import <IvarInImplementation.h>
#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