// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -verify -o - %s // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library -Wno-conversion -DNO_ERR -ast-dump %s | FileCheck %s void test() { // CHECK: VarDecl {{.*}} used f3 'vector' cinit // CHECK-NEXT: ImplicitCastExpr {{.*}} 'vector' // CHECK-NEXT: FloatingLiteral {{.*}} 'float' 1.000000e+00 vector f3 = 1.0; // No warning for splatting to a vector from a literal. // CHECK: VarDecl {{.*}} used d4 'vector' cinit // CHECK-NEXT: ImplicitCastExpr {{.*}} 'vector' // CHECK-NEXT: ExtVectorElementExpr {{.*}} 'vector' xyzx // CHECK-NEXT: DeclRefExpr {{.*}} 'vector' lvalue Var {{.*}} 'f3' 'vector' vector d4 = f3.xyzx; // No warnings for promotion or explicit extension. // CHECK: VarDecl {{.*}} used f2 'vector' cinit // CHECK-NEXT: ImplicitCastExpr {{.*}} 'vector' // CHECK-NEXT: ImplicitCastExpr {{.*}} 'vector' // CHECK-NEXT: DeclRefExpr {{.*}} 'vector' lvalue Var {{.*}} 'f3' 'vector' // expected-warning@#f2{{implicit conversion truncates vector: 'vector' (vector of 3 'float' values) to 'vector' (vector of 2 'float' values)}} vector f2 = f3; // #f2 // CHECK: VarDecl {{.*}} f2_2 'vector' cinit // CHECK-NEXT: ImplicitCastExpr {{.*}} 'vector' // CHECK-NEXT: ImplicitCastExpr {{.*}} 'vector' // CHECK-NEXT: ImplicitCastExpr {{.*}} 'vector' // CHECK-NEXT: DeclRefExpr {{.*}} 'vector' lvalue Var {{.*}} 'd4' 'vector' // expected-warning@#f2_2{{implicit conversion truncates vector: 'vector' (vector of 4 'double' values) to 'vector' (vector of 2 'float' values)}} // expected-warning@#f2_2{{implicit conversion loses floating-point precision: 'vector' (vector of 4 'double' values) to 'vector' (vector of 2 'float' values)}} vector f2_2 = d4; // #f2_2 // CHECK: VarDecl {{.*}} i2 'vector' cinit // CHECK-NEXT: ImplicitCastExpr {{.*}} 'vector' // CHECK-NEXT: ImplicitCastExpr {{.*}} 'vector' // CHECK-NEXT: DeclRefExpr {{.*}} 'vector' lvalue Var {{.*}} 'f2' 'vector' // expected-warning@#i2{{mplicit conversion turns floating-point number into integer: 'vector' (vector of 2 'float' values) to 'vector' (vector of 2 'int' values)}} vector i2 = f2; // #i2 // CHECK: VarDecl {{.*}} i2_2 'vector' cinit // CHECK-NEXT: ImplicitCastExpr {{.*}} 'vector' // CHECK-NEXT: ImplicitCastExpr {{.*}} 'vector' // CHECK-NEXT: ImplicitCastExpr {{.*}} 'vector' // CHECK-NEXT: DeclRefExpr {{.*}} 'vector' lvalue Var {{.*}} 'd4' 'vector' // expected-warning@#i2_2{{implicit conversion truncates vector: 'vector' (vector of 4 'double' values) to 'vector' (vector of 2 'int' values)}} // expected-warning@#i2_2{{implicit conversion turns floating-point number into integer: 'vector' (vector of 4 'double' values) to 'vector' (vector of 2 'int' values)}} vector i2_2 = d4; // #i2_2 // CHECK: VarDecl {{.*}} used i64_4 'vector' cinit // CHECK-NEXT: ImplicitCastExpr {{.*}} 'vector' // CHECK-NEXT: ImplicitCastExpr {{.*}} 'vector' // CHECK-NEXT: DeclRefExpr {{.*}} 'vector' lvalue Var {{.*}} 'd4' 'vector' // expected-warning@#i64_4{{implicit conversion turns floating-point number into integer: 'vector' (vector of 4 'double' values) to 'vector' (vector of 4 'long' values)}} vector i64_4 = d4; // #i64_4 // CHECK: VarDecl {{.*}} used i2_3 'vector' cinit // CHECK-NEXT: ImplicitCastExpr {{.*}} 'vector' // CHECK-NEXT: ImplicitCastExpr {{.*}} 'vector' // CHECK-NEXT: ImplicitCastExpr {{.*}} 'vector' // CHECK-NEXT: DeclRefExpr {{.*}} 'vector' lvalue Var {{.*}} 'i64_4' 'vector' // expected-warning@#i2_3{{implicit conversion loses integer precision: 'vector' (vector of 4 'long' values) to 'vector' (vector of 2 'int' values)}} // expected-warning@#i2_3{{implicit conversion truncates vector: 'vector' (vector of 4 'long' values) to 'vector' (vector of 2 'int' values)}} vector i2_3 = i64_4; // #i2_3 //CHECK: VarDecl {{.*}} b2 'vector' cinit //CHECK-NEXT: ImplicitCastExpr {{.*}} 'vector' //CHECK-NEXT: ImplicitCastExpr {{.*}} 'vector' //CHECK-NEXT: DeclRefExpr {{.*}} 'vector' lvalue Var {{.*}} 'i2_3' 'vector' vector b2 = i2_3; // No warning for integer to bool conversion. // CHECK: VarDecl {{.*}} b2_2 'vector' cinit // CHECK-NEXT: ImplicitCastExpr {{.*}} 'vector' // CHECK-NEXT: ImplicitCastExpr {{.*}} 'vector' // CHECK-NEXT: ImplicitCastExpr {{.*}} 'vector' // CHECK-NEXT: DeclRefExpr {{.*}} 'vector' lvalue Var {{.*}} 'd4' 'vector' // expected-warning@#b2_2{{implicit conversion truncates vector: 'vector' (vector of 4 'double' values) to 'vector' (vector of 2 'bool' values)}} // expected-warning@#b2_2{{implicit conversion turns floating-point number into integer: 'vector' (vector of 4 'double' values) to 'vector' (vector of 2 'bool' values)}} vector b2_2 = d4; // #b2_2 } #ifndef NO_ERR void illegal() { // vector extension is illegal vector f3 = 1.0; vector f4 = f3; // expected-error{{cannot initialize a variable of type 'vector<[...], 4>' with an lvalue of type 'vector<[...], 3>'}} } #endif