blob: 611b7bc009ae5e888cc65780a3b9c0f84512c091 [file] [log] [blame]
Patrick Beardb2f68202012-04-06 18:12:22 +00001// RUN: %clang_cc1 -fsyntax-only -verify -Wno-objc-root-class %s
Fariborz Jahanianadcfab12009-12-16 23:13:33 +00002
3typedef const void * VoidStar;
4
5typedef struct __CFDictionary * CFMDRef;
6
7void RandomFunc(CFMDRef theDict, const void *key, const void *value);
8
9@interface Foo
10- (void)_apply:(void (*)(const void *, const void *, void *))func context:(void *)context;
11- (void)a:(id *)objects b:(id *)keys;
12@end
13
14@implementation Foo
15- (void)_apply:(void (*)(const void *, const void *, void *))func context:(void *)context {
16 id item;
17 id obj;
18 func(item, obj, context);
19}
20
21- (void)a:(id *)objects b:(id *)keys {
22 VoidStar dict;
23 id key;
24 RandomFunc((CFMDRef)dict, key, objects[3]);
25}
26@end
Fariborz Jahanianee9ca692010-03-15 18:36:00 +000027
28@interface I
Douglas Gregora41a8c52010-04-22 00:20:18 +000029- (void) Meth : (I*) Arg; // expected-note{{passing argument to parameter 'Arg' here}}
Fariborz Jahanianee9ca692010-03-15 18:36:00 +000030@end
31
Chris Lattnerd7e52b82010-09-05 00:43:21 +000032void Func (I* arg); // expected-note {{candidate function not viable: no known conversion from 'const I *' to 'I *' for 1st argument}}
Fariborz Jahanianee9ca692010-03-15 18:36:00 +000033
34void foo(const I *p, I* sel) {
Chris Lattnerd7e52b82010-09-05 00:43:21 +000035 [sel Meth : p]; // expected-error {{cannot initialize a parameter of type 'I *' with an lvalue of type 'const I *'}}
Fariborz Jahanianee9ca692010-03-15 18:36:00 +000036 Func(p); // expected-error {{no matching function for call to 'Func'}}
37}
38
Douglas Gregor85789812010-06-30 23:01:39 +000039@interface DerivedFromI : I
40@end
41
Douglas Gregorda80f742010-12-01 21:43:58 +000042void accept_derived(DerivedFromI*);
Douglas Gregor85789812010-06-30 23:01:39 +000043
44void test_base_to_derived(I* i) {
Douglas Gregora3998bd2010-12-02 21:47:04 +000045 accept_derived(i); // expected-warning{{incompatible pointer types passing 'I *' to parameter of type 'DerivedFromI *'}}
Fariborz Jahanian84950c72011-03-21 19:08:42 +000046 DerivedFromI *di = i; // expected-warning{{incompatible pointer types initializing 'DerivedFromI *' with an expression of type 'I *'}}
Douglas Gregora3998bd2010-12-02 21:47:04 +000047 DerivedFromI *di2 = (DerivedFromI *)i;
Douglas Gregor85789812010-06-30 23:01:39 +000048}