Home | History | Annotate | Download | only in shaders
      1 group valid "Valid scoping and name redeclaration cases"
      2 
      3 	case local_variable_hides_global_variable
      4 		version 300 es
      5 		values
      6 		{
      7 			input int in0 = [ 1 | 2 | 3 ];
      8 			output int out0 = [ 1 | 2 | 3 ];
      9 		}
     10 
     11 		both ""
     12 			#version 300 es
     13 			precision mediump float;
     14 			${DECLARATIONS}
     15 
     16 			int a = -1;
     17 
     18 			void main()
     19 			{
     20 				${SETUP}
     21 				int a = in0;
     22 
     23 				out0 = a;
     24 				${OUTPUT}
     25 			}
     26 		""
     27 	end
     28 
     29 	case block_variable_hides_local_variable
     30 		version 300 es
     31 		values
     32 		{
     33 			input int in0 = [ 1 | 2 | 3 ];
     34 			output int out0 = [ 1 | 2 | 3 ];
     35 		}
     36 
     37 		both ""
     38 			#version 300 es
     39 			precision mediump float;
     40 			${DECLARATIONS}
     41 			void main()
     42 			{
     43 				${SETUP}
     44 				int a = in0;
     45 				{
     46 					int a = -1;
     47 				}
     48 				out0 = a;
     49 				${OUTPUT}
     50 			}
     51 		""
     52 	end
     53 
     54 	case block_variable_hides_global_variable
     55 		version 300 es
     56 		values
     57 		{
     58 			input int in0 = [ 1 | 2 | 3 ];
     59 			output int out0 = [ 1 | 2 | 3 ];
     60 		}
     61 
     62 		both ""
     63 			#version 300 es
     64 			precision mediump float;
     65 			${DECLARATIONS}
     66 
     67 			int a = -1;
     68 
     69 			void main()
     70 			{
     71 				${SETUP}
     72 				{
     73 					int a = in0;
     74 
     75 					out0 = a;
     76 				}
     77 				${OUTPUT}
     78 			}
     79 		""
     80 	end
     81 
     82 	case for_init_statement_variable_hides_local_variable
     83 		version 300 es
     84 		values
     85 		{
     86 			input int in0 = [ 1 | 2 | 3 ];
     87 			output int out0 = [ 1 | 2 | 3 ];
     88 		}
     89 
     90 		both ""
     91 			#version 300 es
     92 			precision mediump float;
     93 			${DECLARATIONS}
     94 			void main()
     95 			{
     96 				${SETUP}
     97 				int a = in0;
     98 				for (int a = 0; a < 10; a++)
     99 				{
    100 				}
    101 				out0 = a;
    102 				${OUTPUT}
    103 			}
    104 		""
    105 	end
    106 
    107 	case while_condition_variable_hides_local_variable
    108 		version 300 es
    109 		values
    110 		{
    111 			input int in0 = [ 1 | 2 | 3 ];
    112 			output int out0 = [ 1 | 2 | 3 ];
    113 		}
    114 
    115 		both ""
    116 			#version 300 es
    117 			precision mediump float;
    118 			${DECLARATIONS}
    119 			void main()
    120 			{
    121 				${SETUP}
    122 				int a = in0;
    123 				int i = 0;
    124 				while (bool a = (i < 1))
    125 				{
    126 					i++;
    127 				}
    128 				out0 = a;
    129 				${OUTPUT}
    130 			}
    131 		""
    132 	end
    133 
    134 	case for_init_statement_variable_hides_global_variable
    135 		version 300 es
    136 		values
    137 		{
    138 			input int in0 = [ 1 | 2 | 3 ];
    139 			output int out0 = [ 1 | 2 | 3 ];
    140 		}
    141 
    142 		both ""
    143 			#version 300 es
    144 			precision mediump float;
    145 			${DECLARATIONS}
    146 
    147 			int a = 5;
    148 
    149 			void main()
    150 			{
    151 				${SETUP}
    152 				for (int a = 0; a < 10; a++)
    153 				{
    154 				}
    155 				out0 = in0 + a - 5;
    156 				${OUTPUT}
    157 			}
    158 		""
    159 	end
    160 
    161 	case while_condition_variable_hides_global_variable
    162 		version 300 es
    163 		values
    164 		{
    165 			input int in0 = [ 1 | 2 | 3 ];
    166 			output int out0 = [ 1 | 2 | 3 ];
    167 		}
    168 
    169 		both ""
    170 			#version 300 es
    171 			precision mediump float;
    172 			${DECLARATIONS}
    173 
    174 			int a = 5;
    175 
    176 			void main()
    177 			{
    178 				${SETUP}
    179 				int i = 0;
    180 				while (bool a = (i < 1))
    181 				{
    182 					i++;
    183 				}
    184 				out0 = in0 + a - 5;
    185 				${OUTPUT}
    186 			}
    187 		""
    188 	end
    189 
    190 	case variable_in_if_hides_global_variable
    191 		version 300 es
    192 		values
    193 		{
    194 			input int in0 = [ 1 | 2 | 3 ];
    195 			output int out0 = [ 1 | 2 | 3 ];
    196 		}
    197 
    198 		both ""
    199 			#version 300 es
    200 			precision mediump float;
    201 			${DECLARATIONS}
    202 
    203 			int a = 1;
    204 
    205 			void main()
    206 			{
    207 				${SETUP}
    208 				if (true)
    209 					int a = 42;
    210 				out0 = a*in0;
    211 				${OUTPUT}
    212 			}
    213 		""
    214 	end
    215 
    216 	case variable_from_outer_scope_visible_in_initializer
    217 		version 300 es
    218 		values
    219 		{
    220 			input int in0 = [ 1 | 2 | 3 ];
    221 			output int out0 = [ 1 | 2 | 3 ];
    222 		}
    223 
    224 		both ""
    225 			#version 300 es
    226 			precision mediump float;
    227 			${DECLARATIONS}
    228 			void main()
    229 			{
    230 				${SETUP}
    231 				int a = in0;
    232 				{
    233 					int a = a+5, b = a-5;
    234 					out0 = b;
    235 					a = 42;
    236 				}
    237 				out0 = out0 + a - in0;
    238 				${OUTPUT}
    239 			}
    240 		""
    241 	end
    242 
    243 	case local_int_variable_hides_struct_type
    244 		version 300 es
    245 		values
    246 		{
    247 			input int in0 = [ 1 | 2 | 3 ];
    248 			output int out0 = [ 1 | 2 | 3 ];
    249 		}
    250 
    251 		both ""
    252 			#version 300 es
    253 			precision mediump float;
    254 			${DECLARATIONS}
    255 
    256 			struct S { int val; };
    257 
    258 			void main()
    259 			{
    260 				${SETUP}
    261 				int S = S(in0).val;
    262 				out0 = S;
    263 				${OUTPUT}
    264 			}
    265 		""
    266 	end
    267 
    268 	case local_struct_variable_hides_struct_type
    269 		version 300 es
    270 		values
    271 		{
    272 			input int in0 = [ 1 | 2 | 3 ];
    273 			output int out0 = [ 1 | 2 | 3 ];
    274 		}
    275 
    276 		both ""
    277 			#version 300 es
    278 			precision mediump float;
    279 			${DECLARATIONS}
    280 
    281 			struct S { int val; };
    282 
    283 			void main()
    284 			{
    285 				${SETUP}
    286 				S S = S(in0);
    287 				out0 = S.val;
    288 				${OUTPUT}
    289 			}
    290 		""
    291 	end
    292 
    293 	case local_variable_hides_function
    294 		version 300 es
    295 		values
    296 		{
    297 			input int in0 = [ 1 | 2 | 3 ];
    298 			output int out0 = [ 1 | 2 | 3 ];
    299 		}
    300 
    301 		both ""
    302 			#version 300 es
    303 			precision mediump float;
    304 			${DECLARATIONS}
    305 
    306 			int foo (int x) { return x; }
    307 
    308 			void main()
    309 			{
    310 				${SETUP}
    311 				int foo = in0;
    312 				out0 = foo;
    313 				${OUTPUT}
    314 			}
    315 		""
    316 	end
    317 
    318 	case function_parameter_hides_global_variable
    319 		version 300 es
    320 		values
    321 		{
    322 			input int in0 = [ 1 | 2 | 3 ];
    323 			output int out0 = [ 1 | 2 | 3 ];
    324 		}
    325 
    326 		both ""
    327 			#version 300 es
    328 			precision mediump float;
    329 			${DECLARATIONS}
    330 
    331 			int a = -1;
    332 
    333 			int func (int a) { return a; }
    334 
    335 			void main()
    336 			{
    337 				${SETUP}
    338 				out0 = func(in0);
    339 				${OUTPUT}
    340 			}
    341 		""
    342 	end
    343 
    344 	case function_parameter_hides_struct_type
    345 		version 300 es
    346 		values
    347 		{
    348 			input int in0 = [ 1 | 2 | 3 ];
    349 			output int out0 = [ 1 | 2 | 3 ];
    350 		}
    351 
    352 		both ""
    353 			#version 300 es
    354 			precision mediump float;
    355 			${DECLARATIONS}
    356 
    357 			struct S { int x; };
    358 
    359 			int func (int S) { return S; }
    360 
    361 			void main()
    362 			{
    363 				${SETUP}
    364 				out0 = func(in0);
    365 				${OUTPUT}
    366 			}
    367 		""
    368 	end
    369 
    370 	case function_parameter_hides_function
    371 		version 300 es
    372 		values
    373 		{
    374 			input int in0 = [ 1 | 2 | 3 ];
    375 			output int out0 = [ 1 | 2 | 3 ];
    376 		}
    377 
    378 		both ""
    379 			#version 300 es
    380 			precision mediump float;
    381 			${DECLARATIONS}
    382 
    383 			int func (int func) { return func; }
    384 
    385 			void main()
    386 			{
    387 				${SETUP}
    388 				out0 = func(in0);
    389 				${OUTPUT}
    390 			}
    391 		""
    392 	end
    393 
    394 	case local_variable_in_inner_scope_hides_function_parameter
    395 		version 300 es
    396 		values
    397 		{
    398 			input int in0 = [ 1 | 2 | 3 ];
    399 			output int out0 = [ 1 | 2 | 3 ];
    400 		}
    401 
    402 		both ""
    403 			#version 300 es
    404 			precision mediump float;
    405 			${DECLARATIONS}
    406 			int func (int inp, int x) { { int x = 5; return inp + x - 5; } }
    407 
    408 			void main()
    409 			{
    410 				${SETUP}
    411 				out0 = func(in0, 42);
    412 				${OUTPUT}
    413 			}
    414 		""
    415 	end
    416 
    417 	case redeclare_function
    418 		version 300 es
    419 		values
    420 		{
    421 			input int in0 = [ 1 | 2 | 3 ];
    422 			output int out0 = [ 1 | 2 | 3 ];
    423 		}
    424 
    425 		both ""
    426 			#version 300 es
    427 			precision mediump float;
    428 			${DECLARATIONS}
    429 
    430 			int func (int x);
    431 			int func (int);
    432 			int func (int inp) { return inp; }
    433 
    434 			void main()
    435 			{
    436 				${SETUP}
    437 				out0 = func(in0);
    438 				${OUTPUT}
    439 			}
    440 		""
    441 	end
    442 
    443 end
    444 
    445 group invalid "Invalid scoping behavior"
    446 
    447 	case redeclare_global_variable
    448 		version 300 es
    449 		expect compile_fail
    450 		both ""
    451 			#version 300 es
    452 			precision mediump float;
    453 			${DECLARATIONS}
    454 
    455 			int a;
    456 			float a;
    457 
    458 			void main()
    459 			{
    460 				a = 1.0;
    461 				${POSITION_FRAG_COLOR} = vec4(a);
    462 			}
    463 		""
    464 	end
    465 
    466 	case redeclare_local_variable
    467 		version 300 es
    468 		expect compile_fail
    469 		both ""
    470 			#version 300 es
    471 			precision mediump float;
    472 			${DECLARATIONS}
    473 
    474 			void main()
    475 			{
    476 				int a;
    477 				float a;
    478 				a = 1.0;
    479 				${POSITION_FRAG_COLOR} = vec4(a);
    480 			}
    481 		""
    482 	end
    483 
    484 	case redeclare_for_init_statement_variable
    485 		version 300 es
    486 		expect compile_fail
    487 		both ""
    488 			#version 300 es
    489 			precision mediump float;
    490 			${DECLARATIONS}
    491 
    492 			void main()
    493 			{
    494 				for (int i = 0; i < 10; i++)
    495 				{
    496 					int i = 11;
    497 				}
    498 				${POSITION_FRAG_COLOR} = vec4(0.0);
    499 			}
    500 		""
    501 	end
    502 
    503 	case redeclare_for_condition_variable
    504 		version 300 es
    505 		expect compile_fail
    506 		both ""
    507 			#version 300 es
    508 			precision mediump float;
    509 			${DECLARATIONS}
    510 
    511 			void main()
    512 			{
    513 				for (int i = 0; int a = (i < 10); i++)
    514 				{
    515 					int a = 0;
    516 				}
    517 				${POSITION_FRAG_COLOR} = vec4(0.0);
    518 			}
    519 		""
    520 	end
    521 
    522 	case redeclare_for_init_statement_variable_in_for_condition
    523 		version 300 es
    524 		expect compile_fail
    525 		both ""
    526 			#version 300 es
    527 			precision mediump float;
    528 			${DECLARATIONS}
    529 
    530 			void main()
    531 			{
    532 				float a;
    533 				for (int i = 0; int i = (i < 10); i++)
    534 				{
    535 					a = sin(i);
    536 				}
    537 				${POSITION_FRAG_COLOR} = vec4(a);
    538 			}
    539 		""
    540 	end
    541 
    542 	case redeclare_while_condition_variable
    543 		version 300 es
    544 		expect compile_fail
    545 		both ""
    546 			#version 300 es
    547 			precision mediump float;
    548 			${DECLARATIONS}
    549 
    550 			void main()
    551 			{
    552 				int a = 0;
    553 				while (int i = (a < 5))
    554 				{
    555 					int i = 11;
    556 					a += i;
    557 				}
    558 				${POSITION_FRAG_COLOR} = vec4(0.0);
    559 			}
    560 		""
    561 	end
    562 
    563 	case redefine_function
    564 		version 300 es
    565 		expect compile_fail
    566 		both ""
    567 			#version 300 es
    568 			precision mediump float;
    569 			${DECLARATIONS}
    570 
    571 			float func(float x);
    572 
    573 			float func(float x) { return x + 1.0; }
    574 			float func(float x) { return x + 2.0; }
    575 
    576 			void main()
    577 			{
    578 				${POSITION_FRAG_COLOR} = vec4(func(1.0));
    579 			}
    580 		""
    581 	end
    582 
    583 	case redeclare_builtin
    584 		version 300 es
    585 		expect compile_fail
    586 		both ""
    587 			#version 300 es
    588 			precision mediump float;
    589 			${DECLARATIONS}
    590 
    591 			float sin(float x);
    592 
    593 			void main()
    594 			{
    595 				${POSITION_FRAG_COLOR} = vec4(sin(1.0));
    596 			}
    597 		""
    598 	end
    599 
    600 	case redefine_builtin
    601 		version 300 es
    602 		expect compile_fail
    603 		both ""
    604 			#version 300 es
    605 			precision mediump float;
    606 			${DECLARATIONS}
    607 
    608 			float sin(float x) { return x + 1.0; }
    609 
    610 			void main()
    611 			{
    612 				${POSITION_FRAG_COLOR} = vec4(sin(1.0));
    613 			}
    614 		""
    615 	end
    616 
    617 	case conflict_function_struct
    618 		version 300 es
    619 		expect compile_fail
    620 		both ""
    621 			#version 300 es
    622 			precision mediump float;
    623 			${DECLARATIONS}
    624 
    625 			void f(int x);
    626 			struct f { int x; };
    627 
    628 			void main()
    629 			{
    630 				${POSITION_FRAG_COLOR} = vec4(1);
    631 			}
    632 		""
    633 	end
    634 
    635 	case conflict_function_variable
    636 		version 300 es
    637 		expect compile_fail
    638 		both ""
    639 			#version 300 es
    640 			precision mediump float;
    641 			${DECLARATIONS}
    642 
    643 			void f(int x);
    644 			float f;
    645 
    646 			void main()
    647 			{
    648 				f = 1.0;
    649 				${POSITION_FRAG_COLOR} = vec4(f);
    650 			}
    651 		""
    652 	end
    653 
    654 	case use_global_variable_before_declaration
    655 		version 300 es
    656 		expect compile_fail
    657 		both ""
    658 			#version 300 es
    659 			precision mediump float;
    660 			${DECLARATIONS}
    661 
    662 			void func()
    663 			{
    664 				a = 2.0;
    665 			}
    666 
    667 			float a;
    668 
    669 			void main()
    670 			{
    671 				func();
    672 				${POSITION_FRAG_COLOR} = vec4(a);
    673 			}
    674 		""
    675 	end
    676 
    677 	case use_local_variable_before_declaration
    678 		version 300 es
    679 		expect compile_fail
    680 		both ""
    681 			#version 300 es
    682 			precision mediump float;
    683 			${DECLARATIONS}
    684 
    685 			void main()
    686 			{
    687 				float a = 1.0;
    688 				a = b;
    689 				float b = 2.0;
    690 
    691 				${POSITION_FRAG_COLOR} = vec4(a);
    692 			}
    693 		""
    694 	end
    695 
    696 	case use_struct_type_before_declaration
    697 		version 300 es
    698 		expect compile_fail
    699 		both ""
    700 			#version 300 es
    701 			precision mediump float;
    702 			${DECLARATIONS}
    703 
    704 			float func (float x) { return S(x).val; }
    705 			struct S { float val; };
    706 
    707 			void main()
    708 			{
    709 				${POSITION_FRAG_COLOR} = vec4(func(1.0));
    710 			}
    711 		""
    712 	end
    713 
    714 	case use_function_before_declaration
    715 		version 300 es
    716 		expect compile_fail
    717 		both ""
    718 			#version 300 es
    719 			precision mediump float;
    720 			${DECLARATIONS}
    721 
    722 			float func (float x) { return bar(x); }
    723 			float bar (float x) { return x; }
    724 
    725 			void main()
    726 			{
    727 				${POSITION_FRAG_COLOR} = vec4(func(1.0));
    728 			}
    729 		""
    730 	end
    731 
    732 	case use_variable_from_block_in_outer_scope
    733 		version 300 es
    734 		expect compile_fail
    735 		both ""
    736 			#version 300 es
    737 			precision mediump float;
    738 			${DECLARATIONS}
    739 
    740 			void main()
    741 			{
    742 				{
    743 					float a = 1.0;
    744 				}
    745 				${POSITION_FRAG_COLOR} = vec4(a);
    746 			}
    747 		""
    748 	end
    749 
    750 	case use_variable_from_if_in_outer_scope
    751 		version 300 es
    752 		expect compile_fail
    753 		both ""
    754 			#version 300 es
    755 			precision mediump float;
    756 			${DECLARATIONS}
    757 
    758 			void main()
    759 			{
    760 				if (true)
    761 					float a = 1.0;
    762 				${POSITION_FRAG_COLOR} = vec4(a);
    763 			}
    764 		""
    765 	end
    766 
    767 	case use_variable_from_else_in_outer_scope
    768 		version 300 es
    769 		expect compile_fail
    770 		both ""
    771 			#version 300 es
    772 			precision mediump float;
    773 			${DECLARATIONS}
    774 
    775 			void main()
    776 			{
    777 				if (false)
    778 					float a = 1.0;
    779 				else
    780 					float b = 2.0;
    781 				${POSITION_FRAG_COLOR} = vec4(b);
    782 			}
    783 		""
    784 	end
    785 
    786 	case use_variable_from_if_in_else
    787 		version 300 es
    788 		expect compile_fail
    789 		both ""
    790 			#version 300 es
    791 			precision mediump float;
    792 			${DECLARATIONS}
    793 
    794 			void main()
    795 			{
    796 				float a = 1.0;
    797 				if (true)
    798 				{
    799 					float b = 2.0;
    800 				}
    801 				else
    802 				{
    803 					a = b;
    804 				}
    805 				${POSITION_FRAG_COLOR} = vec4(a);
    806 			}
    807 		""
    808 	end
    809 
    810 	case use_variable_from_for_init_statement_in_outer_scope
    811 		version 300 es
    812 		expect compile_fail
    813 		both ""
    814 			#version 300 es
    815 			precision mediump float;
    816 			${DECLARATIONS}
    817 
    818 			void main()
    819 			{
    820 				float x = 0.0;
    821 				for (int i = 0; i < 10; i++)
    822 				{
    823 					x += sin(i);
    824 				}
    825 				${POSITION_FRAG_COLOR} = vec4(float(i));
    826 			}
    827 		""
    828 	end
    829 
    830 	case use_variable_from_while_condition_in_outer_scope
    831 		version 300 es
    832 		expect compile_fail
    833 		both ""
    834 			#version 300 es
    835 			precision mediump float;
    836 			${DECLARATIONS}
    837 
    838 			void main()
    839 			{
    840 				int a = 1;
    841 				while (bool b = (a == 1))
    842 				{
    843 					a++;
    844 				}
    845 				${POSITION_FRAG_COLOR} = vec4(float(b));
    846 			}
    847 		""
    848 	end
    849 
    850 	case use_parameter_names_from_function_declaration
    851 		version 300 es
    852 		expect compile_fail
    853 		both ""
    854 			#version 300 es
    855 			precision mediump float;
    856 			${DECLARATIONS}
    857 
    858 			float func(float a, float b);
    859 
    860 			float func(float x, float y) { return a+b; }
    861 
    862 			void main()
    863 			{
    864 				${POSITION_FRAG_COLOR} = vec4(func(1.0, 2.0));
    865 			}
    866 		""
    867 	end
    868 
    869 	case variable_not_visible_in_own_initializer
    870 		version 300 es
    871 		expect compile_fail
    872 		both ""
    873 			#version 300 es
    874 			precision mediump float;
    875 			${DECLARATIONS}
    876 
    877 			void main()
    878 			{
    879 				float x = x;
    880 				${POSITION_FRAG_COLOR} = vec4(x);
    881 			}
    882 		""
    883 	end
    884 
    885 	case local_variable_hides_function_parameter
    886 		version 300 es
    887 		expect compile_fail
    888 		both ""
    889 			#version 300 es
    890 			precision mediump float;
    891 			${DECLARATIONS}
    892 			float func (float inp, float x) { int x = 5.0; return inp + x - 5.0; }
    893 
    894 			void main()
    895 			{
    896 				${POSITION_FRAG_COLOR} = vec4(func(1.0, 2.0));
    897 			}
    898 		""
    899 	end
    900 
    901 end # invalid
    902