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 100 es
      5 		values
      6 		{
      7 			input int in0 = [ 1 | 2 | 3 ];
      8 			output int out0 = [ 1 | 2 | 3 ];
      9 		}
     10 
     11 		both ""
     12 			#version 100
     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 100 es
     31 		values
     32 		{
     33 			input int in0 = [ 1 | 2 | 3 ];
     34 			output int out0 = [ 1 | 2 | 3 ];
     35 		}
     36 
     37 		both ""
     38 			#version 100
     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 100 es
     56 		values
     57 		{
     58 			input int in0 = [ 1 | 2 | 3 ];
     59 			output int out0 = [ 1 | 2 | 3 ];
     60 		}
     61 
     62 		both ""
     63 			#version 100
     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 100 es
     84 		values
     85 		{
     86 			input int in0 = [ 1 | 2 | 3 ];
     87 			output int out0 = [ 1 | 2 | 3 ];
     88 		}
     89 
     90 		both ""
     91 			#version 100
     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 100 es
    109 		values
    110 		{
    111 			input int in0 = [ 1 | 2 | 3 ];
    112 			output int out0 = [ 1 | 2 | 3 ];
    113 		}
    114 
    115 		both ""
    116 			#version 100
    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 100 es
    136 		values
    137 		{
    138 			input int in0 = [ 1 | 2 | 3 ];
    139 			output int out0 = [ 1 | 2 | 3 ];
    140 		}
    141 
    142 		both ""
    143 			#version 100
    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 100 es
    163 		values
    164 		{
    165 			input int in0 = [ 1 | 2 | 3 ];
    166 			output int out0 = [ 1 | 2 | 3 ];
    167 		}
    168 
    169 		both ""
    170 			#version 100
    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 100 es
    192 		values
    193 		{
    194 			input int in0 = [ 1 | 2 | 3 ];
    195 			output int out0 = [ 1 | 2 | 3 ];
    196 		}
    197 
    198 		both ""
    199 			#version 100
    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 100 es
    218 		values
    219 		{
    220 			input int in0 = [ 1 | 2 | 3 ];
    221 			output int out0 = [ 1 | 2 | 3 ];
    222 		}
    223 
    224 		both ""
    225 			#version 100
    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 100 es
    245 		values
    246 		{
    247 			input int in0 = [ 1 | 2 | 3 ];
    248 			output int out0 = [ 1 | 2 | 3 ];
    249 		}
    250 
    251 		both ""
    252 			#version 100
    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 100 es
    270 		values
    271 		{
    272 			input int in0 = [ 1 | 2 | 3 ];
    273 			output int out0 = [ 1 | 2 | 3 ];
    274 		}
    275 
    276 		both ""
    277 			#version 100
    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 100 es
    295 		values
    296 		{
    297 			input int in0 = [ 1 | 2 | 3 ];
    298 			output int out0 = [ 1 | 2 | 3 ];
    299 		}
    300 
    301 		both ""
    302 			#version 100
    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 100 es
    320 		values
    321 		{
    322 			input int in0 = [ 1 | 2 | 3 ];
    323 			output int out0 = [ 1 | 2 | 3 ];
    324 		}
    325 
    326 		both ""
    327 			#version 100
    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 100 es
    346 		values
    347 		{
    348 			input int in0 = [ 1 | 2 | 3 ];
    349 			output int out0 = [ 1 | 2 | 3 ];
    350 		}
    351 
    352 		both ""
    353 			#version 100
    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 100 es
    372 		values
    373 		{
    374 			input int in0 = [ 1 | 2 | 3 ];
    375 			output int out0 = [ 1 | 2 | 3 ];
    376 		}
    377 
    378 		both ""
    379 			#version 100
    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 100 es
    396 		values
    397 		{
    398 			input int in0 = [ 1 | 2 | 3 ];
    399 			output int out0 = [ 1 | 2 | 3 ];
    400 		}
    401 
    402 		both ""
    403 			#version 100
    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 local_variable_hides_function_parameter
    418 		version 100 es
    419 		values
    420 		{
    421 			input int in0 = [ 1 | 2 | 3 ];
    422 			output int out0 = [ 1 | 2 | 3 ];
    423 		}
    424 
    425 		both ""
    426 			#version 100
    427 			precision mediump float;
    428 			${DECLARATIONS}
    429 			int func (int inp, int x) { int x = 5; return inp + x - 5; }
    430 
    431 			void main()
    432 			{
    433 				${SETUP}
    434 				out0 = func(in0, 42);
    435 				${OUTPUT}
    436 			}
    437 		""
    438 	end
    439 
    440 end
    441 
    442 group invalid "Invalid scoping behavior"
    443 
    444 	case redeclare_global_variable
    445 		version 100 es
    446 		expect compile_fail
    447 		both ""
    448 			#version 100
    449 			precision mediump float;
    450 			${DECLARATIONS}
    451 
    452 			int a;
    453 			float a;
    454 
    455 			void main()
    456 			{
    457 				a = 1.0;
    458 				${POSITION_FRAG_COLOR} = vec4(a);
    459 			}
    460 		""
    461 	end
    462 
    463 	case redeclare_local_variable
    464 		version 100 es
    465 		expect compile_fail
    466 		both ""
    467 			#version 100
    468 			precision mediump float;
    469 			${DECLARATIONS}
    470 
    471 			void main()
    472 			{
    473 				int a;
    474 				float a;
    475 				a = 1.0;
    476 				${POSITION_FRAG_COLOR} = vec4(a);
    477 			}
    478 		""
    479 	end
    480 
    481 	case redeclare_for_init_statement_variable
    482 		version 100 es
    483 		expect compile_fail
    484 		both ""
    485 			#version 100
    486 			precision mediump float;
    487 			${DECLARATIONS}
    488 
    489 			void main()
    490 			{
    491 				for (int i = 0; i < 10; i++)
    492 				{
    493 					int i = 11;
    494 				}
    495 				${POSITION_FRAG_COLOR} = vec4(0.0);
    496 			}
    497 		""
    498 	end
    499 
    500 	case redeclare_for_condition_variable
    501 		version 100 es
    502 		expect compile_fail
    503 		both ""
    504 			#version 100
    505 			precision mediump float;
    506 			${DECLARATIONS}
    507 
    508 			void main()
    509 			{
    510 				for (int i = 0; int a = (i < 10); i++)
    511 				{
    512 					int a = 0;
    513 				}
    514 				${POSITION_FRAG_COLOR} = vec4(0.0);
    515 			}
    516 		""
    517 	end
    518 
    519 	case redeclare_for_init_statement_variable_in_for_condition
    520 		version 100 es
    521 		expect compile_fail
    522 		both ""
    523 			#version 100
    524 			precision mediump float;
    525 			${DECLARATIONS}
    526 
    527 			void main()
    528 			{
    529 				float a;
    530 				for (int i = 0; int i = (i < 10); i++)
    531 				{
    532 					a = sin(i);
    533 				}
    534 				${POSITION_FRAG_COLOR} = vec4(a);
    535 			}
    536 		""
    537 	end
    538 
    539 	case redeclare_while_condition_variable
    540 		version 100 es
    541 		expect compile_fail
    542 		both ""
    543 			#version 100
    544 			precision mediump float;
    545 			${DECLARATIONS}
    546 
    547 			void main()
    548 			{
    549 				int a = 0;
    550 				while (int i = (a < 5))
    551 				{
    552 					int i = 11;
    553 					a += i;
    554 				}
    555 				${POSITION_FRAG_COLOR} = vec4(0.0);
    556 			}
    557 		""
    558 	end
    559 
    560 	case redeclare_function
    561 		version 100 es
    562 		expect compile_fail
    563 		both ""
    564 			#version 100
    565 			precision mediump float;
    566 			${DECLARATIONS}
    567 
    568 			float func(float x);
    569 			float func(float x);
    570 
    571 			float func(float x) { return x + 1.0; }
    572 
    573 			void main()
    574 			{
    575 				${POSITION_FRAG_COLOR} = vec4(func(1.0));
    576 			}
    577 		""
    578 	end
    579 
    580 	case redefine_function
    581 		version 100 es
    582 		expect compile_fail
    583 		both ""
    584 			#version 100
    585 			precision mediump float;
    586 			${DECLARATIONS}
    587 
    588 			float func(float x);
    589 
    590 			float func(float x) { return x + 1.0; }
    591 			float func(float x) { return x + 2.0; }
    592 
    593 			void main()
    594 			{
    595 				${POSITION_FRAG_COLOR} = vec4(func(1.0));
    596 			}
    597 		""
    598 	end
    599 
    600 	case redeclare_builtin
    601 		version 100 es
    602 		expect compile_fail
    603 		both ""
    604 			#version 100
    605 			precision mediump float;
    606 			${DECLARATIONS}
    607 
    608 			float sin(float x);
    609 
    610 			void main()
    611 			{
    612 				${POSITION_FRAG_COLOR} = vec4(sin(1.0));
    613 			}
    614 		""
    615 	end
    616 
    617 	case redefine_builtin
    618 		version 100 es
    619 		expect compile_fail
    620 		both ""
    621 			#version 100
    622 			precision mediump float;
    623 			${DECLARATIONS}
    624 
    625 			float sin(float x) { return x + 1.0; }
    626 
    627 			void main()
    628 			{
    629 				${POSITION_FRAG_COLOR} = vec4(sin(1.0));
    630 			}
    631 		""
    632 	end
    633 
    634 	case conflict_function_struct
    635 		version 100 es
    636 		expect compile_fail
    637 		both ""
    638 			#version 100
    639 			precision mediump float;
    640 			${DECLARATIONS}
    641 
    642 			void f(int x);
    643 			struct f { int x; };
    644 
    645 			void main()
    646 			{
    647 				${POSITION_FRAG_COLOR} = vec4(1);
    648 			}
    649 		""
    650 	end
    651 
    652 	case conflict_function_variable
    653 		version 100 es
    654 		expect compile_fail
    655 		both ""
    656 			#version 100
    657 			precision mediump float;
    658 			${DECLARATIONS}
    659 
    660 			void f(int x);
    661 			float f;
    662 
    663 			void main()
    664 			{
    665 				f = 1.0;
    666 				${POSITION_FRAG_COLOR} = vec4(f);
    667 			}
    668 		""
    669 	end
    670 
    671 	case use_global_variable_before_declaration
    672 		version 100 es
    673 		expect compile_fail
    674 		both ""
    675 			#version 100
    676 			precision mediump float;
    677 			${DECLARATIONS}
    678 
    679 			void func()
    680 			{
    681 				a = 2.0;
    682 			}
    683 
    684 			float a;
    685 
    686 			void main()
    687 			{
    688 				func();
    689 				${POSITION_FRAG_COLOR} = vec4(a);
    690 			}
    691 		""
    692 	end
    693 
    694 	case use_local_variable_before_declaration
    695 		version 100 es
    696 		expect compile_fail
    697 		both ""
    698 			#version 100
    699 			precision mediump float;
    700 			${DECLARATIONS}
    701 
    702 			void main()
    703 			{
    704 				float a = 1.0;
    705 				a = b;
    706 				float b = 2.0;
    707 
    708 				${POSITION_FRAG_COLOR} = vec4(a);
    709 			}
    710 		""
    711 	end
    712 
    713 	case use_struct_type_before_declaration
    714 		version 100 es
    715 		expect compile_fail
    716 		both ""
    717 			#version 100
    718 			precision mediump float;
    719 			${DECLARATIONS}
    720 
    721 			float func (float x) { return S(x).val; }
    722 			struct S { float val; };
    723 
    724 			void main()
    725 			{
    726 				${POSITION_FRAG_COLOR} = vec4(func(1.0));
    727 			}
    728 		""
    729 	end
    730 
    731 	case use_function_before_declaration
    732 		version 100 es
    733 		expect compile_fail
    734 		both ""
    735 			#version 100
    736 			precision mediump float;
    737 			${DECLARATIONS}
    738 
    739 			float func (float x) { return bar(x); }
    740 			float bar (float x) { return x; }
    741 
    742 			void main()
    743 			{
    744 				${POSITION_FRAG_COLOR} = vec4(func(1.0));
    745 			}
    746 		""
    747 	end
    748 
    749 	case use_variable_from_block_in_outer_scope
    750 		version 100 es
    751 		expect compile_fail
    752 		both ""
    753 			#version 100
    754 			precision mediump float;
    755 			${DECLARATIONS}
    756 
    757 			void main()
    758 			{
    759 				{
    760 					float a = 1.0;
    761 				}
    762 				${POSITION_FRAG_COLOR} = vec4(a);
    763 			}
    764 		""
    765 	end
    766 
    767 	case use_variable_from_if_in_outer_scope
    768 		version 100 es
    769 		expect compile_fail
    770 		both ""
    771 			#version 100
    772 			precision mediump float;
    773 			${DECLARATIONS}
    774 
    775 			void main()
    776 			{
    777 				if (true)
    778 					float a = 1.0;
    779 				${POSITION_FRAG_COLOR} = vec4(a);
    780 			}
    781 		""
    782 	end
    783 
    784 	case use_variable_from_else_in_outer_scope
    785 		version 100 es
    786 		expect compile_fail
    787 		both ""
    788 			#version 100
    789 			precision mediump float;
    790 			${DECLARATIONS}
    791 
    792 			void main()
    793 			{
    794 				if (false)
    795 					float a = 1.0;
    796 				else
    797 					float b = 2.0;
    798 				${POSITION_FRAG_COLOR} = vec4(b);
    799 			}
    800 		""
    801 	end
    802 
    803 	case use_variable_from_if_in_else
    804 		version 100 es
    805 		expect compile_fail
    806 		both ""
    807 			#version 100
    808 			precision mediump float;
    809 			${DECLARATIONS}
    810 
    811 			void main()
    812 			{
    813 				float a = 1.0;
    814 				if (true)
    815 				{
    816 					float b = 2.0;
    817 				}
    818 				else
    819 				{
    820 					a = b;
    821 				}
    822 				${POSITION_FRAG_COLOR} = vec4(a);
    823 			}
    824 		""
    825 	end
    826 
    827 	case use_variable_from_for_init_statement_in_outer_scope
    828 		version 100 es
    829 		expect compile_fail
    830 		both ""
    831 			#version 100
    832 			precision mediump float;
    833 			${DECLARATIONS}
    834 
    835 			void main()
    836 			{
    837 				float x = 0.0;
    838 				for (int i = 0; i < 10; i++)
    839 				{
    840 					x += sin(i);
    841 				}
    842 				${POSITION_FRAG_COLOR} = vec4(float(i));
    843 			}
    844 		""
    845 	end
    846 
    847 	case use_variable_from_while_condition_in_outer_scope
    848 		version 100 es
    849 		expect compile_fail
    850 		both ""
    851 			#version 100
    852 			precision mediump float;
    853 			${DECLARATIONS}
    854 
    855 			void main()
    856 			{
    857 				int a = 1;
    858 				while (bool b = (a == 1))
    859 				{
    860 					a++;
    861 				}
    862 				${POSITION_FRAG_COLOR} = vec4(float(b));
    863 			}
    864 		""
    865 	end
    866 
    867 	case use_parameter_names_from_function_declaration
    868 		version 100 es
    869 		expect compile_fail
    870 		both ""
    871 			#version 100
    872 			precision mediump float;
    873 			${DECLARATIONS}
    874 
    875 			float func(float a, float b);
    876 
    877 			float func(float x, float y) { return a+b; }
    878 
    879 			void main()
    880 			{
    881 				${POSITION_FRAG_COLOR} = vec4(func(1.0, 2.0));
    882 			}
    883 		""
    884 	end
    885 
    886 	case variable_not_visible_in_own_initializer
    887 		version 100 es
    888 		expect compile_fail
    889 		both ""
    890 			#version 100
    891 			precision mediump float;
    892 			${DECLARATIONS}
    893 
    894 			void main()
    895 			{
    896 				float x = x;
    897 				${POSITION_FRAG_COLOR} = vec4(x);
    898 			}
    899 		""
    900 	end
    901 
    902 end # invalid
    903