Home | History | Annotate | Download | only in SemaObjCXX
      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