1// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.6-library %s -fnative-half-type -emit-llvm-only -disable-llvm-passes -verify -verify-ignore-unexpected 2 3float2 test_no_second_arg(float2 p0) { 4 return __builtin_hlsl_lerp(p0); 5 // expected-error@-1 {{too few arguments to function call, expected 3, have 1}} 6} 7 8float2 test_no_third_arg(float2 p0) { 9 return __builtin_hlsl_lerp(p0, p0); 10 // expected-error@-1 {{too few arguments to function call, expected 3, have 2}} 11} 12 13float2 test_too_many_arg(float2 p0) { 14 return __builtin_hlsl_lerp(p0, p0, p0, p0); 15 // expected-error@-1 {{too many arguments to function call, expected 3, have 4}} 16} 17 18float2 test_lerp_no_second_arg(float2 p0) { 19 return lerp(p0); 20 // expected-error@-1 {{no matching function for call to 'lerp'}} 21} 22 23float2 test_lerp_vector_trunc_warn1(float3 p0) { 24 return lerp(p0, p0, p0); 25 // expected-warning@-1 {{implicit conversion truncates vector: 'float3' (aka 'vector<float, 3>') to 'vector<float, 2>' (vector of 2 'float' values)}} 26} 27 28float2 test_lerp_vector_trunc_warn2(float3 p0, float2 p1) { 29 return lerp(p0, p0, p1); 30 // expected-warning@-1 {{implicit conversion truncates vector: 'float3' (aka 'vector<float, 3>') to 'vector<float, 2>' (vector of 2 'float' values)}} 31 // expected-warning@-2 {{implicit conversion truncates vector: 'float3' (aka 'vector<float, 3>') to 'vector<float, 2>' (vector of 2 'float' values)}} 32} 33 34float2 test_lerp_vector_trunc_warn3(float3 p0, float2 p1) { 35 return lerp(p0, p1, p0); 36 // expected-warning@-1 {{implicit conversion truncates vector: 'float3' (aka 'vector<float, 3>') to 'vector<float, 2>' (vector of 2 'float' values)}} 37 // expected-warning@-2 {{implicit conversion truncates vector: 'float3' (aka 'vector<float, 3>') to 'vector<float, 2>' (vector of 2 'float' values)}} 38} 39 40float2 test_lerp_builtin_vector_size_mismatch_Arg1(float3 p0, float2 p1) { 41 return __builtin_hlsl_lerp(p0, p1, p1); 42 // expected-error@-1 {{all arguments to '__builtin_hlsl_lerp' must have the same type}} 43} 44 45float2 test_lerp_builtin_vector_size_mismatch_Arg2(float3 p0, float2 p1) { 46 return __builtin_hlsl_lerp(p1, p0, p1); 47 // expected-error@-1 {{all arguments to '__builtin_hlsl_lerp' must have the same type}} 48} 49 50float2 test_lerp_builtin_vector_size_mismatch_Arg3(float3 p0, float2 p1) { 51 return __builtin_hlsl_lerp(p1, p1, p0); 52 // expected-error@-1 {{all arguments to '__builtin_hlsl_lerp' must have the same type}} 53} 54 55float test_lerp_scalar_mismatch(float p0, half p1) { 56 return lerp(p1, p0, p1); 57 // expected-error@-1 {{call to 'lerp' is ambiguous}} 58} 59 60float2 test_lerp_element_type_mismatch(half2 p0, float2 p1) { 61 return lerp(p1, p0, p1); 62 // expected-error@-1 {{call to 'lerp' is ambiguous}} 63} 64 65float2 test_builtin_lerp_float2_splat(float p0, float2 p1) { 66 return __builtin_hlsl_lerp(p0, p1, p1); 67 // expected-error@-1 {{all arguments to '__builtin_hlsl_lerp' must be vectors}} 68} 69 70float2 test_builtin_lerp_float2_splat2(double p0, double2 p1) { 71 return __builtin_hlsl_lerp(p1, p0, p1); 72 // expected-error@-1 {{all arguments to '__builtin_hlsl_lerp' must be vectors}} 73} 74 75float2 test_builtin_lerp_float2_splat3(double p0, double2 p1) { 76 return __builtin_hlsl_lerp(p1, p1, p0); 77 // expected-error@-1 {{all arguments to '__builtin_hlsl_lerp' must be vectors}} 78} 79 80float3 test_builtin_lerp_float3_splat(float p0, float3 p1) { 81 return __builtin_hlsl_lerp(p0, p1, p1); 82 // expected-error@-1 {{all arguments to '__builtin_hlsl_lerp' must be vectors}} 83} 84 85float4 test_builtin_lerp_float4_splat(float p0, float4 p1) { 86 return __builtin_hlsl_lerp(p0, p1, p1); 87 // expected-error@-1 {{all arguments to '__builtin_hlsl_lerp' must be vectors}} 88} 89 90float2 test_lerp_float2_int_splat(float2 p0, int p1) { 91 return __builtin_hlsl_lerp(p0, p1, p1); 92 // expected-error@-1 {{all arguments to '__builtin_hlsl_lerp' must be vectors}} 93} 94 95float3 test_lerp_float3_int_splat(float3 p0, int p1) { 96 return __builtin_hlsl_lerp(p0, p1, p1); 97 // expected-error@-1 {{all arguments to '__builtin_hlsl_lerp' must be vectors}} 98} 99 100float2 test_builtin_lerp_int_vect_to_float_vec_promotion(int2 p0, float p1) { 101 return __builtin_hlsl_lerp(p0, p1, p1); 102 // expected-error@-1 {{all arguments to '__builtin_hlsl_lerp' must be vectors}} 103} 104 105float test_builtin_lerp_bool_type_promotion(bool p0) { 106 return __builtin_hlsl_lerp(p0, p0, p0); 107 // expected-error@-1 {{1st argument must be a floating point type (was 'bool')}} 108} 109 110float builtin_bool_to_float_type_promotion(float p0, bool p1) { 111 return __builtin_hlsl_lerp(p0, p0, p1); 112 // expected-error@-1 {{3rd argument must be a floating point type (was 'bool')}} 113} 114 115float builtin_bool_to_float_type_promotion2(bool p0, float p1) { 116 return __builtin_hlsl_lerp(p1, p0, p1); 117 // expected-error@-1 {{2nd argument must be a floating point type (was 'bool')}} 118} 119 120float builtin_lerp_int_to_float_promotion(float p0, int p1) { 121 return __builtin_hlsl_lerp(p0, p0, p1); 122 // expected-error@-1 {{3rd argument must be a floating point type (was 'int')}} 123} 124 125float4 test_lerp_int4(int4 p0, int4 p1, int4 p2) { 126 return __builtin_hlsl_lerp(p0, p1, p2); 127 // expected-error@-1 {{1st argument must be a floating point type (was 'int4' (aka 'vector<int, 4>'))}} 128} 129 130// note: DefaultVariadicArgumentPromotion --> DefaultArgumentPromotion has already promoted to double 131// we don't know anymore that the input was half when __builtin_hlsl_lerp is called so we default to float 132// for expected type 133half builtin_lerp_half_scalar (half p0) { 134 return __builtin_hlsl_lerp ( p0, p0, p0 ); 135 // expected-error@-1 {{passing 'double' to parameter of incompatible type 'float'}} 136} 137 138float builtin_lerp_float_scalar ( float p0) { 139 return __builtin_hlsl_lerp ( p0, p0, p0 ); 140 // expected-error@-1 {{passing 'double' to parameter of incompatible type 'float'}} 141} 142