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