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