// RUN: %clang_cc1 -Wno-objc-root-class %s -verify // RUN: %clang_cc1 -xobjective-c++ -Wno-objc-root-class %s -verify #define YES __objc_yes #define NO __objc_no @interface NSNumber +(instancetype)numberWithChar:(char)value; +(instancetype)numberWithInt:(int)value; +(instancetype)numberWithDouble:(double)value; +(instancetype)numberWithBool:(unsigned char)value; +(instancetype)numberWithUnsignedLong:(unsigned long)value; +(instancetype)numberWithLongLong:(long long) value; +(instancetype)numberWithUnsignedInt:(unsigned)value; @end @interface NSString @end @interface NSDictionary + (instancetype)dictionaryWithObjects:(const id[])objects forKeys:(const id[])keys count:(unsigned long)cnt; @end void test() { NSDictionary *t1 = @{ @"foo" : @0, // expected-note 2 {{previous equal key is here}} @"foo" : @0, // expected-warning{{duplicate key in dictionary literal}} @("foo") : @0, // expected-warning{{duplicate key in dictionary literal}} @"foo\0" : @0, @1 : @0, // expected-note + {{previous equal key is here}} @YES : @0, // expected-warning{{duplicate key in dictionary literal}} @'\1' : @0, // expected-warning{{duplicate key in dictionary literal}} @1 : @0, // expected-warning{{duplicate key in dictionary literal}} @1ul : @0, // expected-warning{{duplicate key in dictionary literal}} @1ll : @0, // expected-warning{{duplicate key in dictionary literal}} #ifdef __cplusplus @true : @0, // expected-warning{{duplicate key in dictionary literal}} #endif @1.0 : @0, // FIXME: should warn @-1 : @0, // expected-note + {{previous equal key is here}} @4294967295u : @0, // no warning @-1ll : @0, // expected-warning{{duplicate key in dictionary literal}} @(NO-YES) : @0, // expected-warning{{duplicate key in dictionary literal}} }; } #ifdef __cplusplus template void variadic(Ts... ts) { NSDictionary *nd = @{ ts : @0 ..., @0 : ts ... // expected-warning 2 {{duplicate key in dictionary literal}} expected-note 2 {{previous equal key is here}} }; } void call_variadic() { variadic(@0, @1, @2); // expected-note {{in instantiation}} } #endif