1 // RUN: %clang_cc1 -fsyntax-only -verify %s 2 3 #include "Inputs/cuda.h" 4 5 //------------------------------------------------------------------------------ 6 // Test 1: host method called from device function 7 8 struct S1 { 9 void method() {} 10 }; 11 12 __device__ void foo1(S1& s) { 13 s.method(); // expected-error {{reference to __host__ function 'method' in __device__ function}} 14 } 15 16 //------------------------------------------------------------------------------ 17 // Test 2: host method called from device function, for overloaded method 18 19 struct S2 { 20 void method(int) {} // expected-note {{candidate function not viable: call to __host__ function from __device__ function}} 21 void method(float) {} // expected-note {{candidate function not viable: call to __host__ function from __device__ function}} 22 }; 23 24 __device__ void foo2(S2& s, int i, float f) { 25 s.method(f); // expected-error {{no matching member function}} 26 } 27 28 //------------------------------------------------------------------------------ 29 // Test 3: device method called from host function 30 31 struct S3 { 32 __device__ void method() {} 33 }; 34 35 void foo3(S3& s) { 36 s.method(); // expected-error {{reference to __device__ function 'method' in __host__ function}} 37 } 38 39 //------------------------------------------------------------------------------ 40 // Test 4: device method called from host&device function 41 42 struct S4 { 43 __device__ void method() {} 44 }; 45 46 __host__ __device__ void foo4(S4& s) { 47 s.method(); 48 } 49 50 //------------------------------------------------------------------------------ 51 // Test 5: overloaded operators 52 53 struct S5 { 54 S5() {} 55 S5& operator=(const S5&) {return *this;} // expected-note {{candidate function not viable}} 56 }; 57 58 __device__ void foo5(S5& s, S5& t) { 59 s = t; // expected-error {{no viable overloaded '='}} 60 } 61 62 //------------------------------------------------------------------------------ 63 // Test 6: call method through pointer 64 65 struct S6 { 66 void method() {} 67 }; 68 69 __device__ void foo6(S6* s) { 70 s->method(); // expected-error {{reference to __host__ function 'method' in __device__ function}} 71 } 72