| // RUN: %clang_cc1 -O0 -finclude-default-header -fsyntax-only -triple dxil-pc-shadermodel6.6-library %s -verify |
| void unroll_no_vars() { |
| // expected-note@+1 {{declared here}} |
| int I = 3; |
| // expected-error@+2 {{expression is not an integral constant expression}} |
| // expected-note@+1 {{read of non-const variable 'I' is not allowed in a constant expression}} |
| [unroll(I)] |
| while (I--); |
| } |
| |
| void unroll_arg_count() { |
| [unroll(2,4)] // expected-error {{'unroll' attribute takes no more than 1 argument}} |
| for(int i=0; i<100; i++); |
| } |
| |
| void loop_arg_count() { |
| [loop(2)] // expected-error {{'loop' attribute takes no more than 0 argument}} |
| for(int i=0; i<100; i++); |
| } |
| |
| void unroll_no_negative() { |
| [unroll(-1)] // expected-error {{invalid value '-1'; must be positive}} |
| for(int i=0; i<100; i++); |
| } |
| |
| void unroll_no_zero() { |
| [unroll(0)] // expected-error {{invalid value '0'; must be positive}} |
| for(int i=0; i<100; i++); |
| } |
| |
| void unroll_no_float() { |
| [unroll(2.1)] // expected-error {{invalid argument of type 'float'; expected an integer type}} |
| for(int i=0; i<100; i++); |
| } |
| |
| void unroll_no_bool_false() { |
| [unroll(false)] // expected-error {{invalid argument of type 'bool'; expected an integer type}} |
| for(int i=0; i<100; i++); |
| } |
| |
| void unroll_no_bool_true() { |
| [unroll(true)] // expected-error {{invalid argument of type 'bool'; expected an integer type}} |
| for(int i=0; i<100; i++); |
| } |
| |
| void unroll_loop_enforcement() { |
| int x[10]; |
| [unroll(4)] // expected-error {{'unroll' attribute only applies to 'for', 'while', and 'do' statements}} |
| if (x[0]) |
| x[0] = 15; |
| } |