implicit-casts.hlsl 72 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021
  1. // RUN: %clang_cc1 -Wno-unused-value -fsyntax-only -ffreestanding -verify %s
  2. // To test with the classic compiler, run
  3. // %sdxroot%\tools\x86\fxc.exe /T ps_5_1 implicit-casts.hlsl
  4. // we use -Wno-unused-value because we generate some no-op expressions to yield errors
  5. // without also putting them in a static assertion
  6. // __decltype is the GCC way of saying 'decltype', but doesn't require C++11
  7. // _Static_assert is the C11 way of saying 'static_assert', but doesn't require C++11
  8. #ifdef VERIFY_FXC
  9. #define _Static_assert(a,b,c) ;
  10. #define VERIFY_TYPES(typ, exp) {typ _tmp_var_ = exp;}
  11. #else
  12. #define VERIFY_TYPES(typ, exp) _Static_assert(std::is_same<typ, __decltype(exp)>::value, #typ " == __decltype(" #exp ") failed")
  13. #endif
  14. // The following is meant to be processed by the CodeTags extension in the "VS For Everything" Visual Studio extension:
  15. /*<py>
  16. # Some code to allow regeneration of code blocks while preserving expected error comments on unchanged lines
  17. import re
  18. rxComments = re.compile(r'(//.*|/\*.*?\*\/)')
  19. def strip_comments(line):
  20. line = rxComments.sub('', line)
  21. return line.strip()
  22. def save_error_comments(lines):
  23. saved = {}
  24. for line in lines:
  25. key = strip_comments(line)
  26. if key and line.strip() != key:
  27. saved[key] = line
  28. return saved
  29. def restore_error_comments(saved, lines):
  30. return [saved.get(line.strip(), line) for line in lines]
  31. def modify(lines, newlines):
  32. return restore_error_comments(save_error_comments(lines), newlines)
  33. cmp_types = [ # list of (type, shorthand)
  34. ('float', 'f'),
  35. ('int', 'i'),
  36. ('uint', 'u'),
  37. ('bool', 'b'),
  38. ('double', 'd'),
  39. ('int64_t', 'i64'),
  40. ('uint64_t', 'u64'),
  41. ('min16float', 'm16f'),
  42. ]
  43. vec_dims = [1, 2, 4]
  44. mat_dims = [(1,1), (4,1), (1,4), (4,4)]
  45. def scalar_types(cmp_types = cmp_types):
  46. return [{'type': cmp, 'id': id, 'val': (n+1)*100}
  47. for n, (cmp, id) in enumerate(cmp_types)]
  48. def vector_types(cmp_types, vec_dims = vec_dims):
  49. return [{'type': cmp+str(d), 'id': id+str(d), 'val': (n+1)*100 + d}
  50. for n, (cmp, id) in enumerate(cmp_types)
  51. for d in vec_dims]
  52. def matrix_types(cmp_types, mat_dims = mat_dims):
  53. return [{'type': '%s%dx%d' % (cmp, d1, d2), 'id': '%s%dx%d' % (id, d1, d2), 'val': (n+1)*100 + d1*10 + d2}
  54. for n, (cmp, id) in enumerate(cmp_types)
  55. for d1, d2 in mat_dims]
  56. def all_types(cmp_types = cmp_types, vec_dims = vec_dims, mat_dims = mat_dims):
  57. return scalar_types(cmp_types) + vector_types(cmp_types, vec_dims) + matrix_types(cmp_types, mat_dims)
  58. def gen_code(template, combos = all_types()):
  59. return [template % combo for combo in combos]
  60. # For overloaded functions, scalar, vector1 and matrix1x1 are ambiguous,
  61. # so cut the single component vector/matrix out:
  62. overload_types = all_types(cmp_types=cmp_types[:-1], vec_dims=vec_dims[1:], mat_dims=mat_dims[1:])
  63. </py>
  64. */
  65. // <py::lines('GENERATED_CODE')>modify(lines, gen_code('%(type)s g_%(id)s;'))</py>
  66. // GENERATED_CODE:BEGIN
  67. float g_f;
  68. int g_i;
  69. uint g_u;
  70. bool g_b;
  71. double g_d;
  72. int64_t g_i64;
  73. uint64_t g_u64;
  74. min16float g_m16f;
  75. float1 g_f1;
  76. float2 g_f2;
  77. float4 g_f4;
  78. int1 g_i1;
  79. int2 g_i2;
  80. int4 g_i4;
  81. uint1 g_u1;
  82. uint2 g_u2;
  83. uint4 g_u4;
  84. bool1 g_b1;
  85. bool2 g_b2;
  86. bool4 g_b4;
  87. double1 g_d1;
  88. double2 g_d2;
  89. double4 g_d4;
  90. int64_t1 g_i641;
  91. int64_t2 g_i642;
  92. int64_t4 g_i644;
  93. uint64_t1 g_u641;
  94. uint64_t2 g_u642;
  95. uint64_t4 g_u644;
  96. min16float1 g_m16f1;
  97. min16float2 g_m16f2;
  98. min16float4 g_m16f4;
  99. float1x1 g_f1x1;
  100. float4x1 g_f4x1;
  101. float1x4 g_f1x4;
  102. float4x4 g_f4x4;
  103. int1x1 g_i1x1;
  104. int4x1 g_i4x1;
  105. int1x4 g_i1x4;
  106. int4x4 g_i4x4;
  107. uint1x1 g_u1x1;
  108. uint4x1 g_u4x1;
  109. uint1x4 g_u1x4;
  110. uint4x4 g_u4x4;
  111. bool1x1 g_b1x1;
  112. bool4x1 g_b4x1;
  113. bool1x4 g_b1x4;
  114. bool4x4 g_b4x4;
  115. double1x1 g_d1x1;
  116. double4x1 g_d4x1;
  117. double1x4 g_d1x4;
  118. double4x4 g_d4x4;
  119. int64_t1x1 g_i641x1;
  120. int64_t4x1 g_i644x1;
  121. int64_t1x4 g_i641x4;
  122. int64_t4x4 g_i644x4;
  123. uint64_t1x1 g_u641x1;
  124. uint64_t4x1 g_u644x1;
  125. uint64_t1x4 g_u641x4;
  126. uint64_t4x4 g_u644x4;
  127. min16float1x1 g_m16f1x1;
  128. min16float4x1 g_m16f4x1;
  129. min16float1x4 g_m16f1x4;
  130. min16float4x4 g_m16f4x4;
  131. // GENERATED_CODE:END
  132. //min16float overload1(min16float v) { return (min16float)600; }
  133. // Skip min16float types for overload functions because they currently cause these errors:
  134. // function return value cannot have __fp16 type; did you forget * ?
  135. // parameters cannot have __fp16 type; did you forget * ?
  136. // <py::lines('GENERATED_CODE')>modify(lines, gen_code('%(type)s overload1(%(type)s v) { return (%(type)s)%(val)s; }', overload_types))</py>
  137. // GENERATED_CODE:BEGIN
  138. float overload1(float v) { return (float)100; }
  139. int overload1(int v) { return (int)200; }
  140. uint overload1(uint v) { return (uint)300; }
  141. bool overload1(bool v) { return (bool)400; }
  142. double overload1(double v) { return (double)500; }
  143. int64_t overload1(int64_t v) { return (int64_t)600; }
  144. uint64_t overload1(uint64_t v) { return (uint64_t)700; }
  145. float2 overload1(float2 v) { return (float2)102; }
  146. float4 overload1(float4 v) { return (float4)104; }
  147. int2 overload1(int2 v) { return (int2)202; }
  148. int4 overload1(int4 v) { return (int4)204; }
  149. uint2 overload1(uint2 v) { return (uint2)302; }
  150. uint4 overload1(uint4 v) { return (uint4)304; }
  151. bool2 overload1(bool2 v) { return (bool2)402; }
  152. bool4 overload1(bool4 v) { return (bool4)404; }
  153. double2 overload1(double2 v) { return (double2)502; }
  154. double4 overload1(double4 v) { return (double4)504; }
  155. int64_t2 overload1(int64_t2 v) { return (int64_t2)602; }
  156. int64_t4 overload1(int64_t4 v) { return (int64_t4)604; }
  157. uint64_t2 overload1(uint64_t2 v) { return (uint64_t2)702; }
  158. uint64_t4 overload1(uint64_t4 v) { return (uint64_t4)704; }
  159. float4x1 overload1(float4x1 v) { return (float4x1)141; }
  160. float1x4 overload1(float1x4 v) { return (float1x4)114; }
  161. float4x4 overload1(float4x4 v) { return (float4x4)144; }
  162. int4x1 overload1(int4x1 v) { return (int4x1)241; }
  163. int1x4 overload1(int1x4 v) { return (int1x4)214; }
  164. int4x4 overload1(int4x4 v) { return (int4x4)244; }
  165. uint4x1 overload1(uint4x1 v) { return (uint4x1)341; }
  166. uint1x4 overload1(uint1x4 v) { return (uint1x4)314; }
  167. uint4x4 overload1(uint4x4 v) { return (uint4x4)344; }
  168. bool4x1 overload1(bool4x1 v) { return (bool4x1)441; }
  169. bool1x4 overload1(bool1x4 v) { return (bool1x4)414; }
  170. bool4x4 overload1(bool4x4 v) { return (bool4x4)444; }
  171. double4x1 overload1(double4x1 v) { return (double4x1)541; }
  172. double1x4 overload1(double1x4 v) { return (double1x4)514; }
  173. double4x4 overload1(double4x4 v) { return (double4x4)544; }
  174. int64_t4x1 overload1(int64_t4x1 v) { return (int64_t4x1)641; }
  175. int64_t1x4 overload1(int64_t1x4 v) { return (int64_t1x4)614; }
  176. int64_t4x4 overload1(int64_t4x4 v) { return (int64_t4x4)644; }
  177. uint64_t4x1 overload1(uint64_t4x1 v) { return (uint64_t4x1)741; }
  178. uint64_t1x4 overload1(uint64_t1x4 v) { return (uint64_t1x4)714; }
  179. uint64_t4x4 overload1(uint64_t4x4 v) { return (uint64_t4x4)744; }
  180. // GENERATED_CODE:END
  181. // <py::lines('GENERATED_CODE')>modify(lines, gen_code('%(type)s overload2(%(type)s v1, %(type)s v2) { return (%(type)s)%(val)s; }', overload_types))</py>
  182. // GENERATED_CODE:BEGIN
  183. float overload2(float v1, float v2) { return (float)100; }
  184. int overload2(int v1, int v2) { return (int)200; }
  185. uint overload2(uint v1, uint v2) { return (uint)300; }
  186. bool overload2(bool v1, bool v2) { return (bool)400; }
  187. double overload2(double v1, double v2) { return (double)500; }
  188. int64_t overload2(int64_t v1, int64_t v2) { return (int64_t)600; }
  189. uint64_t overload2(uint64_t v1, uint64_t v2) { return (uint64_t)700; }
  190. float2 overload2(float2 v1, float2 v2) { return (float2)102; }
  191. float4 overload2(float4 v1, float4 v2) { return (float4)104; }
  192. int2 overload2(int2 v1, int2 v2) { return (int2)202; }
  193. int4 overload2(int4 v1, int4 v2) { return (int4)204; }
  194. uint2 overload2(uint2 v1, uint2 v2) { return (uint2)302; }
  195. uint4 overload2(uint4 v1, uint4 v2) { return (uint4)304; }
  196. bool2 overload2(bool2 v1, bool2 v2) { return (bool2)402; }
  197. bool4 overload2(bool4 v1, bool4 v2) { return (bool4)404; }
  198. double2 overload2(double2 v1, double2 v2) { return (double2)502; }
  199. double4 overload2(double4 v1, double4 v2) { return (double4)504; }
  200. int64_t2 overload2(int64_t2 v1, int64_t2 v2) { return (int64_t2)602; }
  201. int64_t4 overload2(int64_t4 v1, int64_t4 v2) { return (int64_t4)604; }
  202. uint64_t2 overload2(uint64_t2 v1, uint64_t2 v2) { return (uint64_t2)702; }
  203. uint64_t4 overload2(uint64_t4 v1, uint64_t4 v2) { return (uint64_t4)704; }
  204. float4x1 overload2(float4x1 v1, float4x1 v2) { return (float4x1)141; }
  205. float1x4 overload2(float1x4 v1, float1x4 v2) { return (float1x4)114; }
  206. float4x4 overload2(float4x4 v1, float4x4 v2) { return (float4x4)144; }
  207. int4x1 overload2(int4x1 v1, int4x1 v2) { return (int4x1)241; }
  208. int1x4 overload2(int1x4 v1, int1x4 v2) { return (int1x4)214; }
  209. int4x4 overload2(int4x4 v1, int4x4 v2) { return (int4x4)244; }
  210. uint4x1 overload2(uint4x1 v1, uint4x1 v2) { return (uint4x1)341; }
  211. uint1x4 overload2(uint1x4 v1, uint1x4 v2) { return (uint1x4)314; }
  212. uint4x4 overload2(uint4x4 v1, uint4x4 v2) { return (uint4x4)344; }
  213. bool4x1 overload2(bool4x1 v1, bool4x1 v2) { return (bool4x1)441; }
  214. bool1x4 overload2(bool1x4 v1, bool1x4 v2) { return (bool1x4)414; }
  215. bool4x4 overload2(bool4x4 v1, bool4x4 v2) { return (bool4x4)444; }
  216. double4x1 overload2(double4x1 v1, double4x1 v2) { return (double4x1)541; }
  217. double1x4 overload2(double1x4 v1, double1x4 v2) { return (double1x4)514; }
  218. double4x4 overload2(double4x4 v1, double4x4 v2) { return (double4x4)544; }
  219. int64_t4x1 overload2(int64_t4x1 v1, int64_t4x1 v2) { return (int64_t4x1)641; }
  220. int64_t1x4 overload2(int64_t1x4 v1, int64_t1x4 v2) { return (int64_t1x4)614; }
  221. int64_t4x4 overload2(int64_t4x4 v1, int64_t4x4 v2) { return (int64_t4x4)644; }
  222. uint64_t4x1 overload2(uint64_t4x1 v1, uint64_t4x1 v2) { return (uint64_t4x1)741; }
  223. uint64_t1x4 overload2(uint64_t1x4 v1, uint64_t1x4 v2) { return (uint64_t1x4)714; }
  224. uint64_t4x4 overload2(uint64_t4x4 v1, uint64_t4x4 v2) { return (uint64_t4x4)744; }
  225. // GENERATED_CODE:END
  226. float4 test(): SV_Target {
  227. // <py::lines('GENERATED_CODE')>modify(lines, gen_code('%(type)s %(id)s = g_%(id)s;'))</py>
  228. // GENERATED_CODE:BEGIN
  229. float f = g_f;
  230. int i = g_i;
  231. uint u = g_u;
  232. bool b = g_b;
  233. double d = g_d;
  234. int64_t i64 = g_i64;
  235. uint64_t u64 = g_u64;
  236. min16float m16f = g_m16f;
  237. float1 f1 = g_f1;
  238. float2 f2 = g_f2;
  239. float4 f4 = g_f4;
  240. int1 i1 = g_i1;
  241. int2 i2 = g_i2;
  242. int4 i4 = g_i4;
  243. uint1 u1 = g_u1;
  244. uint2 u2 = g_u2;
  245. uint4 u4 = g_u4;
  246. bool1 b1 = g_b1;
  247. bool2 b2 = g_b2;
  248. bool4 b4 = g_b4;
  249. double1 d1 = g_d1;
  250. double2 d2 = g_d2;
  251. double4 d4 = g_d4;
  252. int64_t1 i641 = g_i641;
  253. int64_t2 i642 = g_i642;
  254. int64_t4 i644 = g_i644;
  255. uint64_t1 u641 = g_u641;
  256. uint64_t2 u642 = g_u642;
  257. uint64_t4 u644 = g_u644;
  258. min16float1 m16f1 = g_m16f1;
  259. min16float2 m16f2 = g_m16f2;
  260. min16float4 m16f4 = g_m16f4;
  261. float1x1 f1x1 = g_f1x1;
  262. float4x1 f4x1 = g_f4x1;
  263. float1x4 f1x4 = g_f1x4;
  264. float4x4 f4x4 = g_f4x4;
  265. int1x1 i1x1 = g_i1x1;
  266. int4x1 i4x1 = g_i4x1;
  267. int1x4 i1x4 = g_i1x4;
  268. int4x4 i4x4 = g_i4x4;
  269. uint1x1 u1x1 = g_u1x1;
  270. uint4x1 u4x1 = g_u4x1;
  271. uint1x4 u1x4 = g_u1x4;
  272. uint4x4 u4x4 = g_u4x4;
  273. bool1x1 b1x1 = g_b1x1;
  274. bool4x1 b4x1 = g_b4x1;
  275. bool1x4 b1x4 = g_b1x4;
  276. bool4x4 b4x4 = g_b4x4;
  277. double1x1 d1x1 = g_d1x1;
  278. double4x1 d4x1 = g_d4x1;
  279. double1x4 d1x4 = g_d1x4;
  280. double4x4 d4x4 = g_d4x4;
  281. int64_t1x1 i641x1 = g_i641x1;
  282. int64_t4x1 i644x1 = g_i644x1;
  283. int64_t1x4 i641x4 = g_i641x4;
  284. int64_t4x4 i644x4 = g_i644x4;
  285. uint64_t1x1 u641x1 = g_u641x1;
  286. uint64_t4x1 u644x1 = g_u644x1;
  287. uint64_t1x4 u641x4 = g_u641x4;
  288. uint64_t4x4 u644x4 = g_u644x4;
  289. min16float1x1 m16f1x1 = g_m16f1x1;
  290. min16float4x1 m16f4x1 = g_m16f4x1;
  291. min16float1x4 m16f1x4 = g_m16f1x4;
  292. min16float4x4 m16f4x4 = g_m16f4x4;
  293. // GENERATED_CODE:END
  294. float3 f3 = f4; /* expected-warning {{implicit truncation of vector type}} fxc-warning {{X3206: implicit truncation of vector type}} */
  295. int3x1 i3x1 = i4x4; /* expected-warning {{implicit truncation of vector type}} fxc-warning {{X3206: implicit truncation of vector type}} */
  296. /*verify-ast
  297. DeclStmt <col:3, col:21>
  298. `-VarDecl <col:3, col:17> col:10 used i3x1 'int3x1':'matrix<int, 3, 1>' cinit
  299. `-ImplicitCastExpr <col:17> 'matrix<int, 3, 1>':'matrix<int, 3, 1>' <HLSLMatrixTruncationCast>
  300. `-ImplicitCastExpr <col:17> 'int4x4':'matrix<int, 4, 4>' <LValueToRValue>
  301. `-DeclRefExpr <col:17> 'int4x4':'matrix<int, 4, 4>' lvalue Var 'i4x4' 'int4x4':'matrix<int, 4, 4>'
  302. */
  303. VERIFY_TYPES(float, f * f1);
  304. VERIFY_TYPES(float4, f * f4);
  305. VERIFY_TYPES(float4, f1 * f4);
  306. VERIFY_TYPES(float4, i4 * f1);
  307. VERIFY_TYPES(float4x4, i4x4 * f);
  308. VERIFY_TYPES(float4x4, f * i4x4);
  309. VERIFY_TYPES(bool, b = i4); /* expected-warning {{implicit truncation of vector type}} fxc-warning {{X3206: implicit truncation of vector type}} */
  310. VERIFY_TYPES(float4x4, overload1(i4x4 * f));
  311. VERIFY_TYPES(float4x4, overload1(i4x4 * 1.5F));
  312. VERIFY_TYPES(float4x4, overload1(i4x4 * 1.5));
  313. VERIFY_TYPES(double2, overload1(i2 * 1.5L));
  314. VERIFY_TYPES(uint64_t2, overload1(i2 * 2ULL));
  315. VERIFY_TYPES(int64_t2, overload1(i2 * 2LL));
  316. VERIFY_TYPES(float4x4, overload1(f4x4 * 2));
  317. // TODO: Should there be a narrowing warning here due to implicit cast of float to int type?
  318. VERIFY_TYPES(int4x4, overload2(i4x4, f));
  319. VERIFY_TYPES(int4x4, overload2(f, i4x4));
  320. VERIFY_TYPES(uint64_t4x4, overload2(u644x4, d));
  321. VERIFY_TYPES(uint64_t4x4, overload2(d, u644x4));
  322. VERIFY_TYPES(int64_t4x4, overload2(i644x4, d));
  323. VERIFY_TYPES(int64_t4x4, overload2(d, i644x4));
  324. // ambiguous:
  325. //VERIFY_TYPES(float4, overload2(f4, i4));
  326. VERIFY_TYPES(float, overload2(f, 1.0));
  327. VERIFY_TYPES(float, overload2(1.0, f));
  328. VERIFY_TYPES(double, overload2(d, 1.0));
  329. VERIFY_TYPES(double, overload2(1.0, d));
  330. VERIFY_TYPES(uint64_t, overload2(u64, 2));
  331. VERIFY_TYPES(uint64_t, overload2(2, u64));
  332. VERIFY_TYPES(int64_t, overload2(i64, 2));
  333. VERIFY_TYPES(int64_t, overload2(2, i64));
  334. i4 = i;
  335. /*verify-ast
  336. BinaryOperator <col:3, col:8> 'int4':'vector<int, 4>' '='
  337. |-DeclRefExpr <col:3> 'int4':'vector<int, 4>' lvalue Var 'i4' 'int4':'vector<int, 4>'
  338. `-ImplicitCastExpr <col:8> 'vector<int, 4>':'vector<int, 4>' <HLSLVectorSplat>
  339. `-ImplicitCastExpr <col:8> 'int' <LValueToRValue>
  340. `-DeclRefExpr <col:8> 'int' lvalue Var 'i' 'int'
  341. */
  342. u64 = d;
  343. /*verify-ast
  344. BinaryOperator <col:3, col:9> 'uint64_t':'unsigned long long' '='
  345. |-DeclRefExpr <col:3> 'uint64_t':'unsigned long long' lvalue Var 'u64' 'uint64_t':'unsigned long long'
  346. `-ImplicitCastExpr <col:9> 'uint64_t':'unsigned long long' <FloatingToIntegral>
  347. `-ImplicitCastExpr <col:9> 'double' <LValueToRValue>
  348. `-DeclRefExpr <col:9> 'double' lvalue Var 0x1627fd8 'd' 'double'
  349. */
  350. i4 = i1x4;
  351. /*verify-ast
  352. BinaryOperator <col:3, col:8> 'int4':'vector<int, 4>' '='
  353. |-DeclRefExpr <col:3> 'int4':'vector<int, 4>' lvalue Var 'i4' 'int4':'vector<int, 4>'
  354. `-ImplicitCastExpr <col:8> 'vector<int, 4>':'vector<int, 4>' <HLSLMatrixToVectorCast>
  355. `-ImplicitCastExpr <col:8> 'int1x4':'matrix<int, 1, 4>' <LValueToRValue>
  356. `-DeclRefExpr <col:8> 'int1x4':'matrix<int, 1, 4>' lvalue Var 'i1x4' 'int1x4':'matrix<int, 1, 4>'
  357. */
  358. i4 = i4x1;
  359. /*verify-ast
  360. BinaryOperator <col:3, col:8> 'int4':'vector<int, 4>' '='
  361. |-DeclRefExpr <col:3> 'int4':'vector<int, 4>' lvalue Var 'i4' 'int4':'vector<int, 4>'
  362. `-ImplicitCastExpr <col:8> 'vector<int, 4>':'vector<int, 4>' <HLSLMatrixToVectorCast>
  363. `-ImplicitCastExpr <col:8> 'int4x1':'matrix<int, 4, 1>' <LValueToRValue>
  364. `-DeclRefExpr <col:8> 'int4x1':'matrix<int, 4, 1>' lvalue Var 'i4x1' 'int4x1':'matrix<int, 4, 1>'
  365. */
  366. i4x4 = i;
  367. /*verify-ast
  368. BinaryOperator <col:3, col:10> 'int4x4':'matrix<int, 4, 4>' '='
  369. |-DeclRefExpr <col:3> 'int4x4':'matrix<int, 4, 4>' lvalue Var 'i4x4' 'int4x4':'matrix<int, 4, 4>'
  370. `-ImplicitCastExpr <col:10> 'matrix<int, 4, 4>':'matrix<int, 4, 4>' <HLSLMatrixSplat>
  371. `-ImplicitCastExpr <col:10> 'int' <LValueToRValue>
  372. `-DeclRefExpr <col:10> 'int' lvalue Var 'i' 'int'
  373. */
  374. i = i4x4; /* expected-warning {{implicit truncation of vector type}} fxc-warning {{X3206: implicit truncation of vector type}} */
  375. /*verify-ast
  376. BinaryOperator <col:3, col:7> 'int' '='
  377. |-DeclRefExpr <col:3> 'int' lvalue Var 'i' 'int'
  378. `-ImplicitCastExpr <col:7> 'int' <HLSLMatrixToScalarCast>
  379. `-ImplicitCastExpr <col:7> 'matrix<int, 1, 1>':'matrix<int, 1, 1>' <HLSLMatrixTruncationCast>
  380. `-ImplicitCastExpr <col:7> 'int4x4':'matrix<int, 4, 4>' <LValueToRValue>
  381. `-DeclRefExpr <col:7> 'int4x4':'matrix<int, 4, 4>' lvalue Var 'i4x4' 'int4x4':'matrix<int, 4, 4>'
  382. */
  383. i4x4 = i4; /* expected-error {{cannot convert from 'int4' to 'int4x4'}} fxc-error {{X3017: cannot implicitly convert from 'int4' to 'int4x4'}} */
  384. /*verify-ast
  385. BinaryOperator <col:3, col:10> 'int4x4':'matrix<int, 4, 4>' '='
  386. |-DeclRefExpr <col:3> 'int4x4':'matrix<int, 4, 4>' lvalue Var 'i4x4' 'int4x4':'matrix<int, 4, 4>'
  387. `-DeclRefExpr <col:10> 'int4':'vector<int, 4>' lvalue Var 'i4' 'int4':'vector<int, 4>'
  388. */
  389. i4x4 = i4x1; /* expected-error {{cannot convert from 'int4x1' to 'int4x4'}} fxc-error {{X3017: cannot implicitly convert from 'int4x1' to 'int4x4'}} */
  390. /*verify-ast
  391. BinaryOperator <col:3, col:10> 'int4x4':'matrix<int, 4, 4>' '='
  392. |-DeclRefExpr <col:3> 'int4x4':'matrix<int, 4, 4>' lvalue Var 'i4x4' 'int4x4':'matrix<int, 4, 4>'
  393. `-DeclRefExpr <col:10> 'int4x1':'matrix<int, 4, 1>' lvalue Var 'i4x1' 'int4x1':'matrix<int, 4, 1>'
  394. */
  395. i4x4 = i1x4; /* expected-error {{cannot convert from 'int1x4' to 'int4x4'}} fxc-error {{X3017: cannot implicitly convert from 'int4' to 'int4x4'}} */
  396. /*verify-ast
  397. BinaryOperator <col:3, col:10> 'int4x4':'matrix<int, 4, 4>' '='
  398. |-DeclRefExpr <col:3> 'int4x4':'matrix<int, 4, 4>' lvalue Var 'i4x4' 'int4x4':'matrix<int, 4, 4>'
  399. `-DeclRefExpr <col:10> 'int1x4':'matrix<int, 1, 4>' lvalue Var 'i1x4' 'int1x4':'matrix<int, 1, 4>'
  400. */
  401. i4 = i1;
  402. /*verify-ast
  403. BinaryOperator <col:3, col:8> 'int4':'vector<int, 4>' '='
  404. |-DeclRefExpr <col:3> 'int4':'vector<int, 4>' lvalue Var 'i4' 'int4':'vector<int, 4>'
  405. `-ImplicitCastExpr <col:8> 'vector<int, 4>':'vector<int, 4>' <HLSLVectorSplat>
  406. `-ImplicitCastExpr <col:8> 'int' <HLSLVectorToScalarCast>
  407. `-ImplicitCastExpr <col:8> 'int1':'vector<int, 1>' <LValueToRValue>
  408. `-DeclRefExpr <col:8> 'int1':'vector<int, 1>' lvalue Var 'i1' 'int1':'vector<int, 1>'
  409. */
  410. b = i;
  411. /*verify-ast
  412. BinaryOperator <col:3, col:7> 'bool' '='
  413. |-DeclRefExpr <col:3> 'bool' lvalue Var 'b' 'bool'
  414. `-ImplicitCastExpr <col:7> 'bool' <IntegralToBoolean>
  415. `-ImplicitCastExpr <col:7> 'int' <LValueToRValue>
  416. `-DeclRefExpr <col:7> 'int' lvalue Var 'i' 'int'
  417. */
  418. b1 = i1;
  419. /*verify-ast
  420. BinaryOperator <col:3, col:8> 'bool1':'vector<bool, 1>' '='
  421. |-DeclRefExpr <col:3> 'bool1':'vector<bool, 1>' lvalue Var 'b1' 'bool1':'vector<bool, 1>'
  422. `-ImplicitCastExpr <col:8> 'vector<bool, 1>' <HLSLCC_IntegralToBoolean>
  423. `-ImplicitCastExpr <col:8> 'int1':'vector<int, 1>' <LValueToRValue>
  424. `-DeclRefExpr <col:8> 'int1':'vector<int, 1>' lvalue Var 'i1' 'int1':'vector<int, 1>'
  425. */
  426. b4 = i1;
  427. /*verify-ast
  428. BinaryOperator <col:3, col:8> 'bool4':'vector<bool, 4>' '='
  429. |-DeclRefExpr <col:3> 'bool4':'vector<bool, 4>' lvalue Var 'b4' 'bool4':'vector<bool, 4>'
  430. `-ImplicitCastExpr <col:8> 'vector<bool, 4>':'vector<bool, 4>' <HLSLVectorSplat>
  431. `-ImplicitCastExpr <col:8> 'bool' <IntegralToBoolean>
  432. `-ImplicitCastExpr <col:8> 'int' <HLSLVectorToScalarCast>
  433. `-ImplicitCastExpr <col:8> 'int1':'vector<int, 1>' <LValueToRValue>
  434. `-DeclRefExpr <col:8> 'int1':'vector<int, 1>' lvalue Var 'i1' 'int1':'vector<int, 1>'
  435. */
  436. b4 = i4;
  437. /*verify-ast
  438. BinaryOperator <col:3, col:8> 'bool4':'vector<bool, 4>' '='
  439. |-DeclRefExpr <col:3> 'bool4':'vector<bool, 4>' lvalue Var 'b4' 'bool4':'vector<bool, 4>'
  440. `-ImplicitCastExpr <col:8> 'vector<bool, 4>' <HLSLCC_IntegralToBoolean>
  441. `-ImplicitCastExpr <col:8> 'int4':'vector<int, 4>' <LValueToRValue>
  442. `-DeclRefExpr <col:8> 'int4':'vector<int, 4>' lvalue Var 'i4' 'int4':'vector<int, 4>'
  443. */
  444. b4x4 = i4x4;
  445. /*verify-ast
  446. BinaryOperator <col:3, col:10> 'bool4x4':'matrix<bool, 4, 4>' '='
  447. |-DeclRefExpr <col:3> 'bool4x4':'matrix<bool, 4, 4>' lvalue Var 'b4x4' 'bool4x4':'matrix<bool, 4, 4>'
  448. `-ImplicitCastExpr <col:10> 'matrix<bool, 4, 4>' <HLSLCC_IntegralToBoolean>
  449. `-ImplicitCastExpr <col:10> 'int4x4':'matrix<int, 4, 4>' <LValueToRValue>
  450. `-DeclRefExpr <col:10> 'int4x4':'matrix<int, 4, 4>' lvalue Var 'i4x4' 'int4x4':'matrix<int, 4, 4>'
  451. */
  452. i4 = b4x4; /* expected-error {{cannot convert from 'bool4x4' to 'int4'}} fxc-error {{X3017: cannot implicitly convert from 'bool4x4' to 'int4'}} */
  453. /*verify-ast
  454. BinaryOperator <col:3, col:8> 'int4':'vector<int, 4>' '='
  455. |-DeclRefExpr <col:3> 'int4':'vector<int, 4>' lvalue Var 'i4' 'int4':'vector<int, 4>'
  456. `-DeclRefExpr <col:8> 'bool4x4':'matrix<bool, 4, 4>' lvalue Var 'b4x4' 'bool4x4':'matrix<bool, 4, 4>'
  457. */
  458. i4x1 = b1x4; /* expected-error {{cannot convert from 'bool1x4' to 'int4x1'}} fxc-error {{X3017: cannot implicitly convert from 'bool4' to 'int4x1'}} */
  459. /*verify-ast
  460. BinaryOperator <col:3, col:10> 'int4x1':'matrix<int, 4, 1>' '='
  461. |-DeclRefExpr <col:3> 'int4x1':'matrix<int, 4, 1>' lvalue Var 'i4x1' 'int4x1':'matrix<int, 4, 1>'
  462. `-DeclRefExpr <col:10> 'bool1x4':'matrix<bool, 1, 4>' lvalue Var 'b1x4' 'bool1x4':'matrix<bool, 1, 4>'
  463. */
  464. f = b;
  465. /*verify-ast
  466. BinaryOperator <col:3, col:7> 'float' '='
  467. |-DeclRefExpr <col:3> 'float' lvalue Var 'f' 'float'
  468. `-ImplicitCastExpr <col:7> 'float' <FloatingCast>
  469. `-ImplicitCastExpr <col:7> 'bool' <LValueToRValue>
  470. `-DeclRefExpr <col:7> 'bool' lvalue Var 'b' 'bool'
  471. */
  472. f = b4; /* expected-warning {{implicit truncation of vector type}} fxc-warning {{X3206: implicit truncation of vector type}} */
  473. /*verify-ast
  474. BinaryOperator <col:3, col:7> 'float' '='
  475. |-DeclRefExpr <col:3> 'float' lvalue Var 'f' 'float'
  476. `-ImplicitCastExpr <col:7> 'float' <FloatingCast>
  477. `-ImplicitCastExpr <col:7> 'bool' <HLSLVectorToScalarCast>
  478. `-ImplicitCastExpr <col:7> 'vector<bool, 1>':'vector<bool, 1>' <HLSLVectorTruncationCast>
  479. `-ImplicitCastExpr <col:7> 'bool4':'vector<bool, 4>' <LValueToRValue>
  480. `-DeclRefExpr <col:7> 'bool4':'vector<bool, 4>' lvalue Var 'b4' 'bool4':'vector<bool, 4>'
  481. */
  482. f = i;
  483. /*verify-ast
  484. BinaryOperator <col:3, col:7> 'float' '='
  485. |-DeclRefExpr <col:3> 'float' lvalue Var 'f' 'float'
  486. `-ImplicitCastExpr <col:7> 'float' <IntegralToFloating>
  487. `-ImplicitCastExpr <col:7> 'int' <LValueToRValue>
  488. `-DeclRefExpr <col:7> 'int' lvalue Var 'i' 'int'
  489. */
  490. f4 = i4;
  491. /*verify-ast
  492. BinaryOperator <col:3, col:8> 'float4':'vector<float, 4>' '='
  493. |-DeclRefExpr <col:3> 'float4':'vector<float, 4>' lvalue Var 'f4' 'float4':'vector<float, 4>'
  494. `-ImplicitCastExpr <col:8> 'vector<float, 4>' <HLSLCC_IntegralToFloating>
  495. `-ImplicitCastExpr <col:8> 'int4':'vector<int, 4>' <LValueToRValue>
  496. `-DeclRefExpr <col:8> 'int4':'vector<int, 4>' lvalue Var 'i4' 'int4':'vector<int, 4>'
  497. */
  498. f = i * 0.5;
  499. /*verify-ast
  500. BinaryOperator <col:3, col:11> 'float' '='
  501. |-DeclRefExpr <col:3> 'float' lvalue Var 'f' 'float'
  502. `-BinaryOperator <col:7, col:11> 'float' '*'
  503. |-ImplicitCastExpr <col:7> 'float' <IntegralToFloating>
  504. | `-ImplicitCastExpr <col:7> 'int' <LValueToRValue>
  505. | `-DeclRefExpr <col:7> 'int' lvalue Var 'i' 'int'
  506. `-ImplicitCastExpr <col:11> 'float' <FloatingCast>
  507. `-FloatingLiteral <col:11> 'literal float' 5.000000e-01
  508. */
  509. f4 = i4 * 0.5;
  510. /*verify-ast
  511. BinaryOperator <col:3, col:13> 'float4':'vector<float, 4>' '='
  512. |-DeclRefExpr <col:3> 'float4':'vector<float, 4>' lvalue Var 'f4' 'float4':'vector<float, 4>'
  513. `-BinaryOperator <col:8, col:13> 'vector<float, 4>' '*'
  514. |-ImplicitCastExpr <col:8> 'vector<float, 4>' <HLSLCC_IntegralToFloating>
  515. | `-ImplicitCastExpr <col:8> 'int4':'vector<int, 4>' <LValueToRValue>
  516. | `-DeclRefExpr <col:8> 'int4':'vector<int, 4>' lvalue Var 'i4' 'int4':'vector<int, 4>'
  517. `-ImplicitCastExpr <col:13> 'vector<float, 4>':'vector<float, 4>' <HLSLVectorSplat>
  518. `-ImplicitCastExpr <col:13> 'float' <FloatingCast>
  519. `-FloatingLiteral <col:13> 'literal float' 5.000000e-01
  520. */
  521. m16f = 0.5 * m16f;
  522. /*verify-ast
  523. BinaryOperator <col:3, col:16> 'min16float':'__fp16' '='
  524. |-DeclRefExpr <col:3> 'min16float':'__fp16' lvalue Var 'm16f' 'min16float':'__fp16'
  525. `-BinaryOperator <col:10, col:16> '__fp16' '*'
  526. |-ImplicitCastExpr <col:10> '__fp16' <FloatingCast>
  527. | `-FloatingLiteral <col:10> 'literal float' 5.000000e-01
  528. `-ImplicitCastExpr <col:16> 'min16float':'__fp16' <LValueToRValue>
  529. `-DeclRefExpr <col:16> 'min16float':'__fp16' lvalue Var 'm16f' 'min16float':'__fp16'
  530. */
  531. m16f = 0.5F * m16f; /* expected-warning {{conversion from larger type 'float' to smaller type 'min16float', possible loss of data}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}} */
  532. /*verify-ast
  533. BinaryOperator <col:3, col:17> 'min16float':'__fp16' '='
  534. |-DeclRefExpr <col:3> 'min16float':'__fp16' lvalue Var 'm16f' 'min16float':'__fp16'
  535. `-ImplicitCastExpr <col:10, col:17> 'min16float':'__fp16' <FloatingCast>
  536. `-BinaryOperator <col:10, col:17> 'float' '*'
  537. |-FloatingLiteral <col:10> 'float' 5.000000e-01
  538. `-ImplicitCastExpr <col:17> 'float' <FloatingCast>
  539. `-ImplicitCastExpr <col:17> 'min16float':'__fp16' <LValueToRValue>
  540. `-DeclRefExpr <col:17> 'min16float':'__fp16' lvalue Var 'm16f' 'min16float':'__fp16'
  541. */
  542. m16f = 0.5L * m16f; /* expected-warning {{conversion from larger type 'double' to smaller type 'min16float', possible loss of data}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}} */
  543. /*verify-ast
  544. BinaryOperator <col:3, col:17> 'min16float':'__fp16' '='
  545. |-DeclRefExpr <col:3> 'min16float':'__fp16' lvalue Var 'm16f' 'min16float':'__fp16'
  546. `-ImplicitCastExpr <col:10, col:17> 'min16float':'__fp16' <FloatingCast>
  547. `-BinaryOperator <col:10, col:17> 'double' '*'
  548. |-FloatingLiteral <col:10> 'double' 5.000000e-01
  549. `-ImplicitCastExpr <col:17> 'double' <FloatingCast>
  550. `-ImplicitCastExpr <col:17> 'min16float':'__fp16' <LValueToRValue>
  551. `-DeclRefExpr <col:17> 'min16float':'__fp16' lvalue Var 'm16f' 'min16float':'__fp16'
  552. */
  553. m16f4x4 = i4x4 * (m16f + 1); /* fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}} */
  554. /*verify-ast
  555. BinaryOperator <col:3, col:29> 'min16float4x4':'matrix<min16float, 4, 4>' '='
  556. |-DeclRefExpr <col:3> 'min16float4x4':'matrix<min16float, 4, 4>' lvalue Var 'm16f4x4' 'min16float4x4':'matrix<min16float, 4, 4>'
  557. `-BinaryOperator <col:13, col:29> 'matrix<min16float, 4, 4>' '*'
  558. |-ImplicitCastExpr <col:13> 'matrix<min16float, 4, 4>' <HLSLCC_IntegralToFloating>
  559. | `-ImplicitCastExpr <col:13> 'int4x4':'matrix<int, 4, 4>' <LValueToRValue>
  560. | `-DeclRefExpr <col:13> 'int4x4':'matrix<int, 4, 4>' lvalue Var 'i4x4' 'int4x4':'matrix<int, 4, 4>'
  561. `-ImplicitCastExpr <col:20, col:29> 'matrix<min16float, 4, 4>':'matrix<min16float, 4, 4>' <HLSLMatrixSplat>
  562. `-ParenExpr <col:20, col:29> '__fp16'
  563. `-BinaryOperator <col:21, col:28> '__fp16' '+'
  564. |-ImplicitCastExpr <col:21> 'min16float':'__fp16' <LValueToRValue>
  565. | `-DeclRefExpr <col:21> 'min16float':'__fp16' lvalue Var 'm16f' 'min16float':'__fp16'
  566. `-ImplicitCastExpr <col:28> '__fp16' <IntegralToFloating>
  567. `-IntegerLiteral <col:28> 'literal int' 1
  568. */
  569. VERIFY_TYPES(min16float4x4, m16f4x4 * (0.5 + 1));
  570. m16f4x4 = m16f4x4 * (0.5 + 1);
  571. /*verify-ast
  572. BinaryOperator <col:3, col:31> 'min16float4x4':'matrix<min16float, 4, 4>' '='
  573. |-DeclRefExpr <col:3> 'min16float4x4':'matrix<min16float, 4, 4>' lvalue Var 'm16f4x4' 'min16float4x4':'matrix<min16float, 4, 4>'
  574. `-BinaryOperator <col:13, col:31> 'matrix<min16float, 4, 4>' '*'
  575. |-ImplicitCastExpr <col:13> 'min16float4x4':'matrix<min16float, 4, 4>' <LValueToRValue>
  576. | `-DeclRefExpr <col:13> 'min16float4x4':'matrix<min16float, 4, 4>' lvalue Var 'm16f4x4' 'min16float4x4':'matrix<min16float, 4, 4>'
  577. `-ImplicitCastExpr <col:23, col:31> 'matrix<min16float, 4, 4>':'matrix<min16float, 4, 4>' <HLSLMatrixSplat>
  578. `-ImplicitCastExpr <col:23, col:31> 'min16float':'__fp16' <FloatingCast>
  579. `-ParenExpr <col:23, col:31> 'literal float'
  580. `-BinaryOperator <col:24, col:30> 'literal float' '+'
  581. |-FloatingLiteral <col:24> 'literal float' 5.000000e-01
  582. `-ImplicitCastExpr <col:30> 'literal float' <IntegralToFloating>
  583. `-IntegerLiteral <col:30> 'literal int' 1
  584. */
  585. b = i4; /* expected-warning {{implicit truncation of vector type}} fxc-warning {{X3206: implicit truncation of vector type}} */
  586. /*verify-ast
  587. BinaryOperator <col:3, col:7> 'bool' '='
  588. |-DeclRefExpr <col:3> 'bool' lvalue Var 'b' 'bool'
  589. `-ImplicitCastExpr <col:7> 'bool' <IntegralToBoolean>
  590. `-ImplicitCastExpr <col:7> 'int' <HLSLVectorToScalarCast>
  591. `-ImplicitCastExpr <col:7> 'vector<int, 1>':'vector<int, 1>' <HLSLVectorTruncationCast>
  592. `-ImplicitCastExpr <col:7> 'int4':'vector<int, 4>' <LValueToRValue>
  593. `-DeclRefExpr <col:7> 'int4':'vector<int, 4>' lvalue Var 'i4' 'int4':'vector<int, 4>'
  594. */
  595. // TODO: FXC fails this case, but passes other similar cases. What should we do?
  596. i.x = f4 + f1x4 * f4x1 / i1; /* expected-warning {{implicit truncation of vector type}} fxc-error {{X3020: type mismatch}} */
  597. /*verify-ast
  598. BinaryOperator <col:3, col:28> 'int' '='
  599. |-HLSLVectorElementExpr <col:3, col:5> 'int' lvalue vectorcomponent x
  600. | `-ImplicitCastExpr <col:3> 'vector<int, 1>':'vector<int, 1>' lvalue <HLSLVectorSplat>
  601. | `-DeclRefExpr <col:3> 'int' lvalue Var 'i' 'int'
  602. `-ImplicitCastExpr <col:9, col:28> 'int' <FloatingToIntegral>
  603. `-ImplicitCastExpr <col:9, col:28> 'float' <HLSLVectorToScalarCast>
  604. `-ImplicitCastExpr <col:9, col:28> 'vector<float, 1>':'vector<float, 1>' <HLSLVectorTruncationCast>
  605. `-BinaryOperator <col:9, col:28> 'vector<float, 4>' '+'
  606. |-ImplicitCastExpr <col:9> 'float4':'vector<float, 4>' <LValueToRValue>
  607. | `-DeclRefExpr <col:9> 'float4':'vector<float, 4>' lvalue Var 'f4' 'float4':'vector<float, 4>'
  608. `-BinaryOperator <col:14, col:28> 'vector<float, 4>' '/'
  609. |-BinaryOperator <col:14, col:21> 'vector<float, 4>' '*'
  610. | |-ImplicitCastExpr <col:14> 'vector<float, 4>':'vector<float, 4>' <HLSLMatrixToVectorCast>
  611. | | `-ImplicitCastExpr <col:14> 'float1x4':'matrix<float, 1, 4>' <LValueToRValue>
  612. | | `-DeclRefExpr <col:14> 'float1x4':'matrix<float, 1, 4>' lvalue Var 'f1x4' 'float1x4':'matrix<float, 1, 4>'
  613. | `-ImplicitCastExpr <col:21> 'vector<float, 4>':'vector<float, 4>' <HLSLMatrixToVectorCast>
  614. | `-ImplicitCastExpr <col:21> 'float4x1':'matrix<float, 4, 1>' <LValueToRValue>
  615. | `-DeclRefExpr <col:21> 'float4x1':'matrix<float, 4, 1>' lvalue Var 'f4x1' 'float4x1':'matrix<float, 4, 1>'
  616. `-ImplicitCastExpr <col:28> 'vector<float, 4>':'vector<float, 4>' <HLSLVectorSplat>
  617. `-ImplicitCastExpr <col:28> 'float' <IntegralToFloating>
  618. `-ImplicitCastExpr <col:28> 'int' <HLSLVectorToScalarCast>
  619. `-ImplicitCastExpr <col:28> 'int1':'vector<int, 1>' <LValueToRValue>
  620. `-DeclRefExpr <col:28> 'int1':'vector<int, 1>' lvalue Var 'i1' 'int1':'vector<int, 1>'
  621. */
  622. // TODO: fxc passes the following (i4x1 should implicitly cast to float4 for mul op)
  623. f4x4._m02_m11_m20 = i4x1 * f4; /* expected-warning {{implicit truncation of vector type}} fxc-warning {{X3206: implicit truncation of vector type}} */
  624. /*verify-ast
  625. BinaryOperator <col:3, col:30> 'vector<float, 3>':'vector<float, 3>' '='
  626. |-ExtMatrixElementExpr <col:3, col:8> 'vector<float, 3>':'vector<float, 3>' lvalue vectorcomponent _m02_m11_m20
  627. | `-DeclRefExpr <col:3> 'float4x4':'matrix<float, 4, 4>' lvalue Var 'f4x4' 'float4x4':'matrix<float, 4, 4>'
  628. `-ImplicitCastExpr <col:23, col:30> 'vector<float, 3>':'vector<float, 3>' <HLSLMatrixToVectorCast>
  629. `-ImplicitCastExpr <col:23, col:30> 'matrix<float, 3, 1>':'matrix<float, 3, 1>' <HLSLMatrixTruncationCast>
  630. `-BinaryOperator <col:23, col:30> 'matrix<float, 4, 1>' '*'
  631. |-ImplicitCastExpr <col:23> 'matrix<float, 4, 1>' <HLSLCC_IntegralToFloating>
  632. | `-ImplicitCastExpr <col:23> 'int4x1':'matrix<int, 4, 1>' <LValueToRValue>
  633. | `-DeclRefExpr <col:23> 'int4x1':'matrix<int, 4, 1>' lvalue Var 'i4x1' 'int4x1':'matrix<int, 4, 1>'
  634. `-ImplicitCastExpr <col:30> 'matrix<float, 4, 1>':'matrix<float, 4, 1>' <HLSLVectorToMatrixCast>
  635. `-ImplicitCastExpr <col:30> 'float4':'vector<float, 4>' <LValueToRValue>
  636. `-DeclRefExpr <col:30> 'float4':'vector<float, 4>' lvalue Var 'f4' 'float4':'vector<float, 4>'
  637. */
  638. f4 = i3x1 * f4; /* expected-error {{cannot convert from 'matrix<float, 3, 1>' to 'float4'}} fxc-error {{X3017: cannot implicitly convert from 'const float3x1' to 'float4'}} fxc-warning {{X3206: implicit truncation of vector type}} */
  639. // TODO: We seem to be missing the vector truncation warning in this case
  640. f3 = i3x1 * f4; /* fxc-warning {{X3206: implicit truncation of vector type}} */
  641. /*verify-ast
  642. BinaryOperator <col:3, col:15> 'float3':'vector<float, 3>' '='
  643. |-DeclRefExpr <col:3> 'float3':'vector<float, 3>' lvalue Var 'f3' 'float3':'vector<float, 3>'
  644. `-ImplicitCastExpr <col:8, col:15> 'vector<float, 3>':'vector<float, 3>' <HLSLMatrixToVectorCast>
  645. `-BinaryOperator <col:8, col:15> 'matrix<float, 3, 1>' '*'
  646. |-ImplicitCastExpr <col:8> 'matrix<float, 3, 1>' <HLSLCC_IntegralToFloating>
  647. | `-ImplicitCastExpr <col:8> 'int3x1':'matrix<int, 3, 1>' <LValueToRValue>
  648. | `-DeclRefExpr <col:8> 'int3x1':'matrix<int, 3, 1>' lvalue Var 'i3x1' 'int3x1':'matrix<int, 3, 1>'
  649. `-ImplicitCastExpr <col:15> 'matrix<float, 3, 1>':'matrix<float, 3, 1>' <HLSLVectorToMatrixCast>
  650. `-ImplicitCastExpr <col:15> 'vector<float, 3>':'vector<float, 3>' <HLSLVectorTruncationCast>
  651. `-ImplicitCastExpr <col:15> 'float4':'vector<float, 4>' <LValueToRValue>
  652. `-DeclRefExpr <col:15> 'float4':'vector<float, 4>' lvalue Var 'f4' 'float4':'vector<float, 4>'
  653. */
  654. // TODO: Fix ternary operator for HLSL vectorized semantics.
  655. b4 = (b4 * b4) ? b4 : b4;
  656. /*verify-ast
  657. BinaryOperator <col:3, col:25> 'bool4':'vector<bool, 4>' '='
  658. |-DeclRefExpr <col:3> 'bool4':'vector<bool, 4>' lvalue Var 'b4' 'bool4':'vector<bool, 4>'
  659. `-ConditionalOperator <col:8, col:25> 'vector<bool, 4>'
  660. |-ImplicitCastExpr <col:8, col:16> 'vector<bool, 4>' <HLSLCC_IntegralToBoolean>
  661. | `-ParenExpr <col:8, col:16> 'vector<int, 4>'
  662. | `-BinaryOperator <col:9, col:14> 'vector<int, 4>' '*'
  663. | |-ImplicitCastExpr <col:9> 'vector<int, 4>' <HLSLCC_IntegralCast>
  664. | | `-ImplicitCastExpr <col:9> 'bool4':'vector<bool, 4>' <LValueToRValue>
  665. | | `-DeclRefExpr <col:9> 'bool4':'vector<bool, 4>' lvalue Var 'b4' 'bool4':'vector<bool, 4>'
  666. | `-ImplicitCastExpr <col:14> 'vector<int, 4>' <HLSLCC_IntegralCast>
  667. | `-ImplicitCastExpr <col:14> 'bool4':'vector<bool, 4>' <LValueToRValue>
  668. | `-DeclRefExpr <col:14> 'bool4':'vector<bool, 4>' lvalue Var 'b4' 'bool4':'vector<bool, 4>'
  669. |-ImplicitCastExpr <col:20> 'bool4':'vector<bool, 4>' <LValueToRValue>
  670. | `-DeclRefExpr <col:20> 'bool4':'vector<bool, 4>' lvalue Var 'b4' 'bool4':'vector<bool, 4>'
  671. `-ImplicitCastExpr <col:25> 'bool4':'vector<bool, 4>' <LValueToRValue>
  672. `-DeclRefExpr <col:25> 'bool4':'vector<bool, 4>' lvalue Var 'b4' 'bool4':'vector<bool, 4>'
  673. */
  674. return 0.0f;
  675. }
  676. bool1 stresstest() {
  677. float VarZero = float(1.0f);
  678. int VarOne = int(2);
  679. int VarTwo = int(3);
  680. bool VarThree = bool(4);
  681. float VarFour = float(5.0f);
  682. float VarFive = float(6.0f);
  683. int VarSix = int(7);
  684. bool3 VarSeven = bool3(8,9,10);
  685. uint VarEight = uint(11);
  686. bool4 VarNine = bool4(12,13,14,15);
  687. return ((bool1)(-(!(-(((((bool4)(VarTwo - VarTwo)) + ((((((bool4)VarThree) * VarNine) * VarNine) ? VarSeven.yyyx : ((bool4)(VarFour * VarZero))) + ((bool4)((((float)VarSix) * VarFour) * (VarZero ? ((float)VarTwo) : ((float)(VarSeven ? ((bool3)VarTwo) : ((bool3)VarEight)).z)))))) * ((bool4)((((bool)VarFour) + (((bool)VarTwo) + VarThree)) ? ((bool)VarSix) : ((bool)((((int)VarNine.w) - VarSix) + ((VarSix + ((int)VarThree)) ? ((int)VarFour) : VarTwo)))))) ? ((bool4)(+(((bool)(~(VarEight ? ((uint)(VarThree ? ((bool)((VarSix - ((int)VarFour)) - VarSix)) : VarSeven.z)) : ((uint)VarNine.z)))) - (!(+(VarOne * ((int)(~(!((((int)VarSeven.y) - VarSix) ? VarTwo : ((int)VarNine.w))))))))))) : ((bool4)(+((VarZero + ((float)VarNine.z)) ? ((float)VarThree) : VarFive))))))).y);
  688. /*verify-ast
  689. ReturnStmt <col:3, col:771>
  690. `-ParenExpr <col:10, col:771> 'bool1':'vector<bool, 1>'
  691. `-CStyleCastExpr <col:11, col:770> 'bool1':'vector<bool, 1>' <NoOp>
  692. `-ImplicitCastExpr <col:18, col:770> 'vector<bool, 1>':'vector<bool, 1>' <HLSLVectorSplat>
  693. `-ImplicitCastExpr <col:18, col:770> 'bool' <IntegralToBoolean>
  694. `-HLSLVectorElementExpr <col:18, col:770> 'int' y
  695. `-ParenExpr <col:18, col:768> 'vector<int, 4>'
  696. `-UnaryOperator <col:19, col:767> 'vector<int, 4>' prefix '-'
  697. `-ImplicitCastExpr <col:20, col:767> 'vector<int, 4>' <HLSLCC_IntegralCast>
  698. `-ParenExpr <col:20, col:767> 'vector<bool, 4>':'vector<bool, 4>'
  699. `-UnaryOperator <col:21, col:766> 'vector<bool, 4>':'vector<bool, 4>' prefix '!'
  700. `-ImplicitCastExpr <col:22, col:766> 'vector<bool, 4>' <HLSLCC_IntegralToBoolean>
  701. `-ParenExpr <col:22, col:766> 'vector<int, 4>'
  702. `-UnaryOperator <col:23, col:765> 'vector<int, 4>' prefix '-'
  703. `-ImplicitCastExpr <col:24, col:765> 'vector<int, 4>' <HLSLCC_IntegralCast>
  704. `-ParenExpr <col:24, col:765> 'vector<bool, 4>'
  705. `-ConditionalOperator <col:25, col:764> 'vector<bool, 4>'
  706. |-ImplicitCastExpr <col:25, col:457> 'vector<bool, 4>' <HLSLCC_IntegralToBoolean>
  707. | `-ParenExpr <col:25, col:457> 'vector<int, 4>'
  708. | `-BinaryOperator <col:26, col:456> 'vector<int, 4>' '*'
  709. | |-ParenExpr <col:26, col:281> 'vector<int, 4>'
  710. | | `-BinaryOperator <col:27, col:280> 'vector<int, 4>' '+'
  711. | | |-ImplicitCastExpr <col:27, col:52> 'vector<int, 4>' <HLSLCC_IntegralCast>
  712. | | | `-ParenExpr <col:27, col:52> 'bool4':'vector<bool, 4>'
  713. | | | `-CStyleCastExpr <col:28, col:51> 'bool4':'vector<bool, 4>' <NoOp>
  714. | | | `-ImplicitCastExpr <col:35, col:51> 'vector<bool, 4>':'vector<bool, 4>' <HLSLVectorSplat>
  715. | | | `-ImplicitCastExpr <col:35, col:51> 'bool' <IntegralToBoolean>
  716. | | | `-ParenExpr <col:35, col:51> 'int'
  717. | | | `-BinaryOperator <col:36, col:45> 'int' '-'
  718. | | | |-ImplicitCastExpr <col:36> 'int' <LValueToRValue>
  719. | | | | `-DeclRefExpr <col:36> 'int' lvalue Var 'VarTwo' 'int'
  720. | | | `-ImplicitCastExpr <col:45> 'int' <LValueToRValue>
  721. | | | `-DeclRefExpr <col:45> 'int' lvalue Var 'VarTwo' 'int'
  722. | | `-ParenExpr <col:56, col:280> 'vector<int, 4>'
  723. | | `-BinaryOperator <col:57, col:279> 'vector<int, 4>' '+'
  724. | | |-ImplicitCastExpr <col:57, col:146> 'vector<int, 4>' <HLSLCC_IntegralCast>
  725. | | | `-ParenExpr <col:57, col:146> 'vector<bool, 4>'
  726. | | | `-ConditionalOperator <col:58, col:145> 'vector<bool, 4>'
  727. | | | |-ImplicitCastExpr <col:58, col:98> 'vector<bool, 4>' <HLSLCC_IntegralToBoolean>
  728. | | | | `-ParenExpr <col:58, col:98> 'vector<int, 4>'
  729. | | | | `-BinaryOperator <col:59, col:91> 'vector<int, 4>' '*'
  730. | | | | |-ParenExpr <col:59, col:87> 'vector<int, 4>'
  731. | | | | | `-BinaryOperator <col:60, col:80> 'vector<int, 4>' '*'
  732. | | | | | |-ImplicitCastExpr <col:60, col:76> 'vector<int, 4>' <HLSLCC_IntegralCast>
  733. | | | | | | `-ParenExpr <col:60, col:76> 'bool4':'vector<bool, 4>'
  734. | | | | | | `-CStyleCastExpr <col:61, col:68> 'bool4':'vector<bool, 4>' <NoOp>
  735. | | | | | | `-ImplicitCastExpr <col:68> 'vector<bool, 4>':'vector<bool, 4>' <HLSLVectorSplat>
  736. | | | | | | `-ImplicitCastExpr <col:68> 'bool' <LValueToRValue>
  737. | | | | | | `-DeclRefExpr <col:68> 'bool' lvalue Var 'VarThree' 'bool'
  738. | | | | | `-ImplicitCastExpr <col:80> 'vector<int, 4>' <HLSLCC_IntegralCast>
  739. | | | | | `-ImplicitCastExpr <col:80> 'bool4':'vector<bool, 4>' <LValueToRValue>
  740. | | | | | `-DeclRefExpr <col:80> 'bool4':'vector<bool, 4>' lvalue Var 'VarNine' 'bool4':'vector<bool, 4>'
  741. | | | | `-ImplicitCastExpr <col:91> 'vector<int, 4>' <HLSLCC_IntegralCast>
  742. | | | | `-ImplicitCastExpr <col:91> 'bool4':'vector<bool, 4>' <LValueToRValue>
  743. | | | | `-DeclRefExpr <col:91> 'bool4':'vector<bool, 4>' lvalue Var 'VarNine' 'bool4':'vector<bool, 4>'
  744. | | | |-HLSLVectorElementExpr <col:102, col:111> 'vector<bool, 4>':'vector<bool, 4>' yyyx
  745. | | | | `-DeclRefExpr <col:102> 'bool3':'vector<bool, 3>' lvalue Var 'VarSeven' 'bool3':'vector<bool, 3>'
  746. | | | `-ParenExpr <col:118, col:145> 'bool4':'vector<bool, 4>'
  747. | | | `-CStyleCastExpr <col:119, col:144> 'bool4':'vector<bool, 4>' <NoOp>
  748. | | | `-ImplicitCastExpr <col:126, col:144> 'vector<bool, 4>':'vector<bool, 4>' <HLSLVectorSplat>
  749. | | | `-ImplicitCastExpr <col:126, col:144> 'bool' <FloatingToBoolean>
  750. | | | `-ParenExpr <col:126, col:144> 'float'
  751. | | | `-BinaryOperator <col:127, col:137> 'float' '*'
  752. | | | |-ImplicitCastExpr <col:127> 'float' <LValueToRValue>
  753. | | | | `-DeclRefExpr <col:127> 'float' lvalue Var 'VarFour' 'float'
  754. | | | `-ImplicitCastExpr <col:137> 'float' <LValueToRValue>
  755. | | | `-DeclRefExpr <col:137> 'float' lvalue Var 'VarZero' 'float'
  756. | | `-ImplicitCastExpr <col:150, col:279> 'vector<int, 4>' <HLSLCC_IntegralCast>
  757. | | `-ParenExpr <col:150, col:279> 'bool4':'vector<bool, 4>'
  758. | | `-CStyleCastExpr <col:151, col:278> 'bool4':'vector<bool, 4>' <NoOp>
  759. | | `-ImplicitCastExpr <col:158, col:278> 'vector<bool, 4>':'vector<bool, 4>' <HLSLVectorSplat>
  760. | | `-ImplicitCastExpr <col:158, col:278> 'bool' <FloatingToBoolean>
  761. | | `-ParenExpr <col:158, col:278> 'float'
  762. | | `-BinaryOperator <col:159, col:277> 'float' '*'
  763. | | |-ParenExpr <col:159, col:185> 'float'
  764. | | | `-BinaryOperator <col:160, col:178> 'float' '*'
  765. | | | |-ParenExpr <col:160, col:174> 'float'
  766. | | | | `-CStyleCastExpr <col:161, col:168> 'float' <NoOp>
  767. | | | | `-ImplicitCastExpr <col:168> 'float' <IntegralToFloating>
  768. | | | | `-ImplicitCastExpr <col:168> 'int' <LValueToRValue>
  769. | | | | `-DeclRefExpr <col:168> 'int' lvalue Var 'VarSix' 'int'
  770. | | | `-ImplicitCastExpr <col:178> 'float' <LValueToRValue>
  771. | | | `-DeclRefExpr <col:178> 'float' lvalue Var 'VarFour' 'float'
  772. | | `-ParenExpr <col:189, col:277> 'float'
  773. | | `-ConditionalOperator <col:190, col:276> 'float'
  774. | | |-ImplicitCastExpr <col:190> 'bool' <FloatingToBoolean>
  775. | | | `-ImplicitCastExpr <col:190> 'float' <LValueToRValue>
  776. | | | `-DeclRefExpr <col:190> 'float' lvalue Var 'VarZero' 'float'
  777. | | |-ParenExpr <col:200, col:214> 'float'
  778. | | | `-CStyleCastExpr <col:201, col:208> 'float' <NoOp>
  779. | | | `-ImplicitCastExpr <col:208> 'float' <IntegralToFloating>
  780. | | | `-ImplicitCastExpr <col:208> 'int' <LValueToRValue>
  781. | | | `-DeclRefExpr <col:208> 'int' lvalue Var 'VarTwo' 'int'
  782. | | `-ParenExpr <col:218, col:276> 'float'
  783. | | `-CStyleCastExpr <col:219, col:275> 'float' <NoOp>
  784. | | `-ImplicitCastExpr <col:226, col:275> 'float' <FloatingCast>
  785. | | `-HLSLVectorElementExpr <col:226, col:275> 'bool' z
  786. | | `-ParenExpr <col:226, col:273> 'vector<bool, 3>'
  787. | | `-ConditionalOperator <col:227, col:272> 'vector<bool, 3>'
  788. | | |-ImplicitCastExpr <col:227> 'bool3':'vector<bool, 3>' <LValueToRValue>
  789. | | | `-DeclRefExpr <col:227> 'bool3':'vector<bool, 3>' lvalue Var 'VarSeven' 'bool3':'vector<bool, 3>'
  790. | | |-ParenExpr <col:238, col:252> 'bool3':'vector<bool, 3>'
  791. | | | `-CStyleCastExpr <col:239, col:246> 'bool3':'vector<bool, 3>' <NoOp>
  792. | | | `-ImplicitCastExpr <col:246> 'vector<bool, 3>':'vector<bool, 3>' <HLSLVectorSplat>
  793. | | | `-ImplicitCastExpr <col:246> 'bool' <IntegralToBoolean>
  794. | | | `-ImplicitCastExpr <col:246> 'int' <LValueToRValue>
  795. | | | `-DeclRefExpr <col:246> 'int' lvalue Var 'VarTwo' 'int'
  796. | | `-ParenExpr <col:256, col:272> 'bool3':'vector<bool, 3>'
  797. | | `-CStyleCastExpr <col:257, col:264> 'bool3':'vector<bool, 3>' <NoOp>
  798. | | `-ImplicitCastExpr <col:264> 'vector<bool, 3>':'vector<bool, 3>' <HLSLVectorSplat>
  799. | | `-ImplicitCastExpr <col:264> 'bool' <IntegralToBoolean>
  800. | | `-ImplicitCastExpr <col:264> 'uint':'unsigned int' <LValueToRValue>
  801. | | `-DeclRefExpr <col:264> 'uint':'unsigned int' lvalue Var 'VarEight' 'uint':'unsigned int'
  802. | `-ImplicitCastExpr <col:285, col:456> 'vector<int, 4>' <HLSLCC_IntegralCast>
  803. | `-ParenExpr <col:285, col:456> 'bool4':'vector<bool, 4>'
  804. | `-CStyleCastExpr <col:286, col:455> 'bool4':'vector<bool, 4>' <NoOp>
  805. | `-ImplicitCastExpr <col:293, col:455> 'vector<bool, 4>':'vector<bool, 4>' <HLSLVectorSplat>
  806. | `-ParenExpr <col:293, col:455> 'bool'
  807. | `-ConditionalOperator <col:294, col:454> 'bool'
  808. | |-ImplicitCastExpr <col:294, col:340> 'bool' <IntegralToBoolean>
  809. | | `-ParenExpr <col:294, col:340> 'int'
  810. | | `-BinaryOperator <col:295, col:339> 'int' '+'
  811. | | |-ImplicitCastExpr <col:295, col:309> 'int' <IntegralCast>
  812. | | | `-ParenExpr <col:295, col:309> 'bool'
  813. | | | `-CStyleCastExpr <col:296, col:302> 'bool' <NoOp>
  814. | | | `-ImplicitCastExpr <col:302> 'bool' <FloatingToBoolean>
  815. | | | `-ImplicitCastExpr <col:302> 'float' <LValueToRValue>
  816. | | | `-DeclRefExpr <col:302> 'float' lvalue Var 'VarFour' 'float'
  817. | | `-ParenExpr <col:313, col:339> 'int'
  818. | | `-BinaryOperator <col:314, col:331> 'int' '+'
  819. | | |-ImplicitCastExpr <col:314, col:327> 'int' <IntegralCast>
  820. | | | `-ParenExpr <col:314, col:327> 'bool'
  821. | | | `-CStyleCastExpr <col:315, col:321> 'bool' <NoOp>
  822. | | | `-ImplicitCastExpr <col:321> 'bool' <IntegralToBoolean>
  823. | | | `-ImplicitCastExpr <col:321> 'int' <LValueToRValue>
  824. | | | `-DeclRefExpr <col:321> 'int' lvalue Var 'VarTwo' 'int'
  825. | | `-ImplicitCastExpr <col:331> 'int' <IntegralCast>
  826. | | `-ImplicitCastExpr <col:331> 'bool' <LValueToRValue>
  827. | | `-DeclRefExpr <col:331> 'bool' lvalue Var 'VarThree' 'bool'
  828. | |-ParenExpr <col:344, col:357> 'bool'
  829. | | `-CStyleCastExpr <col:345, col:351> 'bool' <NoOp>
  830. | | `-ImplicitCastExpr <col:351> 'bool' <IntegralToBoolean>
  831. | | `-ImplicitCastExpr <col:351> 'int' <LValueToRValue>
  832. | | `-DeclRefExpr <col:351> 'int' lvalue Var 'VarSix' 'int'
  833. | `-ParenExpr <col:361, col:454> 'bool'
  834. | `-CStyleCastExpr <col:362, col:453> 'bool' <NoOp>
  835. | `-ImplicitCastExpr <col:368, col:453> 'bool' <IntegralToBoolean>
  836. | `-ParenExpr <col:368, col:453> 'int'
  837. | `-BinaryOperator <col:369, col:452> 'int' '+'
  838. | |-ParenExpr <col:369, col:395> 'int'
  839. | | `-BinaryOperator <col:370, col:389> 'int' '-'
  840. | | |-ParenExpr <col:370, col:385> 'int'
  841. | | | `-CStyleCastExpr <col:371, col:384> 'int' <NoOp>
  842. | | | `-ImplicitCastExpr <col:376, col:384> 'int' <IntegralCast>
  843. | | | `-ImplicitCastExpr <col:376, col:384> 'bool' <LValueToRValue>
  844. | | | `-HLSLVectorElementExpr <col:376, col:384> 'bool' lvalue vectorcomponent w
  845. | | | `-DeclRefExpr <col:376> 'bool4':'vector<bool, 4>' lvalue Var 'VarNine' 'bool4':'vector<bool, 4>'
  846. | | `-ImplicitCastExpr <col:389> 'int' <LValueToRValue>
  847. | | `-DeclRefExpr <col:389> 'int' lvalue Var 'VarSix' 'int'
  848. | `-ParenExpr <col:399, col:452> 'int'
  849. | `-ConditionalOperator <col:400, col:446> 'int'
  850. | |-ImplicitCastExpr <col:400, col:425> 'bool' <IntegralToBoolean>
  851. | | `-ParenExpr <col:400, col:425> 'int'
  852. | | `-BinaryOperator <col:401, col:424> 'int' '+'
  853. | | |-ImplicitCastExpr <col:401> 'int' <LValueToRValue>
  854. | | | `-DeclRefExpr <col:401> 'int' lvalue Var 'VarSix' 'int'
  855. | | `-ParenExpr <col:410, col:424> 'int'
  856. | | `-CStyleCastExpr <col:411, col:416> 'int' <NoOp>
  857. | | `-ImplicitCastExpr <col:416> 'int' <IntegralCast>
  858. | | `-ImplicitCastExpr <col:416> 'bool' <LValueToRValue>
  859. | | `-DeclRefExpr <col:416> 'bool' lvalue Var 'VarThree' 'bool'
  860. | |-ParenExpr <col:429, col:442> 'int'
  861. | | `-CStyleCastExpr <col:430, col:435> 'int' <NoOp>
  862. | | `-ImplicitCastExpr <col:435> 'int' <FloatingToIntegral>
  863. | | `-ImplicitCastExpr <col:435> 'float' <LValueToRValue>
  864. | | `-DeclRefExpr <col:435> 'float' lvalue Var 'VarFour' 'float'
  865. | `-ImplicitCastExpr <col:446> 'int' <LValueToRValue>
  866. | `-DeclRefExpr <col:446> 'int' lvalue Var 'VarTwo' 'int'
  867. |-ParenExpr <col:461, col:687> 'bool4':'vector<bool, 4>'
  868. | `-CStyleCastExpr <col:462, col:686> 'bool4':'vector<bool, 4>' <NoOp>
  869. | `-ImplicitCastExpr <col:469, col:686> 'vector<bool, 4>':'vector<bool, 4>' <HLSLVectorSplat>
  870. | `-ImplicitCastExpr <col:469, col:686> 'bool' <IntegralToBoolean>
  871. | `-ParenExpr <col:469, col:686> 'int'
  872. | `-UnaryOperator <col:470, col:685> 'int' prefix '+'
  873. | `-ParenExpr <col:471, col:685> 'int'
  874. | `-BinaryOperator <col:472, col:684> 'int' '-'
  875. | |-ImplicitCastExpr <col:472, col:593> 'int' <IntegralCast>
  876. | | `-ParenExpr <col:472, col:593> 'bool'
  877. | | `-CStyleCastExpr <col:473, col:592> 'bool' <NoOp>
  878. | | `-ImplicitCastExpr <col:479, col:592> 'bool' <IntegralToBoolean>
  879. | | `-ParenExpr <col:479, col:592> 'unsigned int'
  880. | | `-UnaryOperator <col:480, col:591> 'unsigned int' prefix '~'
  881. | | `-ParenExpr <col:481, col:591> 'unsigned int'
  882. | | `-ConditionalOperator <col:482, col:590> 'unsigned int'
  883. | | |-ImplicitCastExpr <col:482> 'bool' <IntegralToBoolean>
  884. | | | `-ImplicitCastExpr <col:482> 'uint':'unsigned int' <LValueToRValue>
  885. | | | `-DeclRefExpr <col:482> 'uint':'unsigned int' lvalue Var 'VarEight' 'uint':'unsigned int'
  886. | | |-ParenExpr <col:493, col:570> 'uint':'unsigned int'
  887. | | | `-CStyleCastExpr <col:494, col:569> 'uint':'unsigned int' <NoOp>
  888. | | | `-ImplicitCastExpr <col:500, col:569> 'uint':'unsigned int' <IntegralCast>
  889. | | | `-ParenExpr <col:500, col:569> 'bool'
  890. | | | `-ConditionalOperator <col:501, col:568> 'bool'
  891. | | | |-ImplicitCastExpr <col:501> 'bool' <LValueToRValue>
  892. | | | | `-DeclRefExpr <col:501> 'bool' lvalue Var 'VarThree' 'bool'
  893. | | | |-ParenExpr <col:512, col:555> 'bool'
  894. | | | | `-CStyleCastExpr <col:513, col:554> 'bool' <NoOp>
  895. | | | | `-ImplicitCastExpr <col:519, col:554> 'bool' <IntegralToBoolean>
  896. | | | | `-ParenExpr <col:519, col:554> 'int'
  897. | | | | `-BinaryOperator <col:520, col:548> 'int' '-'
  898. | | | | |-ParenExpr <col:520, col:544> 'int'
  899. | | | | | `-BinaryOperator <col:521, col:543> 'int' '-'
  900. | | | | | |-ImplicitCastExpr <col:521> 'int' <LValueToRValue>
  901. | | | | | | `-DeclRefExpr <col:521> 'int' lvalue Var 'VarSix' 'int'
  902. | | | | | `-ParenExpr <col:530, col:543> 'int'
  903. | | | | | `-CStyleCastExpr <col:531, col:536> 'int' <NoOp>
  904. | | | | | `-ImplicitCastExpr <col:536> 'int' <FloatingToIntegral>
  905. | | | | | `-ImplicitCastExpr <col:536> 'float' <LValueToRValue>
  906. | | | | | `-DeclRefExpr <col:536> 'float' lvalue Var 'VarFour' 'float'
  907. | | | | `-ImplicitCastExpr <col:548> 'int' <LValueToRValue>
  908. | | | | `-DeclRefExpr <col:548> 'int' lvalue Var 'VarSix' 'int'
  909. | | | `-ImplicitCastExpr <col:559, col:568> 'bool' <LValueToRValue>
  910. | | | `-HLSLVectorElementExpr <col:559, col:568> 'bool' lvalue vectorcomponent z
  911. | | | `-DeclRefExpr <col:559> 'bool3':'vector<bool, 3>' lvalue Var 'VarSeven' 'bool3':'vector<bool, 3>'
  912. | | `-ParenExpr <col:574, col:590> 'uint':'unsigned int'
  913. | | `-CStyleCastExpr <col:575, col:589> 'uint':'unsigned int' <NoOp>
  914. | | `-ImplicitCastExpr <col:581, col:589> 'uint':'unsigned int' <IntegralCast>
  915. | | `-ImplicitCastExpr <col:581, col:589> 'bool' <LValueToRValue>
  916. | | `-HLSLVectorElementExpr <col:581, col:589> 'bool' lvalue vectorcomponent z
  917. | | `-DeclRefExpr <col:581> 'bool4':'vector<bool, 4>' lvalue Var 'VarNine' 'bool4':'vector<bool, 4>'
  918. | `-ImplicitCastExpr <col:597, col:684> 'int' <IntegralCast>
  919. | `-ParenExpr <col:597, col:684> 'bool'
  920. | `-UnaryOperator <col:598, col:683> 'bool' prefix '!'
  921. | `-ImplicitCastExpr <col:599, col:683> 'bool' <IntegralToBoolean>
  922. | `-ParenExpr <col:599, col:683> 'int'
  923. | `-UnaryOperator <col:600, col:682> 'int' prefix '+'
  924. | `-ParenExpr <col:601, col:682> 'int'
  925. | `-BinaryOperator <col:602, col:681> 'int' '*'
  926. | |-ImplicitCastExpr <col:602> 'int' <LValueToRValue>
  927. | | `-DeclRefExpr <col:602> 'int' lvalue Var 'VarOne' 'int'
  928. | `-ParenExpr <col:611, col:681> 'int'
  929. | `-CStyleCastExpr <col:612, col:680> 'int' <NoOp>
  930. | `-ParenExpr <col:617, col:680> 'int'
  931. | `-UnaryOperator <col:618, col:679> 'int' prefix '~'
  932. | `-ImplicitCastExpr <col:619, col:679> 'int' <IntegralCast>
  933. | `-ParenExpr <col:619, col:679> 'bool'
  934. | `-UnaryOperator <col:620, col:678> 'bool' prefix '!'
  935. | `-ImplicitCastExpr <col:621, col:678> 'bool' <IntegralToBoolean>
  936. | `-ParenExpr <col:621, col:678> 'int'
  937. | `-ConditionalOperator <col:622, col:677> 'int'
  938. | |-ImplicitCastExpr <col:622, col:649> 'bool' <IntegralToBoolean>
  939. | | `-ParenExpr <col:622, col:649> 'int'
  940. | | `-BinaryOperator <col:623, col:643> 'int' '-'
  941. | | |-ParenExpr <col:623, col:639> 'int'
  942. | | | `-CStyleCastExpr <col:624, col:638> 'int' <NoOp>
  943. | | | `-ImplicitCastExpr <col:629, col:638> 'int' <IntegralCast>
  944. | | | `-ImplicitCastExpr <col:629, col:638> 'bool' <LValueToRValue>
  945. | | | `-HLSLVectorElementExpr <col:629, col:638> 'bool' lvalue vectorcomponent y
  946. | | | `-DeclRefExpr <col:629> 'bool3':'vector<bool, 3>' lvalue Var 'VarSeven' 'bool3':'vector<bool, 3>'
  947. | | `-ImplicitCastExpr <col:643> 'int' <LValueToRValue>
  948. | | `-DeclRefExpr <col:643> 'int' lvalue Var 'VarSix' 'int'
  949. | |-ImplicitCastExpr <col:653> 'int' <LValueToRValue>
  950. | | `-DeclRefExpr <col:653> 'int' lvalue Var 'VarTwo' 'int'
  951. | `-ParenExpr <col:662, col:677> 'int'
  952. | `-CStyleCastExpr <col:663, col:676> 'int' <NoOp>
  953. | `-ImplicitCastExpr <col:668, col:676> 'int' <IntegralCast>
  954. | `-ImplicitCastExpr <col:668, col:676> 'bool' <LValueToRValue>
  955. | `-HLSLVectorElementExpr <col:668, col:676> 'bool' lvalue vectorcomponent w
  956. | `-DeclRefExpr <col:668> 'bool4':'vector<bool, 4>' lvalue Var 'VarNine' 'bool4':'vector<bool, 4>'
  957. `-ParenExpr <col:691, col:764> 'bool4':'vector<bool, 4>'
  958. `-CStyleCastExpr <col:692, col:763> 'bool4':'vector<bool, 4>' <NoOp>
  959. `-ImplicitCastExpr <col:699, col:763> 'vector<bool, 4>':'vector<bool, 4>' <HLSLVectorSplat>
  960. `-ImplicitCastExpr <col:699, col:763> 'bool' <FloatingToBoolean>
  961. `-ParenExpr <col:699, col:763> 'float'
  962. `-UnaryOperator <col:700, col:762> 'float' prefix '+'
  963. `-ParenExpr <col:701, col:762> 'float'
  964. `-ConditionalOperator <col:702, col:755> 'float'
  965. |-ImplicitCastExpr <col:702, col:731> 'bool' <FloatingToBoolean>
  966. | `-ParenExpr <col:702, col:731> 'float'
  967. | `-BinaryOperator <col:703, col:730> 'float' '+'
  968. | |-ImplicitCastExpr <col:703> 'float' <LValueToRValue>
  969. | | `-DeclRefExpr <col:703> 'float' lvalue Var 'VarZero' 'float'
  970. | `-ParenExpr <col:713, col:730> 'float'
  971. | `-CStyleCastExpr <col:714, col:729> 'float' <NoOp>
  972. | `-ImplicitCastExpr <col:721, col:729> 'float' <FloatingCast>
  973. | `-ImplicitCastExpr <col:721, col:729> 'bool' <LValueToRValue>
  974. | `-HLSLVectorElementExpr <col:721, col:729> 'bool' lvalue vectorcomponent z
  975. | `-DeclRefExpr <col:721> 'bool4':'vector<bool, 4>' lvalue Var 'VarNine' 'bool4':'vector<bool, 4>'
  976. |-ParenExpr <col:735, col:751> 'float'
  977. | `-CStyleCastExpr <col:736, col:743> 'float' <NoOp>
  978. | `-ImplicitCastExpr <col:743> 'float' <FloatingCast>
  979. | `-ImplicitCastExpr <col:743> 'bool' <LValueToRValue>
  980. | `-DeclRefExpr <col:743> 'bool' lvalue Var 'VarThree' 'bool'
  981. `-ImplicitCastExpr <col:755> 'float' <LValueToRValue>
  982. `-DeclRefExpr <col:755> 'float' lvalue Var 'VarFive' 'float'
  983. */
  984. }
  985. float4 main() : SV_Target
  986. {
  987. return test();
  988. }