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