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