BitwiseAssignOps.hlsl 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. // RUN: %dxc -E main -T ps_6_0 -enable-templates %s 2>&1 | FileCheck %s
  2. // RUN: %dxc -E main -T ps_6_0 -enable-templates %s -DCHECK_DIAGNOSTICS | FileCheck %s -check-prefix=DIAG
  3. // Check that HLSL bitwise assignment operators deal with dependent types
  4. template<typename T, typename I>
  5. void lshiftassign(inout T t, I i) {
  6. t <<= i;
  7. }
  8. template<typename T>
  9. void lshiftassignby2(inout T t) {
  10. t <<= 2;
  11. }
  12. template<typename T, typename I>
  13. T rshiftassign(T t, I i) {
  14. t >>= i;
  15. return t;
  16. }
  17. template<typename T0, typename T1>
  18. T0 andassign(T0 t0, T1 t1) {
  19. t0 &= t1;
  20. return t0;
  21. }
  22. template<typename T0, typename T1>
  23. T0 orassign(T0 t0, T1 t1) {
  24. t0 |= t1;
  25. return t0;
  26. }
  27. template<typename T0, typename T1>
  28. T0 xorassign(T0 t0, T1 t1) {
  29. t0 ^= t1;
  30. return t0;
  31. }
  32. typedef struct {
  33. int4 a;
  34. } S;
  35. int4 main(int4 a:A) : SV_Target {
  36. int i = 7, j = 6;
  37. unsigned int ui = 7, uj = 6;
  38. int1 i1 = 10, j1 = 11;
  39. int4 i4 = int4(1,2,3,4), j4 = int4(5,6,7,8);
  40. int3x3 i3x3, j3x3;
  41. int iarr[7] = {1,2,3,4,5,6,7}, jarr[7] ;
  42. S s;
  43. bool b;
  44. bool1 b1;
  45. bool3 b3;
  46. bool2x2 b2x2;
  47. float x, y;
  48. float3 x3, y3;
  49. float4x4 x4x4, y4x4;
  50. #ifdef CHECK_DIAGNOSTICS
  51. // DIG-NOT: define void @main
  52. // DIAG: error: scalar, vector, or matrix expected
  53. // DIAG: error: scalar, vector, or matrix expected
  54. // DIAG: error: scalar, vector, or matrix expected
  55. // DIAG: error: scalar, vector, or matrix expected
  56. lshiftassign(iarr,i);
  57. lshiftassign(i,iarr);
  58. lshiftassign(iarr,iarr);
  59. lshiftassignby2(iarr);
  60. // DIAG: error: scalar, vector, or matrix expected
  61. // DIAG: error: scalar, vector, or matrix expected
  62. // DIAG: error: scalar, vector, or matrix expected
  63. lshiftassign(s,i);
  64. lshiftassign(i,s);
  65. lshiftassignby2(s);
  66. // DIAG: error: int or unsigned int type required
  67. // DIAG: error: int or unsigned int type required
  68. // DIAG: error: int or unsigned int type required
  69. // DIAG: error: int or unsigned int type required
  70. // DIAG: error: int or unsigned int type required
  71. // DIAG: error: int or unsigned int type required
  72. // DIAG: error: int or unsigned int type required
  73. // DIAG: error: int or unsigned int type required
  74. // DIAG: error: int or unsigned int type required
  75. lshiftassign(x,ui);
  76. lshiftassign(i,x);
  77. lshiftassignby2(x);
  78. andassign(x,i);
  79. andassign(i,x);
  80. orassign(x,i);
  81. orassign(i,x);
  82. xorassign(x,i);
  83. xorassign(i,x);
  84. // DIAG: error: operator cannot be used with a bool lvalue
  85. // DIAG: error: operator cannot be used with a bool lvalue
  86. lshiftassign(b,i);
  87. rshiftassign(b,i);
  88. return 0;
  89. #else
  90. // CHECK: define void @main
  91. // CHECK-NOT: error
  92. // CHECK-NOT: warning
  93. lshiftassign(j,i);
  94. lshiftassign(uj,i);
  95. lshiftassign(j,ui);
  96. lshiftassign(i,b);
  97. lshiftassignby2(j);
  98. lshiftassignby2(ui);
  99. rshiftassign(j,i);
  100. rshiftassign(uj,i);
  101. rshiftassign(j,ui);
  102. rshiftassign(i,b);
  103. andassign(j,i);
  104. andassign(uj,i);
  105. andassign(j,ui);
  106. andassign(i,b);
  107. andassign(b,i);
  108. orassign(j,i);
  109. orassign(uj,i);
  110. orassign(j,ui);
  111. orassign(i,b);
  112. orassign(b,i);
  113. xorassign(j,i);
  114. xorassign(uj,i);
  115. xorassign(j,ui);
  116. xorassign(i,b);
  117. xorassign(b,i);
  118. // lshiftassign(i,3);
  119. // xorassign(b,2);
  120. return 0;
  121. #endif
  122. }