================
@@ -0,0 +1,69 @@
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute 
-finclude-default-header -verify -Wdouble-promotion -Wconversion %s
+
+struct TwoFloats {
+  float X, Y;
+};
+
+struct TwoInts {
+  int Z, W;
+};
+
+struct Doggo {
+  int4 LegState;
+  int TailState;
+  float HairCount;
+  float4 EarDirection[2];
+};
+
+struct AnimalBits {
+  int Legs[4];
+  uint State;
+  int64_t Counter;
+  float4 LeftDir;
+  float4 RightDir;
+};
+
+struct Kitteh {
+  int4 Legs;
+  int TailState;
+  float HairCount;
+  float4 Claws[2];
+};
+
+struct Zoo {
+  Doggo Dogs[2];
+  Kitteh Cats[4];
+};
+
+void fn() {
+  TwoFloats TF1 = {{{1.0, 2}}};
+  TwoFloats TF2 = {1,2};
+  int Val = 1;
+  TwoFloats TF3 = {Val, 2}; // expected-warning{{implicit conversion from 
'int' to 'float' may lose precision}}
+  int2 TwoVals = 1.xx;
+  int2 Something = 1.xxx; // expected-warning{{implicit conversion truncates 
vector: 'vector<int, 3>' (vector of 3 'int' values) to 'vector<int, 2>' (vector 
of 2 'int' values)}}
+  TwoFloats TF4 = {TwoVals}; // expected-warning{{implicit conversion from 
'int' to 'float' may lose precision}} expected-warning{{implicit conversion 
from 'int' to 'float' may lose precision}}
+
+  TwoInts TI1 = {TwoVals};
+  TwoInts TI2 = {TF4}; // expected-warning{{implicit conversion turns 
floating-point number into integer: 'float' to 'int'}} 
expected-warning{{implicit conversion turns floating-point number into integer: 
'float' to 'int'}}
+
+  Doggo D1 = {TI1, TI2, {Val, Val}, {{TF1, TF2}, {TF3, TF4}}}; // 
expected-warning{{implicit conversion from 'int' to 'float' may lose precision}}
+  AnimalBits A1 = {D1}; // expected-warning{{implicit conversion turns 
floating-point number into integer: 'float' to 'long'}} 
expected-warning{{implicit conversion changes signedness: 'int' to 'unsigned 
int'}}
+
+  Zoo Z1 = {D1, A1, D1, A1, D1, A1}; // #insanity
+
+  // expected-warning@#insanity{{implicit conversion from 'int64_t' (aka 
'long') to 'float' may lose precision}}
+  // expected-warning@#insanity{{implicit conversion changes signedness: 
'uint' (aka 'unsigned int') to 'int'}}
+  // expected-warning@#insanity{{implicit conversion from 'int64_t' (aka 
'long') to 'float' may lose precision}}
+  // expected-warning@#insanity{{implicit conversion changes signedness: 
'uint' (aka 'unsigned int') to 'int'}}
+  // expected-warning@#insanity{{implicit conversion from 'int64_t' (aka 
'long') to 'float' may lose precision}}
+  // expected-warning@#insanity{{implicit conversion changes signedness: 
'uint' (aka 'unsigned int') to 'int'}}
+}
+
+void Errs() {
+  TwoFloats F1 = {}; // expected-error{{too few initializers in list for type 
'TwoFloats' (expected 2 but found 0)}}
+  TwoFloats F2 = {1}; // expected-error{{too few initializers in list for type 
'TwoFloats' (expected 2 but found 1)}}
+  TwoFloats F3 = {1,2,3}; // expected-error{{too many initializers in list for 
type 'TwoFloats' (expected 2 but found 2)}}
+
+  int2 Something = {1.xxx}; // expected-error{{too many initializers in list 
for type 'int2' (aka 'vector<int, 2>') (expected 2 but found 0)}}
----------------
inbelic wrote:

```suggestion
  int2 Something = {1.xxx}; // expected-error{{too many initializers in list 
for type 'int2' (aka 'vector<int, 2>') (expected 2 but found 3)}}
```
Not sure if it should actually be 3? but 0 seems strange

https://github.com/llvm/llvm-project/pull/123141
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to