// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -finclude-default-header -verify -Wdouble-promotion -Wconversion %s void OutVecFn(out float3) {} void InOutVecFn(inout float3) {} // Case 1: Calling out and inout parameters with types that cannot be // back-converted. In HLSL 2021 and earlier this only occurs when passing scalar // arguments to vector parameters because scalar->vector conversion is implicit, // but vector->scalar is not. void case1() { float f; int i; OutVecFn(f); // expected-error{{illegal scalar extension cast on argument 'f' to out paramemter}} InOutVecFn(f); // expected-error{{illegal scalar extension cast on argument 'f' to inout paramemter}} OutVecFn(i); // expected-error{{illegal scalar extension cast on argument 'i' to out paramemter}} InOutVecFn(i); // expected-error{{illegal scalar extension cast on argument 'i' to inout paramemter}} } // Case 2: Conversion warnings on argument initialization. Clang generates // implicit conversion warnings only on the writeback conversion for `out` // parameters since the parameter is not initialized from the argument. Clang // generates implicit conversion warnings on both the parameter initialization // and the writeback for `inout` parameters since the parameter is both copied // in and out of the function. void OutFloat(out float) {} void InOutFloat(inout float) {} void case2() { double f; OutFloat(f); // expected-warning{{implicit conversion increases floating-point precision: 'float' to 'double'}} InOutFloat(f); // expected-warning{{implicit conversion increases floating-point precision: 'float' to 'double'}} expected-warning{{implicit conversion loses floating-point precision: 'double' to 'float'}} }