1 | // RUN: %clang_cc1 -fsyntax-only -verify -Wno-objc-root-class %s |
2 | |
3 | typedef const void * VoidStar; |
4 | |
5 | typedef struct __CFDictionary * CFMDRef; |
6 | |
7 | void 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 |
27 | |
28 | @interface I |
29 | - (void) Meth : (I*) Arg; // expected-note{{passing argument to parameter 'Arg' here}} |
30 | @end |
31 | |
32 | void Func (I* arg); // expected-note {{candidate function not viable: no known conversion from 'const I *' to 'I *' for 1st argument}} |
33 | |
34 | void foo(const I *p, I* sel) { |
35 | [sel Meth : p]; // expected-error {{cannot initialize a parameter of type 'I *' with an lvalue of type 'const I *'}} |
36 | Func(p); // expected-error {{no matching function for call to 'Func'}} |
37 | } |
38 | |
39 | @interface DerivedFromI : I |
40 | @end |
41 | |
42 | void accept_derived(DerivedFromI*); |
43 | |
44 | void test_base_to_derived(I* i) { |
45 | accept_derived(i); // expected-warning{{incompatible pointer types passing 'I *' to parameter of type 'DerivedFromI *'}} |
46 | DerivedFromI *di = i; // expected-warning{{incompatible pointer types initializing 'DerivedFromI *' with an expression of type 'I *'}} |
47 | DerivedFromI *di2 = (DerivedFromI *)i; |
48 | } |
49 | |