glsl: Track in each ir_variable whether it was ever assigned.
[profile/ivi/mesa.git] / src / glsl / ast_to_hir.cpp
1 /*
2  * Copyright © 2010 Intel Corporation
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21  * DEALINGS IN THE SOFTWARE.
22  */
23
24 /**
25  * \file ast_to_hir.c
26  * Convert abstract syntax to to high-level intermediate reprensentation (HIR).
27  *
28  * During the conversion to HIR, the majority of the symantic checking is
29  * preformed on the program.  This includes:
30  *
31  *    * Symbol table management
32  *    * Type checking
33  *    * Function binding
34  *
35  * The majority of this work could be done during parsing, and the parser could
36  * probably generate HIR directly.  However, this results in frequent changes
37  * to the parser code.  Since we do not assume that every system this complier
38  * is built on will have Flex and Bison installed, we have to store the code
39  * generated by these tools in our version control system.  In other parts of
40  * the system we've seen problems where a parser was changed but the generated
41  * code was not committed, merge conflicts where created because two developers
42  * had slightly different versions of Bison installed, etc.
43  *
44  * I have also noticed that running Bison generated parsers in GDB is very
45  * irritating.  When you get a segfault on '$$ = $1->foo', you can't very
46  * well 'print $1' in GDB.
47  *
48  * As a result, my preference is to put as little C code as possible in the
49  * parser (and lexer) sources.
50  */
51
52 #include "main/core.h" /* for struct gl_extensions */
53 #include "glsl_symbol_table.h"
54 #include "glsl_parser_extras.h"
55 #include "ast.h"
56 #include "glsl_types.h"
57 #include "program/hash_table.h"
58 #include "ir.h"
59
60 void
61 _mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state)
62 {
63    _mesa_glsl_initialize_variables(instructions, state);
64
65    state->symbols->language_version = state->language_version;
66
67    state->current_function = NULL;
68
69    state->toplevel_ir = instructions;
70
71    /* Section 4.2 of the GLSL 1.20 specification states:
72     * "The built-in functions are scoped in a scope outside the global scope
73     *  users declare global variables in.  That is, a shader's global scope,
74     *  available for user-defined functions and global variables, is nested
75     *  inside the scope containing the built-in functions."
76     *
77     * Since built-in functions like ftransform() access built-in variables,
78     * it follows that those must be in the outer scope as well.
79     *
80     * We push scope here to create this nesting effect...but don't pop.
81     * This way, a shader's globals are still in the symbol table for use
82     * by the linker.
83     */
84    state->symbols->push_scope();
85
86    foreach_list_typed (ast_node, ast, link, & state->translation_unit)
87       ast->hir(instructions, state);
88
89    detect_recursion_unlinked(state, instructions);
90
91    state->toplevel_ir = NULL;
92 }
93
94
95 /**
96  * If a conversion is available, convert one operand to a different type
97  *
98  * The \c from \c ir_rvalue is converted "in place".
99  *
100  * \param to     Type that the operand it to be converted to
101  * \param from   Operand that is being converted
102  * \param state  GLSL compiler state
103  *
104  * \return
105  * If a conversion is possible (or unnecessary), \c true is returned.
106  * Otherwise \c false is returned.
107  */
108 bool
109 apply_implicit_conversion(const glsl_type *to, ir_rvalue * &from,
110                           struct _mesa_glsl_parse_state *state)
111 {
112    void *ctx = state;
113    if (to->base_type == from->type->base_type)
114       return true;
115
116    /* This conversion was added in GLSL 1.20.  If the compilation mode is
117     * GLSL 1.10, the conversion is skipped.
118     */
119    if (state->language_version < 120)
120       return false;
121
122    /* From page 27 (page 33 of the PDF) of the GLSL 1.50 spec:
123     *
124     *    "There are no implicit array or structure conversions. For
125     *    example, an array of int cannot be implicitly converted to an
126     *    array of float. There are no implicit conversions between
127     *    signed and unsigned integers."
128     */
129    /* FINISHME: The above comment is partially a lie.  There is int/uint
130     * FINISHME: conversion for immediate constants.
131     */
132    if (!to->is_float() || !from->type->is_numeric())
133       return false;
134
135    /* Convert to a floating point type with the same number of components
136     * as the original type - i.e. int to float, not int to vec4.
137     */
138    to = glsl_type::get_instance(GLSL_TYPE_FLOAT, from->type->vector_elements,
139                                 from->type->matrix_columns);
140
141    switch (from->type->base_type) {
142    case GLSL_TYPE_INT:
143       from = new(ctx) ir_expression(ir_unop_i2f, to, from, NULL);
144       break;
145    case GLSL_TYPE_UINT:
146       from = new(ctx) ir_expression(ir_unop_u2f, to, from, NULL);
147       break;
148    case GLSL_TYPE_BOOL:
149       from = new(ctx) ir_expression(ir_unop_b2f, to, from, NULL);
150       break;
151    default:
152       assert(0);
153    }
154
155    return true;
156 }
157
158
159 static const struct glsl_type *
160 arithmetic_result_type(ir_rvalue * &value_a, ir_rvalue * &value_b,
161                        bool multiply,
162                        struct _mesa_glsl_parse_state *state, YYLTYPE *loc)
163 {
164    const glsl_type *type_a = value_a->type;
165    const glsl_type *type_b = value_b->type;
166
167    /* From GLSL 1.50 spec, page 56:
168     *
169     *    "The arithmetic binary operators add (+), subtract (-),
170     *    multiply (*), and divide (/) operate on integer and
171     *    floating-point scalars, vectors, and matrices."
172     */
173    if (!type_a->is_numeric() || !type_b->is_numeric()) {
174       _mesa_glsl_error(loc, state,
175                        "Operands to arithmetic operators must be numeric");
176       return glsl_type::error_type;
177    }
178
179
180    /*    "If one operand is floating-point based and the other is
181     *    not, then the conversions from Section 4.1.10 "Implicit
182     *    Conversions" are applied to the non-floating-point-based operand."
183     */
184    if (!apply_implicit_conversion(type_a, value_b, state)
185        && !apply_implicit_conversion(type_b, value_a, state)) {
186       _mesa_glsl_error(loc, state,
187                        "Could not implicitly convert operands to "
188                        "arithmetic operator");
189       return glsl_type::error_type;
190    }
191    type_a = value_a->type;
192    type_b = value_b->type;
193
194    /*    "If the operands are integer types, they must both be signed or
195     *    both be unsigned."
196     *
197     * From this rule and the preceeding conversion it can be inferred that
198     * both types must be GLSL_TYPE_FLOAT, or GLSL_TYPE_UINT, or GLSL_TYPE_INT.
199     * The is_numeric check above already filtered out the case where either
200     * type is not one of these, so now the base types need only be tested for
201     * equality.
202     */
203    if (type_a->base_type != type_b->base_type) {
204       _mesa_glsl_error(loc, state,
205                        "base type mismatch for arithmetic operator");
206       return glsl_type::error_type;
207    }
208
209    /*    "All arithmetic binary operators result in the same fundamental type
210     *    (signed integer, unsigned integer, or floating-point) as the
211     *    operands they operate on, after operand type conversion. After
212     *    conversion, the following cases are valid
213     *
214     *    * The two operands are scalars. In this case the operation is
215     *      applied, resulting in a scalar."
216     */
217    if (type_a->is_scalar() && type_b->is_scalar())
218       return type_a;
219
220    /*   "* One operand is a scalar, and the other is a vector or matrix.
221     *      In this case, the scalar operation is applied independently to each
222     *      component of the vector or matrix, resulting in the same size
223     *      vector or matrix."
224     */
225    if (type_a->is_scalar()) {
226       if (!type_b->is_scalar())
227          return type_b;
228    } else if (type_b->is_scalar()) {
229       return type_a;
230    }
231
232    /* All of the combinations of <scalar, scalar>, <vector, scalar>,
233     * <scalar, vector>, <scalar, matrix>, and <matrix, scalar> have been
234     * handled.
235     */
236    assert(!type_a->is_scalar());
237    assert(!type_b->is_scalar());
238
239    /*   "* The two operands are vectors of the same size. In this case, the
240     *      operation is done component-wise resulting in the same size
241     *      vector."
242     */
243    if (type_a->is_vector() && type_b->is_vector()) {
244       if (type_a == type_b) {
245          return type_a;
246       } else {
247          _mesa_glsl_error(loc, state,
248                           "vector size mismatch for arithmetic operator");
249          return glsl_type::error_type;
250       }
251    }
252
253    /* All of the combinations of <scalar, scalar>, <vector, scalar>,
254     * <scalar, vector>, <scalar, matrix>, <matrix, scalar>, and
255     * <vector, vector> have been handled.  At least one of the operands must
256     * be matrix.  Further, since there are no integer matrix types, the base
257     * type of both operands must be float.
258     */
259    assert(type_a->is_matrix() || type_b->is_matrix());
260    assert(type_a->base_type == GLSL_TYPE_FLOAT);
261    assert(type_b->base_type == GLSL_TYPE_FLOAT);
262
263    /*   "* The operator is add (+), subtract (-), or divide (/), and the
264     *      operands are matrices with the same number of rows and the same
265     *      number of columns. In this case, the operation is done component-
266     *      wise resulting in the same size matrix."
267     *    * The operator is multiply (*), where both operands are matrices or
268     *      one operand is a vector and the other a matrix. A right vector
269     *      operand is treated as a column vector and a left vector operand as a
270     *      row vector. In all these cases, it is required that the number of
271     *      columns of the left operand is equal to the number of rows of the
272     *      right operand. Then, the multiply (*) operation does a linear
273     *      algebraic multiply, yielding an object that has the same number of
274     *      rows as the left operand and the same number of columns as the right
275     *      operand. Section 5.10 "Vector and Matrix Operations" explains in
276     *      more detail how vectors and matrices are operated on."
277     */
278    if (! multiply) {
279       if (type_a == type_b)
280          return type_a;
281    } else {
282       if (type_a->is_matrix() && type_b->is_matrix()) {
283          /* Matrix multiply.  The columns of A must match the rows of B.  Given
284           * the other previously tested constraints, this means the vector type
285           * of a row from A must be the same as the vector type of a column from
286           * B.
287           */
288          if (type_a->row_type() == type_b->column_type()) {
289             /* The resulting matrix has the number of columns of matrix B and
290              * the number of rows of matrix A.  We get the row count of A by
291              * looking at the size of a vector that makes up a column.  The
292              * transpose (size of a row) is done for B.
293              */
294             const glsl_type *const type =
295                glsl_type::get_instance(type_a->base_type,
296                                        type_a->column_type()->vector_elements,
297                                        type_b->row_type()->vector_elements);
298             assert(type != glsl_type::error_type);
299
300             return type;
301          }
302       } else if (type_a->is_matrix()) {
303          /* A is a matrix and B is a column vector.  Columns of A must match
304           * rows of B.  Given the other previously tested constraints, this
305           * means the vector type of a row from A must be the same as the
306           * vector the type of B.
307           */
308          if (type_a->row_type() == type_b) {
309             /* The resulting vector has a number of elements equal to
310              * the number of rows of matrix A. */
311             const glsl_type *const type =
312                glsl_type::get_instance(type_a->base_type,
313                                        type_a->column_type()->vector_elements,
314                                        1);
315             assert(type != glsl_type::error_type);
316
317             return type;
318          }
319       } else {
320          assert(type_b->is_matrix());
321
322          /* A is a row vector and B is a matrix.  Columns of A must match rows
323           * of B.  Given the other previously tested constraints, this means
324           * the type of A must be the same as the vector type of a column from
325           * B.
326           */
327          if (type_a == type_b->column_type()) {
328             /* The resulting vector has a number of elements equal to
329              * the number of columns of matrix B. */
330             const glsl_type *const type =
331                glsl_type::get_instance(type_a->base_type,
332                                        type_b->row_type()->vector_elements,
333                                        1);
334             assert(type != glsl_type::error_type);
335
336             return type;
337          }
338       }
339
340       _mesa_glsl_error(loc, state, "size mismatch for matrix multiplication");
341       return glsl_type::error_type;
342    }
343
344
345    /*    "All other cases are illegal."
346     */
347    _mesa_glsl_error(loc, state, "type mismatch");
348    return glsl_type::error_type;
349 }
350
351
352 static const struct glsl_type *
353 unary_arithmetic_result_type(const struct glsl_type *type,
354                              struct _mesa_glsl_parse_state *state, YYLTYPE *loc)
355 {
356    /* From GLSL 1.50 spec, page 57:
357     *
358     *    "The arithmetic unary operators negate (-), post- and pre-increment
359     *     and decrement (-- and ++) operate on integer or floating-point
360     *     values (including vectors and matrices). All unary operators work
361     *     component-wise on their operands. These result with the same type
362     *     they operated on."
363     */
364    if (!type->is_numeric()) {
365       _mesa_glsl_error(loc, state,
366                        "Operands to arithmetic operators must be numeric");
367       return glsl_type::error_type;
368    }
369
370    return type;
371 }
372
373 /**
374  * \brief Return the result type of a bit-logic operation.
375  *
376  * If the given types to the bit-logic operator are invalid, return
377  * glsl_type::error_type.
378  *
379  * \param type_a Type of LHS of bit-logic op
380  * \param type_b Type of RHS of bit-logic op
381  */
382 static const struct glsl_type *
383 bit_logic_result_type(const struct glsl_type *type_a,
384                       const struct glsl_type *type_b,
385                       ast_operators op,
386                       struct _mesa_glsl_parse_state *state, YYLTYPE *loc)
387 {
388     if (state->language_version < 130) {
389        _mesa_glsl_error(loc, state, "bit operations require GLSL 1.30");
390        return glsl_type::error_type;
391     }
392
393     /* From page 50 (page 56 of PDF) of GLSL 1.30 spec:
394      *
395      *     "The bitwise operators and (&), exclusive-or (^), and inclusive-or
396      *     (|). The operands must be of type signed or unsigned integers or
397      *     integer vectors."
398      */
399     if (!type_a->is_integer()) {
400        _mesa_glsl_error(loc, state, "LHS of `%s' must be an integer",
401                          ast_expression::operator_string(op));
402        return glsl_type::error_type;
403     }
404     if (!type_b->is_integer()) {
405        _mesa_glsl_error(loc, state, "RHS of `%s' must be an integer",
406                         ast_expression::operator_string(op));
407        return glsl_type::error_type;
408     }
409
410     /*     "The fundamental types of the operands (signed or unsigned) must
411      *     match,"
412      */
413     if (type_a->base_type != type_b->base_type) {
414        _mesa_glsl_error(loc, state, "operands of `%s' must have the same "
415                         "base type", ast_expression::operator_string(op));
416        return glsl_type::error_type;
417     }
418
419     /*     "The operands cannot be vectors of differing size." */
420     if (type_a->is_vector() &&
421         type_b->is_vector() &&
422         type_a->vector_elements != type_b->vector_elements) {
423        _mesa_glsl_error(loc, state, "operands of `%s' cannot be vectors of "
424                         "different sizes", ast_expression::operator_string(op));
425        return glsl_type::error_type;
426     }
427
428     /*     "If one operand is a scalar and the other a vector, the scalar is
429      *     applied component-wise to the vector, resulting in the same type as
430      *     the vector. The fundamental types of the operands [...] will be the
431      *     resulting fundamental type."
432      */
433     if (type_a->is_scalar())
434         return type_b;
435     else
436         return type_a;
437 }
438
439 static const struct glsl_type *
440 modulus_result_type(const struct glsl_type *type_a,
441                     const struct glsl_type *type_b,
442                     struct _mesa_glsl_parse_state *state, YYLTYPE *loc)
443 {
444    if (state->language_version < 130) {
445       _mesa_glsl_error(loc, state,
446                        "operator '%%' is reserved in %s",
447                        state->version_string);
448       return glsl_type::error_type;
449    }
450
451    /* From GLSL 1.50 spec, page 56:
452     *    "The operator modulus (%) operates on signed or unsigned integers or
453     *    integer vectors. The operand types must both be signed or both be
454     *    unsigned."
455     */
456    if (!type_a->is_integer()) {
457       _mesa_glsl_error(loc, state, "LHS of operator %% must be an integer.");
458       return glsl_type::error_type;
459    }
460    if (!type_b->is_integer()) {
461       _mesa_glsl_error(loc, state, "RHS of operator %% must be an integer.");
462       return glsl_type::error_type;
463    }
464    if (type_a->base_type != type_b->base_type) {
465       _mesa_glsl_error(loc, state,
466                        "operands of %% must have the same base type");
467       return glsl_type::error_type;
468    }
469
470    /*    "The operands cannot be vectors of differing size. If one operand is
471     *    a scalar and the other vector, then the scalar is applied component-
472     *    wise to the vector, resulting in the same type as the vector. If both
473     *    are vectors of the same size, the result is computed component-wise."
474     */
475    if (type_a->is_vector()) {
476       if (!type_b->is_vector()
477           || (type_a->vector_elements == type_b->vector_elements))
478          return type_a;
479    } else
480       return type_b;
481
482    /*    "The operator modulus (%) is not defined for any other data types
483     *    (non-integer types)."
484     */
485    _mesa_glsl_error(loc, state, "type mismatch");
486    return glsl_type::error_type;
487 }
488
489
490 static const struct glsl_type *
491 relational_result_type(ir_rvalue * &value_a, ir_rvalue * &value_b,
492                        struct _mesa_glsl_parse_state *state, YYLTYPE *loc)
493 {
494    const glsl_type *type_a = value_a->type;
495    const glsl_type *type_b = value_b->type;
496
497    /* From GLSL 1.50 spec, page 56:
498     *    "The relational operators greater than (>), less than (<), greater
499     *    than or equal (>=), and less than or equal (<=) operate only on
500     *    scalar integer and scalar floating-point expressions."
501     */
502    if (!type_a->is_numeric()
503        || !type_b->is_numeric()
504        || !type_a->is_scalar()
505        || !type_b->is_scalar()) {
506       _mesa_glsl_error(loc, state,
507                        "Operands to relational operators must be scalar and "
508                        "numeric");
509       return glsl_type::error_type;
510    }
511
512    /*    "Either the operands' types must match, or the conversions from
513     *    Section 4.1.10 "Implicit Conversions" will be applied to the integer
514     *    operand, after which the types must match."
515     */
516    if (!apply_implicit_conversion(type_a, value_b, state)
517        && !apply_implicit_conversion(type_b, value_a, state)) {
518       _mesa_glsl_error(loc, state,
519                        "Could not implicitly convert operands to "
520                        "relational operator");
521       return glsl_type::error_type;
522    }
523    type_a = value_a->type;
524    type_b = value_b->type;
525
526    if (type_a->base_type != type_b->base_type) {
527       _mesa_glsl_error(loc, state, "base type mismatch");
528       return glsl_type::error_type;
529    }
530
531    /*    "The result is scalar Boolean."
532     */
533    return glsl_type::bool_type;
534 }
535
536 /**
537  * \brief Return the result type of a bit-shift operation.
538  *
539  * If the given types to the bit-shift operator are invalid, return
540  * glsl_type::error_type.
541  *
542  * \param type_a Type of LHS of bit-shift op
543  * \param type_b Type of RHS of bit-shift op
544  */
545 static const struct glsl_type *
546 shift_result_type(const struct glsl_type *type_a,
547                   const struct glsl_type *type_b,
548                   ast_operators op,
549                   struct _mesa_glsl_parse_state *state, YYLTYPE *loc)
550 {
551    if (state->language_version < 130) {
552       _mesa_glsl_error(loc, state, "bit operations require GLSL 1.30");
553       return glsl_type::error_type;
554    }
555
556    /* From page 50 (page 56 of the PDF) of the GLSL 1.30 spec:
557     *
558     *     "The shift operators (<<) and (>>). For both operators, the operands
559     *     must be signed or unsigned integers or integer vectors. One operand
560     *     can be signed while the other is unsigned."
561     */
562    if (!type_a->is_integer()) {
563       _mesa_glsl_error(loc, state, "LHS of operator %s must be an integer or "
564               "integer vector", ast_expression::operator_string(op));
565      return glsl_type::error_type;
566
567    }
568    if (!type_b->is_integer()) {
569       _mesa_glsl_error(loc, state, "RHS of operator %s must be an integer or "
570               "integer vector", ast_expression::operator_string(op));
571      return glsl_type::error_type;
572    }
573
574    /*     "If the first operand is a scalar, the second operand has to be
575     *     a scalar as well."
576     */
577    if (type_a->is_scalar() && !type_b->is_scalar()) {
578       _mesa_glsl_error(loc, state, "If the first operand of %s is scalar, the "
579               "second must be scalar as well",
580               ast_expression::operator_string(op));
581      return glsl_type::error_type;
582    }
583
584    /* If both operands are vectors, check that they have same number of
585     * elements.
586     */
587    if (type_a->is_vector() &&
588       type_b->is_vector() &&
589       type_a->vector_elements != type_b->vector_elements) {
590       _mesa_glsl_error(loc, state, "Vector operands to operator %s must "
591               "have same number of elements",
592               ast_expression::operator_string(op));
593      return glsl_type::error_type;
594    }
595
596    /*     "In all cases, the resulting type will be the same type as the left
597     *     operand."
598     */
599    return type_a;
600 }
601
602 /**
603  * Validates that a value can be assigned to a location with a specified type
604  *
605  * Validates that \c rhs can be assigned to some location.  If the types are
606  * not an exact match but an automatic conversion is possible, \c rhs will be
607  * converted.
608  *
609  * \return
610  * \c NULL if \c rhs cannot be assigned to a location with type \c lhs_type.
611  * Otherwise the actual RHS to be assigned will be returned.  This may be
612  * \c rhs, or it may be \c rhs after some type conversion.
613  *
614  * \note
615  * In addition to being used for assignments, this function is used to
616  * type-check return values.
617  */
618 ir_rvalue *
619 validate_assignment(struct _mesa_glsl_parse_state *state,
620                     const glsl_type *lhs_type, ir_rvalue *rhs,
621                     bool is_initializer)
622 {
623    /* If there is already some error in the RHS, just return it.  Anything
624     * else will lead to an avalanche of error message back to the user.
625     */
626    if (rhs->type->is_error())
627       return rhs;
628
629    /* If the types are identical, the assignment can trivially proceed.
630     */
631    if (rhs->type == lhs_type)
632       return rhs;
633
634    /* If the array element types are the same and the size of the LHS is zero,
635     * the assignment is okay for initializers embedded in variable
636     * declarations.
637     *
638     * Note: Whole-array assignments are not permitted in GLSL 1.10, but this
639     * is handled by ir_dereference::is_lvalue.
640     */
641    if (is_initializer && lhs_type->is_array() && rhs->type->is_array()
642        && (lhs_type->element_type() == rhs->type->element_type())
643        && (lhs_type->array_size() == 0)) {
644       return rhs;
645    }
646
647    /* Check for implicit conversion in GLSL 1.20 */
648    if (apply_implicit_conversion(lhs_type, rhs, state)) {
649       if (rhs->type == lhs_type)
650          return rhs;
651    }
652
653    return NULL;
654 }
655
656 static void
657 mark_whole_array_access(ir_rvalue *access)
658 {
659    ir_dereference_variable *deref = access->as_dereference_variable();
660
661    if (deref && deref->var) {
662       deref->var->max_array_access = deref->type->length - 1;
663    }
664 }
665
666 ir_rvalue *
667 do_assignment(exec_list *instructions, struct _mesa_glsl_parse_state *state,
668               const char *non_lvalue_description,
669               ir_rvalue *lhs, ir_rvalue *rhs, bool is_initializer,
670               YYLTYPE lhs_loc)
671 {
672    void *ctx = state;
673    bool error_emitted = (lhs->type->is_error() || rhs->type->is_error());
674
675    ir_variable *lhs_var = lhs->variable_referenced();
676    if (lhs_var)
677       lhs_var->assigned = true;
678
679    if (!error_emitted) {
680       if (non_lvalue_description != NULL) {
681          _mesa_glsl_error(&lhs_loc, state,
682                           "assignment to %s",
683                           non_lvalue_description);
684          error_emitted = true;
685       } else if (lhs->variable_referenced() != NULL
686                  && lhs->variable_referenced()->read_only) {
687          _mesa_glsl_error(&lhs_loc, state,
688                           "assignment to read-only variable '%s'",
689                           lhs->variable_referenced()->name);
690          error_emitted = true;
691
692       } else if (state->language_version <= 110 && lhs->type->is_array()) {
693          /* From page 32 (page 38 of the PDF) of the GLSL 1.10 spec:
694           *
695           *    "Other binary or unary expressions, non-dereferenced
696           *     arrays, function names, swizzles with repeated fields,
697           *     and constants cannot be l-values."
698           */
699          _mesa_glsl_error(&lhs_loc, state, "whole array assignment is not "
700                           "allowed in GLSL 1.10 or GLSL ES 1.00.");
701          error_emitted = true;
702       } else if (!lhs->is_lvalue()) {
703          _mesa_glsl_error(& lhs_loc, state, "non-lvalue in assignment");
704          error_emitted = true;
705       }
706    }
707
708    ir_rvalue *new_rhs =
709       validate_assignment(state, lhs->type, rhs, is_initializer);
710    if (new_rhs == NULL) {
711       _mesa_glsl_error(& lhs_loc, state, "type mismatch");
712    } else {
713       rhs = new_rhs;
714
715       /* If the LHS array was not declared with a size, it takes it size from
716        * the RHS.  If the LHS is an l-value and a whole array, it must be a
717        * dereference of a variable.  Any other case would require that the LHS
718        * is either not an l-value or not a whole array.
719        */
720       if (lhs->type->array_size() == 0) {
721          ir_dereference *const d = lhs->as_dereference();
722
723          assert(d != NULL);
724
725          ir_variable *const var = d->variable_referenced();
726
727          assert(var != NULL);
728
729          if (var->max_array_access >= unsigned(rhs->type->array_size())) {
730             /* FINISHME: This should actually log the location of the RHS. */
731             _mesa_glsl_error(& lhs_loc, state, "array size must be > %u due to "
732                              "previous access",
733                              var->max_array_access);
734          }
735
736          var->type = glsl_type::get_array_instance(lhs->type->element_type(),
737                                                    rhs->type->array_size());
738          d->type = var->type;
739       }
740       mark_whole_array_access(rhs);
741       mark_whole_array_access(lhs);
742    }
743
744    /* Most callers of do_assignment (assign, add_assign, pre_inc/dec,
745     * but not post_inc) need the converted assigned value as an rvalue
746     * to handle things like:
747     *
748     * i = j += 1;
749     *
750     * So we always just store the computed value being assigned to a
751     * temporary and return a deref of that temporary.  If the rvalue
752     * ends up not being used, the temp will get copy-propagated out.
753     */
754    ir_variable *var = new(ctx) ir_variable(rhs->type, "assignment_tmp",
755                                            ir_var_temporary);
756    ir_dereference_variable *deref_var = new(ctx) ir_dereference_variable(var);
757    instructions->push_tail(var);
758    instructions->push_tail(new(ctx) ir_assignment(deref_var,
759                                                   rhs,
760                                                   NULL));
761    deref_var = new(ctx) ir_dereference_variable(var);
762
763    if (!error_emitted)
764       instructions->push_tail(new(ctx) ir_assignment(lhs, deref_var, NULL));
765
766    return new(ctx) ir_dereference_variable(var);
767 }
768
769 static ir_rvalue *
770 get_lvalue_copy(exec_list *instructions, ir_rvalue *lvalue)
771 {
772    void *ctx = ralloc_parent(lvalue);
773    ir_variable *var;
774
775    var = new(ctx) ir_variable(lvalue->type, "_post_incdec_tmp",
776                               ir_var_temporary);
777    instructions->push_tail(var);
778    var->mode = ir_var_auto;
779
780    instructions->push_tail(new(ctx) ir_assignment(new(ctx) ir_dereference_variable(var),
781                                                   lvalue, NULL));
782
783    return new(ctx) ir_dereference_variable(var);
784 }
785
786
787 ir_rvalue *
788 ast_node::hir(exec_list *instructions,
789               struct _mesa_glsl_parse_state *state)
790 {
791    (void) instructions;
792    (void) state;
793
794    return NULL;
795 }
796
797 static ir_rvalue *
798 do_comparison(void *mem_ctx, int operation, ir_rvalue *op0, ir_rvalue *op1)
799 {
800    int join_op;
801    ir_rvalue *cmp = NULL;
802
803    if (operation == ir_binop_all_equal)
804       join_op = ir_binop_logic_and;
805    else
806       join_op = ir_binop_logic_or;
807
808    switch (op0->type->base_type) {
809    case GLSL_TYPE_FLOAT:
810    case GLSL_TYPE_UINT:
811    case GLSL_TYPE_INT:
812    case GLSL_TYPE_BOOL:
813       return new(mem_ctx) ir_expression(operation, op0, op1);
814
815    case GLSL_TYPE_ARRAY: {
816       for (unsigned int i = 0; i < op0->type->length; i++) {
817          ir_rvalue *e0, *e1, *result;
818
819          e0 = new(mem_ctx) ir_dereference_array(op0->clone(mem_ctx, NULL),
820                                                 new(mem_ctx) ir_constant(i));
821          e1 = new(mem_ctx) ir_dereference_array(op1->clone(mem_ctx, NULL),
822                                                 new(mem_ctx) ir_constant(i));
823          result = do_comparison(mem_ctx, operation, e0, e1);
824
825          if (cmp) {
826             cmp = new(mem_ctx) ir_expression(join_op, cmp, result);
827          } else {
828             cmp = result;
829          }
830       }
831
832       mark_whole_array_access(op0);
833       mark_whole_array_access(op1);
834       break;
835    }
836
837    case GLSL_TYPE_STRUCT: {
838       for (unsigned int i = 0; i < op0->type->length; i++) {
839          ir_rvalue *e0, *e1, *result;
840          const char *field_name = op0->type->fields.structure[i].name;
841
842          e0 = new(mem_ctx) ir_dereference_record(op0->clone(mem_ctx, NULL),
843                                                  field_name);
844          e1 = new(mem_ctx) ir_dereference_record(op1->clone(mem_ctx, NULL),
845                                                  field_name);
846          result = do_comparison(mem_ctx, operation, e0, e1);
847
848          if (cmp) {
849             cmp = new(mem_ctx) ir_expression(join_op, cmp, result);
850          } else {
851             cmp = result;
852          }
853       }
854       break;
855    }
856
857    case GLSL_TYPE_ERROR:
858    case GLSL_TYPE_VOID:
859    case GLSL_TYPE_SAMPLER:
860       /* I assume a comparison of a struct containing a sampler just
861        * ignores the sampler present in the type.
862        */
863       break;
864
865    default:
866       assert(!"Should not get here.");
867       break;
868    }
869
870    if (cmp == NULL)
871       cmp = new(mem_ctx) ir_constant(true);
872
873    return cmp;
874 }
875
876 /* For logical operations, we want to ensure that the operands are
877  * scalar booleans.  If it isn't, emit an error and return a constant
878  * boolean to avoid triggering cascading error messages.
879  */
880 ir_rvalue *
881 get_scalar_boolean_operand(exec_list *instructions,
882                            struct _mesa_glsl_parse_state *state,
883                            ast_expression *parent_expr,
884                            int operand,
885                            const char *operand_name,
886                            bool *error_emitted)
887 {
888    ast_expression *expr = parent_expr->subexpressions[operand];
889    void *ctx = state;
890    ir_rvalue *val = expr->hir(instructions, state);
891
892    if (val->type->is_boolean() && val->type->is_scalar())
893       return val;
894
895    if (!*error_emitted) {
896       YYLTYPE loc = expr->get_location();
897       _mesa_glsl_error(&loc, state, "%s of `%s' must be scalar boolean",
898                        operand_name,
899                        parent_expr->operator_string(parent_expr->oper));
900       *error_emitted = true;
901    }
902
903    return new(ctx) ir_constant(true);
904 }
905
906 /**
907  * If name refers to a builtin array whose maximum allowed size is less than
908  * size, report an error and return true.  Otherwise return false.
909  */
910 static bool
911 check_builtin_array_max_size(const char *name, unsigned size,
912                              YYLTYPE loc, struct _mesa_glsl_parse_state *state)
913 {
914    if ((strcmp("gl_TexCoord", name) == 0)
915        && (size > state->Const.MaxTextureCoords)) {
916       /* From page 54 (page 60 of the PDF) of the GLSL 1.20 spec:
917        *
918        *     "The size [of gl_TexCoord] can be at most
919        *     gl_MaxTextureCoords."
920        */
921       _mesa_glsl_error(&loc, state, "`gl_TexCoord' array size cannot "
922                        "be larger than gl_MaxTextureCoords (%u)\n",
923                        state->Const.MaxTextureCoords);
924       return true;
925    } else if (strcmp("gl_ClipDistance", name) == 0
926               && size > state->Const.MaxClipPlanes) {
927       /* From section 7.1 (Vertex Shader Special Variables) of the
928        * GLSL 1.30 spec:
929        *
930        *   "The gl_ClipDistance array is predeclared as unsized and
931        *   must be sized by the shader either redeclaring it with a
932        *   size or indexing it only with integral constant
933        *   expressions. ... The size can be at most
934        *   gl_MaxClipDistances."
935        */
936       _mesa_glsl_error(&loc, state, "`gl_ClipDistance' array size cannot "
937                        "be larger than gl_MaxClipDistances (%u)\n",
938                        state->Const.MaxClipPlanes);
939       return true;
940    }
941    return false;
942 }
943
944 /**
945  * Create the constant 1, of a which is appropriate for incrementing and
946  * decrementing values of the given GLSL type.  For example, if type is vec4,
947  * this creates a constant value of 1.0 having type float.
948  *
949  * If the given type is invalid for increment and decrement operators, return
950  * a floating point 1--the error will be detected later.
951  */
952 static ir_rvalue *
953 constant_one_for_inc_dec(void *ctx, const glsl_type *type)
954 {
955    switch (type->base_type) {
956    case GLSL_TYPE_UINT:
957       return new(ctx) ir_constant((unsigned) 1);
958    case GLSL_TYPE_INT:
959       return new(ctx) ir_constant(1);
960    default:
961    case GLSL_TYPE_FLOAT:
962       return new(ctx) ir_constant(1.0f);
963    }
964 }
965
966 ir_rvalue *
967 ast_expression::hir(exec_list *instructions,
968                     struct _mesa_glsl_parse_state *state)
969 {
970    void *ctx = state;
971    static const int operations[AST_NUM_OPERATORS] = {
972       -1,               /* ast_assign doesn't convert to ir_expression. */
973       -1,               /* ast_plus doesn't convert to ir_expression. */
974       ir_unop_neg,
975       ir_binop_add,
976       ir_binop_sub,
977       ir_binop_mul,
978       ir_binop_div,
979       ir_binop_mod,
980       ir_binop_lshift,
981       ir_binop_rshift,
982       ir_binop_less,
983       ir_binop_greater,
984       ir_binop_lequal,
985       ir_binop_gequal,
986       ir_binop_all_equal,
987       ir_binop_any_nequal,
988       ir_binop_bit_and,
989       ir_binop_bit_xor,
990       ir_binop_bit_or,
991       ir_unop_bit_not,
992       ir_binop_logic_and,
993       ir_binop_logic_xor,
994       ir_binop_logic_or,
995       ir_unop_logic_not,
996
997       /* Note: The following block of expression types actually convert
998        * to multiple IR instructions.
999        */
1000       ir_binop_mul,     /* ast_mul_assign */
1001       ir_binop_div,     /* ast_div_assign */
1002       ir_binop_mod,     /* ast_mod_assign */
1003       ir_binop_add,     /* ast_add_assign */
1004       ir_binop_sub,     /* ast_sub_assign */
1005       ir_binop_lshift,  /* ast_ls_assign */
1006       ir_binop_rshift,  /* ast_rs_assign */
1007       ir_binop_bit_and, /* ast_and_assign */
1008       ir_binop_bit_xor, /* ast_xor_assign */
1009       ir_binop_bit_or,  /* ast_or_assign */
1010
1011       -1,               /* ast_conditional doesn't convert to ir_expression. */
1012       ir_binop_add,     /* ast_pre_inc. */
1013       ir_binop_sub,     /* ast_pre_dec. */
1014       ir_binop_add,     /* ast_post_inc. */
1015       ir_binop_sub,     /* ast_post_dec. */
1016       -1,               /* ast_field_selection doesn't conv to ir_expression. */
1017       -1,               /* ast_array_index doesn't convert to ir_expression. */
1018       -1,               /* ast_function_call doesn't conv to ir_expression. */
1019       -1,               /* ast_identifier doesn't convert to ir_expression. */
1020       -1,               /* ast_int_constant doesn't convert to ir_expression. */
1021       -1,               /* ast_uint_constant doesn't conv to ir_expression. */
1022       -1,               /* ast_float_constant doesn't conv to ir_expression. */
1023       -1,               /* ast_bool_constant doesn't conv to ir_expression. */
1024       -1,               /* ast_sequence doesn't convert to ir_expression. */
1025    };
1026    ir_rvalue *result = NULL;
1027    ir_rvalue *op[3];
1028    const struct glsl_type *type; /* a temporary variable for switch cases */
1029    bool error_emitted = false;
1030    YYLTYPE loc;
1031
1032    loc = this->get_location();
1033
1034    switch (this->oper) {
1035    case ast_assign: {
1036       op[0] = this->subexpressions[0]->hir(instructions, state);
1037       op[1] = this->subexpressions[1]->hir(instructions, state);
1038
1039       result = do_assignment(instructions, state,
1040                              this->subexpressions[0]->non_lvalue_description,
1041                              op[0], op[1], false,
1042                              this->subexpressions[0]->get_location());
1043       error_emitted = result->type->is_error();
1044       break;
1045    }
1046
1047    case ast_plus:
1048       op[0] = this->subexpressions[0]->hir(instructions, state);
1049
1050       type = unary_arithmetic_result_type(op[0]->type, state, & loc);
1051
1052       error_emitted = type->is_error();
1053
1054       result = op[0];
1055       break;
1056
1057    case ast_neg:
1058       op[0] = this->subexpressions[0]->hir(instructions, state);
1059
1060       type = unary_arithmetic_result_type(op[0]->type, state, & loc);
1061
1062       error_emitted = type->is_error();
1063
1064       result = new(ctx) ir_expression(operations[this->oper], type,
1065                                       op[0], NULL);
1066       break;
1067
1068    case ast_add:
1069    case ast_sub:
1070    case ast_mul:
1071    case ast_div:
1072       op[0] = this->subexpressions[0]->hir(instructions, state);
1073       op[1] = this->subexpressions[1]->hir(instructions, state);
1074
1075       type = arithmetic_result_type(op[0], op[1],
1076                                     (this->oper == ast_mul),
1077                                     state, & loc);
1078       error_emitted = type->is_error();
1079
1080       result = new(ctx) ir_expression(operations[this->oper], type,
1081                                       op[0], op[1]);
1082       break;
1083
1084    case ast_mod:
1085       op[0] = this->subexpressions[0]->hir(instructions, state);
1086       op[1] = this->subexpressions[1]->hir(instructions, state);
1087
1088       type = modulus_result_type(op[0]->type, op[1]->type, state, & loc);
1089
1090       assert(operations[this->oper] == ir_binop_mod);
1091
1092       result = new(ctx) ir_expression(operations[this->oper], type,
1093                                       op[0], op[1]);
1094       error_emitted = type->is_error();
1095       break;
1096
1097    case ast_lshift:
1098    case ast_rshift:
1099        if (state->language_version < 130) {
1100           _mesa_glsl_error(&loc, state, "operator %s requires GLSL 1.30",
1101               operator_string(this->oper));
1102           error_emitted = true;
1103        }
1104
1105        op[0] = this->subexpressions[0]->hir(instructions, state);
1106        op[1] = this->subexpressions[1]->hir(instructions, state);
1107        type = shift_result_type(op[0]->type, op[1]->type, this->oper, state,
1108                                 &loc);
1109        result = new(ctx) ir_expression(operations[this->oper], type,
1110                                        op[0], op[1]);
1111        error_emitted = op[0]->type->is_error() || op[1]->type->is_error();
1112        break;
1113
1114    case ast_less:
1115    case ast_greater:
1116    case ast_lequal:
1117    case ast_gequal:
1118       op[0] = this->subexpressions[0]->hir(instructions, state);
1119       op[1] = this->subexpressions[1]->hir(instructions, state);
1120
1121       type = relational_result_type(op[0], op[1], state, & loc);
1122
1123       /* The relational operators must either generate an error or result
1124        * in a scalar boolean.  See page 57 of the GLSL 1.50 spec.
1125        */
1126       assert(type->is_error()
1127              || ((type->base_type == GLSL_TYPE_BOOL)
1128                  && type->is_scalar()));
1129
1130       result = new(ctx) ir_expression(operations[this->oper], type,
1131                                       op[0], op[1]);
1132       error_emitted = type->is_error();
1133       break;
1134
1135    case ast_nequal:
1136    case ast_equal:
1137       op[0] = this->subexpressions[0]->hir(instructions, state);
1138       op[1] = this->subexpressions[1]->hir(instructions, state);
1139
1140       /* From page 58 (page 64 of the PDF) of the GLSL 1.50 spec:
1141        *
1142        *    "The equality operators equal (==), and not equal (!=)
1143        *    operate on all types. They result in a scalar Boolean. If
1144        *    the operand types do not match, then there must be a
1145        *    conversion from Section 4.1.10 "Implicit Conversions"
1146        *    applied to one operand that can make them match, in which
1147        *    case this conversion is done."
1148        */
1149       if ((!apply_implicit_conversion(op[0]->type, op[1], state)
1150            && !apply_implicit_conversion(op[1]->type, op[0], state))
1151           || (op[0]->type != op[1]->type)) {
1152          _mesa_glsl_error(& loc, state, "operands of `%s' must have the same "
1153                           "type", (this->oper == ast_equal) ? "==" : "!=");
1154          error_emitted = true;
1155       } else if ((state->language_version <= 110)
1156                  && (op[0]->type->is_array() || op[1]->type->is_array())) {
1157          _mesa_glsl_error(& loc, state, "array comparisons forbidden in "
1158                           "GLSL 1.10");
1159          error_emitted = true;
1160       }
1161
1162       if (error_emitted) {
1163          result = new(ctx) ir_constant(false);
1164       } else {
1165          result = do_comparison(ctx, operations[this->oper], op[0], op[1]);
1166          assert(result->type == glsl_type::bool_type);
1167       }
1168       break;
1169
1170    case ast_bit_and:
1171    case ast_bit_xor:
1172    case ast_bit_or:
1173       op[0] = this->subexpressions[0]->hir(instructions, state);
1174       op[1] = this->subexpressions[1]->hir(instructions, state);
1175       type = bit_logic_result_type(op[0]->type, op[1]->type, this->oper,
1176                                    state, &loc);
1177       result = new(ctx) ir_expression(operations[this->oper], type,
1178                                       op[0], op[1]);
1179       error_emitted = op[0]->type->is_error() || op[1]->type->is_error();
1180       break;
1181
1182    case ast_bit_not:
1183       op[0] = this->subexpressions[0]->hir(instructions, state);
1184
1185       if (state->language_version < 130) {
1186          _mesa_glsl_error(&loc, state, "bit-wise operations require GLSL 1.30");
1187          error_emitted = true;
1188       }
1189
1190       if (!op[0]->type->is_integer()) {
1191          _mesa_glsl_error(&loc, state, "operand of `~' must be an integer");
1192          error_emitted = true;
1193       }
1194
1195       type = error_emitted ? glsl_type::error_type : op[0]->type;
1196       result = new(ctx) ir_expression(ir_unop_bit_not, type, op[0], NULL);
1197       break;
1198
1199    case ast_logic_and: {
1200       exec_list rhs_instructions;
1201       op[0] = get_scalar_boolean_operand(instructions, state, this, 0,
1202                                          "LHS", &error_emitted);
1203       op[1] = get_scalar_boolean_operand(&rhs_instructions, state, this, 1,
1204                                          "RHS", &error_emitted);
1205
1206       if (rhs_instructions.is_empty()) {
1207          result = new(ctx) ir_expression(ir_binop_logic_and, op[0], op[1]);
1208          type = result->type;
1209       } else {
1210          ir_variable *const tmp = new(ctx) ir_variable(glsl_type::bool_type,
1211                                                        "and_tmp",
1212                                                        ir_var_temporary);
1213          instructions->push_tail(tmp);
1214
1215          ir_if *const stmt = new(ctx) ir_if(op[0]);
1216          instructions->push_tail(stmt);
1217
1218          stmt->then_instructions.append_list(&rhs_instructions);
1219          ir_dereference *const then_deref = new(ctx) ir_dereference_variable(tmp);
1220          ir_assignment *const then_assign =
1221             new(ctx) ir_assignment(then_deref, op[1], NULL);
1222          stmt->then_instructions.push_tail(then_assign);
1223
1224          ir_dereference *const else_deref = new(ctx) ir_dereference_variable(tmp);
1225          ir_assignment *const else_assign =
1226             new(ctx) ir_assignment(else_deref, new(ctx) ir_constant(false), NULL);
1227          stmt->else_instructions.push_tail(else_assign);
1228
1229          result = new(ctx) ir_dereference_variable(tmp);
1230          type = tmp->type;
1231       }
1232       break;
1233    }
1234
1235    case ast_logic_or: {
1236       exec_list rhs_instructions;
1237       op[0] = get_scalar_boolean_operand(instructions, state, this, 0,
1238                                          "LHS", &error_emitted);
1239       op[1] = get_scalar_boolean_operand(&rhs_instructions, state, this, 1,
1240                                          "RHS", &error_emitted);
1241
1242       if (rhs_instructions.is_empty()) {
1243          result = new(ctx) ir_expression(ir_binop_logic_or, op[0], op[1]);
1244          type = result->type;
1245       } else {
1246          ir_variable *const tmp = new(ctx) ir_variable(glsl_type::bool_type,
1247                                                        "or_tmp",
1248                                                        ir_var_temporary);
1249          instructions->push_tail(tmp);
1250
1251          ir_if *const stmt = new(ctx) ir_if(op[0]);
1252          instructions->push_tail(stmt);
1253
1254          ir_dereference *const then_deref = new(ctx) ir_dereference_variable(tmp);
1255          ir_assignment *const then_assign =
1256             new(ctx) ir_assignment(then_deref, new(ctx) ir_constant(true), NULL);
1257          stmt->then_instructions.push_tail(then_assign);
1258
1259          stmt->else_instructions.append_list(&rhs_instructions);
1260          ir_dereference *const else_deref = new(ctx) ir_dereference_variable(tmp);
1261          ir_assignment *const else_assign =
1262             new(ctx) ir_assignment(else_deref, op[1], NULL);
1263          stmt->else_instructions.push_tail(else_assign);
1264
1265          result = new(ctx) ir_dereference_variable(tmp);
1266          type = tmp->type;
1267       }
1268       break;
1269    }
1270
1271    case ast_logic_xor:
1272       /* From page 33 (page 39 of the PDF) of the GLSL 1.10 spec:
1273        *
1274        *    "The logical binary operators and (&&), or ( | | ), and
1275        *     exclusive or (^^). They operate only on two Boolean
1276        *     expressions and result in a Boolean expression."
1277        */
1278       op[0] = get_scalar_boolean_operand(instructions, state, this, 0, "LHS",
1279                                          &error_emitted);
1280       op[1] = get_scalar_boolean_operand(instructions, state, this, 1, "RHS",
1281                                          &error_emitted);
1282
1283       result = new(ctx) ir_expression(operations[this->oper], glsl_type::bool_type,
1284                                       op[0], op[1]);
1285       break;
1286
1287    case ast_logic_not:
1288       op[0] = get_scalar_boolean_operand(instructions, state, this, 0,
1289                                          "operand", &error_emitted);
1290
1291       result = new(ctx) ir_expression(operations[this->oper], glsl_type::bool_type,
1292                                       op[0], NULL);
1293       break;
1294
1295    case ast_mul_assign:
1296    case ast_div_assign:
1297    case ast_add_assign:
1298    case ast_sub_assign: {
1299       op[0] = this->subexpressions[0]->hir(instructions, state);
1300       op[1] = this->subexpressions[1]->hir(instructions, state);
1301
1302       type = arithmetic_result_type(op[0], op[1],
1303                                     (this->oper == ast_mul_assign),
1304                                     state, & loc);
1305
1306       ir_rvalue *temp_rhs = new(ctx) ir_expression(operations[this->oper], type,
1307                                                    op[0], op[1]);
1308
1309       result = do_assignment(instructions, state,
1310                              this->subexpressions[0]->non_lvalue_description,
1311                              op[0]->clone(ctx, NULL), temp_rhs, false,
1312                              this->subexpressions[0]->get_location());
1313       error_emitted = (op[0]->type->is_error());
1314
1315       /* GLSL 1.10 does not allow array assignment.  However, we don't have to
1316        * explicitly test for this because none of the binary expression
1317        * operators allow array operands either.
1318        */
1319
1320       break;
1321    }
1322
1323    case ast_mod_assign: {
1324       op[0] = this->subexpressions[0]->hir(instructions, state);
1325       op[1] = this->subexpressions[1]->hir(instructions, state);
1326
1327       type = modulus_result_type(op[0]->type, op[1]->type, state, & loc);
1328
1329       assert(operations[this->oper] == ir_binop_mod);
1330
1331       ir_rvalue *temp_rhs;
1332       temp_rhs = new(ctx) ir_expression(operations[this->oper], type,
1333                                         op[0], op[1]);
1334
1335       result = do_assignment(instructions, state,
1336                              this->subexpressions[0]->non_lvalue_description,
1337                              op[0]->clone(ctx, NULL), temp_rhs, false,
1338                              this->subexpressions[0]->get_location());
1339       error_emitted = type->is_error();
1340       break;
1341    }
1342
1343    case ast_ls_assign:
1344    case ast_rs_assign: {
1345       op[0] = this->subexpressions[0]->hir(instructions, state);
1346       op[1] = this->subexpressions[1]->hir(instructions, state);
1347       type = shift_result_type(op[0]->type, op[1]->type, this->oper, state,
1348                                &loc);
1349       ir_rvalue *temp_rhs = new(ctx) ir_expression(operations[this->oper],
1350                                                    type, op[0], op[1]);
1351       result = do_assignment(instructions, state,
1352                              this->subexpressions[0]->non_lvalue_description,
1353                              op[0]->clone(ctx, NULL), temp_rhs, false,
1354                              this->subexpressions[0]->get_location());
1355       error_emitted = op[0]->type->is_error() || op[1]->type->is_error();
1356       break;
1357    }
1358
1359    case ast_and_assign:
1360    case ast_xor_assign:
1361    case ast_or_assign: {
1362       op[0] = this->subexpressions[0]->hir(instructions, state);
1363       op[1] = this->subexpressions[1]->hir(instructions, state);
1364       type = bit_logic_result_type(op[0]->type, op[1]->type, this->oper,
1365                                    state, &loc);
1366       ir_rvalue *temp_rhs = new(ctx) ir_expression(operations[this->oper],
1367                                                    type, op[0], op[1]);
1368       result = do_assignment(instructions, state,
1369                              this->subexpressions[0]->non_lvalue_description,
1370                              op[0]->clone(ctx, NULL), temp_rhs, false,
1371                              this->subexpressions[0]->get_location());
1372       error_emitted = op[0]->type->is_error() || op[1]->type->is_error();
1373       break;
1374    }
1375
1376    case ast_conditional: {
1377       /* From page 59 (page 65 of the PDF) of the GLSL 1.50 spec:
1378        *
1379        *    "The ternary selection operator (?:). It operates on three
1380        *    expressions (exp1 ? exp2 : exp3). This operator evaluates the
1381        *    first expression, which must result in a scalar Boolean."
1382        */
1383       op[0] = get_scalar_boolean_operand(instructions, state, this, 0,
1384                                          "condition", &error_emitted);
1385
1386       /* The :? operator is implemented by generating an anonymous temporary
1387        * followed by an if-statement.  The last instruction in each branch of
1388        * the if-statement assigns a value to the anonymous temporary.  This
1389        * temporary is the r-value of the expression.
1390        */
1391       exec_list then_instructions;
1392       exec_list else_instructions;
1393
1394       op[1] = this->subexpressions[1]->hir(&then_instructions, state);
1395       op[2] = this->subexpressions[2]->hir(&else_instructions, state);
1396
1397       /* From page 59 (page 65 of the PDF) of the GLSL 1.50 spec:
1398        *
1399        *     "The second and third expressions can be any type, as
1400        *     long their types match, or there is a conversion in
1401        *     Section 4.1.10 "Implicit Conversions" that can be applied
1402        *     to one of the expressions to make their types match. This
1403        *     resulting matching type is the type of the entire
1404        *     expression."
1405        */
1406       if ((!apply_implicit_conversion(op[1]->type, op[2], state)
1407            && !apply_implicit_conversion(op[2]->type, op[1], state))
1408           || (op[1]->type != op[2]->type)) {
1409          YYLTYPE loc = this->subexpressions[1]->get_location();
1410
1411          _mesa_glsl_error(& loc, state, "Second and third operands of ?: "
1412                           "operator must have matching types.");
1413          error_emitted = true;
1414          type = glsl_type::error_type;
1415       } else {
1416          type = op[1]->type;
1417       }
1418
1419       /* From page 33 (page 39 of the PDF) of the GLSL 1.10 spec:
1420        *
1421        *    "The second and third expressions must be the same type, but can
1422        *    be of any type other than an array."
1423        */
1424       if ((state->language_version <= 110) && type->is_array()) {
1425          _mesa_glsl_error(& loc, state, "Second and third operands of ?: "
1426                           "operator must not be arrays.");
1427          error_emitted = true;
1428       }
1429
1430       ir_constant *cond_val = op[0]->constant_expression_value();
1431       ir_constant *then_val = op[1]->constant_expression_value();
1432       ir_constant *else_val = op[2]->constant_expression_value();
1433
1434       if (then_instructions.is_empty()
1435           && else_instructions.is_empty()
1436           && (cond_val != NULL) && (then_val != NULL) && (else_val != NULL)) {
1437          result = (cond_val->value.b[0]) ? then_val : else_val;
1438       } else {
1439          ir_variable *const tmp =
1440             new(ctx) ir_variable(type, "conditional_tmp", ir_var_temporary);
1441          instructions->push_tail(tmp);
1442
1443          ir_if *const stmt = new(ctx) ir_if(op[0]);
1444          instructions->push_tail(stmt);
1445
1446          then_instructions.move_nodes_to(& stmt->then_instructions);
1447          ir_dereference *const then_deref =
1448             new(ctx) ir_dereference_variable(tmp);
1449          ir_assignment *const then_assign =
1450             new(ctx) ir_assignment(then_deref, op[1], NULL);
1451          stmt->then_instructions.push_tail(then_assign);
1452
1453          else_instructions.move_nodes_to(& stmt->else_instructions);
1454          ir_dereference *const else_deref =
1455             new(ctx) ir_dereference_variable(tmp);
1456          ir_assignment *const else_assign =
1457             new(ctx) ir_assignment(else_deref, op[2], NULL);
1458          stmt->else_instructions.push_tail(else_assign);
1459
1460          result = new(ctx) ir_dereference_variable(tmp);
1461       }
1462       break;
1463    }
1464
1465    case ast_pre_inc:
1466    case ast_pre_dec: {
1467       this->non_lvalue_description = (this->oper == ast_pre_inc)
1468          ? "pre-increment operation" : "pre-decrement operation";
1469
1470       op[0] = this->subexpressions[0]->hir(instructions, state);
1471       op[1] = constant_one_for_inc_dec(ctx, op[0]->type);
1472
1473       type = arithmetic_result_type(op[0], op[1], false, state, & loc);
1474
1475       ir_rvalue *temp_rhs;
1476       temp_rhs = new(ctx) ir_expression(operations[this->oper], type,
1477                                         op[0], op[1]);
1478
1479       result = do_assignment(instructions, state,
1480                              this->subexpressions[0]->non_lvalue_description,
1481                              op[0]->clone(ctx, NULL), temp_rhs, false,
1482                              this->subexpressions[0]->get_location());
1483       error_emitted = op[0]->type->is_error();
1484       break;
1485    }
1486
1487    case ast_post_inc:
1488    case ast_post_dec: {
1489       this->non_lvalue_description = (this->oper == ast_post_inc)
1490          ? "post-increment operation" : "post-decrement operation";
1491       op[0] = this->subexpressions[0]->hir(instructions, state);
1492       op[1] = constant_one_for_inc_dec(ctx, op[0]->type);
1493
1494       error_emitted = op[0]->type->is_error() || op[1]->type->is_error();
1495
1496       type = arithmetic_result_type(op[0], op[1], false, state, & loc);
1497
1498       ir_rvalue *temp_rhs;
1499       temp_rhs = new(ctx) ir_expression(operations[this->oper], type,
1500                                         op[0], op[1]);
1501
1502       /* Get a temporary of a copy of the lvalue before it's modified.
1503        * This may get thrown away later.
1504        */
1505       result = get_lvalue_copy(instructions, op[0]->clone(ctx, NULL));
1506
1507       (void)do_assignment(instructions, state,
1508                           this->subexpressions[0]->non_lvalue_description,
1509                           op[0]->clone(ctx, NULL), temp_rhs, false,
1510                           this->subexpressions[0]->get_location());
1511
1512       error_emitted = op[0]->type->is_error();
1513       break;
1514    }
1515
1516    case ast_field_selection:
1517       result = _mesa_ast_field_selection_to_hir(this, instructions, state);
1518       break;
1519
1520    case ast_array_index: {
1521       YYLTYPE index_loc = subexpressions[1]->get_location();
1522
1523       op[0] = subexpressions[0]->hir(instructions, state);
1524       op[1] = subexpressions[1]->hir(instructions, state);
1525
1526       error_emitted = op[0]->type->is_error() || op[1]->type->is_error();
1527
1528       ir_rvalue *const array = op[0];
1529
1530       result = new(ctx) ir_dereference_array(op[0], op[1]);
1531
1532       /* Do not use op[0] after this point.  Use array.
1533        */
1534       op[0] = NULL;
1535
1536
1537       if (error_emitted)
1538          break;
1539
1540       if (!array->type->is_array()
1541           && !array->type->is_matrix()
1542           && !array->type->is_vector()) {
1543          _mesa_glsl_error(& index_loc, state,
1544                           "cannot dereference non-array / non-matrix / "
1545                           "non-vector");
1546          error_emitted = true;
1547       }
1548
1549       if (!op[1]->type->is_integer()) {
1550          _mesa_glsl_error(& index_loc, state,
1551                           "array index must be integer type");
1552          error_emitted = true;
1553       } else if (!op[1]->type->is_scalar()) {
1554          _mesa_glsl_error(& index_loc, state,
1555                           "array index must be scalar");
1556          error_emitted = true;
1557       }
1558
1559       /* If the array index is a constant expression and the array has a
1560        * declared size, ensure that the access is in-bounds.  If the array
1561        * index is not a constant expression, ensure that the array has a
1562        * declared size.
1563        */
1564       ir_constant *const const_index = op[1]->constant_expression_value();
1565       if (const_index != NULL) {
1566          const int idx = const_index->value.i[0];
1567          const char *type_name;
1568          unsigned bound = 0;
1569
1570          if (array->type->is_matrix()) {
1571             type_name = "matrix";
1572          } else if (array->type->is_vector()) {
1573             type_name = "vector";
1574          } else {
1575             type_name = "array";
1576          }
1577
1578          /* From page 24 (page 30 of the PDF) of the GLSL 1.50 spec:
1579           *
1580           *    "It is illegal to declare an array with a size, and then
1581           *    later (in the same shader) index the same array with an
1582           *    integral constant expression greater than or equal to the
1583           *    declared size. It is also illegal to index an array with a
1584           *    negative constant expression."
1585           */
1586          if (array->type->is_matrix()) {
1587             if (array->type->row_type()->vector_elements <= idx) {
1588                bound = array->type->row_type()->vector_elements;
1589             }
1590          } else if (array->type->is_vector()) {
1591             if (array->type->vector_elements <= idx) {
1592                bound = array->type->vector_elements;
1593             }
1594          } else {
1595             if ((array->type->array_size() > 0)
1596                 && (array->type->array_size() <= idx)) {
1597                bound = array->type->array_size();
1598             }
1599          }
1600
1601          if (bound > 0) {
1602             _mesa_glsl_error(& loc, state, "%s index must be < %u",
1603                              type_name, bound);
1604             error_emitted = true;
1605          } else if (idx < 0) {
1606             _mesa_glsl_error(& loc, state, "%s index must be >= 0",
1607                              type_name);
1608             error_emitted = true;
1609          }
1610
1611          if (array->type->is_array()) {
1612             /* If the array is a variable dereference, it dereferences the
1613              * whole array, by definition.  Use this to get the variable.
1614              *
1615              * FINISHME: Should some methods for getting / setting / testing
1616              * FINISHME: array access limits be added to ir_dereference?
1617              */
1618             ir_variable *const v = array->whole_variable_referenced();
1619             if ((v != NULL) && (unsigned(idx) > v->max_array_access)) {
1620                v->max_array_access = idx;
1621
1622                /* Check whether this access will, as a side effect, implicitly
1623                 * cause the size of a built-in array to be too large.
1624                 */
1625                if (check_builtin_array_max_size(v->name, idx+1, loc, state))
1626                   error_emitted = true;
1627             }
1628          }
1629       } else if (array->type->array_size() == 0) {
1630          _mesa_glsl_error(&loc, state, "unsized array index must be constant");
1631       } else {
1632          if (array->type->is_array()) {
1633             /* whole_variable_referenced can return NULL if the array is a
1634              * member of a structure.  In this case it is safe to not update
1635              * the max_array_access field because it is never used for fields
1636              * of structures.
1637              */
1638             ir_variable *v = array->whole_variable_referenced();
1639             if (v != NULL)
1640                v->max_array_access = array->type->array_size() - 1;
1641          }
1642       }
1643
1644       /* From page 23 (29 of the PDF) of the GLSL 1.30 spec:
1645        *
1646        *    "Samplers aggregated into arrays within a shader (using square
1647        *    brackets [ ]) can only be indexed with integral constant
1648        *    expressions [...]."
1649        *
1650        * This restriction was added in GLSL 1.30.  Shaders using earlier version
1651        * of the language should not be rejected by the compiler front-end for
1652        * using this construct.  This allows useful things such as using a loop
1653        * counter as the index to an array of samplers.  If the loop in unrolled,
1654        * the code should compile correctly.  Instead, emit a warning.
1655        */
1656       if (array->type->is_array() &&
1657           array->type->element_type()->is_sampler() &&
1658           const_index == NULL) {
1659
1660          if (state->language_version == 100) {
1661             _mesa_glsl_warning(&loc, state,
1662                                "sampler arrays indexed with non-constant "
1663                                "expressions is optional in GLSL ES 1.00");
1664          } else if (state->language_version < 130) {
1665             _mesa_glsl_warning(&loc, state,
1666                                "sampler arrays indexed with non-constant "
1667                                "expressions is forbidden in GLSL 1.30 and "
1668                                "later");
1669          } else {
1670             _mesa_glsl_error(&loc, state,
1671                              "sampler arrays indexed with non-constant "
1672                              "expressions is forbidden in GLSL 1.30 and "
1673                              "later");
1674             error_emitted = true;
1675          }
1676       }
1677
1678       if (error_emitted)
1679          result->type = glsl_type::error_type;
1680
1681       break;
1682    }
1683
1684    case ast_function_call:
1685       /* Should *NEVER* get here.  ast_function_call should always be handled
1686        * by ast_function_expression::hir.
1687        */
1688       assert(0);
1689       break;
1690
1691    case ast_identifier: {
1692       /* ast_identifier can appear several places in a full abstract syntax
1693        * tree.  This particular use must be at location specified in the grammar
1694        * as 'variable_identifier'.
1695        */
1696       ir_variable *var = 
1697          state->symbols->get_variable(this->primary_expression.identifier);
1698
1699       if (var != NULL) {
1700          var->used = true;
1701          result = new(ctx) ir_dereference_variable(var);
1702       } else {
1703          _mesa_glsl_error(& loc, state, "`%s' undeclared",
1704                           this->primary_expression.identifier);
1705
1706          result = ir_rvalue::error_value(ctx);
1707          error_emitted = true;
1708       }
1709       break;
1710    }
1711
1712    case ast_int_constant:
1713       result = new(ctx) ir_constant(this->primary_expression.int_constant);
1714       break;
1715
1716    case ast_uint_constant:
1717       result = new(ctx) ir_constant(this->primary_expression.uint_constant);
1718       break;
1719
1720    case ast_float_constant:
1721       result = new(ctx) ir_constant(this->primary_expression.float_constant);
1722       break;
1723
1724    case ast_bool_constant:
1725       result = new(ctx) ir_constant(bool(this->primary_expression.bool_constant));
1726       break;
1727
1728    case ast_sequence: {
1729       /* It should not be possible to generate a sequence in the AST without
1730        * any expressions in it.
1731        */
1732       assert(!this->expressions.is_empty());
1733
1734       /* The r-value of a sequence is the last expression in the sequence.  If
1735        * the other expressions in the sequence do not have side-effects (and
1736        * therefore add instructions to the instruction list), they get dropped
1737        * on the floor.
1738        */
1739       exec_node *previous_tail_pred = NULL;
1740       YYLTYPE previous_operand_loc = loc;
1741
1742       foreach_list_typed (ast_node, ast, link, &this->expressions) {
1743          /* If one of the operands of comma operator does not generate any
1744           * code, we want to emit a warning.  At each pass through the loop
1745           * previous_tail_pred will point to the last instruction in the
1746           * stream *before* processing the previous operand.  Naturally,
1747           * instructions->tail_pred will point to the last instruction in the
1748           * stream *after* processing the previous operand.  If the two
1749           * pointers match, then the previous operand had no effect.
1750           *
1751           * The warning behavior here differs slightly from GCC.  GCC will
1752           * only emit a warning if none of the left-hand operands have an
1753           * effect.  However, it will emit a warning for each.  I believe that
1754           * there are some cases in C (especially with GCC extensions) where
1755           * it is useful to have an intermediate step in a sequence have no
1756           * effect, but I don't think these cases exist in GLSL.  Either way,
1757           * it would be a giant hassle to replicate that behavior.
1758           */
1759          if (previous_tail_pred == instructions->tail_pred) {
1760             _mesa_glsl_warning(&previous_operand_loc, state,
1761                                "left-hand operand of comma expression has "
1762                                "no effect");
1763          }
1764
1765          /* tail_pred is directly accessed instead of using the get_tail()
1766           * method for performance reasons.  get_tail() has extra code to
1767           * return NULL when the list is empty.  We don't care about that
1768           * here, so using tail_pred directly is fine.
1769           */
1770          previous_tail_pred = instructions->tail_pred;
1771          previous_operand_loc = ast->get_location();
1772
1773          result = ast->hir(instructions, state);
1774       }
1775
1776       /* Any errors should have already been emitted in the loop above.
1777        */
1778       error_emitted = true;
1779       break;
1780    }
1781    }
1782    type = NULL; /* use result->type, not type. */
1783    assert(result != NULL);
1784
1785    if (result->type->is_error() && !error_emitted)
1786       _mesa_glsl_error(& loc, state, "type mismatch");
1787
1788    return result;
1789 }
1790
1791
1792 ir_rvalue *
1793 ast_expression_statement::hir(exec_list *instructions,
1794                               struct _mesa_glsl_parse_state *state)
1795 {
1796    /* It is possible to have expression statements that don't have an
1797     * expression.  This is the solitary semicolon:
1798     *
1799     * for (i = 0; i < 5; i++)
1800     *     ;
1801     *
1802     * In this case the expression will be NULL.  Test for NULL and don't do
1803     * anything in that case.
1804     */
1805    if (expression != NULL)
1806       expression->hir(instructions, state);
1807
1808    /* Statements do not have r-values.
1809     */
1810    return NULL;
1811 }
1812
1813
1814 ir_rvalue *
1815 ast_compound_statement::hir(exec_list *instructions,
1816                             struct _mesa_glsl_parse_state *state)
1817 {
1818    if (new_scope)
1819       state->symbols->push_scope();
1820
1821    foreach_list_typed (ast_node, ast, link, &this->statements)
1822       ast->hir(instructions, state);
1823
1824    if (new_scope)
1825       state->symbols->pop_scope();
1826
1827    /* Compound statements do not have r-values.
1828     */
1829    return NULL;
1830 }
1831
1832
1833 static const glsl_type *
1834 process_array_type(YYLTYPE *loc, const glsl_type *base, ast_node *array_size,
1835                    struct _mesa_glsl_parse_state *state)
1836 {
1837    unsigned length = 0;
1838
1839    /* From page 19 (page 25) of the GLSL 1.20 spec:
1840     *
1841     *     "Only one-dimensional arrays may be declared."
1842     */
1843    if (base->is_array()) {
1844       _mesa_glsl_error(loc, state,
1845                        "invalid array of `%s' (only one-dimensional arrays "
1846                        "may be declared)",
1847                        base->name);
1848       return glsl_type::error_type;
1849    }
1850
1851    if (array_size != NULL) {
1852       exec_list dummy_instructions;
1853       ir_rvalue *const ir = array_size->hir(& dummy_instructions, state);
1854       YYLTYPE loc = array_size->get_location();
1855
1856       if (ir != NULL) {
1857          if (!ir->type->is_integer()) {
1858             _mesa_glsl_error(& loc, state, "array size must be integer type");
1859          } else if (!ir->type->is_scalar()) {
1860             _mesa_glsl_error(& loc, state, "array size must be scalar type");
1861          } else {
1862             ir_constant *const size = ir->constant_expression_value();
1863
1864             if (size == NULL) {
1865                _mesa_glsl_error(& loc, state, "array size must be a "
1866                                 "constant valued expression");
1867             } else if (size->value.i[0] <= 0) {
1868                _mesa_glsl_error(& loc, state, "array size must be > 0");
1869             } else {
1870                assert(size->type == ir->type);
1871                length = size->value.u[0];
1872
1873                /* If the array size is const (and we've verified that
1874                 * it is) then no instructions should have been emitted
1875                 * when we converted it to HIR.  If they were emitted,
1876                 * then either the array size isn't const after all, or
1877                 * we are emitting unnecessary instructions.
1878                 */
1879                assert(dummy_instructions.is_empty());
1880             }
1881          }
1882       }
1883    } else if (state->es_shader) {
1884       /* Section 10.17 of the GLSL ES 1.00 specification states that unsized
1885        * array declarations have been removed from the language.
1886        */
1887       _mesa_glsl_error(loc, state, "unsized array declarations are not "
1888                        "allowed in GLSL ES 1.00.");
1889    }
1890
1891    return glsl_type::get_array_instance(base, length);
1892 }
1893
1894
1895 const glsl_type *
1896 ast_type_specifier::glsl_type(const char **name,
1897                               struct _mesa_glsl_parse_state *state) const
1898 {
1899    const struct glsl_type *type;
1900
1901    type = state->symbols->get_type(this->type_name);
1902    *name = this->type_name;
1903
1904    if (this->is_array) {
1905       YYLTYPE loc = this->get_location();
1906       type = process_array_type(&loc, type, this->array_size, state);
1907    }
1908
1909    return type;
1910 }
1911
1912
1913 static void
1914 apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual,
1915                                  ir_variable *var,
1916                                  struct _mesa_glsl_parse_state *state,
1917                                  YYLTYPE *loc)
1918 {
1919    if (qual->flags.q.invariant) {
1920       if (var->used) {
1921          _mesa_glsl_error(loc, state,
1922                           "variable `%s' may not be redeclared "
1923                           "`invariant' after being used",
1924                           var->name);
1925       } else {
1926          var->invariant = 1;
1927       }
1928    }
1929
1930    if (qual->flags.q.constant || qual->flags.q.attribute
1931        || qual->flags.q.uniform
1932        || (qual->flags.q.varying && (state->target == fragment_shader)))
1933       var->read_only = 1;
1934
1935    if (qual->flags.q.centroid)
1936       var->centroid = 1;
1937
1938    if (qual->flags.q.attribute && state->target != vertex_shader) {
1939       var->type = glsl_type::error_type;
1940       _mesa_glsl_error(loc, state,
1941                        "`attribute' variables may not be declared in the "
1942                        "%s shader",
1943                        _mesa_glsl_shader_target_name(state->target));
1944    }
1945
1946    /* From page 25 (page 31 of the PDF) of the GLSL 1.10 spec:
1947     *
1948     *     "The varying qualifier can be used only with the data types
1949     *     float, vec2, vec3, vec4, mat2, mat3, and mat4, or arrays of
1950     *     these."
1951     */
1952    if (qual->flags.q.varying) {
1953       const glsl_type *non_array_type;
1954
1955       if (var->type && var->type->is_array())
1956          non_array_type = var->type->fields.array;
1957       else
1958          non_array_type = var->type;
1959
1960       if (non_array_type && non_array_type->base_type != GLSL_TYPE_FLOAT) {
1961          var->type = glsl_type::error_type;
1962          _mesa_glsl_error(loc, state,
1963                           "varying variables must be of base type float");
1964       }
1965    }
1966
1967    /* If there is no qualifier that changes the mode of the variable, leave
1968     * the setting alone.
1969     */
1970    if (qual->flags.q.in && qual->flags.q.out)
1971       var->mode = ir_var_inout;
1972    else if (qual->flags.q.attribute || qual->flags.q.in
1973             || (qual->flags.q.varying && (state->target == fragment_shader)))
1974       var->mode = ir_var_in;
1975    else if (qual->flags.q.out
1976             || (qual->flags.q.varying && (state->target == vertex_shader)))
1977       var->mode = ir_var_out;
1978    else if (qual->flags.q.uniform)
1979       var->mode = ir_var_uniform;
1980
1981    if (state->all_invariant && (state->current_function == NULL)) {
1982       switch (state->target) {
1983       case vertex_shader:
1984          if (var->mode == ir_var_out)
1985             var->invariant = true;
1986          break;
1987       case geometry_shader:
1988          if ((var->mode == ir_var_in) || (var->mode == ir_var_out))
1989             var->invariant = true;
1990          break;
1991       case fragment_shader:
1992          if (var->mode == ir_var_in)
1993             var->invariant = true;
1994          break;
1995       }
1996    }
1997
1998    if (qual->flags.q.flat)
1999       var->interpolation = INTERP_QUALIFIER_FLAT;
2000    else if (qual->flags.q.noperspective)
2001       var->interpolation = INTERP_QUALIFIER_NOPERSPECTIVE;
2002    else if (qual->flags.q.smooth)
2003       var->interpolation = INTERP_QUALIFIER_SMOOTH;
2004    else
2005       var->interpolation = INTERP_QUALIFIER_NONE;
2006
2007    if (var->interpolation != INTERP_QUALIFIER_NONE &&
2008        !(state->target == vertex_shader && var->mode == ir_var_out) &&
2009        !(state->target == fragment_shader && var->mode == ir_var_in)) {
2010       const char *qual_string = NULL;
2011       switch (var->interpolation) {
2012       case INTERP_QUALIFIER_FLAT:
2013          qual_string = "flat";
2014          break;
2015       case INTERP_QUALIFIER_NOPERSPECTIVE:
2016          qual_string = "noperspective";
2017          break;
2018       case INTERP_QUALIFIER_SMOOTH:
2019          qual_string = "smooth";
2020          break;
2021       }
2022
2023       _mesa_glsl_error(loc, state,
2024                        "interpolation qualifier `%s' can only be applied to "
2025                        "vertex shader outputs and fragment shader inputs.",
2026                        qual_string);
2027
2028    }
2029
2030    var->pixel_center_integer = qual->flags.q.pixel_center_integer;
2031    var->origin_upper_left = qual->flags.q.origin_upper_left;
2032    if ((qual->flags.q.origin_upper_left || qual->flags.q.pixel_center_integer)
2033        && (strcmp(var->name, "gl_FragCoord") != 0)) {
2034       const char *const qual_string = (qual->flags.q.origin_upper_left)
2035          ? "origin_upper_left" : "pixel_center_integer";
2036
2037       _mesa_glsl_error(loc, state,
2038                        "layout qualifier `%s' can only be applied to "
2039                        "fragment shader input `gl_FragCoord'",
2040                        qual_string);
2041    }
2042
2043    if (qual->flags.q.explicit_location) {
2044       const bool global_scope = (state->current_function == NULL);
2045       bool fail = false;
2046       const char *string = "";
2047
2048       /* In the vertex shader only shader inputs can be given explicit
2049        * locations.
2050        *
2051        * In the fragment shader only shader outputs can be given explicit
2052        * locations.
2053        */
2054       switch (state->target) {
2055       case vertex_shader:
2056          if (!global_scope || (var->mode != ir_var_in)) {
2057             fail = true;
2058             string = "input";
2059          }
2060          break;
2061
2062       case geometry_shader:
2063          _mesa_glsl_error(loc, state,
2064                           "geometry shader variables cannot be given "
2065                           "explicit locations\n");
2066          break;
2067
2068       case fragment_shader:
2069          if (!global_scope || (var->mode != ir_var_out)) {
2070             fail = true;
2071             string = "output";
2072          }
2073          break;
2074       };
2075
2076       if (fail) {
2077          _mesa_glsl_error(loc, state,
2078                           "only %s shader %s variables can be given an "
2079                           "explicit location\n",
2080                           _mesa_glsl_shader_target_name(state->target),
2081                           string);
2082       } else {
2083          var->explicit_location = true;
2084
2085          /* This bit of silliness is needed because invalid explicit locations
2086           * are supposed to be flagged during linking.  Small negative values
2087           * biased by VERT_ATTRIB_GENERIC0 or FRAG_RESULT_DATA0 could alias
2088           * built-in values (e.g., -16+VERT_ATTRIB_GENERIC0 = VERT_ATTRIB_POS).
2089           * The linker needs to be able to differentiate these cases.  This
2090           * ensures that negative values stay negative.
2091           */
2092          if (qual->location >= 0) {
2093             var->location = (state->target == vertex_shader)
2094                ? (qual->location + VERT_ATTRIB_GENERIC0)
2095                : (qual->location + FRAG_RESULT_DATA0);
2096          } else {
2097             var->location = qual->location;
2098          }
2099          if (qual->flags.q.explicit_index) {
2100             var->explicit_index = true;
2101             var->index = qual->index;
2102          }
2103       }
2104    } else if (qual->flags.q.explicit_index) {
2105          _mesa_glsl_error(loc, state,
2106                           "explicit index requires explicit location\n");
2107    }
2108
2109    /* Does the declaration use the 'layout' keyword?
2110     */
2111    const bool uses_layout = qual->flags.q.pixel_center_integer
2112       || qual->flags.q.origin_upper_left
2113       || qual->flags.q.explicit_location; /* no need for index since it relies on location */
2114
2115    /* Does the declaration use the deprecated 'attribute' or 'varying'
2116     * keywords?
2117     */
2118    const bool uses_deprecated_qualifier = qual->flags.q.attribute
2119       || qual->flags.q.varying;
2120
2121    /* Is the 'layout' keyword used with parameters that allow relaxed checking.
2122     * Many implementations of GL_ARB_fragment_coord_conventions_enable and some
2123     * implementations (only Mesa?) GL_ARB_explicit_attrib_location_enable
2124     * allowed the layout qualifier to be used with 'varying' and 'attribute'.
2125     * These extensions and all following extensions that add the 'layout'
2126     * keyword have been modified to require the use of 'in' or 'out'.
2127     *
2128     * The following extension do not allow the deprecated keywords:
2129     *
2130     *    GL_AMD_conservative_depth
2131     *    GL_ARB_conservative_depth
2132     *    GL_ARB_gpu_shader5
2133     *    GL_ARB_separate_shader_objects
2134     *    GL_ARB_tesselation_shader
2135     *    GL_ARB_transform_feedback3
2136     *    GL_ARB_uniform_buffer_object
2137     *
2138     * It is unknown whether GL_EXT_shader_image_load_store or GL_NV_gpu_shader5
2139     * allow layout with the deprecated keywords.
2140     */
2141    const bool relaxed_layout_qualifier_checking =
2142       state->ARB_fragment_coord_conventions_enable;
2143
2144    if (uses_layout && uses_deprecated_qualifier) {
2145       if (relaxed_layout_qualifier_checking) {
2146          _mesa_glsl_warning(loc, state,
2147                             "`layout' qualifier may not be used with "
2148                             "`attribute' or `varying'");
2149       } else {
2150          _mesa_glsl_error(loc, state,
2151                           "`layout' qualifier may not be used with "
2152                           "`attribute' or `varying'");
2153       }
2154    }
2155
2156    /* Layout qualifiers for gl_FragDepth, which are enabled by extension
2157     * AMD_conservative_depth.
2158     */
2159    int depth_layout_count = qual->flags.q.depth_any
2160       + qual->flags.q.depth_greater
2161       + qual->flags.q.depth_less
2162       + qual->flags.q.depth_unchanged;
2163    if (depth_layout_count > 0
2164        && !state->AMD_conservative_depth_enable
2165        && !state->ARB_conservative_depth_enable) {
2166        _mesa_glsl_error(loc, state,
2167                         "extension GL_AMD_conservative_depth or "
2168                         "GL_ARB_conservative_depth must be enabled "
2169                         "to use depth layout qualifiers");
2170    } else if (depth_layout_count > 0
2171               && strcmp(var->name, "gl_FragDepth") != 0) {
2172        _mesa_glsl_error(loc, state,
2173                         "depth layout qualifiers can be applied only to "
2174                         "gl_FragDepth");
2175    } else if (depth_layout_count > 1
2176               && strcmp(var->name, "gl_FragDepth") == 0) {
2177       _mesa_glsl_error(loc, state,
2178                        "at most one depth layout qualifier can be applied to "
2179                        "gl_FragDepth");
2180    }
2181    if (qual->flags.q.depth_any)
2182       var->depth_layout = ir_depth_layout_any;
2183    else if (qual->flags.q.depth_greater)
2184       var->depth_layout = ir_depth_layout_greater;
2185    else if (qual->flags.q.depth_less)
2186       var->depth_layout = ir_depth_layout_less;
2187    else if (qual->flags.q.depth_unchanged)
2188        var->depth_layout = ir_depth_layout_unchanged;
2189    else
2190        var->depth_layout = ir_depth_layout_none;
2191 }
2192
2193 /**
2194  * Get the variable that is being redeclared by this declaration
2195  *
2196  * Semantic checks to verify the validity of the redeclaration are also
2197  * performed.  If semantic checks fail, compilation error will be emitted via
2198  * \c _mesa_glsl_error, but a non-\c NULL pointer will still be returned.
2199  *
2200  * \returns
2201  * A pointer to an existing variable in the current scope if the declaration
2202  * is a redeclaration, \c NULL otherwise.
2203  */
2204 ir_variable *
2205 get_variable_being_redeclared(ir_variable *var, ast_declaration *decl,
2206                               struct _mesa_glsl_parse_state *state)
2207 {
2208    /* Check if this declaration is actually a re-declaration, either to
2209     * resize an array or add qualifiers to an existing variable.
2210     *
2211     * This is allowed for variables in the current scope, or when at
2212     * global scope (for built-ins in the implicit outer scope).
2213     */
2214    ir_variable *earlier = state->symbols->get_variable(decl->identifier);
2215    if (earlier == NULL ||
2216        (state->current_function != NULL &&
2217         !state->symbols->name_declared_this_scope(decl->identifier))) {
2218       return NULL;
2219    }
2220
2221
2222    YYLTYPE loc = decl->get_location();
2223
2224    /* From page 24 (page 30 of the PDF) of the GLSL 1.50 spec,
2225     *
2226     * "It is legal to declare an array without a size and then
2227     *  later re-declare the same name as an array of the same
2228     *  type and specify a size."
2229     */
2230    if ((earlier->type->array_size() == 0)
2231        && var->type->is_array()
2232        && (var->type->element_type() == earlier->type->element_type())) {
2233       /* FINISHME: This doesn't match the qualifiers on the two
2234        * FINISHME: declarations.  It's not 100% clear whether this is
2235        * FINISHME: required or not.
2236        */
2237
2238       const unsigned size = unsigned(var->type->array_size());
2239       check_builtin_array_max_size(var->name, size, loc, state);
2240       if ((size > 0) && (size <= earlier->max_array_access)) {
2241          _mesa_glsl_error(& loc, state, "array size must be > %u due to "
2242                           "previous access",
2243                           earlier->max_array_access);
2244       }
2245
2246       earlier->type = var->type;
2247       delete var;
2248       var = NULL;
2249    } else if (state->ARB_fragment_coord_conventions_enable
2250               && strcmp(var->name, "gl_FragCoord") == 0
2251               && earlier->type == var->type
2252               && earlier->mode == var->mode) {
2253       /* Allow redeclaration of gl_FragCoord for ARB_fcc layout
2254        * qualifiers.
2255        */
2256       earlier->origin_upper_left = var->origin_upper_left;
2257       earlier->pixel_center_integer = var->pixel_center_integer;
2258
2259       /* According to section 4.3.7 of the GLSL 1.30 spec,
2260        * the following built-in varaibles can be redeclared with an
2261        * interpolation qualifier:
2262        *    * gl_FrontColor
2263        *    * gl_BackColor
2264        *    * gl_FrontSecondaryColor
2265        *    * gl_BackSecondaryColor
2266        *    * gl_Color
2267        *    * gl_SecondaryColor
2268        */
2269    } else if (state->language_version >= 130
2270               && (strcmp(var->name, "gl_FrontColor") == 0
2271                   || strcmp(var->name, "gl_BackColor") == 0
2272                   || strcmp(var->name, "gl_FrontSecondaryColor") == 0
2273                   || strcmp(var->name, "gl_BackSecondaryColor") == 0
2274                   || strcmp(var->name, "gl_Color") == 0
2275                   || strcmp(var->name, "gl_SecondaryColor") == 0)
2276               && earlier->type == var->type
2277               && earlier->mode == var->mode) {
2278       earlier->interpolation = var->interpolation;
2279
2280       /* Layout qualifiers for gl_FragDepth. */
2281    } else if ((state->AMD_conservative_depth_enable ||
2282                state->ARB_conservative_depth_enable)
2283               && strcmp(var->name, "gl_FragDepth") == 0
2284               && earlier->type == var->type
2285               && earlier->mode == var->mode) {
2286
2287       /** From the AMD_conservative_depth spec:
2288        *     Within any shader, the first redeclarations of gl_FragDepth
2289        *     must appear before any use of gl_FragDepth.
2290        */
2291       if (earlier->used) {
2292          _mesa_glsl_error(&loc, state,
2293                           "the first redeclaration of gl_FragDepth "
2294                           "must appear before any use of gl_FragDepth");
2295       }
2296
2297       /* Prevent inconsistent redeclaration of depth layout qualifier. */
2298       if (earlier->depth_layout != ir_depth_layout_none
2299           && earlier->depth_layout != var->depth_layout) {
2300          _mesa_glsl_error(&loc, state,
2301                           "gl_FragDepth: depth layout is declared here "
2302                           "as '%s, but it was previously declared as "
2303                           "'%s'",
2304                           depth_layout_string(var->depth_layout),
2305                           depth_layout_string(earlier->depth_layout));
2306       }
2307
2308       earlier->depth_layout = var->depth_layout;
2309
2310    } else {
2311       _mesa_glsl_error(&loc, state, "`%s' redeclared", decl->identifier);
2312    }
2313
2314    return earlier;
2315 }
2316
2317 /**
2318  * Generate the IR for an initializer in a variable declaration
2319  */
2320 ir_rvalue *
2321 process_initializer(ir_variable *var, ast_declaration *decl,
2322                     ast_fully_specified_type *type,
2323                     exec_list *initializer_instructions,
2324                     struct _mesa_glsl_parse_state *state)
2325 {
2326    ir_rvalue *result = NULL;
2327
2328    YYLTYPE initializer_loc = decl->initializer->get_location();
2329
2330    /* From page 24 (page 30 of the PDF) of the GLSL 1.10 spec:
2331     *
2332     *    "All uniform variables are read-only and are initialized either
2333     *    directly by an application via API commands, or indirectly by
2334     *    OpenGL."
2335     */
2336    if ((state->language_version <= 110)
2337        && (var->mode == ir_var_uniform)) {
2338       _mesa_glsl_error(& initializer_loc, state,
2339                        "cannot initialize uniforms in GLSL 1.10");
2340    }
2341
2342    if (var->type->is_sampler()) {
2343       _mesa_glsl_error(& initializer_loc, state,
2344                        "cannot initialize samplers");
2345    }
2346
2347    if ((var->mode == ir_var_in) && (state->current_function == NULL)) {
2348       _mesa_glsl_error(& initializer_loc, state,
2349                        "cannot initialize %s shader input / %s",
2350                        _mesa_glsl_shader_target_name(state->target),
2351                        (state->target == vertex_shader)
2352                        ? "attribute" : "varying");
2353    }
2354
2355    ir_dereference *const lhs = new(state) ir_dereference_variable(var);
2356    ir_rvalue *rhs = decl->initializer->hir(initializer_instructions,
2357                                            state);
2358
2359    /* Calculate the constant value if this is a const or uniform
2360     * declaration.
2361     */
2362    if (type->qualifier.flags.q.constant
2363        || type->qualifier.flags.q.uniform) {
2364       ir_rvalue *new_rhs = validate_assignment(state, var->type, rhs, true);
2365       if (new_rhs != NULL) {
2366          rhs = new_rhs;
2367
2368          ir_constant *constant_value = rhs->constant_expression_value();
2369          if (!constant_value) {
2370             _mesa_glsl_error(& initializer_loc, state,
2371                              "initializer of %s variable `%s' must be a "
2372                              "constant expression",
2373                              (type->qualifier.flags.q.constant)
2374                              ? "const" : "uniform",
2375                              decl->identifier);
2376             if (var->type->is_numeric()) {
2377                /* Reduce cascading errors. */
2378                var->constant_value = ir_constant::zero(state, var->type);
2379             }
2380          } else {
2381             rhs = constant_value;
2382             var->constant_value = constant_value;
2383          }
2384       } else {
2385          _mesa_glsl_error(&initializer_loc, state,
2386                           "initializer of type %s cannot be assigned to "
2387                           "variable of type %s",
2388                           rhs->type->name, var->type->name);
2389          if (var->type->is_numeric()) {
2390             /* Reduce cascading errors. */
2391             var->constant_value = ir_constant::zero(state, var->type);
2392          }
2393       }
2394    }
2395
2396    if (rhs && !rhs->type->is_error()) {
2397       bool temp = var->read_only;
2398       if (type->qualifier.flags.q.constant)
2399          var->read_only = false;
2400
2401       /* Never emit code to initialize a uniform.
2402        */
2403       const glsl_type *initializer_type;
2404       if (!type->qualifier.flags.q.uniform) {
2405          result = do_assignment(initializer_instructions, state,
2406                                 NULL,
2407                                 lhs, rhs, true,
2408                                 type->get_location());
2409          initializer_type = result->type;
2410       } else
2411          initializer_type = rhs->type;
2412
2413       var->constant_initializer = rhs->constant_expression_value();
2414       var->has_initializer = true;
2415
2416       /* If the declared variable is an unsized array, it must inherrit
2417        * its full type from the initializer.  A declaration such as
2418        *
2419        *     uniform float a[] = float[](1.0, 2.0, 3.0, 3.0);
2420        *
2421        * becomes
2422        *
2423        *     uniform float a[4] = float[](1.0, 2.0, 3.0, 3.0);
2424        *
2425        * The assignment generated in the if-statement (below) will also
2426        * automatically handle this case for non-uniforms.
2427        *
2428        * If the declared variable is not an array, the types must
2429        * already match exactly.  As a result, the type assignment
2430        * here can be done unconditionally.  For non-uniforms the call
2431        * to do_assignment can change the type of the initializer (via
2432        * the implicit conversion rules).  For uniforms the initializer
2433        * must be a constant expression, and the type of that expression
2434        * was validated above.
2435        */
2436       var->type = initializer_type;
2437
2438       var->read_only = temp;
2439    }
2440
2441    return result;
2442 }
2443
2444 ir_rvalue *
2445 ast_declarator_list::hir(exec_list *instructions,
2446                          struct _mesa_glsl_parse_state *state)
2447 {
2448    void *ctx = state;
2449    const struct glsl_type *decl_type;
2450    const char *type_name = NULL;
2451    ir_rvalue *result = NULL;
2452    YYLTYPE loc = this->get_location();
2453
2454    /* From page 46 (page 52 of the PDF) of the GLSL 1.50 spec:
2455     *
2456     *     "To ensure that a particular output variable is invariant, it is
2457     *     necessary to use the invariant qualifier. It can either be used to
2458     *     qualify a previously declared variable as being invariant
2459     *
2460     *         invariant gl_Position; // make existing gl_Position be invariant"
2461     *
2462     * In these cases the parser will set the 'invariant' flag in the declarator
2463     * list, and the type will be NULL.
2464     */
2465    if (this->invariant) {
2466       assert(this->type == NULL);
2467
2468       if (state->current_function != NULL) {
2469          _mesa_glsl_error(& loc, state,
2470                           "All uses of `invariant' keyword must be at global "
2471                           "scope\n");
2472       }
2473
2474       foreach_list_typed (ast_declaration, decl, link, &this->declarations) {
2475          assert(!decl->is_array);
2476          assert(decl->array_size == NULL);
2477          assert(decl->initializer == NULL);
2478
2479          ir_variable *const earlier =
2480             state->symbols->get_variable(decl->identifier);
2481          if (earlier == NULL) {
2482             _mesa_glsl_error(& loc, state,
2483                              "Undeclared variable `%s' cannot be marked "
2484                              "invariant\n", decl->identifier);
2485          } else if ((state->target == vertex_shader)
2486                && (earlier->mode != ir_var_out)) {
2487             _mesa_glsl_error(& loc, state,
2488                              "`%s' cannot be marked invariant, vertex shader "
2489                              "outputs only\n", decl->identifier);
2490          } else if ((state->target == fragment_shader)
2491                && (earlier->mode != ir_var_in)) {
2492             _mesa_glsl_error(& loc, state,
2493                              "`%s' cannot be marked invariant, fragment shader "
2494                              "inputs only\n", decl->identifier);
2495          } else if (earlier->used) {
2496             _mesa_glsl_error(& loc, state,
2497                              "variable `%s' may not be redeclared "
2498                              "`invariant' after being used",
2499                              earlier->name);
2500          } else {
2501             earlier->invariant = true;
2502          }
2503       }
2504
2505       /* Invariant redeclarations do not have r-values.
2506        */
2507       return NULL;
2508    }
2509
2510    assert(this->type != NULL);
2511    assert(!this->invariant);
2512
2513    /* The type specifier may contain a structure definition.  Process that
2514     * before any of the variable declarations.
2515     */
2516    (void) this->type->specifier->hir(instructions, state);
2517
2518    decl_type = this->type->specifier->glsl_type(& type_name, state);
2519    if (this->declarations.is_empty()) {
2520       /* If there is no structure involved in the program text, there are two
2521        * possible scenarios:
2522        *
2523        * - The program text contained something like 'vec4;'.  This is an
2524        *   empty declaration.  It is valid but weird.  Emit a warning.
2525        *
2526        * - The program text contained something like 'S;' and 'S' is not the
2527        *   name of a known structure type.  This is both invalid and weird.
2528        *   Emit an error.
2529        *
2530        * Note that if decl_type is NULL and there is a structure involved,
2531        * there must have been some sort of error with the structure.  In this
2532        * case we assume that an error was already generated on this line of
2533        * code for the structure.  There is no need to generate an additional,
2534        * confusing error.
2535        */
2536       assert(this->type->specifier->structure == NULL || decl_type != NULL
2537              || state->error);
2538       if (this->type->specifier->structure == NULL) {
2539          if (decl_type != NULL) {
2540             _mesa_glsl_warning(&loc, state, "empty declaration");
2541          } else {
2542             _mesa_glsl_error(&loc, state,
2543                              "invalid type `%s' in empty declaration",
2544                              type_name);
2545          }
2546       }
2547    }
2548
2549    foreach_list_typed (ast_declaration, decl, link, &this->declarations) {
2550       const struct glsl_type *var_type;
2551       ir_variable *var;
2552
2553       /* FINISHME: Emit a warning if a variable declaration shadows a
2554        * FINISHME: declaration at a higher scope.
2555        */
2556
2557       if ((decl_type == NULL) || decl_type->is_void()) {
2558          if (type_name != NULL) {
2559             _mesa_glsl_error(& loc, state,
2560                              "invalid type `%s' in declaration of `%s'",
2561                              type_name, decl->identifier);
2562          } else {
2563             _mesa_glsl_error(& loc, state,
2564                              "invalid type in declaration of `%s'",
2565                              decl->identifier);
2566          }
2567          continue;
2568       }
2569
2570       if (decl->is_array) {
2571          var_type = process_array_type(&loc, decl_type, decl->array_size,
2572                                        state);
2573          if (var_type->is_error())
2574             continue;
2575       } else {
2576          var_type = decl_type;
2577       }
2578
2579       var = new(ctx) ir_variable(var_type, decl->identifier, ir_var_auto);
2580
2581       /* From page 22 (page 28 of the PDF) of the GLSL 1.10 specification;
2582        *
2583        *     "Global variables can only use the qualifiers const,
2584        *     attribute, uni form, or varying. Only one may be
2585        *     specified.
2586        *
2587        *     Local variables can only use the qualifier const."
2588        *
2589        * This is relaxed in GLSL 1.30.  It is also relaxed by any extension
2590        * that adds the 'layout' keyword.
2591        */
2592       if ((state->language_version < 130)
2593           && !state->ARB_explicit_attrib_location_enable
2594           && !state->ARB_fragment_coord_conventions_enable) {
2595          if (this->type->qualifier.flags.q.out) {
2596             _mesa_glsl_error(& loc, state,
2597                              "`out' qualifier in declaration of `%s' "
2598                              "only valid for function parameters in %s.",
2599                              decl->identifier, state->version_string);
2600          }
2601          if (this->type->qualifier.flags.q.in) {
2602             _mesa_glsl_error(& loc, state,
2603                              "`in' qualifier in declaration of `%s' "
2604                              "only valid for function parameters in %s.",
2605                              decl->identifier, state->version_string);
2606          }
2607          /* FINISHME: Test for other invalid qualifiers. */
2608       }
2609
2610       apply_type_qualifier_to_variable(& this->type->qualifier, var, state,
2611                                        & loc);
2612
2613       if (this->type->qualifier.flags.q.invariant) {
2614          if ((state->target == vertex_shader) && !(var->mode == ir_var_out ||
2615                                                    var->mode == ir_var_inout)) {
2616             /* FINISHME: Note that this doesn't work for invariant on
2617              * a function signature outval
2618              */
2619             _mesa_glsl_error(& loc, state,
2620                              "`%s' cannot be marked invariant, vertex shader "
2621                              "outputs only\n", var->name);
2622          } else if ((state->target == fragment_shader) &&
2623                     !(var->mode == ir_var_in || var->mode == ir_var_inout)) {
2624             /* FINISHME: Note that this doesn't work for invariant on
2625              * a function signature inval
2626              */
2627             _mesa_glsl_error(& loc, state,
2628                              "`%s' cannot be marked invariant, fragment shader "
2629                              "inputs only\n", var->name);
2630          }
2631       }
2632
2633       if (state->current_function != NULL) {
2634          const char *mode = NULL;
2635          const char *extra = "";
2636
2637          /* There is no need to check for 'inout' here because the parser will
2638           * only allow that in function parameter lists.
2639           */
2640          if (this->type->qualifier.flags.q.attribute) {
2641             mode = "attribute";
2642          } else if (this->type->qualifier.flags.q.uniform) {
2643             mode = "uniform";
2644          } else if (this->type->qualifier.flags.q.varying) {
2645             mode = "varying";
2646          } else if (this->type->qualifier.flags.q.in) {
2647             mode = "in";
2648             extra = " or in function parameter list";
2649          } else if (this->type->qualifier.flags.q.out) {
2650             mode = "out";
2651             extra = " or in function parameter list";
2652          }
2653
2654          if (mode) {
2655             _mesa_glsl_error(& loc, state,
2656                              "%s variable `%s' must be declared at "
2657                              "global scope%s",
2658                              mode, var->name, extra);
2659          }
2660       } else if (var->mode == ir_var_in) {
2661          var->read_only = true;
2662
2663          if (state->target == vertex_shader) {
2664             bool error_emitted = false;
2665
2666             /* From page 31 (page 37 of the PDF) of the GLSL 1.50 spec:
2667              *
2668              *    "Vertex shader inputs can only be float, floating-point
2669              *    vectors, matrices, signed and unsigned integers and integer
2670              *    vectors. Vertex shader inputs can also form arrays of these
2671              *    types, but not structures."
2672              *
2673              * From page 31 (page 27 of the PDF) of the GLSL 1.30 spec:
2674              *
2675              *    "Vertex shader inputs can only be float, floating-point
2676              *    vectors, matrices, signed and unsigned integers and integer
2677              *    vectors. They cannot be arrays or structures."
2678              *
2679              * From page 23 (page 29 of the PDF) of the GLSL 1.20 spec:
2680              *
2681              *    "The attribute qualifier can be used only with float,
2682              *    floating-point vectors, and matrices. Attribute variables
2683              *    cannot be declared as arrays or structures."
2684              */
2685             const glsl_type *check_type = var->type->is_array()
2686                ? var->type->fields.array : var->type;
2687
2688             switch (check_type->base_type) {
2689             case GLSL_TYPE_FLOAT:
2690                break;
2691             case GLSL_TYPE_UINT:
2692             case GLSL_TYPE_INT:
2693                if (state->language_version > 120)
2694                   break;
2695                /* FALLTHROUGH */
2696             default:
2697                _mesa_glsl_error(& loc, state,
2698                                 "vertex shader input / attribute cannot have "
2699                                 "type %s`%s'",
2700                                 var->type->is_array() ? "array of " : "",
2701                                 check_type->name);
2702                error_emitted = true;
2703             }
2704
2705             if (!error_emitted && (state->language_version <= 130)
2706                 && var->type->is_array()) {
2707                _mesa_glsl_error(& loc, state,
2708                                 "vertex shader input / attribute cannot have "
2709                                 "array type");
2710                error_emitted = true;
2711             }
2712          }
2713       }
2714
2715       /* Integer vertex outputs must be qualified with 'flat'.
2716        *
2717        * From section 4.3.6 of the GLSL 1.30 spec:
2718        *    "If a vertex output is a signed or unsigned integer or integer
2719        *    vector, then it must be qualified with the interpolation qualifier
2720        *    flat."
2721        */
2722       if (state->language_version >= 130
2723           && state->target == vertex_shader
2724           && state->current_function == NULL
2725           && var->type->is_integer()
2726           && var->mode == ir_var_out
2727           && var->interpolation != INTERP_QUALIFIER_FLAT) {
2728
2729          _mesa_glsl_error(&loc, state, "If a vertex output is an integer, "
2730                           "then it must be qualified with 'flat'");
2731       }
2732
2733
2734       /* Interpolation qualifiers cannot be applied to 'centroid' and
2735        * 'centroid varying'.
2736        *
2737        * From page 29 (page 35 of the PDF) of the GLSL 1.30 spec:
2738        *    "interpolation qualifiers may only precede the qualifiers in,
2739        *    centroid in, out, or centroid out in a declaration. They do not apply
2740        *    to the deprecated storage qualifiers varying or centroid varying."
2741        */
2742       if (state->language_version >= 130
2743           && this->type->qualifier.has_interpolation()
2744           && this->type->qualifier.flags.q.varying) {
2745
2746          const char *i = this->type->qualifier.interpolation_string();
2747          assert(i != NULL);
2748          const char *s;
2749          if (this->type->qualifier.flags.q.centroid)
2750             s = "centroid varying";
2751          else
2752             s = "varying";
2753
2754          _mesa_glsl_error(&loc, state,
2755                           "qualifier '%s' cannot be applied to the "
2756                           "deprecated storage qualifier '%s'", i, s);
2757       }
2758
2759
2760       /* Interpolation qualifiers can only apply to vertex shader outputs and
2761        * fragment shader inputs.
2762        *
2763        * From page 29 (page 35 of the PDF) of the GLSL 1.30 spec:
2764        *    "Outputs from a vertex shader (out) and inputs to a fragment
2765        *    shader (in) can be further qualified with one or more of these
2766        *    interpolation qualifiers"
2767        */
2768       if (state->language_version >= 130
2769           && this->type->qualifier.has_interpolation()) {
2770
2771          const char *i = this->type->qualifier.interpolation_string();
2772          assert(i != NULL);
2773
2774          switch (state->target) {
2775          case vertex_shader:
2776             if (this->type->qualifier.flags.q.in) {
2777                _mesa_glsl_error(&loc, state,
2778                                 "qualifier '%s' cannot be applied to vertex "
2779                                 "shader inputs", i);
2780             }
2781             break;
2782          case fragment_shader:
2783             if (this->type->qualifier.flags.q.out) {
2784                _mesa_glsl_error(&loc, state,
2785                                 "qualifier '%s' cannot be applied to fragment "
2786                                 "shader outputs", i);
2787             }
2788             break;
2789          default:
2790             assert(0);
2791          }
2792       }
2793
2794
2795       /* From section 4.3.4 of the GLSL 1.30 spec:
2796        *    "It is an error to use centroid in in a vertex shader."
2797        */
2798       if (state->language_version >= 130
2799           && this->type->qualifier.flags.q.centroid
2800           && this->type->qualifier.flags.q.in
2801           && state->target == vertex_shader) {
2802
2803          _mesa_glsl_error(&loc, state,
2804                           "'centroid in' cannot be used in a vertex shader");
2805       }
2806
2807
2808       /* Precision qualifiers exists only in GLSL versions 1.00 and >= 1.30.
2809        */
2810       if (this->type->specifier->precision != ast_precision_none
2811           && state->language_version != 100
2812           && state->language_version < 130) {
2813
2814          _mesa_glsl_error(&loc, state,
2815                           "precision qualifiers are supported only in GLSL ES "
2816                           "1.00, and GLSL 1.30 and later");
2817       }
2818
2819
2820       /* Precision qualifiers only apply to floating point and integer types.
2821        *
2822        * From section 4.5.2 of the GLSL 1.30 spec:
2823        *    "Any floating point or any integer declaration can have the type
2824        *    preceded by one of these precision qualifiers [...] Literal
2825        *    constants do not have precision qualifiers. Neither do Boolean
2826        *    variables.
2827        *
2828        * In GLSL ES, sampler types are also allowed.
2829        *
2830        * From page 87 of the GLSL ES spec:
2831        *    "RESOLUTION: Allow sampler types to take a precision qualifier."
2832        */
2833       if (this->type->specifier->precision != ast_precision_none
2834           && !var->type->is_float()
2835           && !var->type->is_integer()
2836           && !(var->type->is_sampler() && state->es_shader)
2837           && !(var->type->is_array()
2838                && (var->type->fields.array->is_float()
2839                    || var->type->fields.array->is_integer()))) {
2840
2841          _mesa_glsl_error(&loc, state,
2842                           "precision qualifiers apply only to floating point"
2843                           "%s types", state->es_shader ? ", integer, and sampler"
2844                                                        : "and integer");
2845       }
2846
2847       /* From page 17 (page 23 of the PDF) of the GLSL 1.20 spec:
2848        *
2849        *    "[Sampler types] can only be declared as function
2850        *    parameters or uniform variables (see Section 4.3.5
2851        *    "Uniform")".
2852        */
2853       if (var_type->contains_sampler() &&
2854           !this->type->qualifier.flags.q.uniform) {
2855          _mesa_glsl_error(&loc, state, "samplers must be declared uniform");
2856       }
2857
2858       /* Process the initializer and add its instructions to a temporary
2859        * list.  This list will be added to the instruction stream (below) after
2860        * the declaration is added.  This is done because in some cases (such as
2861        * redeclarations) the declaration may not actually be added to the
2862        * instruction stream.
2863        */
2864       exec_list initializer_instructions;
2865       ir_variable *earlier = get_variable_being_redeclared(var, decl, state);
2866
2867       if (decl->initializer != NULL) {
2868          result = process_initializer((earlier == NULL) ? var : earlier,
2869                                       decl, this->type,
2870                                       &initializer_instructions, state);
2871       }
2872
2873       /* From page 23 (page 29 of the PDF) of the GLSL 1.10 spec:
2874        *
2875        *     "It is an error to write to a const variable outside of
2876        *      its declaration, so they must be initialized when
2877        *      declared."
2878        */
2879       if (this->type->qualifier.flags.q.constant && decl->initializer == NULL) {
2880          _mesa_glsl_error(& loc, state,
2881                           "const declaration of `%s' must be initialized",
2882                           decl->identifier);
2883       }
2884
2885       /* If the declaration is not a redeclaration, there are a few additional
2886        * semantic checks that must be applied.  In addition, variable that was
2887        * created for the declaration should be added to the IR stream.
2888        */
2889       if (earlier == NULL) {
2890          /* From page 15 (page 21 of the PDF) of the GLSL 1.10 spec,
2891           *
2892           *   "Identifiers starting with "gl_" are reserved for use by
2893           *   OpenGL, and may not be declared in a shader as either a
2894           *   variable or a function."
2895           */
2896          if (strncmp(decl->identifier, "gl_", 3) == 0)
2897             _mesa_glsl_error(& loc, state,
2898                              "identifier `%s' uses reserved `gl_' prefix",
2899                              decl->identifier);
2900          else if (strstr(decl->identifier, "__")) {
2901             /* From page 14 (page 20 of the PDF) of the GLSL 1.10
2902              * spec:
2903              *
2904              *     "In addition, all identifiers containing two
2905              *      consecutive underscores (__) are reserved as
2906              *      possible future keywords."
2907              */
2908             _mesa_glsl_error(& loc, state,
2909                              "identifier `%s' uses reserved `__' string",
2910                              decl->identifier);
2911          }
2912
2913          /* Add the variable to the symbol table.  Note that the initializer's
2914           * IR was already processed earlier (though it hasn't been emitted
2915           * yet), without the variable in scope.
2916           *
2917           * This differs from most C-like languages, but it follows the GLSL
2918           * specification.  From page 28 (page 34 of the PDF) of the GLSL 1.50
2919           * spec:
2920           *
2921           *     "Within a declaration, the scope of a name starts immediately
2922           *     after the initializer if present or immediately after the name
2923           *     being declared if not."
2924           */
2925          if (!state->symbols->add_variable(var)) {
2926             YYLTYPE loc = this->get_location();
2927             _mesa_glsl_error(&loc, state, "name `%s' already taken in the "
2928                              "current scope", decl->identifier);
2929             continue;
2930          }
2931
2932          /* Push the variable declaration to the top.  It means that all the
2933           * variable declarations will appear in a funny last-to-first order,
2934           * but otherwise we run into trouble if a function is prototyped, a
2935           * global var is decled, then the function is defined with usage of
2936           * the global var.  See glslparsertest's CorrectModule.frag.
2937           */
2938          instructions->push_head(var);
2939       }
2940
2941       instructions->append_list(&initializer_instructions);
2942    }
2943
2944
2945    /* Generally, variable declarations do not have r-values.  However,
2946     * one is used for the declaration in
2947     *
2948     * while (bool b = some_condition()) {
2949     *   ...
2950     * }
2951     *
2952     * so we return the rvalue from the last seen declaration here.
2953     */
2954    return result;
2955 }
2956
2957
2958 ir_rvalue *
2959 ast_parameter_declarator::hir(exec_list *instructions,
2960                               struct _mesa_glsl_parse_state *state)
2961 {
2962    void *ctx = state;
2963    const struct glsl_type *type;
2964    const char *name = NULL;
2965    YYLTYPE loc = this->get_location();
2966
2967    type = this->type->specifier->glsl_type(& name, state);
2968
2969    if (type == NULL) {
2970       if (name != NULL) {
2971          _mesa_glsl_error(& loc, state,
2972                           "invalid type `%s' in declaration of `%s'",
2973                           name, this->identifier);
2974       } else {
2975          _mesa_glsl_error(& loc, state,
2976                           "invalid type in declaration of `%s'",
2977                           this->identifier);
2978       }
2979
2980       type = glsl_type::error_type;
2981    }
2982
2983    /* From page 62 (page 68 of the PDF) of the GLSL 1.50 spec:
2984     *
2985     *    "Functions that accept no input arguments need not use void in the
2986     *    argument list because prototypes (or definitions) are required and
2987     *    therefore there is no ambiguity when an empty argument list "( )" is
2988     *    declared. The idiom "(void)" as a parameter list is provided for
2989     *    convenience."
2990     *
2991     * Placing this check here prevents a void parameter being set up
2992     * for a function, which avoids tripping up checks for main taking
2993     * parameters and lookups of an unnamed symbol.
2994     */
2995    if (type->is_void()) {
2996       if (this->identifier != NULL)
2997          _mesa_glsl_error(& loc, state,
2998                           "named parameter cannot have type `void'");
2999
3000       is_void = true;
3001       return NULL;
3002    }
3003
3004    if (formal_parameter && (this->identifier == NULL)) {
3005       _mesa_glsl_error(& loc, state, "formal parameter lacks a name");
3006       return NULL;
3007    }
3008
3009    /* This only handles "vec4 foo[..]".  The earlier specifier->glsl_type(...)
3010     * call already handled the "vec4[..] foo" case.
3011     */
3012    if (this->is_array) {
3013       type = process_array_type(&loc, type, this->array_size, state);
3014    }
3015
3016    if (!type->is_error() && type->array_size() == 0) {
3017       _mesa_glsl_error(&loc, state, "arrays passed as parameters must have "
3018                        "a declared size.");
3019       type = glsl_type::error_type;
3020    }
3021
3022    is_void = false;
3023    ir_variable *var = new(ctx) ir_variable(type, this->identifier, ir_var_in);
3024
3025    /* Apply any specified qualifiers to the parameter declaration.  Note that
3026     * for function parameters the default mode is 'in'.
3027     */
3028    apply_type_qualifier_to_variable(& this->type->qualifier, var, state, & loc);
3029
3030    /* From page 17 (page 23 of the PDF) of the GLSL 1.20 spec:
3031     *
3032     *    "Samplers cannot be treated as l-values; hence cannot be used
3033     *    as out or inout function parameters, nor can they be assigned
3034     *    into."
3035     */
3036    if ((var->mode == ir_var_inout || var->mode == ir_var_out)
3037        && type->contains_sampler()) {
3038       _mesa_glsl_error(&loc, state, "out and inout parameters cannot contain samplers");
3039       type = glsl_type::error_type;
3040    }
3041
3042    /* From page 39 (page 45 of the PDF) of the GLSL 1.10 spec:
3043     *
3044     *    "When calling a function, expressions that do not evaluate to
3045     *     l-values cannot be passed to parameters declared as out or inout."
3046     *
3047     * From page 32 (page 38 of the PDF) of the GLSL 1.10 spec:
3048     *
3049     *    "Other binary or unary expressions, non-dereferenced arrays,
3050     *     function names, swizzles with repeated fields, and constants
3051     *     cannot be l-values."
3052     *
3053     * So for GLSL 1.10, passing an array as an out or inout parameter is not
3054     * allowed.  This restriction is removed in GLSL 1.20, and in GLSL ES.
3055     */
3056    if ((var->mode == ir_var_inout || var->mode == ir_var_out)
3057        && type->is_array() && state->language_version == 110) {
3058       _mesa_glsl_error(&loc, state, "Arrays cannot be out or inout parameters in GLSL 1.10");
3059       type = glsl_type::error_type;
3060    }
3061
3062    instructions->push_tail(var);
3063
3064    /* Parameter declarations do not have r-values.
3065     */
3066    return NULL;
3067 }
3068
3069
3070 void
3071 ast_parameter_declarator::parameters_to_hir(exec_list *ast_parameters,
3072                                             bool formal,
3073                                             exec_list *ir_parameters,
3074                                             _mesa_glsl_parse_state *state)
3075 {
3076    ast_parameter_declarator *void_param = NULL;
3077    unsigned count = 0;
3078
3079    foreach_list_typed (ast_parameter_declarator, param, link, ast_parameters) {
3080       param->formal_parameter = formal;
3081       param->hir(ir_parameters, state);
3082
3083       if (param->is_void)
3084          void_param = param;
3085
3086       count++;
3087    }
3088
3089    if ((void_param != NULL) && (count > 1)) {
3090       YYLTYPE loc = void_param->get_location();
3091
3092       _mesa_glsl_error(& loc, state,
3093                        "`void' parameter must be only parameter");
3094    }
3095 }
3096
3097
3098 void
3099 emit_function(_mesa_glsl_parse_state *state, ir_function *f)
3100 {
3101    /* IR invariants disallow function declarations or definitions
3102     * nested within other function definitions.  But there is no
3103     * requirement about the relative order of function declarations
3104     * and definitions with respect to one another.  So simply insert
3105     * the new ir_function block at the end of the toplevel instruction
3106     * list.
3107     */
3108    state->toplevel_ir->push_tail(f);
3109 }
3110
3111
3112 ir_rvalue *
3113 ast_function::hir(exec_list *instructions,
3114                   struct _mesa_glsl_parse_state *state)
3115 {
3116    void *ctx = state;
3117    ir_function *f = NULL;
3118    ir_function_signature *sig = NULL;
3119    exec_list hir_parameters;
3120
3121    const char *const name = identifier;
3122
3123    /* New functions are always added to the top-level IR instruction stream,
3124     * so this instruction list pointer is ignored.  See also emit_function
3125     * (called below).
3126     */
3127    (void) instructions;
3128
3129    /* From page 21 (page 27 of the PDF) of the GLSL 1.20 spec,
3130     *
3131     *   "Function declarations (prototypes) cannot occur inside of functions;
3132     *   they must be at global scope, or for the built-in functions, outside
3133     *   the global scope."
3134     *
3135     * From page 27 (page 33 of the PDF) of the GLSL ES 1.00.16 spec,
3136     *
3137     *   "User defined functions may only be defined within the global scope."
3138     *
3139     * Note that this language does not appear in GLSL 1.10.
3140     */
3141    if ((state->current_function != NULL) && (state->language_version != 110)) {
3142       YYLTYPE loc = this->get_location();
3143       _mesa_glsl_error(&loc, state,
3144                        "declaration of function `%s' not allowed within "
3145                        "function body", name);
3146    }
3147
3148    /* From page 15 (page 21 of the PDF) of the GLSL 1.10 spec,
3149     *
3150     *   "Identifiers starting with "gl_" are reserved for use by
3151     *   OpenGL, and may not be declared in a shader as either a
3152     *   variable or a function."
3153     */
3154    if (strncmp(name, "gl_", 3) == 0) {
3155       YYLTYPE loc = this->get_location();
3156       _mesa_glsl_error(&loc, state,
3157                        "identifier `%s' uses reserved `gl_' prefix", name);
3158    }
3159
3160    /* Convert the list of function parameters to HIR now so that they can be
3161     * used below to compare this function's signature with previously seen
3162     * signatures for functions with the same name.
3163     */
3164    ast_parameter_declarator::parameters_to_hir(& this->parameters,
3165                                                is_definition,
3166                                                & hir_parameters, state);
3167
3168    const char *return_type_name;
3169    const glsl_type *return_type =
3170       this->return_type->specifier->glsl_type(& return_type_name, state);
3171
3172    if (!return_type) {
3173       YYLTYPE loc = this->get_location();
3174       _mesa_glsl_error(&loc, state,
3175                        "function `%s' has undeclared return type `%s'",
3176                        name, return_type_name);
3177       return_type = glsl_type::error_type;
3178    }
3179
3180    /* From page 56 (page 62 of the PDF) of the GLSL 1.30 spec:
3181     * "No qualifier is allowed on the return type of a function."
3182     */
3183    if (this->return_type->has_qualifiers()) {
3184       YYLTYPE loc = this->get_location();
3185       _mesa_glsl_error(& loc, state,
3186                        "function `%s' return type has qualifiers", name);
3187    }
3188
3189    /* From page 17 (page 23 of the PDF) of the GLSL 1.20 spec:
3190     *
3191     *    "[Sampler types] can only be declared as function parameters
3192     *    or uniform variables (see Section 4.3.5 "Uniform")".
3193     */
3194    if (return_type->contains_sampler()) {
3195       YYLTYPE loc = this->get_location();
3196       _mesa_glsl_error(&loc, state,
3197                        "function `%s' return type can't contain a sampler",
3198                        name);
3199    }
3200
3201    /* Verify that this function's signature either doesn't match a previously
3202     * seen signature for a function with the same name, or, if a match is found,
3203     * that the previously seen signature does not have an associated definition.
3204     */
3205    f = state->symbols->get_function(name);
3206    if (f != NULL && (state->es_shader || f->has_user_signature())) {
3207       sig = f->exact_matching_signature(&hir_parameters);
3208       if (sig != NULL) {
3209          const char *badvar = sig->qualifiers_match(&hir_parameters);
3210          if (badvar != NULL) {
3211             YYLTYPE loc = this->get_location();
3212
3213             _mesa_glsl_error(&loc, state, "function `%s' parameter `%s' "
3214                              "qualifiers don't match prototype", name, badvar);
3215          }
3216
3217          if (sig->return_type != return_type) {
3218             YYLTYPE loc = this->get_location();
3219
3220             _mesa_glsl_error(&loc, state, "function `%s' return type doesn't "
3221                              "match prototype", name);
3222          }
3223
3224          if (is_definition && sig->is_defined) {
3225             YYLTYPE loc = this->get_location();
3226
3227             _mesa_glsl_error(& loc, state, "function `%s' redefined", name);
3228          }
3229       }
3230    } else {
3231       f = new(ctx) ir_function(name);
3232       if (!state->symbols->add_function(f)) {
3233          /* This function name shadows a non-function use of the same name. */
3234          YYLTYPE loc = this->get_location();
3235
3236          _mesa_glsl_error(&loc, state, "function name `%s' conflicts with "
3237                           "non-function", name);
3238          return NULL;
3239       }
3240
3241       emit_function(state, f);
3242    }
3243
3244    /* Verify the return type of main() */
3245    if (strcmp(name, "main") == 0) {
3246       if (! return_type->is_void()) {
3247          YYLTYPE loc = this->get_location();
3248
3249          _mesa_glsl_error(& loc, state, "main() must return void");
3250       }
3251
3252       if (!hir_parameters.is_empty()) {
3253          YYLTYPE loc = this->get_location();
3254
3255          _mesa_glsl_error(& loc, state, "main() must not take any parameters");
3256       }
3257    }
3258
3259    /* Finish storing the information about this new function in its signature.
3260     */
3261    if (sig == NULL) {
3262       sig = new(ctx) ir_function_signature(return_type);
3263       f->add_signature(sig);
3264    }
3265
3266    sig->replace_parameters(&hir_parameters);
3267    signature = sig;
3268
3269    /* Function declarations (prototypes) do not have r-values.
3270     */
3271    return NULL;
3272 }
3273
3274
3275 ir_rvalue *
3276 ast_function_definition::hir(exec_list *instructions,
3277                              struct _mesa_glsl_parse_state *state)
3278 {
3279    prototype->is_definition = true;
3280    prototype->hir(instructions, state);
3281
3282    ir_function_signature *signature = prototype->signature;
3283    if (signature == NULL)
3284       return NULL;
3285
3286    assert(state->current_function == NULL);
3287    state->current_function = signature;
3288    state->found_return = false;
3289
3290    /* Duplicate parameters declared in the prototype as concrete variables.
3291     * Add these to the symbol table.
3292     */
3293    state->symbols->push_scope();
3294    foreach_iter(exec_list_iterator, iter, signature->parameters) {
3295       ir_variable *const var = ((ir_instruction *) iter.get())->as_variable();
3296
3297       assert(var != NULL);
3298
3299       /* The only way a parameter would "exist" is if two parameters have
3300        * the same name.
3301        */
3302       if (state->symbols->name_declared_this_scope(var->name)) {
3303          YYLTYPE loc = this->get_location();
3304
3305          _mesa_glsl_error(& loc, state, "parameter `%s' redeclared", var->name);
3306       } else {
3307          state->symbols->add_variable(var);
3308       }
3309    }
3310
3311    /* Convert the body of the function to HIR. */
3312    this->body->hir(&signature->body, state);
3313    signature->is_defined = true;
3314
3315    state->symbols->pop_scope();
3316
3317    assert(state->current_function == signature);
3318    state->current_function = NULL;
3319
3320    if (!signature->return_type->is_void() && !state->found_return) {
3321       YYLTYPE loc = this->get_location();
3322       _mesa_glsl_error(& loc, state, "function `%s' has non-void return type "
3323                        "%s, but no return statement",
3324                        signature->function_name(),
3325                        signature->return_type->name);
3326    }
3327
3328    /* Function definitions do not have r-values.
3329     */
3330    return NULL;
3331 }
3332
3333
3334 ir_rvalue *
3335 ast_jump_statement::hir(exec_list *instructions,
3336                         struct _mesa_glsl_parse_state *state)
3337 {
3338    void *ctx = state;
3339
3340    switch (mode) {
3341    case ast_return: {
3342       ir_return *inst;
3343       assert(state->current_function);
3344
3345       if (opt_return_value) {
3346          ir_rvalue *const ret = opt_return_value->hir(instructions, state);
3347
3348          /* The value of the return type can be NULL if the shader says
3349           * 'return foo();' and foo() is a function that returns void.
3350           *
3351           * NOTE: The GLSL spec doesn't say that this is an error.  The type
3352           * of the return value is void.  If the return type of the function is
3353           * also void, then this should compile without error.  Seriously.
3354           */
3355          const glsl_type *const ret_type =
3356             (ret == NULL) ? glsl_type::void_type : ret->type;
3357
3358          /* Implicit conversions are not allowed for return values. */
3359          if (state->current_function->return_type != ret_type) {
3360             YYLTYPE loc = this->get_location();
3361
3362             _mesa_glsl_error(& loc, state,
3363                              "`return' with wrong type %s, in function `%s' "
3364                              "returning %s",
3365                              ret_type->name,
3366                              state->current_function->function_name(),
3367                              state->current_function->return_type->name);
3368          }
3369
3370          inst = new(ctx) ir_return(ret);
3371       } else {
3372          if (state->current_function->return_type->base_type !=
3373              GLSL_TYPE_VOID) {
3374             YYLTYPE loc = this->get_location();
3375
3376             _mesa_glsl_error(& loc, state,
3377                              "`return' with no value, in function %s returning "
3378                              "non-void",
3379                              state->current_function->function_name());
3380          }
3381          inst = new(ctx) ir_return;
3382       }
3383
3384       state->found_return = true;
3385       instructions->push_tail(inst);
3386       break;
3387    }
3388
3389    case ast_discard:
3390       if (state->target != fragment_shader) {
3391          YYLTYPE loc = this->get_location();
3392
3393          _mesa_glsl_error(& loc, state,
3394                           "`discard' may only appear in a fragment shader");
3395       }
3396       instructions->push_tail(new(ctx) ir_discard);
3397       break;
3398
3399    case ast_break:
3400    case ast_continue:
3401       if (mode == ast_continue &&
3402           state->loop_nesting_ast == NULL) {
3403          YYLTYPE loc = this->get_location();
3404
3405          _mesa_glsl_error(& loc, state,
3406                           "continue may only appear in a loop");
3407       } else if (mode == ast_break &&
3408                  state->loop_nesting_ast == NULL &&
3409                  state->switch_state.switch_nesting_ast == NULL) {
3410          YYLTYPE loc = this->get_location();
3411
3412          _mesa_glsl_error(& loc, state,
3413                           "break may only appear in a loop or a switch");
3414       } else {
3415          /* For a loop, inline the for loop expression again,
3416           * since we don't know where near the end of
3417           * the loop body the normal copy of it
3418           * is going to be placed.
3419           */
3420          if (state->loop_nesting_ast != NULL &&
3421              mode == ast_continue &&
3422              state->loop_nesting_ast->rest_expression) {
3423             state->loop_nesting_ast->rest_expression->hir(instructions,
3424                                                           state);
3425          }
3426
3427          if (state->switch_state.is_switch_innermost &&
3428              mode == ast_break) {
3429             /* Force break out of switch by setting is_break switch state.
3430              */
3431             ir_variable *const is_break_var = state->switch_state.is_break_var;
3432             ir_dereference_variable *const deref_is_break_var =
3433                new(ctx) ir_dereference_variable(is_break_var);
3434             ir_constant *const true_val = new(ctx) ir_constant(true);
3435             ir_assignment *const set_break_var =
3436                new(ctx) ir_assignment(deref_is_break_var,
3437                                       true_val,
3438                                       NULL);
3439             
3440             instructions->push_tail(set_break_var);
3441          }
3442          else {
3443             ir_loop_jump *const jump = 
3444                new(ctx) ir_loop_jump((mode == ast_break)
3445                                      ? ir_loop_jump::jump_break
3446                                      : ir_loop_jump::jump_continue);
3447             instructions->push_tail(jump);
3448          }
3449       }
3450
3451       break;
3452    }
3453
3454    /* Jump instructions do not have r-values.
3455     */
3456    return NULL;
3457 }
3458
3459
3460 ir_rvalue *
3461 ast_selection_statement::hir(exec_list *instructions,
3462                              struct _mesa_glsl_parse_state *state)
3463 {
3464    void *ctx = state;
3465
3466    ir_rvalue *const condition = this->condition->hir(instructions, state);
3467
3468    /* From page 66 (page 72 of the PDF) of the GLSL 1.50 spec:
3469     *
3470     *    "Any expression whose type evaluates to a Boolean can be used as the
3471     *    conditional expression bool-expression. Vector types are not accepted
3472     *    as the expression to if."
3473     *
3474     * The checks are separated so that higher quality diagnostics can be
3475     * generated for cases where both rules are violated.
3476     */
3477    if (!condition->type->is_boolean() || !condition->type->is_scalar()) {
3478       YYLTYPE loc = this->condition->get_location();
3479
3480       _mesa_glsl_error(& loc, state, "if-statement condition must be scalar "
3481                        "boolean");
3482    }
3483
3484    ir_if *const stmt = new(ctx) ir_if(condition);
3485
3486    if (then_statement != NULL) {
3487       state->symbols->push_scope();
3488       then_statement->hir(& stmt->then_instructions, state);
3489       state->symbols->pop_scope();
3490    }
3491
3492    if (else_statement != NULL) {
3493       state->symbols->push_scope();
3494       else_statement->hir(& stmt->else_instructions, state);
3495       state->symbols->pop_scope();
3496    }
3497
3498    instructions->push_tail(stmt);
3499
3500    /* if-statements do not have r-values.
3501     */
3502    return NULL;
3503 }
3504
3505
3506 ir_rvalue *
3507 ast_switch_statement::hir(exec_list *instructions,
3508                           struct _mesa_glsl_parse_state *state)
3509 {
3510    void *ctx = state;
3511
3512    ir_rvalue *const test_expression =
3513       this->test_expression->hir(instructions, state);
3514
3515    /* From page 66 (page 55 of the PDF) of the GLSL 1.50 spec:
3516     *
3517     *    "The type of init-expression in a switch statement must be a 
3518     *     scalar integer." 
3519     *
3520     * The checks are separated so that higher quality diagnostics can be
3521     * generated for cases where the rule is violated.
3522     */
3523    if (!test_expression->type->is_integer()) {
3524       YYLTYPE loc = this->test_expression->get_location();
3525
3526       _mesa_glsl_error(& loc,
3527                        state,
3528                        "switch-statement expression must be scalar "
3529                        "integer");
3530    }
3531
3532    /* Track the switch-statement nesting in a stack-like manner.
3533     */
3534    struct glsl_switch_state saved = state->switch_state;
3535
3536    state->switch_state.is_switch_innermost = true;
3537    state->switch_state.switch_nesting_ast = this;
3538    state->switch_state.labels_ht = hash_table_ctor(0, hash_table_pointer_hash,
3539                                                    hash_table_pointer_compare);
3540    state->switch_state.previous_default = NULL;
3541
3542    /* Initalize is_fallthru state to false.
3543     */
3544    ir_rvalue *const is_fallthru_val = new (ctx) ir_constant(false);
3545    state->switch_state.is_fallthru_var =
3546       new(ctx) ir_variable(glsl_type::bool_type,
3547                            "switch_is_fallthru_tmp",
3548                            ir_var_temporary);
3549    instructions->push_tail(state->switch_state.is_fallthru_var);
3550
3551    ir_dereference_variable *deref_is_fallthru_var =
3552       new(ctx) ir_dereference_variable(state->switch_state.is_fallthru_var);
3553    instructions->push_tail(new(ctx) ir_assignment(deref_is_fallthru_var,
3554                                                   is_fallthru_val,
3555                                                   NULL));
3556
3557    /* Initalize is_break state to false.
3558     */
3559    ir_rvalue *const is_break_val = new (ctx) ir_constant(false);
3560    state->switch_state.is_break_var = new(ctx) ir_variable(glsl_type::bool_type,
3561                                                            "switch_is_break_tmp",
3562                                                            ir_var_temporary);
3563    instructions->push_tail(state->switch_state.is_break_var);
3564
3565    ir_dereference_variable *deref_is_break_var =
3566       new(ctx) ir_dereference_variable(state->switch_state.is_break_var);
3567    instructions->push_tail(new(ctx) ir_assignment(deref_is_break_var,
3568                                                   is_break_val,
3569                                                   NULL));
3570
3571    /* Cache test expression.
3572     */
3573    test_to_hir(instructions, state);
3574    
3575    /* Emit code for body of switch stmt.
3576     */
3577    body->hir(instructions, state);
3578
3579    hash_table_dtor(state->switch_state.labels_ht);
3580
3581    state->switch_state = saved;
3582
3583      /* Switch statements do not have r-values.
3584       */
3585      return NULL;
3586   }
3587
3588
3589   void
3590   ast_switch_statement::test_to_hir(exec_list *instructions,
3591                                     struct _mesa_glsl_parse_state *state)
3592   {
3593      void *ctx = state;
3594
3595      /* Cache value of test expression.
3596       */
3597      ir_rvalue *const test_val =
3598         test_expression->hir(instructions,
3599                              state);
3600
3601      state->switch_state.test_var = new(ctx) ir_variable(glsl_type::int_type,
3602                                                          "switch_test_tmp",
3603                                                          ir_var_temporary);
3604      ir_dereference_variable *deref_test_var =
3605         new(ctx) ir_dereference_variable(state->switch_state.test_var);
3606
3607      instructions->push_tail(state->switch_state.test_var);
3608      instructions->push_tail(new(ctx) ir_assignment(deref_test_var,
3609                                                     test_val,
3610                                                     NULL));
3611   }
3612
3613
3614   ir_rvalue *
3615   ast_switch_body::hir(exec_list *instructions,
3616                        struct _mesa_glsl_parse_state *state)
3617   {
3618      if (stmts != NULL)
3619         stmts->hir(instructions, state);
3620
3621      /* Switch bodies do not have r-values.
3622       */
3623      return NULL;
3624   }
3625
3626
3627   ir_rvalue *
3628   ast_case_statement_list::hir(exec_list *instructions,
3629                                struct _mesa_glsl_parse_state *state)
3630   {
3631      foreach_list_typed (ast_case_statement, case_stmt, link, & this->cases)
3632         case_stmt->hir(instructions, state);
3633
3634      /* Case statements do not have r-values.
3635       */
3636      return NULL;
3637   }
3638
3639
3640   ir_rvalue *
3641   ast_case_statement::hir(exec_list *instructions,
3642                           struct _mesa_glsl_parse_state *state)
3643   {
3644      labels->hir(instructions, state);
3645
3646      /* Conditionally set fallthru state based on break state.
3647       */
3648      ir_constant *const false_val = new(state) ir_constant(false);
3649      ir_dereference_variable *const deref_is_fallthru_var =
3650         new(state) ir_dereference_variable(state->switch_state.is_fallthru_var);
3651      ir_dereference_variable *const deref_is_break_var =
3652         new(state) ir_dereference_variable(state->switch_state.is_break_var);
3653      ir_assignment *const reset_fallthru_on_break =
3654         new(state) ir_assignment(deref_is_fallthru_var,
3655                                  false_val,
3656                                  deref_is_break_var);
3657      instructions->push_tail(reset_fallthru_on_break);
3658
3659      /* Guard case statements depending on fallthru state.
3660       */
3661      ir_dereference_variable *const deref_fallthru_guard =
3662         new(state) ir_dereference_variable(state->switch_state.is_fallthru_var);
3663      ir_if *const test_fallthru = new(state) ir_if(deref_fallthru_guard);
3664
3665      foreach_list_typed (ast_node, stmt, link, & this->stmts)
3666         stmt->hir(& test_fallthru->then_instructions, state);
3667
3668      instructions->push_tail(test_fallthru);
3669
3670      /* Case statements do not have r-values.
3671       */
3672      return NULL;
3673   }
3674
3675
3676   ir_rvalue *
3677   ast_case_label_list::hir(exec_list *instructions,
3678                            struct _mesa_glsl_parse_state *state)
3679   {
3680      foreach_list_typed (ast_case_label, label, link, & this->labels)
3681         label->hir(instructions, state);
3682
3683      /* Case labels do not have r-values.
3684       */
3685      return NULL;
3686   }
3687
3688
3689   ir_rvalue *
3690   ast_case_label::hir(exec_list *instructions,
3691                       struct _mesa_glsl_parse_state *state)
3692   {
3693      void *ctx = state;
3694
3695      ir_dereference_variable *deref_fallthru_var =
3696         new(ctx) ir_dereference_variable(state->switch_state.is_fallthru_var);
3697
3698      ir_rvalue *const true_val = new(ctx) ir_constant(true);
3699
3700      /* If not default case, ...
3701       */
3702      if (this->test_value != NULL) {
3703         /* Conditionally set fallthru state based on
3704          * comparison of cached test expression value to case label.
3705          */
3706         ir_rvalue *const label_rval = this->test_value->hir(instructions, state);
3707         ir_constant *label_const = label_rval->constant_expression_value();
3708
3709         if (!label_const) {
3710            YYLTYPE loc = this->test_value->get_location();
3711
3712            _mesa_glsl_error(& loc, state,
3713                             "switch statement case label must be a "
3714                             "constant expression");
3715
3716            /* Stuff a dummy value in to allow processing to continue. */
3717            label_const = new(ctx) ir_constant(0);
3718         } else {
3719            ast_expression *previous_label = (ast_expression *)
3720               hash_table_find(state->switch_state.labels_ht,
3721                               (void *)(uintptr_t)label_const->value.u[0]);
3722
3723            if (previous_label) {
3724               YYLTYPE loc = this->test_value->get_location();
3725               _mesa_glsl_error(& loc, state,
3726                                "duplicate case value");
3727
3728               loc = previous_label->get_location();
3729               _mesa_glsl_error(& loc, state,
3730                                "this is the previous case label");
3731            } else {
3732               hash_table_insert(state->switch_state.labels_ht,
3733                                 this->test_value,
3734                                 (void *)(uintptr_t)label_const->value.u[0]);
3735            }
3736         }
3737
3738         ir_dereference_variable *deref_test_var =
3739            new(ctx) ir_dereference_variable(state->switch_state.test_var);
3740
3741         ir_rvalue *const test_cond = new(ctx) ir_expression(ir_binop_all_equal,
3742                                                             glsl_type::bool_type,
3743                                                             label_const,
3744                                                             deref_test_var);
3745
3746         ir_assignment *set_fallthru_on_test =
3747            new(ctx) ir_assignment(deref_fallthru_var,
3748                                   true_val,
3749                                   test_cond);
3750
3751         instructions->push_tail(set_fallthru_on_test);
3752      } else { /* default case */
3753         if (state->switch_state.previous_default) {
3754            printf("a\n");
3755            YYLTYPE loc = this->get_location();
3756            _mesa_glsl_error(& loc, state,
3757                                "multiple default labels in one switch");
3758
3759            printf("b\n");
3760
3761            loc = state->switch_state.previous_default->get_location();
3762            _mesa_glsl_error(& loc, state,
3763                             "this is the first default label");
3764         }
3765         state->switch_state.previous_default = this;
3766
3767         /* Set falltrhu state.
3768          */
3769         ir_assignment *set_fallthru =
3770            new(ctx) ir_assignment(deref_fallthru_var,
3771                                   true_val,
3772                                   NULL);
3773
3774         instructions->push_tail(set_fallthru);
3775      }
3776
3777      /* Case statements do not have r-values.
3778       */
3779      return NULL;
3780   }
3781
3782
3783   void
3784   ast_iteration_statement::condition_to_hir(ir_loop *stmt,
3785                                             struct _mesa_glsl_parse_state *state)
3786   {
3787      void *ctx = state;
3788
3789      if (condition != NULL) {
3790         ir_rvalue *const cond =
3791            condition->hir(& stmt->body_instructions, state);
3792
3793         if ((cond == NULL)
3794             || !cond->type->is_boolean() || !cond->type->is_scalar()) {
3795            YYLTYPE loc = condition->get_location();
3796
3797            _mesa_glsl_error(& loc, state,
3798                             "loop condition must be scalar boolean");
3799         } else {
3800            /* As the first code in the loop body, generate a block that looks
3801             * like 'if (!condition) break;' as the loop termination condition.
3802             */
3803            ir_rvalue *const not_cond =
3804               new(ctx) ir_expression(ir_unop_logic_not, glsl_type::bool_type, cond,
3805                                      NULL);
3806
3807            ir_if *const if_stmt = new(ctx) ir_if(not_cond);
3808
3809            ir_jump *const break_stmt =
3810               new(ctx) ir_loop_jump(ir_loop_jump::jump_break);
3811
3812            if_stmt->then_instructions.push_tail(break_stmt);
3813            stmt->body_instructions.push_tail(if_stmt);
3814         }
3815      }
3816   }
3817
3818
3819   ir_rvalue *
3820   ast_iteration_statement::hir(exec_list *instructions,
3821                                struct _mesa_glsl_parse_state *state)
3822   {
3823      void *ctx = state;
3824
3825      /* For-loops and while-loops start a new scope, but do-while loops do not.
3826       */
3827      if (mode != ast_do_while)
3828         state->symbols->push_scope();
3829
3830      if (init_statement != NULL)
3831         init_statement->hir(instructions, state);
3832
3833      ir_loop *const stmt = new(ctx) ir_loop();
3834      instructions->push_tail(stmt);
3835
3836      /* Track the current loop nesting.
3837       */
3838      ast_iteration_statement *nesting_ast = state->loop_nesting_ast;
3839
3840      state->loop_nesting_ast = this;
3841
3842      /* Likewise, indicate that following code is closest to a loop,
3843       * NOT closest to a switch.
3844       */
3845      bool saved_is_switch_innermost = state->switch_state.is_switch_innermost;
3846      state->switch_state.is_switch_innermost = false;
3847
3848      if (mode != ast_do_while)
3849         condition_to_hir(stmt, state);
3850
3851      if (body != NULL)
3852         body->hir(& stmt->body_instructions, state);
3853
3854      if (rest_expression != NULL)
3855         rest_expression->hir(& stmt->body_instructions, state);
3856
3857      if (mode == ast_do_while)
3858         condition_to_hir(stmt, state);
3859
3860      if (mode != ast_do_while)
3861         state->symbols->pop_scope();
3862
3863      /* Restore previous nesting before returning.
3864       */
3865      state->loop_nesting_ast = nesting_ast;
3866      state->switch_state.is_switch_innermost = saved_is_switch_innermost;
3867
3868    /* Loops do not have r-values.
3869     */
3870    return NULL;
3871 }
3872
3873
3874 ir_rvalue *
3875 ast_type_specifier::hir(exec_list *instructions,
3876                           struct _mesa_glsl_parse_state *state)
3877 {
3878    if (!this->is_precision_statement && this->structure == NULL)
3879       return NULL;
3880
3881    YYLTYPE loc = this->get_location();
3882
3883    if (this->precision != ast_precision_none
3884        && state->language_version != 100
3885        && state->language_version < 130) {
3886       _mesa_glsl_error(&loc, state,
3887                        "precision qualifiers exist only in "
3888                        "GLSL ES 1.00, and GLSL 1.30 and later");
3889       return NULL;
3890    }
3891    if (this->precision != ast_precision_none
3892        && this->structure != NULL) {
3893       _mesa_glsl_error(&loc, state,
3894                        "precision qualifiers do not apply to structures");
3895       return NULL;
3896    }
3897
3898    /* If this is a precision statement, check that the type to which it is
3899     * applied is either float or int.
3900     *
3901     * From section 4.5.3 of the GLSL 1.30 spec:
3902     *    "The precision statement
3903     *       precision precision-qualifier type;
3904     *    can be used to establish a default precision qualifier. The type
3905     *    field can be either int or float [...].  Any other types or
3906     *    qualifiers will result in an error.
3907     */
3908    if (this->is_precision_statement) {
3909       assert(this->precision != ast_precision_none);
3910       assert(this->structure == NULL); /* The check for structures was
3911                                         * performed above. */
3912       if (this->is_array) {
3913          _mesa_glsl_error(&loc, state,
3914                           "default precision statements do not apply to "
3915                           "arrays");
3916          return NULL;
3917       }
3918       if (strcmp(this->type_name, "float") != 0 &&
3919           strcmp(this->type_name, "int") != 0) {
3920          _mesa_glsl_error(&loc, state,
3921                           "default precision statements apply only to types "
3922                           "float and int");
3923          return NULL;
3924       }
3925
3926       /* FINISHME: Translate precision statements into IR. */
3927       return NULL;
3928    }
3929
3930    if (this->structure != NULL)
3931       return this->structure->hir(instructions, state);
3932
3933    return NULL;
3934 }
3935
3936
3937 ir_rvalue *
3938 ast_struct_specifier::hir(exec_list *instructions,
3939                           struct _mesa_glsl_parse_state *state)
3940 {
3941    unsigned decl_count = 0;
3942
3943    /* Make an initial pass over the list of structure fields to determine how
3944     * many there are.  Each element in this list is an ast_declarator_list.
3945     * This means that we actually need to count the number of elements in the
3946     * 'declarations' list in each of the elements.
3947     */
3948    foreach_list_typed (ast_declarator_list, decl_list, link,
3949                        &this->declarations) {
3950       foreach_list_const (decl_ptr, & decl_list->declarations) {
3951          decl_count++;
3952       }
3953    }
3954
3955    /* Allocate storage for the structure fields and process the field
3956     * declarations.  As the declarations are processed, try to also convert
3957     * the types to HIR.  This ensures that structure definitions embedded in
3958     * other structure definitions are processed.
3959     */
3960    glsl_struct_field *const fields = ralloc_array(state, glsl_struct_field,
3961                                                   decl_count);
3962
3963    unsigned i = 0;
3964    foreach_list_typed (ast_declarator_list, decl_list, link,
3965                        &this->declarations) {
3966       const char *type_name;
3967
3968       decl_list->type->specifier->hir(instructions, state);
3969
3970       /* Section 10.9 of the GLSL ES 1.00 specification states that
3971        * embedded structure definitions have been removed from the language.
3972        */
3973       if (state->es_shader && decl_list->type->specifier->structure != NULL) {
3974          YYLTYPE loc = this->get_location();
3975          _mesa_glsl_error(&loc, state, "Embedded structure definitions are "
3976                           "not allowed in GLSL ES 1.00.");
3977       }
3978
3979       const glsl_type *decl_type =
3980          decl_list->type->specifier->glsl_type(& type_name, state);
3981
3982       foreach_list_typed (ast_declaration, decl, link,
3983                           &decl_list->declarations) {
3984          const struct glsl_type *field_type = decl_type;
3985          if (decl->is_array) {
3986             YYLTYPE loc = decl->get_location();
3987             field_type = process_array_type(&loc, decl_type, decl->array_size,
3988                                             state);
3989          }
3990          fields[i].type = (field_type != NULL)
3991             ? field_type : glsl_type::error_type;
3992          fields[i].name = decl->identifier;
3993          i++;
3994       }
3995    }
3996
3997    assert(i == decl_count);
3998
3999    const glsl_type *t =
4000       glsl_type::get_record_instance(fields, decl_count, this->name);
4001
4002    YYLTYPE loc = this->get_location();
4003    if (!state->symbols->add_type(name, t)) {
4004       _mesa_glsl_error(& loc, state, "struct `%s' previously defined", name);
4005    } else {
4006       const glsl_type **s = reralloc(state, state->user_structures,
4007                                      const glsl_type *,
4008                                      state->num_user_structures + 1);
4009       if (s != NULL) {
4010          s[state->num_user_structures] = t;
4011          state->user_structures = s;
4012          state->num_user_structures++;
4013       }
4014    }
4015
4016    /* Structure type definitions do not have r-values.
4017     */
4018    return NULL;
4019 }