xref: /aosp_15_r20/external/deqp/data/gles2/shaders/preprocessor.test (revision 35238bce31c2a825756842865a792f8cf7f89930)
1group basic "Basic Tests"
2
3    case correct_phases
4        expect compile_fail
5        both ""
6            #define e +1
7            void main()
8            {
9                mediump int n = 1e;
10            }
11        ""
12    end
13
14    case invalid_identifier
15        expect compile_fail
16        both ""
17            #define e +1
18
19            void main()
20            {
21                mediump int 1xyz = 1;
22            }
23        ""
24    end
25
26    case null_directive
27        values { output float out0 = 0.0; }
28        both ""
29            precision mediump float;
30            ${DECLARATIONS}
31
32            #
33        # // comment
34    /*sfd*/        # /* */
35
36            void main()
37            {
38                out0 = 0.0;
39                ${OUTPUT}
40            }
41        ""
42    end
43
44    case invalid_directive
45        expect compile_fail
46        both ""
47            #defin AAA
48
49            void main()
50            {
51            }
52        ""
53    end
54
55    case missing_identifier
56        expect compile_fail
57        both ""
58            #define
59
60            void main()
61            {
62            }
63        ""
64    end
65
66    case empty_object
67        values { output float out0 = -1.0; }
68        both ""
69            precision mediump float;
70            ${DECLARATIONS}
71
72            # define VALUE
73
74            void main()
75            {
76                out0 = VALUE - 1.0;
77                ${OUTPUT}
78            }
79        ""
80    end
81
82    case empty_function
83        values { output float out0 = -1.0; }
84        both ""
85            precision mediump float;
86            ${DECLARATIONS}
87
88            # define VALUE(a)
89
90            void main()
91            {
92                out0 = VALUE(2.0) - 1.0;
93                ${OUTPUT}
94            }
95        ""
96    end
97
98
99    case empty_directive
100        values { output float out0 = 1.0; }
101        both ""
102            precision mediump float;
103            ${DECLARATIONS}
104
105            #
106
107            void main()
108            {
109                out0 = 1.0;
110                ${OUTPUT}
111            }
112        ""
113    end
114
115    case identifier_with_double_underscore
116        values { output float out0 = 1.0; }
117        both ""
118            precision mediump float;
119            ${DECLARATIONS}
120            # define __VALUE__    1
121
122            void main()
123            {
124                // __VALUE__ not used since it might be set by an "underlying software layer"
125                out0 = float(1.0);
126                ${OUTPUT}
127            }
128        ""
129    end
130end # basic
131
132group definitions "Symbol Definition Tests"
133
134    case define_value_and_function
135        values { output float out0 = 6.0; }
136
137        both ""
138            precision mediump float;
139            ${DECLARATIONS:single-line}
140            #    define        VALUE            (1.5 + 2.5)
141            #    define        FUNCTION(__LINE__, b)    __LINE__+b
142
143            void main()
144            {
145                out0 = FUNCTION(VALUE, ((0.2) + 1.8) );
146                ${OUTPUT}
147            }
148        ""
149    end
150
151    case undefine_object_invalid_syntax
152        expect compile_fail
153        both ""
154            precision mediump float;
155            #define        VAL            2.0
156            #undef        VAL    sdflkjfds
157            #define        VAL            1.0
158
159            void main()
160            {
161                ${POSITION_FRAG_COLOR} = vec4(VAL);
162            }
163        ""
164    end
165
166    case undefine_invalid_object_1
167        expect compile_fail
168        both ""
169            precision mediump float;
170            #undef __LINE__
171
172            void main()
173            {
174                ${POSITION_FRAG_COLOR} = vec4(__LINE__);
175            }
176        ""
177    end
178
179    case undefine_invalid_object_2
180        expect compile_fail
181        both ""
182            precision mediump float;
183            #undef __FILE__
184
185            void main()
186            {
187                ${POSITION_FRAG_COLOR} = vec4(__FILE__);
188            }
189        ""
190    end
191
192    case undefine_invalid_object_3
193        expect compile_fail
194        both ""
195            precision mediump float;
196            #undef __VERSION__
197
198            void main()
199            {
200                ${POSITION_FRAG_COLOR} = vec4(__VERSION__);
201            }
202        ""
203    end
204
205    case undefine_invalid_object_4
206        expect compile_fail
207        both ""
208            precision mediump float;
209            #undef GL_ES
210
211            void main()
212            {
213                ${POSITION_FRAG_COLOR} = vec4(GL_ES);
214            }
215        ""
216    end
217
218    case undefine_function
219        values { output float out0 = 1.0; }
220        both ""
221            precision mediump float;
222            ${DECLARATIONS}
223            #define        FUNCTION(a,b) a+b
224            #undef        FUNCTION
225            #define        FUNCTION(a,b) a-b
226
227            void main()
228            {
229                out0 = FUNCTION(3.0, 2.0);
230                ${OUTPUT}
231            }
232        ""
233    end
234
235end # definitions
236
237group invalid_definitions "Invalid Definition Tests"
238
239    case define_non_identifier
240        expect compile_fail
241        both ""
242            precision mediump float;
243            #define 123 321
244
245            void main()
246            {
247                ${POSITION_FRAG_COLOR} = vec4(1.0);
248            }
249        ""
250    end
251
252    case undef_non_identifier_1
253        expect compile_fail
254        both ""
255            precision mediump float;
256            #undef 123
257
258            void main()
259            {
260                ${POSITION_FRAG_COLOR} = vec4(1.0);
261            }
262        ""
263    end
264
265    case undef_non_identifier_2
266        expect compile_fail
267        both ""
268            precision mediump float;
269            #undef foo.bar
270
271            void main()
272            {
273                ${POSITION_FRAG_COLOR} = vec4(1.0);
274            }
275        ""
276    end
277
278
279end # invalid_definitions
280
281group object_redefinitions "Object Redefinition Tests"
282
283    case invalid_object_ident
284        expect compile_fail
285        both ""
286            precision mediump float;
287            # define AAA        2.0
288            # define AAAA        2.1
289            # define VALUE (AAA - 1.0)
290            # define VALUE (AAAA - 1.0)
291
292            void main()
293            {
294                ${POSITION_FRAG_COLOR} = vec4(VALUE);
295            }
296        ""
297    end
298
299    case invalid_object_whitespace
300        expect compile_fail
301        both ""
302            precision mediump float;
303            # define AAA        2.0
304            # define VALUE (AAA - 1.0)
305            # define VALUE (AAA- 1.0)
306
307            void main()
308            {
309                ${POSITION_FRAG_COLOR} = vec4(VALUE);
310            }
311        ""
312    end
313
314    case invalid_object_op
315        expect compile_fail
316        both ""
317            precision mediump float;
318            # define AAA        2.0
319            # define VALUE (AAA - 1.0)
320            # define VALUE (AAA + 1.0)
321
322            void main()
323            {
324                ${POSITION_FRAG_COLOR} = vec4(VALUE);
325            }
326        ""
327    end
328
329    case invalid_object_floatval_1
330        expect compile_fail
331        both ""
332            precision mediump float;
333            # define AAA        2.0
334            # define VALUE (AAA - 1.0)
335            # define VALUE (AAA - 1.1)
336
337            void main()
338            {
339                ${POSITION_FRAG_COLOR} = vec4(VALUE);
340            }
341        ""
342    end
343
344    case invalid_object_floatval_2
345        expect compile_fail
346        both ""
347            precision mediump float;
348            # define AAA        2.0
349            # define VALUE (AAA - 1.0)
350            # define VALUE (AAA - 1.0e-1)
351
352            void main()
353            {
354                ${POSITION_FRAG_COLOR} = vec4(VALUE);
355            }
356        ""
357    end
358
359    case invalid_object_intval_1
360        expect compile_fail
361        both ""
362            precision mediump float;
363            # define AAA        2
364            # define VALUE (AAA - 1)
365            # define VALUE (AAA - 2)
366
367            void main()
368            {
369                ${POSITION_FRAG_COLOR} = vec4(VALUE);
370            }
371        ""
372    end
373
374    case invalid_object_intval_2
375        expect compile_fail
376        both ""
377            precision mediump float;
378            # define AAA        2
379            # define VALUE (AAA - 1)
380            # define VALUE (AAA - 0x1)
381
382            void main()
383            {
384                ${POSITION_FRAG_COLOR} = vec4(VALUE);
385            }
386        ""
387    end
388
389    case redefine_object_1
390        values { output float out0 = 6.0; }
391
392        both ""
393            precision mediump float;
394            ${DECLARATIONS}
395            #    define  VAL1 1.0
396            #define        VAL2 2.0
397
398            #define RES2 (RES1 * VAL2)
399            #define RES1    (VAL2 / VAL1)
400            #define RES2    (RES1 * VAL2)
401            #define VALUE    (RES2 + RES1)
402
403            void main()
404            {
405                out0 = VALUE;
406                ${OUTPUT}
407            }
408        ""
409    end
410
411    case redefine_object_ifdef
412        values { output float out0 = 1.0; }
413
414        both ""
415            precision mediump float;
416            ${DECLARATIONS}
417            #define ADEFINE 1
418            #define ADEFINE 1
419
420            #ifdef ADEFINE
421            #define VALUE 1.0
422            #else
423            #define VALUE 0.0
424            #endif
425
426            void main()
427            {
428                out0 = VALUE;
429                ${OUTPUT}
430            }
431        ""
432    end
433
434    case redefine_object_undef_ifdef
435        values { output float out0 = 1.0; }
436
437        both ""
438            precision mediump float;
439            ${DECLARATIONS}
440            #define ADEFINE 1
441            #define ADEFINE 1
442            #undef ADEFINE
443
444            #ifdef ADEFINE
445            #define VALUE 0.0
446            #else
447            #define VALUE 1.0
448            #endif
449
450            void main()
451            {
452                out0 = VALUE;
453                ${OUTPUT}
454            }
455        ""
456    end
457
458    case redefine_object_ifndef
459        values { output float out0 = 1.0; }
460
461        both ""
462            precision mediump float;
463            ${DECLARATIONS}
464            #define ADEFINE 1
465            #define ADEFINE 1
466
467            #ifndef ADEFINE
468            #define VALUE 0.0
469            #else
470            #define VALUE 1.0
471            #endif
472
473            void main()
474            {
475                out0 = VALUE;
476                ${OUTPUT}
477            }
478        ""
479    end
480
481    case redefine_object_defined_1
482        values { output float out0 = 1.0; }
483
484        both ""
485            precision mediump float;
486            ${DECLARATIONS}
487            #define ADEFINE 1
488            #define ADEFINE 1
489
490            #if defined(ADEFINE)
491            #define VALUE 1.0
492            #else
493            #define VALUE 0.0
494            #endif
495
496            void main()
497            {
498                out0 = VALUE;
499                ${OUTPUT}
500            }
501        ""
502    end
503
504    case redefine_object_defined_2
505        values { output float out0 = 1.0; }
506
507        both ""
508            precision mediump float;
509            ${DECLARATIONS}
510            #define ADEFINE 1
511            #define ADEFINE 1
512
513            #if defined ADEFINE
514            #define VALUE 1.0
515            #else
516            #define VALUE 0.0
517            #endif
518
519            void main()
520            {
521                out0 = VALUE;
522                ${OUTPUT}
523            }
524        ""
525    end
526
527    case redefine_object_comment
528        values { output float out0 = 6.0; }
529
530        both ""
531            precision mediump float;
532            ${DECLARATIONS}
533            #    define  VAL1 1.0
534            #define        VAL2 2.0
535
536            #define RES2 /* fdsjklfdsjkl dsfjkhfdsjkh fdsjklhfdsjkh */ (RES1 * VAL2)
537            #define RES1    (VAL2 / VAL1)
538            #define RES2    /* ewrlkjhsadf */ (RES1 * VAL2)
539            #define VALUE    (RES2 + RES1)
540
541            void main()
542            {
543                out0 = VALUE;
544                ${OUTPUT}
545            }
546        ""
547    end
548
549    case redefine_object_multiline_comment
550        values { output float out0 = 6.0; }
551
552        both ""
553            precision mediump float;
554            ${DECLARATIONS}
555            #    define  VAL1 1.0
556            #define        VAL2 2.0
557
558            #define RES2 /* fdsjklfdsjkl
559                            dsfjkhfdsjkh
560                            fdsjklhfdsjkh */ (RES1 * VAL2)
561            #define RES1    (VAL2 / VAL1)
562            #define RES2    /* ewrlkjhsadf */ (RES1 * VAL2)
563            #define VALUE    (RES2 + RES1)
564
565            void main()
566            {
567                out0 = VALUE;
568                ${OUTPUT}
569            }
570        ""
571    end
572
573end # object_redefinitions
574
575group invalid_redefinitions "Invalid Redefinitions Tests"
576
577    case invalid_identifier_2
578        expect compile_fail
579        both ""
580            precision mediump float;
581            # define GL_VALUE    1.0
582
583            void main()
584            {
585                ${POSITION_FRAG_COLOR} = vec4(GL_VALUE);
586            }
587        ""
588    end
589
590end # invalid_redefinitions
591
592group comments "Comment Tests"
593
594    case multiline_comment_define
595        values { output float out0 = 4.2; }
596        both ""
597            precision mediump float;
598            ${DECLARATIONS}
599            #define VALUE /* current
600                        value */ 4.2
601
602            void main()
603            {
604                out0 = VALUE;
605                ${OUTPUT}
606            }
607        ""
608    end
609
610    case nested_comment
611        values { output float out0 = 1.0; }
612        both ""
613            precision mediump float;
614            ${DECLARATIONS}
615            void main()
616            {
617                out0 = 0.0;
618                /* /* */
619                out0 = 1.0;
620                // */
621                ${OUTPUT}
622            }
623        ""
624    end
625
626    case comment_trick_1
627        values { output float out0 = 1.0; }
628        both ""
629            precision mediump float;
630            ${DECLARATIONS}
631            void main()
632            {
633                /*/
634                out0 = 0.0;
635                /*/
636                out0 = 1.0;
637                /**/
638                ${OUTPUT}
639            }
640        ""
641    end
642
643    case comment_trick_2
644        values { output float out0 = 1.0; }
645        both ""
646            precision mediump float;
647            ${DECLARATIONS}
648            void main()
649            {
650                /**/
651                out0 = 1.0;
652                /*/
653                out0 = 0.0;
654                /**/
655                ${OUTPUT}
656            }
657        ""
658    end
659
660    case invalid_comment
661        expect compile_fail
662        both ""
663            precision mediump float;
664            void main()
665            {
666                /* /* */ */
667                ${POSITION_FRAG_COLOR} = 1.0;
668            }
669        ""
670    end
671
672    case unterminated_comment_1
673        expect compile_fail
674        both ""
675            precision mediump float;
676            void main()
677            {
678                /*
679            }
680        ""
681    end
682
683    case unterminated_comment_2
684        expect compile_fail
685        both ""
686            /*
687            precision mediump float;
688            void main()
689            {
690            }
691        ""
692    end
693
694end # comments
695
696group function_definitions "Function Definitions Tests"
697
698    case same_object_and_function_param
699        values { output float out0 = 1.0; }
700
701        both ""
702            precision mediump float;
703            ${DECLARATIONS}
704            #define VALUE 1.0
705            #define FUNCTION(VALUE, B)    (VALUE-B)
706
707            void main()
708            {
709                out0 = FUNCTION(3.0, 2.0);
710                ${OUTPUT}
711            }
712        ""
713    end
714
715    case complex_func
716        values { output float out0 = 518.5; }
717        both ""
718            precision mediump float;
719            ${DECLARATIONS}
720            #define AAA(a,b)    a*(BBB(a,b))
721            #define BBB(a,b)    a-b
722
723            void main()
724            {
725                out0 = BBB(AAA(8.0/4.0, 2.0)*BBB(2.0*2.0,0.75*2.0), AAA(40.0,10.0*BBB(5.0,3.0)));
726                ${OUTPUT}
727            }
728        ""
729    end
730
731    case function_definition_with_comments
732        values { output float out0 = 3.0; }
733        both ""
734            precision mediump float;
735            ${DECLARATIONS}
736            /* sdfljk */    #/* sdfljk */define /* sdfljk */ FUNC( /* jklsfd*/a /*sfdjklh*/, /*sdfklj */b /*sdfklj*/)        a+b
737
738            void main()
739            {
740                out0 = FUNC(1.0, 2.0);
741                ${OUTPUT}
742            }
743        ""
744    end
745
746end # function_definitions
747
748group recursion "Recursions Tests"
749
750    case recursion_1
751        expect compile_fail
752        both ""
753            precision mediump float;
754            # define AAA    AAA
755
756            void main()
757            {
758                ${POSITION_FRAG_COLOR} = vec4(AAA);
759            }
760        ""
761    end
762
763    case recursion_2
764        expect compile_fail
765        both ""
766            precision mediump float;
767            # define AAA    BBB
768            #define BBB        AAA
769
770            void main()
771            {
772                ${POSITION_FRAG_COLOR} = vec4(AAA);
773            }
774        ""
775    end
776
777    case recursion_3
778        expect compile_fail
779        both ""
780            precision mediump float;
781            # define AAA    (1.0+BBB)
782            #define BBB        (2.0+AAA)
783
784            void main()
785            {
786                ${POSITION_FRAG_COLOR} = vec4(AAA);
787            }
788        ""
789    end
790
791    case recursion_4
792        expect compile_fail
793        both ""
794            precision mediump float;
795            # define AAA(a)    AAA(a)
796
797            void main()
798            {
799                ${POSITION_FRAG_COLOR} = vec4(AAA(1.0));
800            }
801        ""
802    end
803
804    case recursion_5
805        expect compile_fail
806        both ""
807            precision mediump float;
808            # define AAA(a, b)    AAA(b, a)
809
810            void main()
811            {
812                ${POSITION_FRAG_COLOR} = vec4(AAA(1.0, 2.0));
813            }
814        ""
815    end
816
817end # recursion
818
819group function_redefinitions "Function Redefinition Tests"
820
821    case function_redefinition_1
822        values { output float out0 = 3.0; }
823        both ""
824            precision mediump float;
825            # define FUNC(a,b)        a+b
826            # define FUNC( a, b)        a+b
827
828            ${DECLARATIONS}
829            void main()
830            {
831                out0 = FUNC(1.0, 2.0);
832                ${OUTPUT}
833            }
834        ""
835    end
836
837    case function_redefinition_2
838        values { output float out0 = 3.0; }
839        both ""
840            precision mediump float;
841            # define FUNC(a,b)        (a  +b)
842            # define FUNC( a, b )(a            +b)
843
844            ${DECLARATIONS}
845            void main()
846            {
847                out0 = FUNC(1.0, 2.0);
848                ${OUTPUT}
849            }
850        ""
851    end
852
853    case function_redefinition_3
854        values { output float out0 = 3.0; }
855        both ""
856            precision mediump float;
857            # define FUNC(a,b)        (a  +b)
858            # define FUNC(a,b)(a    /* comment
859                                     */ +b)
860
861            ${DECLARATIONS}
862            void main()
863            {
864                out0 = FUNC(1.0, 2.0);
865                ${OUTPUT}
866            }
867        ""
868    end
869
870    case invalid_function_redefinition_param_1
871        expect compile_fail
872        both ""
873            precision mediump float;
874            # define FUNC(a,b)        a+b
875            # define FUNC(A,b)        A+b
876
877            void main()
878            {
879                ${POSITION_FRAG_COLOR} = vec4(FUNC(1.0, 2.0));
880            }
881        ""
882    end
883
884    case invalid_function_redefinition_param_2
885        expect compile_fail
886        both ""
887            precision mediump float;
888            # define FUNC(a,b)        a+b
889            # define FUNC(a,b,c)    a+b+c
890
891            void main()
892            {
893                ${POSITION_FRAG_COLOR} = vec4(FUNC(1.0, 2.0, 3.0));
894            }
895        ""
896    end
897
898    case invalid_function_redefinition_param_3
899        expect compile_fail
900        both ""
901            precision mediump float;
902            # define FUNC(a,b)        a+b
903            # define FUNC(a,b)        b+a
904
905            void main()
906            {
907                ${POSITION_FRAG_COLOR} = vec4(FUNC(1.0, 2.0));
908            }
909        ""
910    end
911
912end # functions_redefinitions
913
914group invalid_function_definitions "Invalid Function Definition Tests"
915
916    case arguments_1
917        expect compile_fail
918        both ""
919            precision mediump float;
920            # define FUNC(a,b)        a+b
921
922            void main()
923            {
924                ${POSITION_FRAG_COLOR} = vec4(FUNC);
925            }
926        ""
927    end
928
929    case arguments_2
930        expect compile_fail
931        both ""
932            precision mediump float;
933            # define FUNC(a,b)        a+b
934
935            void main()
936            {
937                ${POSITION_FRAG_COLOR} = vec4(FUNC());
938            }
939        ""
940    end
941
942    case arguments_3
943        expect compile_fail
944        both ""
945            precision mediump float;
946            # define FUNC(a,b)        a+b
947
948            void main()
949            {
950                ${POSITION_FRAG_COLOR} = vec4(FUNC((();
951            }
952        ""
953    end
954
955    case arguments_4
956        expect compile_fail
957        both ""
958            precision mediump float;
959            # define FUNC(a,b)        a+b
960
961            void main()
962            {
963                ${POSITION_FRAG_COLOR} = vec4(FUNC));
964            }
965        ""
966    end
967
968    case arguments_5
969        expect compile_fail
970        both ""
971            precision mediump float;
972            # define FUNC(a,b)        a+b
973
974            void main()
975            {
976                ${POSITION_FRAG_COLOR} = vec4(FUNC(1.0));
977            }
978        ""
979    end
980
981    case arguments_6
982        expect compile_fail
983        both ""
984            precision mediump float;
985            # define FUNC(a,b)        a+b
986
987            void main()
988            {
989                ${POSITION_FRAG_COLOR} = vec4(FUNC(1.0,2.0);
990            }
991        ""
992    end
993
994    case arguments_7
995        expect compile_fail
996        both ""
997            precision mediump float;
998            # define FUNC(a,b)        a+b
999
1000            void main()
1001            {
1002                ${POSITION_FRAG_COLOR} = vec4(FUNC(1.0,));
1003            }
1004        ""
1005    end
1006
1007    case arguments_8
1008        expect compile_fail
1009        both ""
1010            precision mediump float;
1011            # define FUNC(a,b)        a+b
1012
1013            void main()
1014            {
1015                ${POSITION_FRAG_COLOR} = vec4(FUNC(1.0, 2.0, 3.0));
1016            }
1017        ""
1018    end
1019
1020    case unique_param_name
1021        expect compile_fail
1022        both ""
1023            precision mediump float;
1024            # define FUNC(a,a)        a+a
1025
1026            void main()
1027            {
1028                ${POSITION_FRAG_COLOR} = vec4(FUNC(1.0,2.0));
1029            }
1030        ""
1031    end
1032
1033    case argument_list_1
1034        expect compile_fail
1035        both ""
1036            precision mediump float;
1037            # define FUNC(a b)        a+b
1038
1039            void main()
1040            {
1041                ${POSITION_FRAG_COLOR} = vec4(FUNC(1.0,2.0));
1042            }
1043        ""
1044    end
1045
1046    case argument_list_2
1047        expect compile_fail
1048        both ""
1049            precision mediump float;
1050            # define FUNC(a + b)        a+b
1051
1052            void main()
1053            {
1054                ${POSITION_FRAG_COLOR} = vec4(FUNC(1.0,2.0));
1055            }
1056        ""
1057    end
1058
1059    case argument_list_3
1060        expect compile_fail
1061        both ""
1062            precision mediump float;
1063            # define FUNC(,a,b)        a+b
1064
1065            void main()
1066            {
1067                ${POSITION_FRAG_COLOR} = vec4(FUNC(1.0,2.0));
1068            }
1069        ""
1070    end
1071
1072    case no_closing_parenthesis_1
1073        expect compile_fail
1074        both ""
1075            precision mediump float;
1076            # define FUNC(
1077
1078            void main()
1079            {
1080                ${POSITION_FRAG_COLOR} = vec4(FUNC(1.0,2.0));
1081            }
1082        ""
1083    end
1084
1085    case no_closing_parenthesis_2
1086        expect compile_fail
1087        both ""
1088            precision mediump float;
1089            # define FUNC(A  a+b
1090
1091            void main()
1092            {
1093                ${POSITION_FRAG_COLOR} = vec4(FUNC(1.0,2.0));
1094            }
1095        ""
1096    end
1097
1098    case no_closing_parenthesis_3
1099        expect compile_fail
1100        both ""
1101            precision mediump float;
1102            # define FUNC(A,B,C  a+b
1103
1104            void main()
1105            {
1106                ${POSITION_FRAG_COLOR} = vec4(FUNC(1.0,2.0));
1107            }
1108        ""
1109    end
1110
1111    case no_closing_parenthesis_4
1112        expect compile_fail
1113        both ""
1114            precision mediump float;
1115            # define FUNC(
1116        ""
1117    end
1118
1119end # invalid_function_definitions
1120
1121group semantic "Semantic Tests"
1122
1123    case ops_as_arguments
1124        values { output float out0 = 20.0; }
1125        both ""
1126            precision mediump float;
1127            ${DECLARATIONS}
1128            #define FOO(a, b)        (1 a 9) b 2
1129
1130            void main()
1131            {
1132                out0 = float(FOO(+, *));
1133                ${OUTPUT}
1134            }
1135        ""
1136    end
1137
1138    case correct_order
1139        values { output float out0 = 1.0; }
1140        both ""
1141            precision mediump float;
1142            ${DECLARATIONS}
1143            #define FUNC(A) A
1144            #define A 2.0
1145
1146            void main()
1147            {
1148                out0 = FUNC(A - 1.0);
1149                ${OUTPUT}
1150            }
1151        ""
1152    end
1153
1154end # semantic
1155
1156group predefined_macros "Predefined Macros Tests"
1157
1158    case version
1159        values { output float out0 = 100.0; }
1160        both ""
1161            precision mediump float;
1162            ${DECLARATIONS}
1163            void main()
1164            {
1165                #define AAA __VERSION__
1166                out0 = float(AAA);
1167                ${OUTPUT}
1168            }
1169        ""
1170    end
1171
1172    case gl_es_1
1173        values { output float out0 = 1.0; }
1174        both ""
1175            precision mediump float;
1176            ${DECLARATIONS}
1177
1178            void main()
1179            {
1180                out0 = float(GL_ES);
1181                ${OUTPUT}
1182            }
1183        ""
1184    end
1185
1186    case gl_es_2
1187        values { output float out0 = 1.0; }
1188        both ""
1189            precision mediump float;
1190            ${DECLARATIONS}
1191            #define AAA(A) A
1192
1193            void main()
1194            {
1195                out0 = float(AAA(GL_ES));
1196                ${OUTPUT}
1197            }
1198        ""
1199    end
1200
1201    case line_1
1202        values { output float out0 = 1.0; }
1203        both ""
1204            const mediump int line = __LINE__;
1205            precision mediump float;
1206            ${DECLARATIONS}
1207            void main()
1208            {
1209                out0 = float(line);
1210                ${OUTPUT}
1211            }
1212        ""
1213    end
1214
1215    case line_2
1216        # Note: Arguments are macro replaced in the first stage.
1217        # Macro replacement list is expanded in the last stage.
1218        values { output vec4 out0 = vec4(11.0, 11.0, 9.0, 10.0); }
1219
1220        both ""
1221            precision mediump float;
1222            ${DECLARATIONS:single-line}
1223            #define BBB        __LINE__, /*
1224                */ __LINE__
1225            #define AAA(a,b) BBB, a, b
1226
1227            void main()
1228            {
1229                out0 = vec4(AAA(__LINE__,
1230                        __LINE__
1231                        ));
1232                ${OUTPUT}
1233            }
1234        ""
1235    end
1236
1237    case file
1238        values { output float out0 = 0.0; }
1239        both ""
1240            precision mediump float;
1241            ${DECLARATIONS}
1242            void main()
1243            {
1244                out0 = float(__FILE__);
1245                ${OUTPUT}
1246            }
1247        ""
1248    end
1249
1250    case if_gl_es
1251        values { output float out0 = 1.0; }
1252        both ""
1253            precision mediump float;
1254            ${DECLARATIONS}
1255            void main()
1256            {
1257    #if GL_ES
1258                out0 = 1.0;
1259    #else
1260                out0 = -1.0;
1261    #endif
1262                ${OUTPUT}
1263            }
1264        ""
1265    end
1266
1267    case if_version
1268        values { output float out0 = 1.0; }
1269        both ""
1270            precision mediump float;
1271            ${DECLARATIONS}
1272            void main()
1273            {
1274    #if __VERSION__ == 100
1275                out0 = 1.0;
1276    #else
1277                out0 = -1.0;
1278    #endif
1279                ${OUTPUT}
1280            }
1281        ""
1282    end
1283
1284end # predefined_macros
1285
1286group conditional_inclusion "Conditional Inclusion Tests"
1287
1288    case basic_1
1289        values { output float out0 = 1.0; }
1290        both ""
1291            precision mediump float;
1292            ${DECLARATIONS}
1293            void main()
1294            {
1295    #define AAA asdf
1296
1297    #if defined AAA && !defined(BBB)
1298                out0 = 1.0;
1299    #else
1300                out0 = 0.0;
1301    #endif
1302                ${OUTPUT}
1303            }
1304        ""
1305    end
1306
1307    case basic_2
1308        values { output float out0 = 1.0; }
1309        both ""
1310            precision mediump float;
1311            ${DECLARATIONS}
1312            void main()
1313            {
1314    #define AAA defined(BBB)
1315
1316    #if !AAA
1317                out0 = 1.0;
1318    #else
1319                out0 = 0.0;
1320    #endif
1321                ${OUTPUT}
1322            }
1323        ""
1324    end
1325
1326    case basic_3
1327        values { output float out0 = 1.0; }
1328        both ""
1329            precision mediump float;
1330            ${DECLARATIONS}
1331            void main()
1332            {
1333    #if 0
1334                out0 = -1.0;
1335    #elif 0
1336                out0 = -2.0;
1337    #elif 1
1338                out0 = 1.0;
1339    #else
1340                out0 = -3.0;
1341    #endif
1342                ${OUTPUT}
1343            }
1344        ""
1345    end
1346
1347    case basic_4
1348        values { output float out0 = 1.0; }
1349        both ""
1350            precision mediump float;
1351            ${DECLARATIONS}
1352            void main()
1353            {
1354    #if 0
1355                out0 = -1.0;
1356    #elif 0
1357                out0 = -2.0;
1358    #else
1359                out0 = 1.0;
1360    #endif
1361                ${OUTPUT}
1362            }
1363        ""
1364    end
1365
1366    case basic_5
1367        values { output float out0 = 1.0; }
1368        both ""
1369            precision mediump float;
1370            ${DECLARATIONS}
1371            void main()
1372            {
1373    #if 1
1374                out0 = 1.0;
1375    #elif 0
1376                out0 = -2.0;
1377    #else
1378                out0 = -1.0;
1379    #endif
1380                ${OUTPUT}
1381            }
1382        ""
1383    end
1384
1385    case unary_ops_1
1386        values { output float out0 = 1.0; }
1387        both ""
1388            precision mediump float;
1389            ${DECLARATIONS}
1390            void main()
1391            {
1392    #if !((~2 >> 1) & 1)
1393                out0 = 1.0;
1394    #else
1395                out0 = -1.0;
1396    #endif
1397                ${OUTPUT}
1398            }
1399        ""
1400    end
1401
1402    case unary_ops_2
1403        values { output float out0 = 1.0; }
1404        both ""
1405            precision mediump float;
1406            ${DECLARATIONS}
1407            void main()
1408            {
1409    #if !((~(- - - - - 1 + + + + + +1) >> 1) & 1)
1410                out0 = -1.0;
1411    #else
1412                out0 = 1.0;
1413    #endif
1414                ${OUTPUT}
1415            }
1416        ""
1417    end
1418
1419end # conditional_inclusion
1420
1421group invalid_ops "Invalid Operations Tests"
1422
1423    case invalid_op_1
1424        expect compile_fail
1425        both ""
1426            precision mediump float;
1427            void main()
1428            {
1429    #if !((~(+ ++1 - - - -1) >> 1) & 1)
1430                ${POSITION_FRAG_COLOR} = vec4(-1.0);
1431    #else
1432                ${POSITION_FRAG_COLOR} = vec4(1.0);
1433    #endif
1434            }
1435        ""
1436    end
1437
1438    case invalid_op_2
1439        expect compile_fail
1440        both ""
1441            precision mediump float;
1442            void main()
1443            {
1444    #if !((~(+ + +1 - -- -1) >> 1) & 1)
1445                ${POSITION_FRAG_COLOR} = vec4(-1.0);
1446    #else
1447                ${POSITION_FRAG_COLOR} = vec4(1.0);
1448    #endif
1449            }
1450        ""
1451    end
1452
1453    case invalid_defined_expected_identifier_1
1454        expect compile_fail
1455        both ""
1456            precision mediump float;
1457            #define AAA 1
1458
1459            void main()
1460            {
1461    #if defined
1462                ${POSITION_FRAG_COLOR} = vec4(1.0);
1463    #endif
1464            }
1465        ""
1466    end
1467
1468    case invalid_defined_expected_identifier_2
1469        expect compile_fail
1470        both ""
1471            precision mediump float;
1472            #define AAA 1
1473
1474            void main()
1475            {
1476    #if defined()
1477                ${POSITION_FRAG_COLOR} = vec4(1.0);
1478    #endif
1479            }
1480        ""
1481    end
1482
1483    case invalid_defined_expected_identifier_3
1484        expect compile_fail
1485        both ""
1486            precision mediump float;
1487            #define AAA 1
1488
1489            void main()
1490            {
1491    #if defined(
1492                ${POSITION_FRAG_COLOR} = vec4(1.0);
1493    #endif
1494            }
1495        ""
1496    end
1497
1498    case invalid_defined_expected_identifier_4
1499        expect compile_fail
1500        both ""
1501            precision mediump float;
1502            #define AAA 1
1503
1504            void main()
1505            {
1506    #if defined)
1507                ${POSITION_FRAG_COLOR} = vec4(1.0);
1508    #endif
1509            }
1510        ""
1511    end
1512
1513    case invalid_defined_expected_identifier_5
1514        expect compile_fail
1515        both ""
1516            precision mediump float;
1517            #define AAA 1
1518
1519            void main()
1520            {
1521    #if defined((AAA))
1522                ${POSITION_FRAG_COLOR} = vec4(FUNC(1.0,2.0);
1523    #endif
1524            }
1525        ""
1526    end
1527
1528    case invalid_defined_expected_rparen
1529        expect compile_fail
1530        both ""
1531            precision mediump float;
1532            #define AAA 1
1533
1534            void main()
1535            {
1536    #if defined(AAA
1537                ${POSITION_FRAG_COLOR} = vec4(1.0);
1538    #endif
1539            }
1540        ""
1541    end
1542
1543    case defined_define
1544        values { output float out0 = 1.0; }
1545        both ""
1546            precision mediump float;
1547            ${DECLARATIONS}
1548    #define define 1
1549    #define AAA 1.0
1550
1551            void main()
1552            {
1553                out0 = AAA;
1554                ${OUTPUT}
1555            }
1556        ""
1557    end
1558
1559end # invalid_ops
1560
1561group undefined_identifiers "Undefined Identifiers Tests"
1562
1563    case valid_undefined_identifier_1
1564        values { output float out0 = 1.0; }
1565        both ""
1566            precision mediump float;
1567            ${DECLARATIONS}
1568            void main()
1569            {
1570    #if 1 || AAA
1571                out0 = 1.0;
1572    #else
1573                out0 = -1.0;
1574    #endif
1575                ${OUTPUT}
1576            }
1577        ""
1578    end
1579
1580    case valid_undefined_identifier_2
1581        values { output float out0 = 1.0; }
1582        both ""
1583            precision mediump float;
1584            ${DECLARATIONS}
1585            void main()
1586            {
1587    #if 0 && AAA
1588                out0 = -1.0;
1589    #else
1590                out0 = 1.0;
1591    #endif
1592                ${OUTPUT}
1593            }
1594        ""
1595    end
1596
1597    case undefined_identifier_1
1598        expect compile_fail
1599        both ""
1600            precision mediump float;
1601            void main()
1602            {
1603    #if 1 - CCC + (-AAA || BBB)
1604                ${POSITION_FRAG_COLOR} = vec4(1.0);
1605    #else
1606                ${POSITION_FRAG_COLOR} = vec4(-1.0);
1607    #endif
1608            }
1609        ""
1610    end
1611
1612    case undefined_identifier_2
1613        expect compile_fail
1614        both ""
1615            precision mediump float;
1616            void main()
1617            {
1618    #if !A
1619                ${POSITION_FRAG_COLOR} = vec4(1.0);
1620    #else
1621                ${POSITION_FRAG_COLOR} = vec4(-1.0);
1622    #endif
1623            }
1624        ""
1625    end
1626
1627    case undefined_identifier_3
1628        expect compile_fail
1629        both ""
1630            precision mediump float;
1631            void main()
1632            {
1633    #if -A
1634                ${POSITION_FRAG_COLOR} = vec4(1.0);
1635    #else
1636                ${POSITION_FRAG_COLOR} = vec4(-1.0);
1637    #endif
1638            }
1639        ""
1640    end
1641
1642    case undefined_identifier_4
1643        expect compile_fail
1644        both ""
1645            precision mediump float;
1646            void main()
1647            {
1648    #if ~A
1649                ${POSITION_FRAG_COLOR} = vec4(1.0);
1650    #else
1651                ${POSITION_FRAG_COLOR} = vec4(-1.0);
1652    #endif
1653            }
1654        ""
1655    end
1656
1657    case undefined_identifier_5
1658        expect compile_fail
1659        both ""
1660            precision mediump float;
1661            void main()
1662            {
1663    #if A && B
1664                ${POSITION_FRAG_COLOR} = vec4(1.0);
1665    #else
1666                ${POSITION_FRAG_COLOR} = vec4(-1.0);
1667    #endif
1668            }
1669        ""
1670    end
1671
1672    case undefined_identifier_6
1673        expect compile_fail
1674        both ""
1675            precision mediump float;
1676            void main()
1677            {
1678    #define A 1
1679    #if A && B
1680                ${POSITION_FRAG_COLOR} = vec4(1.0);
1681    #else
1682                ${POSITION_FRAG_COLOR} = vec4(-1.0);
1683    #endif
1684            }
1685        ""
1686    end
1687
1688    case undefined_identifier_7
1689        expect compile_fail
1690        both ""
1691            precision mediump float;
1692            void main()
1693            {
1694    #define B 1
1695    #if A && B
1696                ${POSITION_FRAG_COLOR} = vec4(1.0);
1697    #else
1698                ${POSITION_FRAG_COLOR} = vec4(-1.0);
1699    #endif
1700            }
1701        ""
1702    end
1703
1704    case undefined_identifier_8
1705        expect compile_fail
1706        both ""
1707            precision mediump float;
1708            void main()
1709            {
1710    #define B 1
1711    #define A 2
1712    #undef A
1713    #if A && B
1714                ${POSITION_FRAG_COLOR} = vec4(1.0);
1715    #else
1716                ${POSITION_FRAG_COLOR} = vec4(-1.0);
1717    #endif
1718            }
1719        ""
1720    end
1721
1722    case undefined_identifier_9
1723        expect compile_fail
1724        both ""
1725            precision mediump float;
1726            void main()
1727            {
1728    #if A || B
1729                ${POSITION_FRAG_COLOR} = vec4(1.0);
1730    #else
1731                ${POSITION_FRAG_COLOR} = vec4(-1.0);
1732    #endif
1733            }
1734        ""
1735    end
1736
1737    case undefined_identifier_10
1738        expect compile_fail
1739        both ""
1740            precision mediump float;
1741            void main()
1742            {
1743    #define A 0
1744    #if A || B
1745                ${POSITION_FRAG_COLOR} = vec4(1.0);
1746    #else
1747                ${POSITION_FRAG_COLOR} = vec4(-1.0);
1748    #endif
1749            }
1750        ""
1751    end
1752
1753    case undefined_identifier_11
1754        expect compile_fail
1755        both ""
1756            precision mediump float;
1757            void main()
1758            {
1759    #define A 0
1760    #define B 2
1761    #undef B
1762    #if A || B
1763                ${POSITION_FRAG_COLOR} = vec4(1.0);
1764    #else
1765                ${POSITION_FRAG_COLOR} = vec4(-1.0);
1766    #endif
1767            }
1768        ""
1769    end
1770
1771    case undefined_identifier_12
1772        expect compile_fail
1773        both ""
1774            precision mediump float;
1775            void main()
1776            {
1777    #define B 1
1778    #if A || B
1779                ${POSITION_FRAG_COLOR} = vec4(1.0);
1780    #else
1781                ${POSITION_FRAG_COLOR} = vec4(-1.0);
1782    #endif
1783            }
1784        ""
1785    end
1786
1787end # undefined_identifiers
1788
1789group invalid_conditionals "Invalid Conditionals Tests"
1790
1791    case empty_if
1792        expect compile_fail
1793        both ""
1794            precision mediump float;
1795            void main()
1796            {
1797    #if
1798                ${POSITION_FRAG_COLOR} = vec4(1.0);
1799            }
1800        ""
1801    end
1802
1803    case empty_ifdef
1804        expect compile_fail
1805        both ""
1806            precision mediump float;
1807            void main()
1808            {
1809    #ifdef
1810                ${POSITION_FRAG_COLOR} = vec4(1.0);
1811            }
1812        ""
1813    end
1814
1815    case empty_ifndef
1816        expect compile_fail
1817        both ""
1818            precision mediump float;
1819            void main()
1820            {
1821    #ifndef
1822                ${POSITION_FRAG_COLOR} = vec4(1.0);
1823            }
1824        ""
1825    end
1826
1827    case empty_if_defined
1828        expect compile_fail
1829        both ""
1830            precision mediump float;
1831            void main()
1832            {
1833    #if defined
1834                ${POSITION_FRAG_COLOR} = vec4(1.0);
1835            }
1836        ""
1837    end
1838
1839    case unterminated_if_1
1840        expect compile_fail
1841        both ""
1842            precision mediump float;
1843            void main()
1844            {
1845    #if 1
1846                ${POSITION_FRAG_COLOR} = vec4(1.0);
1847            }
1848        ""
1849    end
1850
1851    case unterminated_if_2
1852        expect compile_fail
1853        both ""
1854            precision mediump float;
1855            void main()
1856            {
1857    #if 0
1858                ${POSITION_FRAG_COLOR} = vec4(1.0);
1859            }
1860        ""
1861    end
1862
1863    case unterminated_ifdef
1864        expect compile_fail
1865        both ""
1866            precision mediump float;
1867            void main()
1868            {
1869    #ifdef FOOBAR
1870                ${POSITION_FRAG_COLOR} = vec4(1.0);
1871            }
1872        ""
1873    end
1874
1875    case unterminated_ifndef
1876        expect compile_fail
1877        both ""
1878            precision mediump float;
1879            void main()
1880            {
1881    #ifndef GL_ES
1882                ${POSITION_FRAG_COLOR} = vec4(1.0);
1883            }
1884        ""
1885    end
1886
1887    case unterminated_else_1
1888        expect compile_fail
1889        both ""
1890            precision mediump float;
1891            void main()
1892            {
1893    #if 1
1894    #else
1895                ${POSITION_FRAG_COLOR} = vec4(1.0);
1896            }
1897        ""
1898    end
1899
1900    case unterminated_else_2
1901        expect compile_fail
1902        both ""
1903            precision mediump float;
1904            void main()
1905            {
1906    #if 0
1907    #else
1908                ${POSITION_FRAG_COLOR} = vec4(1.0);
1909            }
1910        ""
1911    end
1912
1913    case unterminated_elif_1
1914        expect compile_fail
1915        both ""
1916            precision mediump float;
1917            void main()
1918            {
1919    #if 0
1920    #elif 1
1921                ${POSITION_FRAG_COLOR} = vec4(1.0);
1922            }
1923        ""
1924    end
1925
1926    case unterminated_elif_2
1927        expect compile_fail
1928        both ""
1929            precision mediump float;
1930            void main()
1931            {
1932    #if 1
1933    #elif 0
1934                ${POSITION_FRAG_COLOR} = vec4(1.0);
1935            }
1936        ""
1937    end
1938
1939    case unterminated_elif_3
1940        expect compile_fail
1941        both ""
1942            precision mediump float;
1943            void main()
1944            {
1945    #if 0
1946    #elif 0
1947                ${POSITION_FRAG_COLOR} = vec4(2.0);
1948            }
1949        ""
1950    end
1951
1952    case elif_after_else
1953        expect compile_fail
1954        both ""
1955            precision mediump float;
1956            void main()
1957            {
1958    #if 0
1959                ${POSITION_FRAG_COLOR} = vec4(1.0);
1960    #else
1961                ${POSITION_FRAG_COLOR} = vec4(-1.0);
1962    #elif 1
1963                ${POSITION_FRAG_COLOR} = vec4(0.0);
1964    #endif
1965            }
1966        ""
1967    end
1968
1969    case else_without_if
1970        expect compile_fail
1971        both ""
1972            precision mediump float;
1973            void main()
1974            {
1975    #else
1976                ${POSITION_FRAG_COLOR} = vec4(1.0);
1977    #endif
1978            }
1979        ""
1980    end
1981
1982    case elif_without_if
1983        expect compile_fail
1984        both ""
1985            precision mediump float;
1986            void main()
1987            {
1988    #elif 1
1989                ${POSITION_FRAG_COLOR} = vec4(1.0);
1990    #endif
1991            }
1992        ""
1993    end
1994
1995    case endif_without_if
1996        expect compile_fail
1997        both ""
1998            precision mediump float;
1999            void main()
2000            {
2001                ${POSITION_FRAG_COLOR} = vec4(1.0);
2002    #endif
2003            }
2004        ""
2005    end
2006
2007    case else_after_else
2008        expect compile_fail
2009        both ""
2010            precision mediump float;
2011            void main()
2012            {
2013    #if !GL_ES
2014            ${POSITION_FRAG_COLOR} = vec4(1.0);
2015    #else
2016            ${POSITION_FRAG_COLOR} = vec4(-1.0);
2017    #else
2018            ${POSITION_FRAG_COLOR} = vec4(-1.0);
2019    #endif
2020            }
2021        ""
2022    end
2023
2024    case nested_elif_without_if
2025        expect compile_fail
2026        both ""
2027            precision mediump float;
2028            void main()
2029            {
2030    #if 1
2031            ${POSITION_FRAG_COLOR} = vec4(1.0);
2032    #    elif
2033            ${POSITION_FRAG_COLOR} = vec4(0.0);
2034    #    endif
2035    #endif
2036            }
2037        ""
2038    end
2039
2040    case if_float
2041        expect compile_fail
2042        both ""
2043            precision mediump float;
2044            void main()
2045            {
2046    #if 1.231
2047            ${POSITION_FRAG_COLOR} = vec4(1.0);
2048    #    elif
2049            ${POSITION_FRAG_COLOR} = vec4(0.0);
2050    #    endif
2051    #endif
2052            }
2053        ""
2054    end
2055
2056    case tokens_after_if
2057        expect compile_fail
2058        both ""
2059            precision mediump float;
2060            void main()
2061            {
2062    #if 1 foobar
2063                ${POSITION_FRAG_COLOR} = vec4(1.0);
2064    #endif
2065            }
2066        ""
2067    end
2068
2069    case tokens_after_elif
2070        expect compile_fail
2071        both ""
2072            precision mediump float;
2073            void main()
2074            {
2075    #if 0
2076    #elif foobar
2077                ${POSITION_FRAG_COLOR} = vec4(1.0);
2078    #endif
2079            }
2080        ""
2081    end
2082
2083    case tokens_after_else
2084        expect compile_fail
2085        both ""
2086            precision mediump float;
2087            void main()
2088            {
2089    #if 1
2090    #else foobar 1.231
2091    #endif
2092                ${POSITION_FRAG_COLOR} = vec4(1.0);
2093            }
2094        ""
2095    end
2096
2097    case tokens_after_endif
2098        expect compile_fail
2099        both ""
2100            precision mediump float;
2101            void main()
2102            {
2103    #if 1
2104    #else
2105    #endif foobar
2106                ${POSITION_FRAG_COLOR} = vec4(1.0);
2107            }
2108        ""
2109    end
2110
2111    case tokens_after_ifdef
2112        expect compile_fail
2113        both ""
2114            precision mediump float;
2115            void main()
2116            {
2117    #ifdef FOOBAR foobar
2118    #else
2119    #endif
2120                ${POSITION_FRAG_COLOR} = vec4(1.0);
2121            }
2122        ""
2123    end
2124
2125    case tokens_after_ifndef
2126        expect compile_fail
2127        both ""
2128            precision mediump float;
2129            void main()
2130            {
2131    #ifndef FOOBAR ,, +- << barbar
2132    #else
2133    #endif
2134                ${POSITION_FRAG_COLOR} = vec4(1.0);
2135            }
2136        ""
2137    end
2138
2139end # invalid_conditionals
2140
2141group conditionals "Conditionals Tests"
2142
2143    case unterminated_nested_blocks
2144        expect compile_fail
2145        both ""
2146            precision mediump float;
2147            void main()
2148            {
2149    #if 1
2150    #    if 1
2151                ${POSITION_FRAG_COLOR} = vec4(1.0);
2152            }
2153        ""
2154    end
2155
2156    case ifdef_1
2157        values { output float out0 = 1.0; }
2158        both ""
2159    #define AAA
2160            precision mediump float;
2161            ${DECLARATIONS}
2162            void main()
2163            {
2164    #ifdef AAA
2165                out0 = 1.0;
2166    #else
2167                out0 = -1.0;
2168    #endif
2169                ${OUTPUT}
2170            }
2171        ""
2172    end
2173
2174    case ifdef_2
2175        values { output float out0 = 1.0; }
2176        both ""
2177    #define AAA
2178            precision mediump float;
2179            ${DECLARATIONS}
2180            void main()
2181            {
2182    #if defined  ( AAA)
2183                out0 = 1.0;
2184    #else
2185                out0 = -1.0;
2186    #endif
2187                ${OUTPUT}
2188            }
2189        ""
2190    end
2191
2192    case ifdef_3
2193        values { output float out0 = 1.0; }
2194        both ""
2195            precision mediump float;
2196            ${DECLARATIONS}
2197            void main()
2198            {
2199    #ifdef AAA
2200                out0 = -1.0;
2201    #else
2202                out0 = 1.0;
2203    #endif
2204                ${OUTPUT}
2205            }
2206        ""
2207    end
2208
2209    case invalid_ifdef
2210        expect compile_fail
2211        both ""
2212            precision mediump float;
2213            void main()
2214            {
2215    #ifdef 1
2216                ${POSITION_FRAG_COLOR} = vec4(1.0);
2217    #endif
2218            }
2219        ""
2220    end
2221
2222    case ifndef_1
2223        values { output float out0 = 1.0; }
2224        both ""
2225            precision mediump float;
2226            ${DECLARATIONS}
2227            void main()
2228            {
2229    #ifndef AAA
2230                out0 = 1.0;
2231    #else
2232                out0 = -1.0;
2233    #endif
2234                ${OUTPUT}
2235            }
2236        ""
2237    end
2238
2239    case ifndef_2
2240        values { output float out0 = 1.0; }
2241        both ""
2242            precision mediump float;
2243            ${DECLARATIONS}
2244    #define AAA
2245            void main()
2246            {
2247    #ifndef AAA
2248                out0 = -1.0;
2249    #else
2250                out0 = 1.0;
2251    #endif
2252                ${OUTPUT}
2253            }
2254        ""
2255    end
2256
2257    case invalid_ifndef
2258        expect compile_fail
2259        both ""
2260            precision mediump float;
2261            void main()
2262            {
2263    #ifndef 1
2264                ${POSITION_FRAG_COLOR} = vec4(1.0);
2265    #endif
2266            }
2267        ""
2268    end
2269
2270    case mixed_conditional_inclusion
2271        values { output float out0 = 1.0; }
2272        both ""
2273            precision mediump float;
2274            ${DECLARATIONS}
2275            void main()
2276            {
2277    #ifndef AAA
2278                out0 = 1.0;
2279    #elif 1
2280                out0 = -1.0;
2281    #endif
2282                ${OUTPUT}
2283            }
2284        ""
2285    end
2286
2287    case nested_if_1
2288        values { output float out0 = 1.0; }
2289        both ""
2290            precision mediump float;
2291            ${DECLARATIONS}
2292            void main()
2293            {
2294    #if GL_ES
2295    #    if __VERSION__ != 100
2296                out0 = -1.0;
2297    #    else
2298                out0 = 1.0;
2299    #    endif
2300    #endif
2301                ${OUTPUT}
2302            }
2303        ""
2304    end
2305
2306    case nested_if_2
2307        values { output float out0 = 1.0; }
2308        both ""
2309            precision mediump float;
2310            ${DECLARATIONS}
2311            void main()
2312            {
2313    #if 1
2314    #    if 0
2315                out0 = -1.0;
2316    #    else
2317    #        if 0
2318                out0 = -1.0;
2319    #        elif 1
2320                out0 = 1.0;
2321    #        else
2322                out0 = -1.0;
2323    #        endif
2324    #    endif
2325    #endif
2326                ${OUTPUT}
2327            }
2328        ""
2329    end
2330
2331    case nested_if_3
2332        values { output float out0 = 1.0; }
2333        both ""
2334            precision mediump float;
2335            ${DECLARATIONS}
2336            void main()
2337            {
2338    #if 0
2339    #    if 1
2340                out0 = -1.0;
2341    #    endif
2342    #else
2343                out0 = 1.0;
2344    #endif
2345                ${OUTPUT}
2346            }
2347        ""
2348    end
2349
2350end # conditionals
2351
2352group directive "Directive Tests"
2353
2354    case version
2355        values { output float out0 = 1.0; }
2356        both ""
2357    /* asdf */
2358    #version 100
2359            precision mediump float;
2360            ${DECLARATIONS}
2361            void main()
2362            {
2363                out0 = 1.0;
2364                ${OUTPUT}
2365            }
2366        ""
2367    end
2368
2369    case version_is_less
2370        expect compile_fail
2371        both ""
2372    #version 99
2373            precision mediump float;
2374            void main()
2375            {
2376                ${POSITION_FRAG_COLOR} = vec4(1.0);
2377            }
2378        ""
2379    end
2380
2381    case version_is_more
2382        expect compile_fail
2383        both ""
2384    #version 101
2385            precision mediump float;
2386            void main()
2387            {
2388                ${POSITION_FRAG_COLOR} = vec4(1.0);
2389            }
2390        ""
2391    end
2392
2393    case version_missing
2394        expect compile_fail
2395        both ""
2396    #version
2397            precision mediump float;
2398            void main()
2399            {
2400                ${POSITION_FRAG_COLOR} = vec4(1.0);
2401            }
2402        ""
2403    end
2404
2405    case version_not_first_statement_1
2406        expect compile_fail
2407        both ""
2408            precision mediump float;
2409            #version 100
2410            void main()
2411            {
2412                ${POSITION_FRAG_COLOR} = vec4(1.0);
2413            }
2414        ""
2415    end
2416
2417    case version_not_first_statement_2
2418        expect compile_fail
2419        both ""
2420            #define FOO BAR
2421            #version 100
2422            precision mediump float;
2423            void main()
2424            {
2425                ${POSITION_FRAG_COLOR} = vec4(1.0);
2426            }
2427        ""
2428    end
2429
2430    case version_invalid_token_1
2431        expect compile_fail
2432        both ""
2433    #version 100.0
2434            precision mediump float;
2435            void main()
2436            {
2437                ${POSITION_FRAG_COLOR} = vec4(1.0);
2438            }
2439        ""
2440    end
2441
2442    case version_invalid_token_2
2443        expect compile_fail
2444        both ""
2445    #version foobar
2446            precision mediump float;
2447            void main()
2448            {
2449                ${POSITION_FRAG_COLOR} = vec4(1.0);
2450            }
2451        ""
2452    end
2453
2454    case invalid_version
2455        expect compile_fail
2456        both ""
2457    #version AAA
2458            precision mediump float;
2459            void main()
2460            {
2461                ${POSITION_FRAG_COLOR} = vec4(1.0);
2462            }
2463        ""
2464    end
2465
2466    case additional_tokens
2467        expect compile_fail
2468        both ""
2469    #version 100 foobar
2470            precision mediump float;
2471            void main()
2472            {
2473                ${POSITION_FRAG_COLOR} = vec4(1.0);
2474            }
2475        ""
2476    end
2477
2478    case error_with_no_tokens
2479        expect compile_fail
2480        both ""
2481    #error
2482            precision mediump float;
2483            void main()
2484            {
2485                ${POSITION_FRAG_COLOR} = vec4(1.0);
2486            }
2487        ""
2488    end
2489
2490    case error
2491        expect compile_fail
2492        both ""
2493    #define AAA asdf
2494    #error 1 * AAA /* comment */
2495            precision mediump float;
2496            void main()
2497            {
2498                ${POSITION_FRAG_COLOR} = vec4(1.0);
2499            }
2500        ""
2501    end
2502
2503end # directive
2504
2505group builtin "Built-in Symbol Tests"
2506
2507    case line
2508        values { output float out0 = 1.0; }
2509        both ""
2510            precision mediump float;
2511            ${DECLARATIONS}
2512            void main()
2513            {
2514    #line 1
2515                out0 = float(__LINE__);
2516                ${OUTPUT}
2517            }
2518        ""
2519    end
2520
2521    case line_and_file
2522        values { output vec4 out0 = vec4(234.0, 234.0, 10.0, 10.0); }
2523        both ""
2524            precision mediump float;
2525            ${DECLARATIONS}
2526            void main()
2527            {
2528    #line 234 10
2529                out0 = vec4(__LINE__, __LINE__, __FILE__, __FILE__);
2530                ${OUTPUT}
2531            }
2532        ""
2533    end
2534
2535    case line_defined_1
2536        values { output float out0 = 4.0; }
2537        both ""
2538            precision mediump float;
2539            ${DECLARATIONS}
2540            void main()
2541            {
2542    #define A 4
2543    #line A
2544                out0 = float(__LINE__);
2545                ${OUTPUT}
2546            }
2547        ""
2548    end
2549
2550    case line_defined_2
2551        values { output vec4 out0 = vec4(234.0, 234.0, 10.0, 10.0); }
2552        both ""
2553            precision mediump float;
2554            ${DECLARATIONS}
2555            void main()
2556            {
2557    #define A 10
2558    #line 234 A
2559                out0 = vec4(__LINE__, __LINE__, __FILE__, __FILE__);
2560                ${OUTPUT}
2561            }
2562        ""
2563    end
2564
2565    case empty_line
2566        expect compile_fail
2567        both ""
2568            precision mediump float;
2569            void main()
2570            {
2571    #line
2572                ${POSITION_FRAG_COLOR} = vec4(1.0);
2573            }
2574        ""
2575    end
2576
2577    case invalid_line_file_1
2578        expect compile_fail
2579        both ""
2580            precision mediump float;
2581            void main()
2582            {
2583    #line 22 1.234
2584                ${POSITION_FRAG_COLOR} = vec4(__LINE__, __LINE__, __FILE__, __FILE__);
2585            }
2586        ""
2587    end
2588
2589    case invalid_line_file_3
2590        expect compile_fail
2591        both ""
2592            precision mediump float;
2593            void main()
2594            {
2595    #line 233 10 2
2596                ${POSITION_FRAG_COLOR} = vec4(__LINE__, __LINE__, __FILE__, __FILE__);
2597            }
2598        ""
2599    end
2600
2601    case invalid_line_file_4
2602        expect compile_fail
2603        both ""
2604            precision mediump float;
2605            void main()
2606            {
2607    #line foobar
2608                ${POSITION_FRAG_COLOR} = vec4(__LINE__, __LINE__, __FILE__, __FILE__);
2609            }
2610        ""
2611    end
2612
2613end # builtin
2614
2615group pragmas "Pragma Tests"
2616
2617    case pragma_vertex
2618        values { output float out0 = 1.0; }
2619
2620        vertex ""
2621            #pragma
2622            #pragma STDGL invariant(all)
2623            #pragma debug(off)
2624            #pragma optimize(off)
2625
2626            precision mediump float;
2627            ${VERTEX_DECLARATIONS}
2628            varying float v_val;
2629            void main()
2630            {
2631                v_val = 1.0;
2632                ${VERTEX_OUTPUT}
2633            }
2634        ""
2635        fragment ""
2636            precision mediump float;
2637            ${FRAGMENT_DECLARATIONS}
2638            invariant varying float v_val;
2639            void main()
2640            {
2641                out0 = v_val;
2642                ${FRAGMENT_OUTPUT}
2643            }
2644        ""
2645    end
2646
2647    case pragma_fragment
2648        values { output float out0 = 1.0; }
2649
2650        vertex ""
2651            precision mediump float;
2652            ${VERTEX_DECLARATIONS}
2653            varying float v_val;
2654            void main()
2655            {
2656                v_val = 1.0;
2657                ${VERTEX_OUTPUT}
2658            }
2659        ""
2660        fragment ""
2661            #pragma
2662            #pragma STDGL invariant(all)
2663            #pragma debug(off)
2664            #pragma optimize(off)
2665
2666            precision mediump float;
2667            ${FRAGMENT_DECLARATIONS}
2668            varying float v_val;
2669            void main()
2670            {
2671                out0 = v_val;
2672                ${FRAGMENT_OUTPUT}
2673            }
2674        ""
2675    end
2676
2677    case pragma_macro_exp
2678        values { output float out0 = 1.0; }
2679        both ""
2680    #define off    INVALID
2681    /* pragma line not macro expanded */
2682    #pragma debug(off)
2683
2684            precision mediump float;
2685            ${DECLARATIONS}
2686            void main()
2687            {
2688                out0 = 1.0;
2689                ${OUTPUT}
2690            }
2691        ""
2692    end
2693
2694    case pragma_unrecognized_debug
2695        expect build_successful
2696        both ""
2697            #pragma debug(1.23)
2698
2699            // unrecognized preprocessor token
2700
2701            precision mediump float;
2702            void main()
2703            {
2704                ${POSITION_FRAG_COLOR} = vec4(1.0);
2705            }
2706        ""
2707    end
2708
2709    case pragma_unrecognized_token
2710        expect build_successful
2711        both ""
2712            #pragma ¤¤½
2713
2714            // trailing bytes form a valid but unrecognized preprocessor token
2715
2716            precision mediump float;
2717            void main()
2718            {
2719                ${POSITION_FRAG_COLOR} = vec4(1.0);
2720            }
2721        ""
2722    end
2723
2724end # pragmas
2725
2726group extensions "Extension Tests"
2727
2728    case basic
2729        values { output float out0 = 1.0; }
2730        both ""
2731    #extension all : warn
2732
2733            precision mediump float;
2734            ${DECLARATIONS}
2735            void main()
2736            {
2737                out0 = 1.0;
2738                ${OUTPUT}
2739            }
2740        ""
2741    end
2742
2743    case macro_exp
2744        values { output float out0 = 1.0; }
2745        both ""
2746    #define warn enable
2747
2748    #extension all : warn
2749
2750            precision mediump float;
2751            ${DECLARATIONS}
2752            void main()
2753            {
2754                out0 = 1.0;
2755                ${OUTPUT}
2756            }
2757        ""
2758    end
2759
2760    case missing_extension_name
2761        expect compile_fail
2762        both ""
2763    #extension
2764            precision mediump float;
2765            void main()
2766            {
2767                ${POSITION_FRAG_COLOR} = vec4(1.0);
2768            }
2769        ""
2770    end
2771
2772    case invalid_extension_name
2773        expect compile_fail
2774        both ""
2775    #extension 2 : all
2776            precision mediump float;
2777            void main()
2778            {
2779                ${POSITION_FRAG_COLOR} = vec4(1.0);
2780            }
2781        ""
2782    end
2783
2784    case missing_colon
2785        expect compile_fail
2786        both ""
2787    #extension all
2788            precision mediump float;
2789            void main()
2790            {
2791                ${POSITION_FRAG_COLOR} = vec4(1.0);
2792            }
2793        ""
2794    end
2795
2796    case expected_colon
2797        expect compile_fail
2798        both ""
2799    #extension all ;
2800            precision mediump float;
2801            void main()
2802            {
2803                ${POSITION_FRAG_COLOR} = vec4(1.0);
2804            }
2805        ""
2806    end
2807
2808    case missing_behavior
2809        expect compile_fail
2810        both ""
2811    #extension all :
2812            precision mediump float;
2813            void main()
2814            {
2815                ${POSITION_FRAG_COLOR} = vec4(1.0);
2816            }
2817        ""
2818    end
2819
2820    case invalid_behavior_1
2821        expect compile_fail
2822        both ""
2823    #extension all : WARN
2824            precision mediump float;
2825            void main()
2826            {
2827                ${POSITION_FRAG_COLOR} = vec4(1.0);
2828            }
2829        ""
2830    end
2831
2832    case invalid_behavior_2
2833        expect compile_fail
2834        both ""
2835    #extension all : require
2836            precision mediump float;
2837            void main()
2838            {
2839                ${POSITION_FRAG_COLOR} = vec4(1.0);
2840            }
2841        ""
2842    end
2843
2844    case invalid_char_in_name
2845        expect compile_fail
2846        both ""
2847    #extension all¤ : warn
2848            precision mediump float;
2849            void main()
2850            {
2851                ${POSITION_FRAG_COLOR} = vec4(1.0);
2852            }
2853        ""
2854    end
2855
2856    case invalid_char_in_behavior
2857        expect compile_fail
2858        both ""
2859    #extension all : war¤n
2860            precision mediump float;
2861            void main()
2862            {
2863                ${POSITION_FRAG_COLOR} = vec4(1.0);
2864            }
2865        ""
2866    end
2867
2868    case unterminated_comment
2869        expect compile_fail
2870        both ""
2871    #extension all : warn /*asd
2872            precision mediump float;
2873            void main()
2874            {
2875                ${POSITION_FRAG_COLOR} = vec4(1.0);
2876            }
2877        ""
2878    end
2879
2880    case after_non_preprocessing_tokens
2881        expect compile_fail
2882        both ""
2883    #extension all : warn
2884
2885            precision mediump float;
2886            ${DECLARATIONS}
2887            void main()
2888            {
2889    #extension all : disable
2890                ${POSITION_FRAG_COLOR} = vec4(1.0);
2891            }
2892        ""
2893    end
2894end # extensions
2895
2896group expressions "Expression Tests"
2897
2898    case shift_left
2899        values { output float out0 = 1.0; }
2900        both ""
2901            precision mediump float;
2902            ${DECLARATIONS}
2903            void main()
2904            {
2905                #define VAL 4
2906                out0 = 0.0;
2907                #if (VAL << 2) == 16
2908                    out0 = 1.0;
2909                #endif
2910                ${OUTPUT}
2911            }
2912        ""
2913    end
2914
2915    case shift_right
2916        values { output float out0 = 1.0; }
2917        both ""
2918            precision mediump float;
2919            ${DECLARATIONS}
2920            void main()
2921            {
2922                #define VAL 5
2923                out0 = 0.0;
2924                #if (VAL >> 1) == 2
2925                    out0 = 1.0;
2926                #endif
2927                ${OUTPUT}
2928            }
2929        ""
2930    end
2931
2932    case cmp_less_than
2933        values { output float out0 = 1.0; }
2934        both ""
2935            precision mediump float;
2936            ${DECLARATIONS}
2937            void main()
2938            {
2939                #define VAL 5
2940                out0 = 0.0;
2941                #if (VAL < 6) && (-VAL < -4)
2942                    out0 = 1.0;
2943                #endif
2944                ${OUTPUT}
2945            }
2946        ""
2947    end
2948
2949    case less_or_equal
2950        values { output float out0 = 1.0; }
2951        both ""
2952            precision mediump float;
2953            ${DECLARATIONS}
2954            void main()
2955            {
2956                #define VAL 6
2957                out0 = 0.0;
2958                #if (VAL <= 6) && (-VAL <= -6)
2959                    out0 = 1.0;
2960                #endif
2961                ${OUTPUT}
2962            }
2963        ""
2964    end
2965
2966    case or
2967        values { output float out0 = 1.0; }
2968        both ""
2969            precision mediump float;
2970            ${DECLARATIONS}
2971            void main()
2972            {
2973                #define VAL 6
2974                out0 = 0.0;
2975                #if (VAL | 5) == 7
2976                    out0 = 1.0;
2977                #endif
2978                ${OUTPUT}
2979            }
2980        ""
2981    end
2982
2983    case and
2984        values { output float out0 = 1.0; }
2985        both ""
2986            precision mediump float;
2987            ${DECLARATIONS}
2988            void main()
2989            {
2990                #define VAL 6
2991                out0 = 0.0;
2992                #if (VAL & 5) == 4
2993                    out0 = 1.0;
2994                #endif
2995                ${OUTPUT}
2996            }
2997        ""
2998    end
2999
3000    case xor
3001        values { output float out0 = 1.0; }
3002        both ""
3003            precision mediump float;
3004            ${DECLARATIONS}
3005            void main()
3006            {
3007                #define VAL 6
3008                out0 = 0.0;
3009                #if (VAL ^ 5) == 3
3010                    out0 = 1.0;
3011                #endif
3012                ${OUTPUT}
3013            }
3014        ""
3015    end
3016
3017    case mod
3018        values { output float out0 = 1.0; }
3019        both ""
3020            precision mediump float;
3021            ${DECLARATIONS}
3022            void main()
3023            {
3024                #define VAL 12
3025                out0 = 0.0;
3026                #if (VAL % 5) == 2
3027                    out0 = 1.0;
3028                #endif
3029                ${OUTPUT}
3030            }
3031        ""
3032    end
3033
3034    case parenthesis_value
3035        values { output float out0 = 1.0; }
3036        both ""
3037            precision mediump float;
3038            ${DECLARATIONS}
3039            void main()
3040            {
3041                #define VAL ((  (4   ) )  )
3042                out0 = 0.0;
3043                #if VAL >= 4
3044                    out0 = 1.0;
3045                #endif
3046                ${OUTPUT}
3047            }
3048        ""
3049    end
3050
3051    case parenthesis_tricky
3052        values { output float out0 = 1.0; }
3053        both ""
3054            precision mediump float;
3055            ${DECLARATIONS}
3056            void main()
3057            {
3058                #define VAL ((  (4   ) )
3059                out0 = 0.0;
3060                #if VAL) >= 4
3061                    out0 = 1.0;
3062                #endif
3063                ${OUTPUT}
3064            }
3065        ""
3066    end
3067
3068    case parenthesis_if_no
3069        values { output float out0 = 1.0; }
3070        both ""
3071            precision mediump float;
3072            ${DECLARATIONS}
3073            void main()
3074            {
3075                #define VAL 4
3076                out0 = 0.0;
3077                #if VAL >= 4
3078                    out0 = 1.0;
3079                #endif
3080                ${OUTPUT}
3081            }
3082        ""
3083    end
3084
3085    case parenthesis_if
3086        values { output float out0 = 1.0; }
3087        both ""
3088            precision mediump float;
3089            ${DECLARATIONS}
3090            void main()
3091            {
3092                #define VAL 4
3093                out0 = 0.0;
3094                #if (VAL >= 4)
3095                    out0 = 1.0;
3096                #endif
3097                ${OUTPUT}
3098            }
3099        ""
3100    end
3101
3102    case parenthesis_multi_if
3103        values { output float out0 = 1.0; }
3104        both ""
3105            precision mediump float;
3106            ${DECLARATIONS}
3107            void main()
3108            {
3109                #define VAL (4)
3110                out0 = 0.0;
3111                #if (((VAL)) >= (4))
3112                    out0 = 1.0;
3113                #endif
3114                ${OUTPUT}
3115            }
3116        ""
3117    end
3118
3119    case parenthesis_single_if
3120        values { output float out0 = 1.0; }
3121        both ""
3122            precision mediump float;
3123            ${DECLARATIONS}
3124            void main()
3125            {
3126                #define VAL 4
3127                out0 = 0.0;
3128                #if (VAL >= 4)
3129                    out0 = 1.0;
3130                #endif
3131                ${OUTPUT}
3132            }
3133        ""
3134    end
3135
3136    case parenthesis_ifelse_true
3137        values { output float out0 = 1.0; }
3138        both ""
3139            precision mediump float;
3140            ${DECLARATIONS}
3141            void main()
3142            {
3143                #define VAL 4
3144                #if (VAL >= 4)
3145                    out0 = 1.0;
3146                #else
3147                    out0 = 0.0;
3148                #endif
3149                ${OUTPUT}
3150            }
3151        ""
3152    end
3153
3154    case parenthesis_ifelse_false
3155        values { output float out0 = 1.0; }
3156        both ""
3157            precision mediump float;
3158            ${DECLARATIONS}
3159            void main()
3160            {
3161                #define VAL 4
3162                #if (VAL > 4)
3163                    out0 = 0.0;
3164                #else
3165                    out0 = 1.0;
3166                #endif
3167                ${OUTPUT}
3168            }
3169        ""
3170    end
3171
3172    case eval_basic_0
3173        values { output float out0 = 1.0; }
3174        both ""
3175            precision mediump float;
3176            ${DECLARATIONS}
3177            void main()
3178            {
3179                #if -4 + 5 == 1
3180                    out0 = 1.0;
3181                #else
3182                    out0 = 0.0;
3183                #endif
3184                ${OUTPUT}
3185            }
3186        ""
3187    end
3188
3189    case eval_basic_1
3190        values { output float out0 = 1.0; }
3191        both ""
3192            precision mediump float;
3193            ${DECLARATIONS}
3194            void main()
3195            {
3196                #if (2 * 2) - 3 >= 0
3197                    out0 = 1.0;
3198                #else
3199                    out0 = 0.0;
3200                #endif
3201                ${OUTPUT}
3202            }
3203        ""
3204    end
3205
3206    case eval_simple_precedence_0
3207        values { output float out0 = 1.0; }
3208        both ""
3209            precision mediump float;
3210            ${DECLARATIONS}
3211            void main()
3212            {
3213                #if 2 * 3 - 3 == 3
3214                    out0 = 1.0;
3215                #else
3216                    out0 = 0.0;
3217                #endif
3218                ${OUTPUT}
3219            }
3220        ""
3221    end
3222
3223    case eval_simple_precedence_1
3224        values { output float out0 = 1.0; }
3225        both ""
3226            precision mediump float;
3227            ${DECLARATIONS}
3228            void main()
3229            {
3230                #if 2 - 2 / 2 == 1
3231                    out0 = 1.0;
3232                #else
3233                    out0 = 0.0;
3234                #endif
3235                ${OUTPUT}
3236            }
3237        ""
3238    end
3239
3240    case defined_1
3241        values { output float out0 = 1.0; }
3242        both ""
3243            precision mediump float;
3244            ${DECLARATIONS}
3245            #define X 0
3246            void main()
3247            {
3248                #if defined(X)
3249                    out0 = 1.0;
3250                #else
3251                    out0 = 0.0;
3252                #endif
3253                ${OUTPUT}
3254            }
3255        ""
3256    end
3257
3258    case defined_2
3259        values { output float out0 = 1.0; }
3260        both ""
3261            precision mediump float;
3262            ${DECLARATIONS}
3263            #define X 0
3264            #define Y 1
3265            void main()
3266            {
3267                #if defined(X) == Y
3268                    out0 = 1.0;
3269                #else
3270                    out0 = 0.0;
3271                #endif
3272                ${OUTPUT}
3273            }
3274        ""
3275    end
3276
3277    case defined_3
3278        values { output float out0 = 1.0; }
3279        both ""
3280            precision mediump float;
3281            ${DECLARATIONS}
3282            #define X 0
3283            #define Y 1
3284            void main()
3285            {
3286                #if defined(X) && defined(Y)
3287                    out0 = 1.0;
3288                #else
3289                    out0 = 0.0;
3290                #endif
3291                ${OUTPUT}
3292            }
3293        ""
3294    end
3295
3296    case defined_4
3297        values { output float out0 = 1.0; }
3298        both ""
3299            precision mediump float;
3300            ${DECLARATIONS}
3301            #define X 0
3302            #define Y 1
3303            #undef X
3304            void main()
3305            {
3306                #if defined(X) && defined(Y)
3307                    out0 = 0.0;
3308                #else
3309                    out0 = 1.0;
3310                #endif
3311                ${OUTPUT}
3312            }
3313        ""
3314    end
3315
3316    case defined_5
3317        values { output float out0 = 1.0; }
3318        both ""
3319            precision mediump float;
3320            ${DECLARATIONS}
3321            #define X 0
3322            #define Y 1
3323            #undef X
3324            void main()
3325            {
3326                #if defined(X) || defined(Y)
3327                    out0 = 1.0;
3328                #else
3329                    out0 = 0.0;
3330                #endif
3331                ${OUTPUT}
3332            }
3333        ""
3334    end
3335
3336    case defined_6
3337        values { output float out0 = 1.0; }
3338        both ""
3339            precision mediump float;
3340            ${DECLARATIONS}
3341            #define X 0
3342            #define Y 1
3343            #undef Y
3344            void main()
3345            {
3346                #if defined(X) && (defined(Y) || (X == 0))
3347                    out0 = 1.0;
3348                #else
3349                    out0 = 0.0;
3350                #endif
3351                ${OUTPUT}
3352            }
3353        ""
3354    end
3355
3356end # expressions
3357
3358group invalid_expressions "Invalid Expression Tests"
3359
3360    case invalid_unary_expr
3361        expect compile_fail
3362        both ""
3363            precision mediump float;
3364            void main()
3365            {
3366    #if !
3367                ${POSITION_FRAG_COLOR} = vec4(1.0);
3368            }
3369        ""
3370    end
3371
3372    case invalid_binary_expr
3373        expect compile_fail
3374        both ""
3375            precision mediump float;
3376            void main()
3377            {
3378    #if 3+4+
3379                ${POSITION_FRAG_COLOR} = vec4(1.0);
3380            }
3381        ""
3382    end
3383
3384    case missing_expr
3385        expect compile_fail
3386        both ""
3387            precision mediump float;
3388            void main()
3389            {
3390    #if
3391                ${POSITION_FRAG_COLOR} = vec4(1.0);
3392            }
3393        ""
3394    end
3395
3396    case invalid_expr_1
3397        expect compile_fail
3398        both ""
3399            precision mediump float;
3400            void main()
3401            {
3402    #if 4 4
3403                ${POSITION_FRAG_COLOR} = vec4(1.0);
3404            }
3405        ""
3406    end
3407
3408    case invalid_expr_2
3409        expect compile_fail
3410        both ""
3411            precision mediump float;
3412            void main()
3413            {
3414    #if 4 * * 4
3415                ${POSITION_FRAG_COLOR} = vec4(1.0);
3416            }
3417        ""
3418    end
3419
3420    case invalid_expr_3
3421        expect compile_fail
3422        both ""
3423            precision mediump float;
3424            void main()
3425            {
3426    #if (4)(4)
3427                ${POSITION_FRAG_COLOR} = vec4(1.0);
3428            }
3429        ""
3430    end
3431
3432    case unopened_parenthesis
3433        expect compile_fail
3434        both ""
3435            precision mediump float;
3436            void main()
3437            {
3438    #if 4)
3439                ${POSITION_FRAG_COLOR} = vec4(1.0);
3440            }
3441        ""
3442    end
3443
3444    case unclosed_parenthesis
3445        expect compile_fail
3446        both ""
3447            precision mediump float;
3448            void main()
3449            {
3450    #if ((4 + 7)
3451                ${POSITION_FRAG_COLOR} = vec4(1.0);
3452            }
3453        ""
3454    end
3455
3456end # invalid_expressions
3457
3458group operator_precedence "Operator precedence"
3459
3460
3461    case modulo_vs_not
3462        values { output float out0 = 1.0; }
3463        both ""
3464
3465    #if ( 8 % ! 0 ) == 0
3466    #define VAL 1.0
3467    #else
3468    #define VAL 0.0
3469    #endif
3470            precision mediump float;
3471            ${DECLARATIONS}
3472            void main()
3473            {
3474                out0 = VAL;
3475                ${OUTPUT}
3476            }
3477        ""
3478    end
3479
3480    case div_vs_not
3481        values { output float out0 = 1.0; }
3482        both ""
3483
3484    #if ( 8 / ! 0 ) == 8
3485    #define VAL 1.0
3486    #else
3487    #define VAL 0.0
3488    #endif
3489            precision mediump float;
3490            ${DECLARATIONS}
3491            void main()
3492            {
3493                out0 = VAL;
3494                ${OUTPUT}
3495            }
3496        ""
3497    end
3498
3499    case mul_vs_not
3500        values { output float out0 = 1.0; }
3501        both ""
3502
3503    #if ( 8 * ! 0 ) == 8
3504    #define VAL 1.0
3505    #else
3506    #define VAL 0.0
3507    #endif
3508            precision mediump float;
3509            ${DECLARATIONS}
3510            void main()
3511            {
3512                out0 = VAL;
3513                ${OUTPUT}
3514            }
3515        ""
3516    end
3517
3518    case modulo_vs_bit_invert
3519        values { output float out0 = 1.0; }
3520        both ""
3521
3522    #if ( 8 % ~ 4 ) == 3
3523    #define VAL 1.0
3524    #else
3525    #define VAL 0.0
3526    #endif
3527            precision mediump float;
3528            ${DECLARATIONS}
3529            void main()
3530            {
3531                out0 = VAL;
3532                ${OUTPUT}
3533            }
3534        ""
3535    end
3536
3537    case modulo_vs_minus
3538        values { output float out0 = 1.0; }
3539        both ""
3540
3541    #if ( 8 % - 2 ) == 0
3542    #define VAL 1.0
3543    #else
3544    #define VAL 0.0
3545    #endif
3546            precision mediump float;
3547            ${DECLARATIONS}
3548            void main()
3549            {
3550                out0 = VAL;
3551                ${OUTPUT}
3552            }
3553        ""
3554    end
3555
3556    case modulo_vs_plus
3557        values { output float out0 = 1.0; }
3558        both ""
3559
3560    #if ( 8 % + 2 ) == 0
3561    #define VAL 1.0
3562    #else
3563    #define VAL 0.0
3564    #endif
3565            precision mediump float;
3566            ${DECLARATIONS}
3567            void main()
3568            {
3569                out0 = VAL;
3570                ${OUTPUT}
3571            }
3572        ""
3573    end
3574
3575    case div_vs_bit_invert
3576        values { output float out0 = 1.0; }
3577        both ""
3578
3579    #if ( 8 / ~ 2 ) == -2
3580    #define VAL 1.0
3581    #else
3582    #define VAL 0.0
3583    #endif
3584            precision mediump float;
3585            ${DECLARATIONS}
3586            void main()
3587            {
3588                out0 = VAL;
3589                ${OUTPUT}
3590            }
3591        ""
3592    end
3593
3594    case div_vs_minus
3595        values { output float out0 = 1.0; }
3596        both ""
3597
3598    #if ( 8 / - 2 ) == -4
3599    #define VAL 1.0
3600    #else
3601    #define VAL 0.0
3602    #endif
3603            precision mediump float;
3604            ${DECLARATIONS}
3605            void main()
3606            {
3607                out0 = VAL;
3608                ${OUTPUT}
3609            }
3610        ""
3611    end
3612
3613    case div_vs_plus
3614        values { output float out0 = 1.0; }
3615        both ""
3616
3617    #if ( 8 / + 2 ) == 4
3618    #define VAL 1.0
3619    #else
3620    #define VAL 0.0
3621    #endif
3622            precision mediump float;
3623            ${DECLARATIONS}
3624            void main()
3625            {
3626                out0 = VAL;
3627                ${OUTPUT}
3628            }
3629        ""
3630    end
3631
3632    case mul_vs_bit_invert
3633        values { output float out0 = 1.0; }
3634        both ""
3635
3636    #if ( 8 * ~ 2 ) == -24
3637    #define VAL 1.0
3638    #else
3639    #define VAL 0.0
3640    #endif
3641            precision mediump float;
3642            ${DECLARATIONS}
3643            void main()
3644            {
3645                out0 = VAL;
3646                ${OUTPUT}
3647            }
3648        ""
3649    end
3650
3651    case mul_vs_minus
3652        values { output float out0 = 1.0; }
3653        both ""
3654
3655    #if ( 8 * - 2 ) == -16
3656    #define VAL 1.0
3657    #else
3658    #define VAL 0.0
3659    #endif
3660            precision mediump float;
3661            ${DECLARATIONS}
3662            void main()
3663            {
3664                out0 = VAL;
3665                ${OUTPUT}
3666            }
3667        ""
3668    end
3669
3670    case mul_vs_plus
3671        values { output float out0 = 1.0; }
3672        both ""
3673
3674    #if ( 8 * + 2 ) == 16
3675    #define VAL 1.0
3676    #else
3677    #define VAL 0.0
3678    #endif
3679            precision mediump float;
3680            ${DECLARATIONS}
3681            void main()
3682            {
3683                out0 = VAL;
3684                ${OUTPUT}
3685            }
3686        ""
3687    end
3688
3689    case sub_vs_modulo
3690        values { output float out0 = 1.0; }
3691        both ""
3692
3693    #if ( 8 - 3 % 2 ) == 7
3694    #define VAL 1.0
3695    #else
3696    #define VAL 0.0
3697    #endif
3698            precision mediump float;
3699            ${DECLARATIONS}
3700            void main()
3701            {
3702                out0 = VAL;
3703                ${OUTPUT}
3704            }
3705        ""
3706    end
3707
3708    case sub_vs_div
3709        values { output float out0 = 1.0; }
3710        both ""
3711
3712    #if ( 8 - 3 / 2 ) == 7
3713    #define VAL 1.0
3714    #else
3715    #define VAL 0.0
3716    #endif
3717            precision mediump float;
3718            ${DECLARATIONS}
3719            void main()
3720            {
3721                out0 = VAL;
3722                ${OUTPUT}
3723            }
3724        ""
3725    end
3726
3727    case sub_vs_mul
3728        values { output float out0 = 1.0; }
3729        both ""
3730
3731    #if ( 8 - 3 * 2 ) == 2
3732    #define VAL 1.0
3733    #else
3734    #define VAL 0.0
3735    #endif
3736            precision mediump float;
3737            ${DECLARATIONS}
3738            void main()
3739            {
3740                out0 = VAL;
3741                ${OUTPUT}
3742            }
3743        ""
3744    end
3745
3746    case add_vs_modulo
3747        values { output float out0 = 1.0; }
3748        both ""
3749
3750    #if ( 8 + 3 % 2 ) == 9
3751    #define VAL 1.0
3752    #else
3753    #define VAL 0.0
3754    #endif
3755            precision mediump float;
3756            ${DECLARATIONS}
3757            void main()
3758            {
3759                out0 = VAL;
3760                ${OUTPUT}
3761            }
3762        ""
3763    end
3764
3765    case add_vs_div
3766        values { output float out0 = 1.0; }
3767        both ""
3768
3769    #if ( 8 + 3 / 2 ) == 9
3770    #define VAL 1.0
3771    #else
3772    #define VAL 0.0
3773    #endif
3774            precision mediump float;
3775            ${DECLARATIONS}
3776            void main()
3777            {
3778                out0 = VAL;
3779                ${OUTPUT}
3780            }
3781        ""
3782    end
3783
3784    case add_vs_mul
3785        values { output float out0 = 1.0; }
3786        both ""
3787
3788    #if ( 8 + 3 * 2 ) == 14
3789    #define VAL 1.0
3790    #else
3791    #define VAL 0.0
3792    #endif
3793            precision mediump float;
3794            ${DECLARATIONS}
3795            void main()
3796            {
3797                out0 = VAL;
3798                ${OUTPUT}
3799            }
3800        ""
3801    end
3802
3803    case rshift_vs_sub
3804        values { output float out0 = 1.0; }
3805        both ""
3806
3807    #if ( 8 >> 3 - 2 ) == 4
3808    #define VAL 1.0
3809    #else
3810    #define VAL 0.0
3811    #endif
3812            precision mediump float;
3813            ${DECLARATIONS}
3814            void main()
3815            {
3816                out0 = VAL;
3817                ${OUTPUT}
3818            }
3819        ""
3820    end
3821
3822    case rshift_vs_add
3823        values { output float out0 = 1.0; }
3824        both ""
3825
3826    #if ( 8 >> 3 + 2 ) == 0
3827    #define VAL 1.0
3828    #else
3829    #define VAL 0.0
3830    #endif
3831            precision mediump float;
3832            ${DECLARATIONS}
3833            void main()
3834            {
3835                out0 = VAL;
3836                ${OUTPUT}
3837            }
3838        ""
3839    end
3840
3841    case lshift_vs_sub
3842        values { output float out0 = 1.0; }
3843        both ""
3844
3845    #if ( 8 << 3 - 2 ) == 16
3846    #define VAL 1.0
3847    #else
3848    #define VAL 0.0
3849    #endif
3850            precision mediump float;
3851            ${DECLARATIONS}
3852            void main()
3853            {
3854                out0 = VAL;
3855                ${OUTPUT}
3856            }
3857        ""
3858    end
3859
3860    case lshift_vs_add
3861        values { output float out0 = 1.0; }
3862        both ""
3863
3864    #if ( 8 << 3 + 2 ) == 256
3865    #define VAL 1.0
3866    #else
3867    #define VAL 0.0
3868    #endif
3869            precision mediump float;
3870            ${DECLARATIONS}
3871            void main()
3872            {
3873                out0 = VAL;
3874                ${OUTPUT}
3875            }
3876        ""
3877    end
3878
3879    case greater_or_equal_vs_rshift
3880        values { output float out0 = 1.0; }
3881        both ""
3882
3883    #if ( 8 >= 3 >> 2 ) == 1
3884    #define VAL 1.0
3885    #else
3886    #define VAL 0.0
3887    #endif
3888            precision mediump float;
3889            ${DECLARATIONS}
3890            void main()
3891            {
3892                out0 = VAL;
3893                ${OUTPUT}
3894            }
3895        ""
3896    end
3897
3898    case greater_or_equal_vs_lshift
3899        values { output float out0 = 1.0; }
3900        both ""
3901
3902    #if ( 8 >= 3 << 2 ) == 0
3903    #define VAL 1.0
3904    #else
3905    #define VAL 0.0
3906    #endif
3907            precision mediump float;
3908            ${DECLARATIONS}
3909            void main()
3910            {
3911                out0 = VAL;
3912                ${OUTPUT}
3913            }
3914        ""
3915    end
3916
3917    case less_or_equal_vs_rshift
3918        values { output float out0 = 1.0; }
3919        both ""
3920
3921    #if ( 8 <= 3 >> 2 ) == 0
3922    #define VAL 1.0
3923    #else
3924    #define VAL 0.0
3925    #endif
3926            precision mediump float;
3927            ${DECLARATIONS}
3928            void main()
3929            {
3930                out0 = VAL;
3931                ${OUTPUT}
3932            }
3933        ""
3934    end
3935
3936    case less_or_equal_vs_lshift
3937        values { output float out0 = 1.0; }
3938        both ""
3939
3940    #if ( 8 <= 3 << 2 ) == 1
3941    #define VAL 1.0
3942    #else
3943    #define VAL 0.0
3944    #endif
3945            precision mediump float;
3946            ${DECLARATIONS}
3947            void main()
3948            {
3949                out0 = VAL;
3950                ${OUTPUT}
3951            }
3952        ""
3953    end
3954
3955    case greater_vs_rshift
3956        values { output float out0 = 1.0; }
3957        both ""
3958
3959    #if ( 8 > 3 >> 2 ) == 1
3960    #define VAL 1.0
3961    #else
3962    #define VAL 0.0
3963    #endif
3964            precision mediump float;
3965            ${DECLARATIONS}
3966            void main()
3967            {
3968                out0 = VAL;
3969                ${OUTPUT}
3970            }
3971        ""
3972    end
3973
3974    case greater_vs_lshift
3975        values { output float out0 = 1.0; }
3976        both ""
3977
3978    #if ( 8 > 3 << 2 ) == 0
3979    #define VAL 1.0
3980    #else
3981    #define VAL 0.0
3982    #endif
3983            precision mediump float;
3984            ${DECLARATIONS}
3985            void main()
3986            {
3987                out0 = VAL;
3988                ${OUTPUT}
3989            }
3990        ""
3991    end
3992
3993    case less_vs_rshift
3994        values { output float out0 = 1.0; }
3995        both ""
3996
3997    #if ( 8 < 3 >> 2 ) == 0
3998    #define VAL 1.0
3999    #else
4000    #define VAL 0.0
4001    #endif
4002            precision mediump float;
4003            ${DECLARATIONS}
4004            void main()
4005            {
4006                out0 = VAL;
4007                ${OUTPUT}
4008            }
4009        ""
4010    end
4011
4012    case less_vs_lshift
4013        values { output float out0 = 1.0; }
4014        both ""
4015
4016    #if ( 8 < 3 << 2 ) == 1
4017    #define VAL 1.0
4018    #else
4019    #define VAL 0.0
4020    #endif
4021            precision mediump float;
4022            ${DECLARATIONS}
4023            void main()
4024            {
4025                out0 = VAL;
4026                ${OUTPUT}
4027            }
4028        ""
4029    end
4030
4031    case not_equal_vs_greater_or_equal
4032        values { output float out0 = 1.0; }
4033        both ""
4034
4035    #if ( 8 != 3 >= 2 ) == 1
4036    #define VAL 1.0
4037    #else
4038    #define VAL 0.0
4039    #endif
4040            precision mediump float;
4041            ${DECLARATIONS}
4042            void main()
4043            {
4044                out0 = VAL;
4045                ${OUTPUT}
4046            }
4047        ""
4048    end
4049
4050    case not_equal_vs_less_or_equal
4051        values { output float out0 = 1.0; }
4052        both ""
4053
4054    #if ( 8 != 3 <= 2 ) == 1
4055    #define VAL 1.0
4056    #else
4057    #define VAL 0.0
4058    #endif
4059            precision mediump float;
4060            ${DECLARATIONS}
4061            void main()
4062            {
4063                out0 = VAL;
4064                ${OUTPUT}
4065            }
4066        ""
4067    end
4068
4069    case not_equal_vs_greater
4070        values { output float out0 = 1.0; }
4071        both ""
4072
4073    #if ( 8 != 3 > 2 ) == 1
4074    #define VAL 1.0
4075    #else
4076    #define VAL 0.0
4077    #endif
4078            precision mediump float;
4079            ${DECLARATIONS}
4080            void main()
4081            {
4082                out0 = VAL;
4083                ${OUTPUT}
4084            }
4085        ""
4086    end
4087
4088    case not_equal_vs_less
4089        values { output float out0 = 1.0; }
4090        both ""
4091
4092    #if ( 8 != 3 < 2 ) == 1
4093    #define VAL 1.0
4094    #else
4095    #define VAL 0.0
4096    #endif
4097            precision mediump float;
4098            ${DECLARATIONS}
4099            void main()
4100            {
4101                out0 = VAL;
4102                ${OUTPUT}
4103            }
4104        ""
4105    end
4106
4107    case equal_vs_greater_or_equal
4108        values { output float out0 = 1.0; }
4109        both ""
4110
4111    #if ( 8 == 3 >= 2 ) == 0
4112    #define VAL 1.0
4113    #else
4114    #define VAL 0.0
4115    #endif
4116            precision mediump float;
4117            ${DECLARATIONS}
4118            void main()
4119            {
4120                out0 = VAL;
4121                ${OUTPUT}
4122            }
4123        ""
4124    end
4125
4126    case equal_vs_less_or_equal
4127        values { output float out0 = 1.0; }
4128        both ""
4129
4130    #if ( 8 == 3 <= 2 ) == 0
4131    #define VAL 1.0
4132    #else
4133    #define VAL 0.0
4134    #endif
4135            precision mediump float;
4136            ${DECLARATIONS}
4137            void main()
4138            {
4139                out0 = VAL;
4140                ${OUTPUT}
4141            }
4142        ""
4143    end
4144
4145    case equal_vs_greater
4146        values { output float out0 = 1.0; }
4147        both ""
4148
4149    #if ( 8 == 3 > 2 ) == 0
4150    #define VAL 1.0
4151    #else
4152    #define VAL 0.0
4153    #endif
4154            precision mediump float;
4155            ${DECLARATIONS}
4156            void main()
4157            {
4158                out0 = VAL;
4159                ${OUTPUT}
4160            }
4161        ""
4162    end
4163
4164    case equal_vs_less
4165        values { output float out0 = 1.0; }
4166        both ""
4167
4168    #if ( 8 == 3 < 2 ) == 0
4169    #define VAL 1.0
4170    #else
4171    #define VAL 0.0
4172    #endif
4173            precision mediump float;
4174            ${DECLARATIONS}
4175            void main()
4176            {
4177                out0 = VAL;
4178                ${OUTPUT}
4179            }
4180        ""
4181    end
4182
4183    case bitwise_and_vs_not_equal
4184        values { output float out0 = 1.0; }
4185        both ""
4186
4187    #if ( 8 & 3 != 2 ) == 0
4188    #define VAL 1.0
4189    #else
4190    #define VAL 0.0
4191    #endif
4192            precision mediump float;
4193            ${DECLARATIONS}
4194            void main()
4195            {
4196                out0 = VAL;
4197                ${OUTPUT}
4198            }
4199        ""
4200    end
4201
4202    case bitwise_and_vs_equal
4203        values { output float out0 = 1.0; }
4204        both ""
4205
4206    #if ( 8 & 3 == 2 ) == 0
4207    #define VAL 1.0
4208    #else
4209    #define VAL 0.0
4210    #endif
4211            precision mediump float;
4212            ${DECLARATIONS}
4213            void main()
4214            {
4215                out0 = VAL;
4216                ${OUTPUT}
4217            }
4218        ""
4219    end
4220
4221    case xor_vs_bitwise_and
4222        values { output float out0 = 1.0; }
4223        both ""
4224
4225    #if ( 8 ^ 3 & 2 ) == 10
4226    #define VAL 1.0
4227    #else
4228    #define VAL 0.0
4229    #endif
4230            precision mediump float;
4231            ${DECLARATIONS}
4232            void main()
4233            {
4234                out0 = VAL;
4235                ${OUTPUT}
4236            }
4237        ""
4238    end
4239
4240    case bitwise_or_vs_xor
4241        values { output float out0 = 1.0; }
4242        both ""
4243
4244    #if ( 8 | 3 ^ 2 ) == 9
4245    #define VAL 1.0
4246    #else
4247    #define VAL 0.0
4248    #endif
4249            precision mediump float;
4250            ${DECLARATIONS}
4251            void main()
4252            {
4253                out0 = VAL;
4254                ${OUTPUT}
4255            }
4256        ""
4257    end
4258
4259    case logical_and_vs_bitwise_or
4260        values { output float out0 = 1.0; }
4261        both ""
4262
4263    #if ( 0 && 3 | 2 )
4264    #define VAL 0.0
4265    #else
4266    #define VAL 1.0
4267    #endif
4268            precision mediump float;
4269            ${DECLARATIONS}
4270            void main()
4271            {
4272                out0 = VAL;
4273                ${OUTPUT}
4274            }
4275        ""
4276    end
4277
4278    case logical_and_vs_bitwise_and
4279        values { output float out0 = 1.0; }
4280        both ""
4281
4282    #if ( 0 && 4 & 2 )
4283    #define VAL 0.0
4284    #else
4285    #define VAL 1.0
4286    #endif
4287            precision mediump float;
4288            ${DECLARATIONS}
4289            void main()
4290            {
4291                out0 = VAL;
4292                ${OUTPUT}
4293            }
4294        ""
4295    end
4296
4297    case logical_or_vs_logical_and
4298        values { output float out0 = 1.0; }
4299        both ""
4300
4301    #if ( 0 || 4 && 0 )
4302    #define VAL 0.0
4303    #else
4304    #define VAL 1.0
4305    #endif
4306            precision mediump float;
4307            ${DECLARATIONS}
4308            void main()
4309            {
4310                out0 = VAL;
4311                ${OUTPUT}
4312            }
4313        ""
4314    end
4315
4316end # operator_precedence
4317