ast_to_hir.cpp revision 959a9ecdd8fbc3375e4149f2b44d253622ff12ee
1a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*
2a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Copyright © 2010 Intel Corporation
3a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
4a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Permission is hereby granted, free of charge, to any person obtaining a
5a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * copy of this software and associated documentation files (the "Software"),
6a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * to deal in the Software without restriction, including without limitation
7a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * and/or sell copies of the Software, and to permit persons to whom the
9a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Software is furnished to do so, subject to the following conditions:
10a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
11a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The above copyright notice and this permission notice (including the next
12a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * paragraph) shall be included in all copies or substantial portions of the
13a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Software.
14a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
15a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * DEALINGS IN THE SOFTWARE.
22a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
23a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
24a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/**
25a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * \file ast_to_hir.c
26a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Convert abstract syntax to to high-level intermediate reprensentation (HIR).
27a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
28a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * During the conversion to HIR, the majority of the symantic checking is
29a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * preformed on the program.  This includes:
30a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
31a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *    * Symbol table management
32a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *    * Type checking
33a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *    * Function binding
34a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
35a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The majority of this work could be done during parsing, and the parser could
36a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * probably generate HIR directly.  However, this results in frequent changes
37a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * to the parser code.  Since we do not assume that every system this complier
38a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * is built on will have Flex and Bison installed, we have to store the code
39a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * generated by these tools in our version control system.  In other parts of
40a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * the system we've seen problems where a parser was changed but the generated
41a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * code was not committed, merge conflicts where created because two developers
42a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * had slightly different versions of Bison installed, etc.
43a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
44a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * I have also noticed that running Bison generated parsers in GDB is very
45a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * irritating.  When you get a segfault on '$$ = $1->foo', you can't very
46a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * well 'print $1' in GDB.
47a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
48a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * As a result, my preference is to put as little C code as possible in the
49a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * parser (and lexer) sources.
50a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
51ac95f2f8c88d39aaa878f61172d9748af13e2c80Eric Anholt
52a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include "main/imports.h"
538bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick#include "glsl_symbol_table.h"
54a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include "glsl_parser_extras.h"
55a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include "ast.h"
56a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include "glsl_types.h"
57a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include "ir.h"
58a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
59d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanickvoid
60d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick_mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state)
61d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick{
62adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick   _mesa_glsl_initialize_variables(instructions, state);
63a4e92c4b26578614d76ce71b53194ea5c0f58d6cIan Romanick   _mesa_glsl_initialize_constructors(instructions, state);
64c22c40015db32b68b33c4944b9d94bf499135ec5Eric Anholt   _mesa_glsl_initialize_functions(instructions, state);
65adfb0cd7401251bef0c854ac945fce78f0ed11dbIan Romanick
6641ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick   state->current_function = NULL;
6741ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick
682b97dc657a0e762bc67216405419cd348eb948c0Ian Romanick   foreach_list_typed (ast_node, ast, link, & state->translation_unit)
69304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick      ast->hir(instructions, state);
70d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick}
71d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick
72d949a9afb0a01e9678a4343f66b056b41a2e48a9Ian Romanick
730104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick/**
740104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * If a conversion is available, convert one operand to a different type
750104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick *
760104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * The \c from \c ir_rvalue is converted "in place".
770104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick *
780104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * \param to     Type that the operand it to be converted to
790104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * \param from   Operand that is being converted
800104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * \param state  GLSL compiler state
810104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick *
820104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * \return
830104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * If a conversion is possible (or unnecessary), \c true is returned.
840104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick * Otherwise \c false is returned.
850104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick */
860104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanickstatic bool
87bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanickapply_implicit_conversion(const glsl_type *to, ir_rvalue * &from,
880104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick			  struct _mesa_glsl_parse_state *state)
890104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick{
90bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick   if (to->base_type == from->type->base_type)
910104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick      return true;
920104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick
930104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick   /* This conversion was added in GLSL 1.20.  If the compilation mode is
940104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick    * GLSL 1.10, the conversion is skipped.
950104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick    */
960104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick   if (state->language_version < 120)
970104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick      return false;
980104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick
990104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick   /* From page 27 (page 33 of the PDF) of the GLSL 1.50 spec:
1000104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick    *
1010104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick    *    "There are no implicit array or structure conversions. For
1020104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick    *    example, an array of int cannot be implicitly converted to an
1030104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick    *    array of float. There are no implicit conversions between
1040104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick    *    signed and unsigned integers."
1050104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick    */
1060104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick   /* FINISHME: The above comment is partially a lie.  There is int/uint
1070104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick    * FINISHME: conversion for immediate constants.
1080104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick    */
109bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick   if (!to->is_float() || !from->type->is_numeric())
1100104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick      return false;
1110104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick
112bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick   switch (from->type->base_type) {
1130104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick   case GLSL_TYPE_INT:
114bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick      from = new ir_expression(ir_unop_i2f, to, from, NULL);
1150104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick      break;
1160104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick   case GLSL_TYPE_UINT:
117bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick      from = new ir_expression(ir_unop_u2f, to, from, NULL);
1180104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick      break;
1190104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick   case GLSL_TYPE_BOOL:
120dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt      from = new ir_expression(ir_unop_b2f, to, from, NULL);
121dc58b3f8ccd817fdee390a3df5b8e0fb29d5397cEric Anholt      break;
1220104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick   default:
1230104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick      assert(0);
1240104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick   }
1250104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick
1260104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick   return true;
1270104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick}
1280104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick
1290104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick
130a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic const struct glsl_type *
131bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanickarithmetic_result_type(ir_rvalue * &value_a, ir_rvalue * &value_b,
132a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick		       bool multiply,
133a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt		       struct _mesa_glsl_parse_state *state, YYLTYPE *loc)
134a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
135336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt   const glsl_type *type_a = value_a->type;
136336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt   const glsl_type *type_b = value_b->type;
1370104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick
138a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* From GLSL 1.50 spec, page 56:
139a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
140a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    "The arithmetic binary operators add (+), subtract (-),
141a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    multiply (*), and divide (/) operate on integer and
142a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    floating-point scalars, vectors, and matrices."
143a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
14460b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick   if (!type_a->is_numeric() || !type_b->is_numeric()) {
145a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt      _mesa_glsl_error(loc, state,
146a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt		       "Operands to arithmetic operators must be numeric");
1470471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      return glsl_type::error_type;
148a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
149a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
150a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
151a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*    "If one operand is floating-point based and the other is
152a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    not, then the conversions from Section 4.1.10 "Implicit
153a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    Conversions" are applied to the non-floating-point-based operand."
154a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1550104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick   if (!apply_implicit_conversion(type_a, value_b, state)
1560104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick       && !apply_implicit_conversion(type_b, value_a, state)) {
157a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt      _mesa_glsl_error(loc, state,
158a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt		       "Could not implicitly convert operands to "
159a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt		       "arithmetic operator");
1600104536568ed031654c1c3c957b0216bbca4a1d6Ian Romanick      return glsl_type::error_type;
161a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
162336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt   type_a = value_a->type;
163336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt   type_b = value_b->type;
164336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt
165a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*    "If the operands are integer types, they must both be signed or
166a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    both be unsigned."
167a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
168a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * From this rule and the preceeding conversion it can be inferred that
169a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * both types must be GLSL_TYPE_FLOAT, or GLSL_TYPE_UINT, or GLSL_TYPE_INT.
17060b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick    * The is_numeric check above already filtered out the case where either
17160b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick    * type is not one of these, so now the base types need only be tested for
17260b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick    * equality.
173a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
174a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   if (type_a->base_type != type_b->base_type) {
175a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt      _mesa_glsl_error(loc, state,
176a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt		       "base type mismatch for arithmetic operator");
1770471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      return glsl_type::error_type;
178a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
179a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
180a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*    "All arithmetic binary operators result in the same fundamental type
181a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    (signed integer, unsigned integer, or floating-point) as the
182a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    operands they operate on, after operand type conversion. After
183a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    conversion, the following cases are valid
184a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
185a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    * The two operands are scalars. In this case the operation is
186a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      applied, resulting in a scalar."
187a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
188cb36f8aaeeb09660843316270a781948f773d90bIan Romanick   if (type_a->is_scalar() && type_b->is_scalar())
189a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      return type_a;
190a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
191a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*   "* One operand is a scalar, and the other is a vector or matrix.
192a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      In this case, the scalar operation is applied independently to each
193a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      component of the vector or matrix, resulting in the same size
194a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      vector or matrix."
195a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
196cb36f8aaeeb09660843316270a781948f773d90bIan Romanick   if (type_a->is_scalar()) {
197cb36f8aaeeb09660843316270a781948f773d90bIan Romanick      if (!type_b->is_scalar())
198a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 return type_b;
199cb36f8aaeeb09660843316270a781948f773d90bIan Romanick   } else if (type_b->is_scalar()) {
200a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      return type_a;
201a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
202a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
203a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* All of the combinations of <scalar, scalar>, <vector, scalar>,
204a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * <scalar, vector>, <scalar, matrix>, and <matrix, scalar> have been
205a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * handled.
206a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
20760b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick   assert(!type_a->is_scalar());
20860b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick   assert(!type_b->is_scalar());
209a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
210a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*   "* The two operands are vectors of the same size. In this case, the
211a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      operation is done component-wise resulting in the same size
212a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      vector."
213a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
214a2dd22fb194bdffa14a2466ae5667f3be63430d3Ian Romanick   if (type_a->is_vector() && type_b->is_vector()) {
215a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt      if (type_a == type_b) {
216a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt	 return type_a;
217a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt      } else {
218a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt	 _mesa_glsl_error(loc, state,
219a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt			  "vector size mismatch for arithmetic operator");
220a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt	 return glsl_type::error_type;
221a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt      }
222a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
223a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
224a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* All of the combinations of <scalar, scalar>, <vector, scalar>,
225a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * <scalar, vector>, <scalar, matrix>, <matrix, scalar>, and
226a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * <vector, vector> have been handled.  At least one of the operands must
227a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * be matrix.  Further, since there are no integer matrix types, the base
228a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * type of both operands must be float.
229a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
23060b54d977a7b3df9612eb9232f6b5d6c3f393e2fIan Romanick   assert(type_a->is_matrix() || type_b->is_matrix());
231a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   assert(type_a->base_type == GLSL_TYPE_FLOAT);
232a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   assert(type_b->base_type == GLSL_TYPE_FLOAT);
233a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
234a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*   "* The operator is add (+), subtract (-), or divide (/), and the
235a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      operands are matrices with the same number of rows and the same
236a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      number of columns. In this case, the operation is done component-
237a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      wise resulting in the same size matrix."
238a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    * The operator is multiply (*), where both operands are matrices or
239a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      one operand is a vector and the other a matrix. A right vector
240a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      operand is treated as a column vector and a left vector operand as a
241a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      row vector. In all these cases, it is required that the number of
242a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      columns of the left operand is equal to the number of rows of the
243a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      right operand. Then, the multiply (*) operation does a linear
244a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      algebraic multiply, yielding an object that has the same number of
245a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      rows as the left operand and the same number of columns as the right
246a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      operand. Section 5.10 "Vector and Matrix Operations" explains in
247a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *      more detail how vectors and matrices are operated on."
248a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
249a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   if (! multiply) {
250a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt      if (type_a == type_b)
251a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt	 return type_a;
252a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } else {
253fce1150156edc8b51f5cf077679c0fdb5d582abaIan Romanick      if (type_a->is_matrix() && type_b->is_matrix()) {
254c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	 /* Matrix multiply.  The columns of A must match the rows of B.  Given
255c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	  * the other previously tested constraints, this means the vector type
256c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	  * of a row from A must be the same as the vector type of a column from
257c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	  * B.
258c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	  */
259c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	 if (type_a->row_type() == type_b->column_type()) {
260c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	    /* The resulting matrix has the number of columns of matrix B and
261c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	     * the number of rows of matrix A.  We get the row count of A by
262c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	     * looking at the size of a vector that makes up a column.  The
263c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	     * transpose (size of a row) is done for B.
264c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	     */
265a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt	    const glsl_type *const type =
266c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	       glsl_type::get_instance(type_a->base_type,
267c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick				       type_a->column_type()->vector_elements,
268c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick				       type_b->row_type()->vector_elements);
269a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt	    assert(type != glsl_type::error_type);
270a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt
271a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt	    return type;
272a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 }
273fce1150156edc8b51f5cf077679c0fdb5d582abaIan Romanick      } else if (type_a->is_matrix()) {
274a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 /* A is a matrix and B is a column vector.  Columns of A must match
275c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	  * rows of B.  Given the other previously tested constraints, this
276c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	  * means the vector type of a row from A must be the same as the
277c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	  * vector the type of B.
278a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	  */
279c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	 if (type_a->row_type() == type_b)
280a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	    return type_b;
281a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      } else {
282fce1150156edc8b51f5cf077679c0fdb5d582abaIan Romanick	 assert(type_b->is_matrix());
283a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
284c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	 /* A is a row vector and B is a matrix.  Columns of A must match rows
285c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	  * of B.  Given the other previously tested constraints, this means
286c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	  * the type of A must be the same as the vector type of a column from
287c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	  * B.
288a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	  */
289c1bd3a1a61364d8450629a935b4611184eb99654Ian Romanick	 if (type_a == type_b->column_type())
290a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	    return type_a;
291a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      }
292a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt
293a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt      _mesa_glsl_error(loc, state, "size mismatch for matrix multiplication");
294a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt      return glsl_type::error_type;
295a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
296a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
297a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
298a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*    "All other cases are illegal."
299a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
300a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt   _mesa_glsl_error(loc, state, "type mismatch");
3010471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick   return glsl_type::error_type;
302a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
303a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
304a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
305a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic const struct glsl_type *
30665e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholtunary_arithmetic_result_type(const struct glsl_type *type,
30765e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt			     struct _mesa_glsl_parse_state *state, YYLTYPE *loc)
308a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
309a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* From GLSL 1.50 spec, page 57:
310a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
311a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    "The arithmetic unary operators negate (-), post- and pre-increment
312a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *     and decrement (-- and ++) operate on integer or floating-point
313a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *     values (including vectors and matrices). All unary operators work
314a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *     component-wise on their operands. These result with the same type
315a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *     they operated on."
316a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
31765e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt   if (!type->is_numeric()) {
31865e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt      _mesa_glsl_error(loc, state,
31965e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt		       "Operands to arithmetic operators must be numeric");
3200471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      return glsl_type::error_type;
32165e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt   }
322a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
323a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   return type;
324a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
325a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
326a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
327a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic const struct glsl_type *
328a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickmodulus_result_type(const struct glsl_type *type_a,
32965e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt		    const struct glsl_type *type_b,
33065e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt		    struct _mesa_glsl_parse_state *state, YYLTYPE *loc)
331a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
332a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* From GLSL 1.50 spec, page 56:
333a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    "The operator modulus (%) operates on signed or unsigned integers or
334a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    integer vectors. The operand types must both be signed or both be
335a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    unsigned."
336a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
33740176e249f72b6090204611873b19aed3da67c71Ian Romanick   if (!type_a->is_integer() || !type_b->is_integer()
338a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       || (type_a->base_type != type_b->base_type)) {
33965e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt      _mesa_glsl_error(loc, state, "type mismatch");
3400471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      return glsl_type::error_type;
341a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
342a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
343a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*    "The operands cannot be vectors of differing size. If one operand is
344a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    a scalar and the other vector, then the scalar is applied component-
345a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    wise to the vector, resulting in the same type as the vector. If both
346a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    are vectors of the same size, the result is computed component-wise."
347a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
348a2dd22fb194bdffa14a2466ae5667f3be63430d3Ian Romanick   if (type_a->is_vector()) {
349a2dd22fb194bdffa14a2466ae5667f3be63430d3Ian Romanick      if (!type_b->is_vector()
350a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	  || (type_a->vector_elements == type_b->vector_elements))
351a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 return type_a;
352a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } else
353a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      return type_b;
354a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
355a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*    "The operator modulus (%) is not defined for any other data types
356a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    (non-integer types)."
357a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
35865e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt   _mesa_glsl_error(loc, state, "type mismatch");
3590471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick   return glsl_type::error_type;
360a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
361a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
362a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
363a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic const struct glsl_type *
364bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanickrelational_result_type(ir_rvalue * &value_a, ir_rvalue * &value_b,
36565e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt		       struct _mesa_glsl_parse_state *state, YYLTYPE *loc)
366a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
367336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt   const glsl_type *type_a = value_a->type;
368336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt   const glsl_type *type_b = value_b->type;
3690150f5f20edaef96520af5d1bbed0e62e24918e5Ian Romanick
370a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* From GLSL 1.50 spec, page 56:
371a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    "The relational operators greater than (>), less than (<), greater
372a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    than or equal (>=), and less than or equal (<=) operate only on
373a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    scalar integer and scalar floating-point expressions."
374a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
375a6d653dcbbee3158f9ea7b284bdeb1a8432f0fcbIan Romanick   if (!type_a->is_numeric()
376a6d653dcbbee3158f9ea7b284bdeb1a8432f0fcbIan Romanick       || !type_b->is_numeric()
377cb36f8aaeeb09660843316270a781948f773d90bIan Romanick       || !type_a->is_scalar()
37865e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt       || !type_b->is_scalar()) {
37965e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt      _mesa_glsl_error(loc, state,
38065e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt		       "Operands to relational operators must be scalar and "
38165e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt		       "numeric");
3820471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      return glsl_type::error_type;
38365e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt   }
384a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
385a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*    "Either the operands' types must match, or the conversions from
386a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    Section 4.1.10 "Implicit Conversions" will be applied to the integer
387a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *    operand, after which the types must match."
388a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
3890150f5f20edaef96520af5d1bbed0e62e24918e5Ian Romanick   if (!apply_implicit_conversion(type_a, value_b, state)
3900150f5f20edaef96520af5d1bbed0e62e24918e5Ian Romanick       && !apply_implicit_conversion(type_b, value_a, state)) {
39165e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt      _mesa_glsl_error(loc, state,
39265e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt		       "Could not implicitly convert operands to "
39365e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt		       "relational operator");
3940150f5f20edaef96520af5d1bbed0e62e24918e5Ian Romanick      return glsl_type::error_type;
395a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
396336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt   type_a = value_a->type;
397336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt   type_b = value_b->type;
398a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
39965e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt   if (type_a->base_type != type_b->base_type) {
40065e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt      _mesa_glsl_error(loc, state, "base type mismatch");
4010471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      return glsl_type::error_type;
40265e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt   }
403a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
404a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /*    "The result is scalar Boolean."
405a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
4060471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick   return glsl_type::bool_type;
407a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
408a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
409a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
4100bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick/**
4110bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * Validates that a value can be assigned to a location with a specified type
4120bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick *
4130bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * Validates that \c rhs can be assigned to some location.  If the types are
4140bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * not an exact match but an automatic conversion is possible, \c rhs will be
4150bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * converted.
4160bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick *
4170bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * \return
4180bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * \c NULL if \c rhs cannot be assigned to a location with type \c lhs_type.
4190bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * Otherwise the actual RHS to be assigned will be returned.  This may be
4200bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * \c rhs, or it may be \c rhs after some type conversion.
4210bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick *
4220bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * \note
4230bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * In addition to being used for assignments, this function is used to
4240bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick * type-check return values.
4250bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick */
426fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue *
427336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholtvalidate_assignment(struct _mesa_glsl_parse_state *state,
428336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt		    const glsl_type *lhs_type, ir_rvalue *rhs)
4290bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick{
430336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt   const glsl_type *rhs_type = rhs->type;
4310bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick
4320bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick   /* If there is already some error in the RHS, just return it.  Anything
4330bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick    * else will lead to an avalanche of error message back to the user.
4340bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick    */
4350bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick   if (rhs_type->is_error())
4360bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick      return rhs;
4370bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick
4380bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick   /* If the types are identical, the assignment can trivially proceed.
4390bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick    */
4400bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick   if (rhs_type == lhs_type)
4410bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick      return rhs;
4420bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick
4430157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick   /* If the array element types are the same and the size of the LHS is zero,
4440157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick    * the assignment is okay.
4450157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick    *
4460157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick    * Note: Whole-array assignments are not permitted in GLSL 1.10, but this
4470157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick    * is handled by ir_dereference::is_lvalue.
4480157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick    */
4490157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick   if (lhs_type->is_array() && rhs->type->is_array()
4500157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick       && (lhs_type->element_type() == rhs->type->element_type())
4510157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick       && (lhs_type->array_size() == 0)) {
4520157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick      return rhs;
4530157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick   }
4540157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick
455336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt   /* Check for implicit conversion in GLSL 1.20 */
456336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt   if (apply_implicit_conversion(lhs_type, rhs, state)) {
457336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt      rhs_type = rhs->type;
458336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt      if (rhs_type == lhs_type)
459336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt	 return rhs;
460336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt   }
461336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt
4620bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick   return NULL;
4630bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick}
4640bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick
46510a685218610e737e23d2d8a243ed6ff6613becdEric Anholtir_rvalue *
46610a685218610e737e23d2d8a243ed6ff6613becdEric Anholtdo_assignment(exec_list *instructions, struct _mesa_glsl_parse_state *state,
46710a685218610e737e23d2d8a243ed6ff6613becdEric Anholt	      ir_rvalue *lhs, ir_rvalue *rhs,
46810a685218610e737e23d2d8a243ed6ff6613becdEric Anholt	      YYLTYPE lhs_loc)
46910a685218610e737e23d2d8a243ed6ff6613becdEric Anholt{
47010a685218610e737e23d2d8a243ed6ff6613becdEric Anholt   bool error_emitted = (lhs->type->is_error() || rhs->type->is_error());
47110a685218610e737e23d2d8a243ed6ff6613becdEric Anholt
47210a685218610e737e23d2d8a243ed6ff6613becdEric Anholt   if (!error_emitted) {
47310a685218610e737e23d2d8a243ed6ff6613becdEric Anholt      /* FINISHME: This does not handle 'foo.bar.a.b.c[5].d = 5' */
47410a685218610e737e23d2d8a243ed6ff6613becdEric Anholt      if (!lhs->is_lvalue()) {
47510a685218610e737e23d2d8a243ed6ff6613becdEric Anholt	 _mesa_glsl_error(& lhs_loc, state, "non-lvalue in assignment");
47610a685218610e737e23d2d8a243ed6ff6613becdEric Anholt	 error_emitted = true;
47710a685218610e737e23d2d8a243ed6ff6613becdEric Anholt      }
47810a685218610e737e23d2d8a243ed6ff6613becdEric Anholt   }
47910a685218610e737e23d2d8a243ed6ff6613becdEric Anholt
480336b4ad8c76a525a0df2f4b0fc1d67e86bc5db3fEric Anholt   ir_rvalue *new_rhs = validate_assignment(state, lhs->type, rhs);
48110a685218610e737e23d2d8a243ed6ff6613becdEric Anholt   if (new_rhs == NULL) {
48210a685218610e737e23d2d8a243ed6ff6613becdEric Anholt      _mesa_glsl_error(& lhs_loc, state, "type mismatch");
48310a685218610e737e23d2d8a243ed6ff6613becdEric Anholt   } else {
48410a685218610e737e23d2d8a243ed6ff6613becdEric Anholt      rhs = new_rhs;
4850157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick
4860157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick      /* If the LHS array was not declared with a size, it takes it size from
4870157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick       * the RHS.  If the LHS is an l-value and a whole array, it must be a
4880157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick       * dereference of a variable.  Any other case would require that the LHS
4890157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick       * is either not an l-value or not a whole array.
4900157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick       */
4910157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick      if (lhs->type->array_size() == 0) {
4920157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick	 ir_dereference *const d = lhs->as_dereference();
4930157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick
4940157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick	 assert(d != NULL);
4950157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick
49636ea28646c666ac2af9b43c47e65f9f53ffcc390Ian Romanick	 ir_variable *const var = d->variable_referenced();
4970157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick
4980157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick	 assert(var != NULL);
4990157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick
50063f394203a8be9b87f8617cd7a56a0806c0870b3Ian Romanick	 if (var->max_array_access >= unsigned(rhs->type->array_size())) {
50163f394203a8be9b87f8617cd7a56a0806c0870b3Ian Romanick	    /* FINISHME: This should actually log the location of the RHS. */
50263f394203a8be9b87f8617cd7a56a0806c0870b3Ian Romanick	    _mesa_glsl_error(& lhs_loc, state, "array size must be > %u due to "
50363f394203a8be9b87f8617cd7a56a0806c0870b3Ian Romanick			     "previous access",
50463f394203a8be9b87f8617cd7a56a0806c0870b3Ian Romanick			     var->max_array_access);
50563f394203a8be9b87f8617cd7a56a0806c0870b3Ian Romanick	 }
50663f394203a8be9b87f8617cd7a56a0806c0870b3Ian Romanick
5070157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick	 var->type = glsl_type::get_array_instance(lhs->type->element_type(),
5080157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick						   rhs->type->array_size());
5090157f41e5e644632393edf903f3c1adb1cf782cdIan Romanick      }
51010a685218610e737e23d2d8a243ed6ff6613becdEric Anholt   }
51110a685218610e737e23d2d8a243ed6ff6613becdEric Anholt
51210a685218610e737e23d2d8a243ed6ff6613becdEric Anholt   ir_instruction *tmp = new ir_assignment(lhs, rhs, NULL);
51310a685218610e737e23d2d8a243ed6ff6613becdEric Anholt   instructions->push_tail(tmp);
51410a685218610e737e23d2d8a243ed6ff6613becdEric Anholt
51510a685218610e737e23d2d8a243ed6ff6613becdEric Anholt   return rhs;
51610a685218610e737e23d2d8a243ed6ff6613becdEric Anholt}
5170bb1c3c1539fcadaa90d592a296c2ff1de3787a4Ian Romanick
5185185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick
5195185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick/**
5205185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick * Generate a new temporary and add its declaration to the instruction stream
5215185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick */
5225185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanickstatic ir_variable *
5235185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanickgenerate_temporary(const glsl_type *type, exec_list *instructions,
5245185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick		   struct _mesa_glsl_parse_state *state)
5255185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick{
5265185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick   char *name = (char *) malloc(sizeof(char) * 13);
5275185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick
5285185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick   snprintf(name, 13, "tmp_%08X", state->temp_index);
5295185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick   state->temp_index++;
5305185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick
5315185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick   ir_variable *const var = new ir_variable(type, name);
5325185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick   instructions->push_tail(var);
5335185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick
5345185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick   return var;
5355185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick}
5365185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick
5375185a5f7d5654c9202c226015c4daeee43d9b897Ian Romanick
538de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholtstatic ir_rvalue *
539959a9ecdd8fbc3375e4149f2b44d253622ff12eeEric Anholtget_lvalue_copy(exec_list *instructions, ir_rvalue *lvalue)
540de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt{
541de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt   ir_variable *var;
542de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt   ir_rvalue *var_deref;
543de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
544de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt   /* FINISHME: Give unique names to the temporaries. */
545de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt   var = new ir_variable(lvalue->type, "_internal_tmp");
546de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt   var->mode = ir_var_auto;
547de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
54870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick   var_deref = new ir_dereference_variable(var);
549959a9ecdd8fbc3375e4149f2b44d253622ff12eeEric Anholt   instructions->push_tail(new ir_assignment(var_deref, lvalue, NULL));
550de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
551de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt   /* Once we've created this temporary, mark it read only so it's no
552de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt    * longer considered an lvalue.
553de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt    */
554de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt   var->read_only = true;
555de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
556de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt   return var_deref;
557de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt}
558de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
559de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
560fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue *
5610044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickast_node::hir(exec_list *instructions,
56218238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick	      struct _mesa_glsl_parse_state *state)
56318238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick{
56418238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   (void) instructions;
56518238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   (void) state;
56618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick
56718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   return NULL;
56818238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick}
56918238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick
57018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick
571fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue *
5720044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickast_expression::hir(exec_list *instructions,
57318238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick		    struct _mesa_glsl_parse_state *state)
574a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
575a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   static const int operations[AST_NUM_OPERATORS] = {
576a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_assign doesn't convert to ir_expression. */
577a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_plus doesn't convert to ir_expression. */
578a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_unop_neg,
579a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_add,
580a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_sub,
581a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_mul,
582a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_div,
583a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_mod,
584a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_lshift,
585a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_rshift,
586a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_less,
587a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_greater,
588a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_lequal,
589a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_gequal,
590a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_equal,
591a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_nequal,
592a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_bit_and,
593a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_bit_xor,
594a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_bit_or,
595a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_unop_bit_not,
596a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_logic_and,
597a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_logic_xor,
598a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_logic_or,
599a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_unop_logic_not,
600a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
601a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* Note: The following block of expression types actually convert
602a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * to multiple IR instructions.
603a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       */
604a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_mul,     /* ast_mul_assign */
605a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_div,     /* ast_div_assign */
606a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_mod,     /* ast_mod_assign */
607a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_add,     /* ast_add_assign */
608a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_sub,     /* ast_sub_assign */
609a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_lshift,  /* ast_ls_assign */
610a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_rshift,  /* ast_rs_assign */
611a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_bit_and, /* ast_and_assign */
612a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_bit_xor, /* ast_xor_assign */
613a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      ir_binop_bit_or,  /* ast_or_assign */
614a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
615a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_conditional doesn't convert to ir_expression. */
616de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      ir_binop_add,     /* ast_pre_inc. */
617de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      ir_binop_sub,     /* ast_pre_dec. */
618de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      ir_binop_add,     /* ast_post_inc. */
619de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      ir_binop_sub,     /* ast_post_dec. */
620a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_field_selection doesn't conv to ir_expression. */
621a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_array_index doesn't convert to ir_expression. */
622a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_function_call doesn't conv to ir_expression. */
623a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_identifier doesn't convert to ir_expression. */
624a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_int_constant doesn't convert to ir_expression. */
625a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_uint_constant doesn't conv to ir_expression. */
626a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_float_constant doesn't conv to ir_expression. */
627a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_bool_constant doesn't conv to ir_expression. */
628a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      -1,               /* ast_sequence doesn't convert to ir_expression. */
629a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   };
630fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *result = NULL;
631fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *op[2];
6320471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick   const struct glsl_type *type = glsl_type::error_type;
633a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   bool error_emitted = false;
634a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   YYLTYPE loc;
635a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
63618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   loc = this->get_location();
637a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
63818238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   switch (this->oper) {
6396652af36fe8994b1621d882fcc230d320908a2a3Ian Romanick   case ast_assign: {
64018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[0] = this->subexpressions[0]->hir(instructions, state);
64118238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[1] = this->subexpressions[1]->hir(instructions, state);
642a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
64310a685218610e737e23d2d8a243ed6ff6613becdEric Anholt      result = do_assignment(instructions, state, op[0], op[1],
64410a685218610e737e23d2d8a243ed6ff6613becdEric Anholt			     this->subexpressions[0]->get_location());
64510a685218610e737e23d2d8a243ed6ff6613becdEric Anholt      error_emitted = result->type->is_error();
64610a685218610e737e23d2d8a243ed6ff6613becdEric Anholt      type = result->type;
647a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
6486652af36fe8994b1621d882fcc230d320908a2a3Ian Romanick   }
649a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
650a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_plus:
65118238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[0] = this->subexpressions[0]->hir(instructions, state);
652a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
653a43817a483a8c4a480ef4e6dfda2cef899300eb0Ian Romanick      error_emitted = op[0]->type->is_error();
654a43817a483a8c4a480ef4e6dfda2cef899300eb0Ian Romanick      if (type->is_error())
655a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 op[0]->type = type;
656a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
657a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      result = op[0];
658a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
659a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
660a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_neg:
66118238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[0] = this->subexpressions[0]->hir(instructions, state);
662a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
66365e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt      type = unary_arithmetic_result_type(op[0]->type, state, & loc);
664a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
66565e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt      error_emitted = type->is_error();
666a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
66718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      result = new ir_expression(operations[this->oper], type,
668a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick				 op[0], NULL);
669a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
670a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
671a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_add:
672a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_sub:
673a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_mul:
674a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_div:
67518238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[0] = this->subexpressions[0]->hir(instructions, state);
67618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[1] = this->subexpressions[1]->hir(instructions, state);
677a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
678bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick      type = arithmetic_result_type(op[0], op[1],
67918238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick				    (this->oper == ast_mul),
680a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt				    state, & loc);
681a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt      error_emitted = type->is_error();
682a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
68318238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      result = new ir_expression(operations[this->oper], type,
684a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick				 op[0], op[1]);
685a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
686a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
687a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_mod:
68818238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[0] = this->subexpressions[0]->hir(instructions, state);
68918238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[1] = this->subexpressions[1]->hir(instructions, state);
690a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
69165e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt      type = modulus_result_type(op[0]->type, op[1]->type, state, & loc);
692a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
69318238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      assert(operations[this->oper] == ir_binop_mod);
694a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
69518238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      result = new ir_expression(operations[this->oper], type,
696a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick				 op[0], op[1]);
69765e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt      error_emitted = type->is_error();
698a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
699a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
700a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_lshift:
701a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_rshift:
702183d8c63947fcfab45c9f2a8a8a6fc311e8b1552Eric Anholt      _mesa_glsl_error(& loc, state, "FINISHME: implement bit-shift operators");
703183d8c63947fcfab45c9f2a8a8a6fc311e8b1552Eric Anholt      error_emitted = true;
704a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
705a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
706a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_less:
707a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_greater:
708a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_lequal:
709a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_gequal:
71018238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[0] = this->subexpressions[0]->hir(instructions, state);
71118238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[1] = this->subexpressions[1]->hir(instructions, state);
712a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
71365e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt      type = relational_result_type(op[0], op[1], state, & loc);
714a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
715a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* The relational operators must either generate an error or result
716a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * in a scalar boolean.  See page 57 of the GLSL 1.50 spec.
717a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       */
718a43817a483a8c4a480ef4e6dfda2cef899300eb0Ian Romanick      assert(type->is_error()
719a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	     || ((type->base_type == GLSL_TYPE_BOOL)
720cb36f8aaeeb09660843316270a781948f773d90bIan Romanick		 && type->is_scalar()));
721a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
72218238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      result = new ir_expression(operations[this->oper], type,
723a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick				 op[0], op[1]);
72465e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt      error_emitted = type->is_error();
725a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
726a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
727a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_nequal:
728a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_equal:
7296e659caaa946339a2de3890a8bed091ccb65102aIan Romanick      op[0] = this->subexpressions[0]->hir(instructions, state);
7306e659caaa946339a2de3890a8bed091ccb65102aIan Romanick      op[1] = this->subexpressions[1]->hir(instructions, state);
7316e659caaa946339a2de3890a8bed091ccb65102aIan Romanick
7326e659caaa946339a2de3890a8bed091ccb65102aIan Romanick      /* From page 58 (page 64 of the PDF) of the GLSL 1.50 spec:
7336e659caaa946339a2de3890a8bed091ccb65102aIan Romanick       *
7346e659caaa946339a2de3890a8bed091ccb65102aIan Romanick       *    "The equality operators equal (==), and not equal (!=)
7356e659caaa946339a2de3890a8bed091ccb65102aIan Romanick       *    operate on all types. They result in a scalar Boolean. If
7366e659caaa946339a2de3890a8bed091ccb65102aIan Romanick       *    the operand types do not match, then there must be a
7376e659caaa946339a2de3890a8bed091ccb65102aIan Romanick       *    conversion from Section 4.1.10 "Implicit Conversions"
7386e659caaa946339a2de3890a8bed091ccb65102aIan Romanick       *    applied to one operand that can make them match, in which
7396e659caaa946339a2de3890a8bed091ccb65102aIan Romanick       *    case this conversion is done."
7406e659caaa946339a2de3890a8bed091ccb65102aIan Romanick       */
741bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick      if ((!apply_implicit_conversion(op[0]->type, op[1], state)
742bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick	   && !apply_implicit_conversion(op[1]->type, op[0], state))
743212b0327b47033442842a7be3d7fb10e08e2bf66Ian Romanick	  || (op[0]->type != op[1]->type)) {
7446e659caaa946339a2de3890a8bed091ccb65102aIan Romanick	 _mesa_glsl_error(& loc, state, "operands of `%s' must have the same "
7456e659caaa946339a2de3890a8bed091ccb65102aIan Romanick			  "type", (this->oper == ast_equal) ? "==" : "!=");
7466e659caaa946339a2de3890a8bed091ccb65102aIan Romanick	 error_emitted = true;
747a80cbd6d82f6ec4c1d16129581d5fa893a6ba94fIan Romanick      } else if ((state->language_version <= 110)
748a80cbd6d82f6ec4c1d16129581d5fa893a6ba94fIan Romanick		 && (op[0]->type->is_array() || op[1]->type->is_array())) {
749a80cbd6d82f6ec4c1d16129581d5fa893a6ba94fIan Romanick	 _mesa_glsl_error(& loc, state, "array comparisons forbidden in "
750a80cbd6d82f6ec4c1d16129581d5fa893a6ba94fIan Romanick			  "GLSL 1.10");
751a80cbd6d82f6ec4c1d16129581d5fa893a6ba94fIan Romanick	 error_emitted = true;
7526e659caaa946339a2de3890a8bed091ccb65102aIan Romanick      }
7536e659caaa946339a2de3890a8bed091ccb65102aIan Romanick
7546e659caaa946339a2de3890a8bed091ccb65102aIan Romanick      result = new ir_expression(operations[this->oper], glsl_type::bool_type,
7556e659caaa946339a2de3890a8bed091ccb65102aIan Romanick				 op[0], op[1]);
7566e659caaa946339a2de3890a8bed091ccb65102aIan Romanick      type = glsl_type::bool_type;
7576e659caaa946339a2de3890a8bed091ccb65102aIan Romanick
7586e659caaa946339a2de3890a8bed091ccb65102aIan Romanick      assert(result->type == glsl_type::bool_type);
759a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
760a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
761a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_bit_and:
762a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_bit_xor:
763a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_bit_or:
764a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_bit_not:
765183d8c63947fcfab45c9f2a8a8a6fc311e8b1552Eric Anholt      _mesa_glsl_error(& loc, state, "FINISHME: implement bit-wise operators");
766183d8c63947fcfab45c9f2a8a8a6fc311e8b1552Eric Anholt      error_emitted = true;
767a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
768a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
7694950a68bf22ede6f4f368c9783e5401816159574Eric Anholt   case ast_logic_and: {
770b82c0c31aea2d02721f162b94b9f591242d9364eEric Anholt      op[0] = this->subexpressions[0]->hir(instructions, state);
771b82c0c31aea2d02721f162b94b9f591242d9364eEric Anholt
772b82c0c31aea2d02721f162b94b9f591242d9364eEric Anholt      if (!op[0]->type->is_boolean() || !op[0]->type->is_scalar()) {
773b82c0c31aea2d02721f162b94b9f591242d9364eEric Anholt	 YYLTYPE loc = this->subexpressions[0]->get_location();
774b82c0c31aea2d02721f162b94b9f591242d9364eEric Anholt
775b82c0c31aea2d02721f162b94b9f591242d9364eEric Anholt	 _mesa_glsl_error(& loc, state, "LHS of `%s' must be scalar boolean",
776b82c0c31aea2d02721f162b94b9f591242d9364eEric Anholt			  operator_string(this->oper));
777ebbf14b9801d577adf40dcb0b63df2d3b8da934eEric Anholt	 error_emitted = true;
778b82c0c31aea2d02721f162b94b9f591242d9364eEric Anholt      }
779b82c0c31aea2d02721f162b94b9f591242d9364eEric Anholt
78044b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt      ir_constant *op0_const = op[0]->constant_expression_value();
78144b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt      if (op0_const) {
78244b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 if (op0_const->value.b[0]) {
78344b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    op[1] = this->subexpressions[1]->hir(instructions, state);
78444b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt
78544b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    if (!op[1]->type->is_boolean() || !op[1]->type->is_scalar()) {
78644b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	       YYLTYPE loc = this->subexpressions[1]->get_location();
78744b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt
78844b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	       _mesa_glsl_error(& loc, state,
78944b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt				"RHS of `%s' must be scalar boolean",
79044b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt				operator_string(this->oper));
79144b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	       error_emitted = true;
79244b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    }
79344b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    result = op[1];
79444b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 } else {
79544b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    result = op0_const;
79644b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 }
79744b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 type = glsl_type::bool_type;
79844b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt      } else {
79944b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 ir_if *const stmt = new ir_if(op[0]);
80044b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 instructions->push_tail(stmt);
8014950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
80244b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 op[1] = this->subexpressions[1]->hir(&stmt->then_instructions, state);
8034950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
80444b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 if (!op[1]->type->is_boolean() || !op[1]->type->is_scalar()) {
80544b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    YYLTYPE loc = this->subexpressions[1]->get_location();
8064950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
80744b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    _mesa_glsl_error(& loc, state,
80844b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt			     "RHS of `%s' must be scalar boolean",
80944b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt			     operator_string(this->oper));
81044b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    error_emitted = true;
81144b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 }
812b82c0c31aea2d02721f162b94b9f591242d9364eEric Anholt
81344b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 ir_variable *const tmp = generate_temporary(glsl_type::bool_type,
81444b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt						     instructions, state);
815b82c0c31aea2d02721f162b94b9f591242d9364eEric Anholt
81670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick	 ir_dereference *const then_deref = new ir_dereference_variable(tmp);
81744b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 ir_assignment *const then_assign =
81844b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    new ir_assignment(then_deref, op[1], NULL);
81944b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 stmt->then_instructions.push_tail(then_assign);
8204950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
82170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick	 ir_dereference *const else_deref = new ir_dereference_variable(tmp);
82244b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 ir_assignment *const else_assign =
82344b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    new ir_assignment(else_deref, new ir_constant(false), NULL);
82444b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 stmt->else_instructions.push_tail(else_assign);
8254950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
82670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick	 result = new ir_dereference_variable(tmp);
82744b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 type = tmp->type;
82844b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt      }
8294950a68bf22ede6f4f368c9783e5401816159574Eric Anholt      break;
8304950a68bf22ede6f4f368c9783e5401816159574Eric Anholt   }
8314950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
8324950a68bf22ede6f4f368c9783e5401816159574Eric Anholt   case ast_logic_or: {
8334950a68bf22ede6f4f368c9783e5401816159574Eric Anholt      op[0] = this->subexpressions[0]->hir(instructions, state);
8344950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
8354950a68bf22ede6f4f368c9783e5401816159574Eric Anholt      if (!op[0]->type->is_boolean() || !op[0]->type->is_scalar()) {
8364950a68bf22ede6f4f368c9783e5401816159574Eric Anholt	 YYLTYPE loc = this->subexpressions[0]->get_location();
8374950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
8384950a68bf22ede6f4f368c9783e5401816159574Eric Anholt	 _mesa_glsl_error(& loc, state, "LHS of `%s' must be scalar boolean",
8394950a68bf22ede6f4f368c9783e5401816159574Eric Anholt			  operator_string(this->oper));
8404950a68bf22ede6f4f368c9783e5401816159574Eric Anholt	 error_emitted = true;
8414950a68bf22ede6f4f368c9783e5401816159574Eric Anholt      }
8424950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
84344b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt      ir_constant *op0_const = op[0]->constant_expression_value();
84444b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt      if (op0_const) {
84544b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 if (op0_const->value.b[0]) {
84644b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    result = op0_const;
84744b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 } else {
84844b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    op[1] = this->subexpressions[1]->hir(instructions, state);
84944b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt
85044b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    if (!op[1]->type->is_boolean() || !op[1]->type->is_scalar()) {
85144b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	       YYLTYPE loc = this->subexpressions[1]->get_location();
85244b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt
85344b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	       _mesa_glsl_error(& loc, state,
85444b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt				"RHS of `%s' must be scalar boolean",
85544b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt				operator_string(this->oper));
85644b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	       error_emitted = true;
85744b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    }
85844b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    result = op[1];
85944b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 }
86044b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 type = glsl_type::bool_type;
86144b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt      } else {
86244b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 ir_if *const stmt = new ir_if(op[0]);
86344b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 instructions->push_tail(stmt);
8644950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
86544b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 ir_variable *const tmp = generate_temporary(glsl_type::bool_type,
86644b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt						     instructions, state);
8674950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
86844b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 op[1] = this->subexpressions[1]->hir(&stmt->then_instructions, state);
8694950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
87044b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 if (!op[1]->type->is_boolean() || !op[1]->type->is_scalar()) {
87144b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    YYLTYPE loc = this->subexpressions[1]->get_location();
8724950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
87344b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    _mesa_glsl_error(& loc, state, "RHS of `%s' must be scalar boolean",
87444b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt			     operator_string(this->oper));
87544b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    error_emitted = true;
87644b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 }
8774950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
87870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick	 ir_dereference *const then_deref = new ir_dereference_variable(tmp);
87944b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 ir_assignment *const then_assign =
88044b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    new ir_assignment(then_deref, new ir_constant(true), NULL);
88144b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 stmt->then_instructions.push_tail(then_assign);
8824950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
88370fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick	 ir_dereference *const else_deref = new ir_dereference_variable(tmp);
88444b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 ir_assignment *const else_assign =
88544b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	    new ir_assignment(else_deref, op[1], NULL);
88644b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 stmt->else_instructions.push_tail(else_assign);
8874950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
88870fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick	 result = new ir_dereference_variable(tmp);
88944b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt	 type = tmp->type;
89044b694e1f621730bca1cd03eabdfe5474d818f18Eric Anholt      }
8914950a68bf22ede6f4f368c9783e5401816159574Eric Anholt      break;
8924950a68bf22ede6f4f368c9783e5401816159574Eric Anholt   }
8934950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
8944950a68bf22ede6f4f368c9783e5401816159574Eric Anholt   case ast_logic_xor:
8954950a68bf22ede6f4f368c9783e5401816159574Eric Anholt      op[0] = this->subexpressions[0]->hir(instructions, state);
8964950a68bf22ede6f4f368c9783e5401816159574Eric Anholt      op[1] = this->subexpressions[1]->hir(instructions, state);
8974950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
8984950a68bf22ede6f4f368c9783e5401816159574Eric Anholt
899b82c0c31aea2d02721f162b94b9f591242d9364eEric Anholt      result = new ir_expression(operations[this->oper], glsl_type::bool_type,
900b82c0c31aea2d02721f162b94b9f591242d9364eEric Anholt				 op[0], op[1]);
901ebbf14b9801d577adf40dcb0b63df2d3b8da934eEric Anholt      type = glsl_type::bool_type;
902a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
903a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
904a5827fe8d06a1161ef3b4e2b3296431a55d4ba2eEric Anholt   case ast_logic_not:
905a5827fe8d06a1161ef3b4e2b3296431a55d4ba2eEric Anholt      op[0] = this->subexpressions[0]->hir(instructions, state);
906a5827fe8d06a1161ef3b4e2b3296431a55d4ba2eEric Anholt
907a5827fe8d06a1161ef3b4e2b3296431a55d4ba2eEric Anholt      if (!op[0]->type->is_boolean() || !op[0]->type->is_scalar()) {
908a5827fe8d06a1161ef3b4e2b3296431a55d4ba2eEric Anholt	 YYLTYPE loc = this->subexpressions[0]->get_location();
909a5827fe8d06a1161ef3b4e2b3296431a55d4ba2eEric Anholt
910a5827fe8d06a1161ef3b4e2b3296431a55d4ba2eEric Anholt	 _mesa_glsl_error(& loc, state,
911a5827fe8d06a1161ef3b4e2b3296431a55d4ba2eEric Anholt			  "operand of `!' must be scalar boolean");
912ebbf14b9801d577adf40dcb0b63df2d3b8da934eEric Anholt	 error_emitted = true;
913a5827fe8d06a1161ef3b4e2b3296431a55d4ba2eEric Anholt      }
914a5827fe8d06a1161ef3b4e2b3296431a55d4ba2eEric Anholt
915a5827fe8d06a1161ef3b4e2b3296431a55d4ba2eEric Anholt      result = new ir_expression(operations[this->oper], glsl_type::bool_type,
916a5827fe8d06a1161ef3b4e2b3296431a55d4ba2eEric Anholt				 op[0], NULL);
917ebbf14b9801d577adf40dcb0b63df2d3b8da934eEric Anholt      type = glsl_type::bool_type;
918a5827fe8d06a1161ef3b4e2b3296431a55d4ba2eEric Anholt      break;
919a5827fe8d06a1161ef3b4e2b3296431a55d4ba2eEric Anholt
920a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_mul_assign:
921a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_div_assign:
922a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_add_assign:
923a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_sub_assign: {
92418238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[0] = this->subexpressions[0]->hir(instructions, state);
92518238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      op[1] = this->subexpressions[1]->hir(instructions, state);
926a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
927bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick      type = arithmetic_result_type(op[0], op[1],
92818238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick				    (this->oper == ast_mul_assign),
929a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt				    state, & loc);
930a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
931fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke      ir_rvalue *temp_rhs = new ir_expression(operations[this->oper], type,
932fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke				              op[0], op[1]);
933a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
9343e24ef68a9b22918c8b21b743d81bbf86f43c119Eric Anholt      result = do_assignment(instructions, state,
9353e24ef68a9b22918c8b21b743d81bbf86f43c119Eric Anholt			     (ir_rvalue *)op[0]->clone(NULL), temp_rhs,
93610a685218610e737e23d2d8a243ed6ff6613becdEric Anholt			     this->subexpressions[0]->get_location());
93710a685218610e737e23d2d8a243ed6ff6613becdEric Anholt      type = result->type;
93810a685218610e737e23d2d8a243ed6ff6613becdEric Anholt      error_emitted = (op[0]->type->is_error());
939a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
940a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* GLSL 1.10 does not allow array assignment.  However, we don't have to
941a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * explicitly test for this because none of the binary expression
942a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * operators allow array operands either.
943a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       */
944a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
945a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
946a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
947a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
94848a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt   case ast_mod_assign: {
94948a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt      op[0] = this->subexpressions[0]->hir(instructions, state);
95048a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt      op[1] = this->subexpressions[1]->hir(instructions, state);
95148a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt
95265e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt      type = modulus_result_type(op[0]->type, op[1]->type, state, & loc);
95348a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt
95448a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt      assert(operations[this->oper] == ir_binop_mod);
95548a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt
95648a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt      struct ir_rvalue *temp_rhs;
95748a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt      temp_rhs = new ir_expression(operations[this->oper], type,
95848a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt				   op[0], op[1]);
95948a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt
9603e24ef68a9b22918c8b21b743d81bbf86f43c119Eric Anholt      result = do_assignment(instructions, state,
9613e24ef68a9b22918c8b21b743d81bbf86f43c119Eric Anholt			     (ir_rvalue *)op[0]->clone(NULL), temp_rhs,
96248a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt			     this->subexpressions[0]->get_location());
96348a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt      type = result->type;
96465e1a7ac6a6735e135851ddb87e48361d4677000Eric Anholt      error_emitted = type->is_error();
96548a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt      break;
96648a0e64b7d6a4308f9c691e5844165ec97f8282eEric Anholt   }
967a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
968a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_ls_assign:
969a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_rs_assign:
970183d8c63947fcfab45c9f2a8a8a6fc311e8b1552Eric Anholt      _mesa_glsl_error(& loc, state,
971183d8c63947fcfab45c9f2a8a8a6fc311e8b1552Eric Anholt		       "FINISHME: implement bit-shift assignment operators");
972183d8c63947fcfab45c9f2a8a8a6fc311e8b1552Eric Anholt      error_emitted = true;
973251eb753187fee83e6413f44f8b3cf0be1b4f4cbIan Romanick      break;
974a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
975a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_and_assign:
976a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_xor_assign:
977a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_or_assign:
978183d8c63947fcfab45c9f2a8a8a6fc311e8b1552Eric Anholt      _mesa_glsl_error(& loc, state,
979183d8c63947fcfab45c9f2a8a8a6fc311e8b1552Eric Anholt		       "FINISHME: implement logic assignment operators");
980183d8c63947fcfab45c9f2a8a8a6fc311e8b1552Eric Anholt      error_emitted = true;
981251eb753187fee83e6413f44f8b3cf0be1b4f4cbIan Romanick      break;
982a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
98396f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick   case ast_conditional: {
98496f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick      op[0] = this->subexpressions[0]->hir(instructions, state);
98596f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick
98696f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick      /* From page 59 (page 65 of the PDF) of the GLSL 1.50 spec:
98796f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       *
98896f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       *    "The ternary selection operator (?:). It operates on three
98996f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       *    expressions (exp1 ? exp2 : exp3). This operator evaluates the
99096f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       *    first expression, which must result in a scalar Boolean."
99196f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       */
99296f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick      if (!op[0]->type->is_boolean() || !op[0]->type->is_scalar()) {
99396f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick	 YYLTYPE loc = this->subexpressions[0]->get_location();
99496f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick
99596f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick	 _mesa_glsl_error(& loc, state, "?: condition must be scalar boolean");
99696f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick	 error_emitted = true;
99796f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick      }
99896f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick
99996f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick      /* The :? operator is implemented by generating an anonymous temporary
100096f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       * followed by an if-statement.  The last instruction in each branch of
100196f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       * the if-statement assigns a value to the anonymous temporary.  This
100296f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       * temporary is the r-value of the expression.
100396f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       */
10040ad76c67675c35a65a79752058f53eee74947ba5Ian Romanick      exec_list then_instructions;
10050ad76c67675c35a65a79752058f53eee74947ba5Ian Romanick      exec_list else_instructions;
100696f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick
10070ad76c67675c35a65a79752058f53eee74947ba5Ian Romanick      op[1] = this->subexpressions[1]->hir(&then_instructions, state);
10080ad76c67675c35a65a79752058f53eee74947ba5Ian Romanick      op[2] = this->subexpressions[2]->hir(&else_instructions, state);
100996f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick
101096f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick      /* From page 59 (page 65 of the PDF) of the GLSL 1.50 spec:
101196f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       *
101296f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       *     "The second and third expressions can be any type, as
101396f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       *     long their types match, or there is a conversion in
101496f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       *     Section 4.1.10 "Implicit Conversions" that can be applied
101596f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       *     to one of the expressions to make their types match. This
101696f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       *     resulting matching type is the type of the entire
101796f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       *     expression."
101896f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick       */
1019bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick      if ((!apply_implicit_conversion(op[1]->type, op[2], state)
1020bfb09c2a94414c1b40108c9c41eb0844d932e459Ian Romanick	   && !apply_implicit_conversion(op[2]->type, op[1], state))
1021db9be2e7aa3a56e43b725ad7725fe6b424e4933eIan Romanick	  || (op[1]->type != op[2]->type)) {
102296f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick	 YYLTYPE loc = this->subexpressions[1]->get_location();
102396f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick
102496f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick	 _mesa_glsl_error(& loc, state, "Second and third operands of ?: "
102596f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick			  "operator must have matching types.");
102696f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick	 error_emitted = true;
10270ad76c67675c35a65a79752058f53eee74947ba5Ian Romanick	 type = glsl_type::error_type;
1028db9be2e7aa3a56e43b725ad7725fe6b424e4933eIan Romanick      } else {
10290ad76c67675c35a65a79752058f53eee74947ba5Ian Romanick	 type = op[1]->type;
103096f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick      }
103196f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick
10327825d3d15710fdfcfc503754862963aac8065480Ian Romanick      ir_constant *cond_val = op[0]->constant_expression_value();
10337825d3d15710fdfcfc503754862963aac8065480Ian Romanick      ir_constant *then_val = op[1]->constant_expression_value();
10347825d3d15710fdfcfc503754862963aac8065480Ian Romanick      ir_constant *else_val = op[2]->constant_expression_value();
10357825d3d15710fdfcfc503754862963aac8065480Ian Romanick
10367825d3d15710fdfcfc503754862963aac8065480Ian Romanick      if (then_instructions.is_empty()
10377825d3d15710fdfcfc503754862963aac8065480Ian Romanick	  && else_instructions.is_empty()
10387825d3d15710fdfcfc503754862963aac8065480Ian Romanick	  && (cond_val != NULL) && (then_val != NULL) && (else_val != NULL)) {
10397825d3d15710fdfcfc503754862963aac8065480Ian Romanick	 result = (cond_val->value.b[0]) ? then_val : else_val;
10407825d3d15710fdfcfc503754862963aac8065480Ian Romanick      } else {
10417825d3d15710fdfcfc503754862963aac8065480Ian Romanick	 ir_variable *const tmp = generate_temporary(type,
10427825d3d15710fdfcfc503754862963aac8065480Ian Romanick						     instructions, state);
10430ad76c67675c35a65a79752058f53eee74947ba5Ian Romanick
10447825d3d15710fdfcfc503754862963aac8065480Ian Romanick	 ir_if *const stmt = new ir_if(op[0]);
10457825d3d15710fdfcfc503754862963aac8065480Ian Romanick	 instructions->push_tail(stmt);
10460ad76c67675c35a65a79752058f53eee74947ba5Ian Romanick
10477825d3d15710fdfcfc503754862963aac8065480Ian Romanick	 then_instructions.move_nodes_to(& stmt->then_instructions);
10487825d3d15710fdfcfc503754862963aac8065480Ian Romanick	 ir_dereference *const then_deref = new ir_dereference_variable(tmp);
10497825d3d15710fdfcfc503754862963aac8065480Ian Romanick	 ir_assignment *const then_assign =
10507825d3d15710fdfcfc503754862963aac8065480Ian Romanick	    new ir_assignment(then_deref, op[1], NULL);
10517825d3d15710fdfcfc503754862963aac8065480Ian Romanick	 stmt->then_instructions.push_tail(then_assign);
10520ad76c67675c35a65a79752058f53eee74947ba5Ian Romanick
10537825d3d15710fdfcfc503754862963aac8065480Ian Romanick	 else_instructions.move_nodes_to(& stmt->else_instructions);
10547825d3d15710fdfcfc503754862963aac8065480Ian Romanick	 ir_dereference *const else_deref = new ir_dereference_variable(tmp);
10557825d3d15710fdfcfc503754862963aac8065480Ian Romanick	 ir_assignment *const else_assign =
10567825d3d15710fdfcfc503754862963aac8065480Ian Romanick	    new ir_assignment(else_deref, op[2], NULL);
10577825d3d15710fdfcfc503754862963aac8065480Ian Romanick	 stmt->else_instructions.push_tail(else_assign);
10580ad76c67675c35a65a79752058f53eee74947ba5Ian Romanick
10597825d3d15710fdfcfc503754862963aac8065480Ian Romanick	 result = new ir_dereference_variable(tmp);
10607825d3d15710fdfcfc503754862963aac8065480Ian Romanick      }
1061251eb753187fee83e6413f44f8b3cf0be1b4f4cbIan Romanick      break;
106296f9cea11606bb1bd8e07edc17032447424b8bffIan Romanick   }
1063a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1064a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_pre_inc:
106576ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt   case ast_pre_dec: {
106676ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt      op[0] = this->subexpressions[0]->hir(instructions, state);
106776ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt      if (op[0]->type->base_type == GLSL_TYPE_FLOAT)
106876ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt	 op[1] = new ir_constant(1.0f);
106976ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt      else
107076ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt	 op[1] = new ir_constant(1);
107176ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt
1072a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt      type = arithmetic_result_type(op[0], op[1], false, state, & loc);
107376ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt
107476ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt      struct ir_rvalue *temp_rhs;
107576ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt      temp_rhs = new ir_expression(operations[this->oper], type,
107676ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt				   op[0], op[1]);
107776ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt
10783e24ef68a9b22918c8b21b743d81bbf86f43c119Eric Anholt      result = do_assignment(instructions, state,
10793e24ef68a9b22918c8b21b743d81bbf86f43c119Eric Anholt			     (ir_rvalue *)op[0]->clone(NULL), temp_rhs,
108076ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt			     this->subexpressions[0]->get_location());
108176ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt      type = result->type;
108276ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt      error_emitted = op[0]->type->is_error();
108376ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt      break;
108476ea56c007263ec3b79234e7b775e3a7b519a54aEric Anholt   }
1085a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1086a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_post_inc:
1087de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt   case ast_post_dec: {
1088de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      op[0] = this->subexpressions[0]->hir(instructions, state);
1089de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      if (op[0]->type->base_type == GLSL_TYPE_FLOAT)
1090de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt	 op[1] = new ir_constant(1.0f);
1091de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      else
1092de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt	 op[1] = new ir_constant(1);
1093de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
1094de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      error_emitted = op[0]->type->is_error() || op[1]->type->is_error();
1095de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
1096a13bb1490c57ea958f2d1853d71c55d03263e9e4Eric Anholt      type = arithmetic_result_type(op[0], op[1], false, state, & loc);
1097de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
1098de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      struct ir_rvalue *temp_rhs;
1099de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      temp_rhs = new ir_expression(operations[this->oper], type,
1100de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt				   op[0], op[1]);
1101de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
1102de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      /* Get a temporary of a copy of the lvalue before it's modified.
1103de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt       * This may get thrown away later.
1104de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt       */
1105959a9ecdd8fbc3375e4149f2b44d253622ff12eeEric Anholt      result = get_lvalue_copy(instructions, (ir_rvalue *)op[0]->clone(NULL));
1106de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
11073e24ef68a9b22918c8b21b743d81bbf86f43c119Eric Anholt      (void)do_assignment(instructions, state,
11083e24ef68a9b22918c8b21b743d81bbf86f43c119Eric Anholt			  (ir_rvalue *)op[0]->clone(NULL), temp_rhs,
1109de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt			  this->subexpressions[0]->get_location());
1110de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt
1111de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      type = result->type;
1112de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt      error_emitted = op[0]->type->is_error();
1113a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
1114de38f0ed53c80f87478c3899d4ff1bc3a601ea6bEric Anholt   }
1115a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1116a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_field_selection:
111718238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      result = _mesa_ast_field_selection_to_hir(this, instructions, state);
1118a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      type = result->type;
1119a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
1120a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
112127e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick   case ast_array_index: {
112227e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick      YYLTYPE index_loc = subexpressions[1]->get_location();
112327e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick
112427e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick      op[0] = subexpressions[0]->hir(instructions, state);
112527e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick      op[1] = subexpressions[1]->hir(instructions, state);
112627e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick
112727e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick      error_emitted = op[0]->type->is_error() || op[1]->type->is_error();
112827e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick
1129a9159f9e87b518ba0a4ad43db8fdd58a678b3a92Ian Romanick      ir_rvalue *const array = op[0];
1130b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick
113170fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick      result = new ir_dereference_array(op[0], op[1]);
1132b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick
1133b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick      /* Do not use op[0] after this point.  Use array.
1134b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick       */
1135b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick      op[0] = NULL;
1136b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick
113727e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick
113827e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick      if (error_emitted)
113927e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	 break;
114027e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick
114163038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick      if (!array->type->is_array()
114263038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	  && !array->type->is_matrix()
114363038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	  && !array->type->is_vector()) {
114427e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	 _mesa_glsl_error(& index_loc, state,
114563038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick			  "cannot dereference non-array / non-matrix / "
114663038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick			  "non-vector");
114727e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	 error_emitted = true;
114827e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick      }
114927e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick
115027e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick      if (!op[1]->type->is_integer()) {
115127e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	 _mesa_glsl_error(& index_loc, state,
115227e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick			  "array index must be integer type");
115327e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	 error_emitted = true;
115427e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick      } else if (!op[1]->type->is_scalar()) {
115527e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	 _mesa_glsl_error(& index_loc, state,
115627e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick			  "array index must be scalar");
115727e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	 error_emitted = true;
115827e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick      }
115927e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick
116027e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick      /* If the array index is a constant expression and the array has a
116127e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick       * declared size, ensure that the access is in-bounds.  If the array
116227e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick       * index is not a constant expression, ensure that the array has a
116327e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick       * declared size.
116427e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick       */
116527e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick      ir_constant *const const_index = op[1]->constant_expression_value();
116627e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick      if (const_index != NULL) {
116727e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	 const int idx = const_index->value.i[0];
116863038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	 const char *type_name;
116963038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	 unsigned bound = 0;
117063038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick
117163038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	 if (array->type->is_matrix()) {
117263038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	    type_name = "matrix";
117363038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	 } else if (array->type->is_vector()) {
117463038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	    type_name = "vector";
117563038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	 } else {
117663038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	    type_name = "array";
117763038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	 }
117827e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick
117927e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	 /* From page 24 (page 30 of the PDF) of the GLSL 1.50 spec:
118027e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	  *
118127e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	  *    "It is illegal to declare an array with a size, and then
118227e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	  *    later (in the same shader) index the same array with an
118327e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	  *    integral constant expression greater than or equal to the
118427e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	  *    declared size. It is also illegal to index an array with a
118527e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	  *    negative constant expression."
118627e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	  */
118763038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	 if (array->type->is_matrix()) {
118863038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	    if (array->type->row_type()->vector_elements <= idx) {
118963038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	       bound = array->type->row_type()->vector_elements;
119063038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	    }
119163038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	 } else if (array->type->is_vector()) {
119263038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	    if (array->type->vector_elements <= idx) {
119363038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	       bound = array->type->vector_elements;
119463038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	    }
119563038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	 } else {
119663038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	    if ((array->type->array_size() > 0)
119763038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick		&& (array->type->array_size() <= idx)) {
119863038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	       bound = array->type->array_size();
119963038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	    }
120027e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	 }
120127e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick
120263038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	 if (bound > 0) {
120363038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	    _mesa_glsl_error(& loc, state, "%s index must be < %u",
120463038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick			     type_name, bound);
120563038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	    error_emitted = true;
120663038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	 } else if (idx < 0) {
120763038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	    _mesa_glsl_error(& loc, state, "%s index must be >= 0",
120863038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick			     type_name);
120927e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	    error_emitted = true;
121027e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	 }
1211b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick
121263038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	 if (array->type->is_array()) {
1213a9159f9e87b518ba0a4ad43db8fdd58a678b3a92Ian Romanick	    /* If the array is a variable dereference, it dereferences the
1214a9159f9e87b518ba0a4ad43db8fdd58a678b3a92Ian Romanick	     * whole array, by definition.  Use this to get the variable.
1215a9159f9e87b518ba0a4ad43db8fdd58a678b3a92Ian Romanick	     *
1216a9159f9e87b518ba0a4ad43db8fdd58a678b3a92Ian Romanick	     * FINISHME: Should some methods for getting / setting / testing
1217a9159f9e87b518ba0a4ad43db8fdd58a678b3a92Ian Romanick	     * FINISHME: array access limits be added to ir_dereference?
1218a9159f9e87b518ba0a4ad43db8fdd58a678b3a92Ian Romanick	     */
1219a9159f9e87b518ba0a4ad43db8fdd58a678b3a92Ian Romanick	    ir_variable *const v = array->whole_variable_referenced();
122063038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	    if ((v != NULL) && (unsigned(idx) > v->max_array_access))
122163038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	       v->max_array_access = idx;
122263038e18ad44e4e021da9a6dbe7a075e57ff6415Ian Romanick	 }
122327e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick      }
122427e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick
122527e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick      if (error_emitted)
122627e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick	 result->type = glsl_type::error_type;
122727e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick
122827e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick      type = result->type;
1229a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
123027e3cf8c0d8812f9be55ca6ceb52cf8232742d99Ian Romanick   }
1231a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1232a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_function_call:
12337cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick      /* Should *NEVER* get here.  ast_function_call should always be handled
12347cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick       * by ast_function_expression::hir.
1235a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       */
12367cfddf19413ef61fcf1450bd61e9ece4cf1735a4Ian Romanick      assert(0);
1237a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
1238a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1239a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_identifier: {
1240a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* ast_identifier can appear several places in a full abstract syntax
1241a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * tree.  This particular use must be at location specified in the grammar
1242a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * as 'variable_identifier'.
1243a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       */
12448bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick      ir_variable *var =
12458bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick	 state->symbols->get_variable(this->primary_expression.identifier);
1246a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
124770fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick      result = new ir_dereference_variable(var);
1248a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1249a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      if (var != NULL) {
1250a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 type = result->type;
1251a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      } else {
125271d0bbfcb2853f37b580ec7b705e55bb0eb426faIan Romanick	 _mesa_glsl_error(& loc, state, "`%s' undeclared",
125318238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick			  this->primary_expression.identifier);
1254a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1255a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 error_emitted = true;
1256a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      }
1257a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
1258a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
1259a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1260a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_int_constant:
12610471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      type = glsl_type::int_type;
1262b74b43e4ba27a9b2e9da0f3499af261a4b997b00Ian Romanick      result = new ir_constant(this->primary_expression.int_constant);
1263a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
1264a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1265a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_uint_constant:
12660471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      type = glsl_type::uint_type;
1267b74b43e4ba27a9b2e9da0f3499af261a4b997b00Ian Romanick      result = new ir_constant(this->primary_expression.uint_constant);
1268a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
1269a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1270a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_float_constant:
12710471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      type = glsl_type::float_type;
1272b74b43e4ba27a9b2e9da0f3499af261a4b997b00Ian Romanick      result = new ir_constant(this->primary_expression.float_constant);
1273a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
1274a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1275a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_bool_constant:
12760471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      type = glsl_type::bool_type;
1277b74b43e4ba27a9b2e9da0f3499af261a4b997b00Ian Romanick      result = new ir_constant(bool(this->primary_expression.bool_constant));
1278a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
1279a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1280a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_sequence: {
1281a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* It should not be possible to generate a sequence in the AST without
1282a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * any expressions in it.
1283a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       */
1284304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick      assert(!this->expressions.is_empty());
1285a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1286a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* The r-value of a sequence is the last expression in the sequence.  If
1287a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * the other expressions in the sequence do not have side-effects (and
1288a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * therefore add instructions to the instruction list), they get dropped
1289a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * on the floor.
1290a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       */
12912b97dc657a0e762bc67216405419cd348eb948c0Ian Romanick      foreach_list_typed (ast_node, ast, link, &this->expressions)
1292304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick	 result = ast->hir(instructions, state);
1293a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1294a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      type = result->type;
1295a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1296a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* Any errors should have already been emitted in the loop above.
1297a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       */
1298a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      error_emitted = true;
1299a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
1300a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
1301a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
1302a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1303cef3baecf636a30b62cd7a1e8de57c7650f7003eIan Romanick   if (type->is_error() && !error_emitted)
130471d0bbfcb2853f37b580ec7b705e55bb0eb426faIan Romanick      _mesa_glsl_error(& loc, state, "type mismatch");
1305a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1306a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   return result;
1307a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
1308a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1309a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1310fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue *
13110044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickast_expression_statement::hir(exec_list *instructions,
131218238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick			      struct _mesa_glsl_parse_state *state)
1313a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
1314a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* It is possible to have expression statements that don't have an
1315a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * expression.  This is the solitary semicolon:
1316a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
1317a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * for (i = 0; i < 5; i++)
1318a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *     ;
1319a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    *
1320a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * In this case the expression will be NULL.  Test for NULL and don't do
1321a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * anything in that case.
1322a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
132318238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   if (expression != NULL)
132418238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick      expression->hir(instructions, state);
1325a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1326a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* Statements do not have r-values.
1327a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1328a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   return NULL;
1329a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
1330a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1331a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1332fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue *
13330044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickast_compound_statement::hir(exec_list *instructions,
133418238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick			    struct _mesa_glsl_parse_state *state)
1335a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
133618238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   if (new_scope)
13378bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick      state->symbols->push_scope();
1338a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
13392b97dc657a0e762bc67216405419cd348eb948c0Ian Romanick   foreach_list_typed (ast_node, ast, link, &this->statements)
1340304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick      ast->hir(instructions, state);
1341a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
134218238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   if (new_scope)
13438bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick      state->symbols->pop_scope();
1344a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1345a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* Compound statements do not have r-values.
1346a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1347a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   return NULL;
1348a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
1349a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1350a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
135128009cd75cd3328774bd80a5b87a255ac881a710Ian Romanickstatic const glsl_type *
135228009cd75cd3328774bd80a5b87a255ac881a710Ian Romanickprocess_array_type(const glsl_type *base, ast_node *array_size,
135328009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick		   struct _mesa_glsl_parse_state *state)
135428009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick{
135528009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick   unsigned length = 0;
135628009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick
135728009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick   /* FINISHME: Reject delcarations of multidimensional arrays. */
135828009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick
135928009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick   if (array_size != NULL) {
136028009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick      exec_list dummy_instructions;
136128009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick      ir_rvalue *const ir = array_size->hir(& dummy_instructions, state);
136228009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick      YYLTYPE loc = array_size->get_location();
136328009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick
136428009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick      /* FINISHME: Verify that the grammar forbids side-effects in array
136528009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick       * FINISHME: sizes.   i.e., 'vec4 [x = 12] data'
136628009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick       */
136728009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick      assert(dummy_instructions.is_empty());
136828009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick
136928009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick      if (ir != NULL) {
137028009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick	 if (!ir->type->is_integer()) {
137128009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick	    _mesa_glsl_error(& loc, state, "array size must be integer type");
137228009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick	 } else if (!ir->type->is_scalar()) {
137328009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick	    _mesa_glsl_error(& loc, state, "array size must be scalar type");
137428009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick	 } else {
137528009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick	    ir_constant *const size = ir->constant_expression_value();
137628009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick
137728009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick	    if (size == NULL) {
137828009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick	       _mesa_glsl_error(& loc, state, "array size must be a "
137928009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick				"constant valued expression");
138028009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick	    } else if (size->value.i[0] <= 0) {
138128009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick	       _mesa_glsl_error(& loc, state, "array size must be > 0");
138228009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick	    } else {
138328009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick	       assert(size->type == ir->type);
138428009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick	       length = size->value.u[0];
138528009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick	    }
138628009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick	 }
138728009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick      }
138828009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick   }
138928009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick
139028009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick   return glsl_type::get_array_instance(base, length);
139128009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick}
139228009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick
139328009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick
1394d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanickconst glsl_type *
1395d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanickast_type_specifier::glsl_type(const char **name,
1396d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick			      struct _mesa_glsl_parse_state *state) const
1397a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
1398d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick   const struct glsl_type *type;
1399a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
14003455ce614424a5a23a23037e23d0454e476bceeaIan Romanick   if ((this->type_specifier == ast_struct) && (this->type_name == NULL)) {
1401a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* FINISHME: Handle annonymous structures. */
1402a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      type = NULL;
1403a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } else {
1404d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick      type = state->symbols->get_type(this->type_name);
1405d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick      *name = this->type_name;
1406a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1407d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick      if (this->is_array) {
1408d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick	 type = process_array_type(type, this->array_size, state);
140928009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick      }
1410a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
1411a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1412a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   return type;
1413a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
1414a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1415a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1416a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic void
1417a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickapply_type_qualifier_to_variable(const struct ast_type_qualifier *qual,
1418a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick				 struct ir_variable *var,
14192e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt				 struct _mesa_glsl_parse_state *state,
14202e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt				 YYLTYPE *loc)
1421a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
1422a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   if (qual->invariant)
1423a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      var->invariant = 1;
1424a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1425a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* FINISHME: Mark 'in' variables at global scope as read-only. */
1426a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   if (qual->constant || qual->attribute || qual->uniform
1427a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       || (qual->varying && (state->target == fragment_shader)))
1428a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      var->read_only = 1;
1429a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1430a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   if (qual->centroid)
1431a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      var->centroid = 1;
1432a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1433ae4c4c07959f059e557ea44e98552ced1fec9f47Ian Romanick   if (qual->attribute && state->target != vertex_shader) {
14342e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt      var->type = glsl_type::error_type;
14352e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt      _mesa_glsl_error(loc, state,
14362e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt		       "`attribute' variables may not be declared in the "
1437ae4c4c07959f059e557ea44e98552ced1fec9f47Ian Romanick		       "%s shader",
1438ae4c4c07959f059e557ea44e98552ced1fec9f47Ian Romanick		       _mesa_glsl_shader_target_name(state->target));
14392e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt   }
14402e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt
144190b7825b0e92375dbe721d2dca1a4a3f1093f4abEric Anholt   /* From page 25 (page 31 of the PDF) of the GLSL 1.10 spec:
144290b7825b0e92375dbe721d2dca1a4a3f1093f4abEric Anholt    *
144390b7825b0e92375dbe721d2dca1a4a3f1093f4abEric Anholt    *     "The varying qualifier can be used only with the data types
144490b7825b0e92375dbe721d2dca1a4a3f1093f4abEric Anholt    *     float, vec2, vec3, vec4, mat2, mat3, and mat4, or arrays of
144590b7825b0e92375dbe721d2dca1a4a3f1093f4abEric Anholt    *     these."
144690b7825b0e92375dbe721d2dca1a4a3f1093f4abEric Anholt    */
14470ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt   if (qual->varying) {
14480ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt      const glsl_type *non_array_type;
14490ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt
14500ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt      if (var->type && var->type->is_array())
14510ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt	 non_array_type = var->type->fields.array;
14520ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt      else
14530ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt	 non_array_type = var->type;
14540ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt
14550ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt      if (non_array_type && non_array_type->base_type != GLSL_TYPE_FLOAT) {
14560ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt	 var->type = glsl_type::error_type;
14570ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt	 _mesa_glsl_error(loc, state,
14580ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt			  "varying variables must be of base type float");
14590ca171908d04732176cbcaf2625fed8208a93dc9Eric Anholt      }
146090b7825b0e92375dbe721d2dca1a4a3f1093f4abEric Anholt   }
146190b7825b0e92375dbe721d2dca1a4a3f1093f4abEric Anholt
1462a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   if (qual->in && qual->out)
1463a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      var->mode = ir_var_inout;
1464a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   else if (qual->attribute || qual->in
1465a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	    || (qual->varying && (state->target == fragment_shader)))
1466a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      var->mode = ir_var_in;
14670b678234625fac67a89285ad2871dedc891fb1b1Ian Romanick   else if (qual->out || (qual->varying && (state->target == vertex_shader)))
1468a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      var->mode = ir_var_out;
1469a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   else if (qual->uniform)
1470a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      var->mode = ir_var_uniform;
1471a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   else
1472a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      var->mode = ir_var_auto;
1473a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
147471df19f5ef6e78beb5160801f81468184b75447eEric Anholt   if (qual->uniform)
147571df19f5ef6e78beb5160801f81468184b75447eEric Anholt      var->shader_in = true;
1476c96822cf311d764a3cf6a2c62145851e8326c896Ian Romanick
1477c96822cf311d764a3cf6a2c62145851e8326c896Ian Romanick   /* Any 'in' or 'inout' variables at global scope must be marked as being
1478c96822cf311d764a3cf6a2c62145851e8326c896Ian Romanick    * shader inputs.  Likewise, any 'out' or 'inout' variables at global scope
1479c96822cf311d764a3cf6a2c62145851e8326c896Ian Romanick    * must be marked as being shader outputs.
1480c96822cf311d764a3cf6a2c62145851e8326c896Ian Romanick    */
1481c96822cf311d764a3cf6a2c62145851e8326c896Ian Romanick   if (state->current_function == NULL) {
1482c96822cf311d764a3cf6a2c62145851e8326c896Ian Romanick      switch (var->mode) {
1483c96822cf311d764a3cf6a2c62145851e8326c896Ian Romanick      case ir_var_in:
1484c96822cf311d764a3cf6a2c62145851e8326c896Ian Romanick      case ir_var_uniform:
1485c96822cf311d764a3cf6a2c62145851e8326c896Ian Romanick	 var->shader_in = true;
1486c96822cf311d764a3cf6a2c62145851e8326c896Ian Romanick	 break;
1487c96822cf311d764a3cf6a2c62145851e8326c896Ian Romanick      case ir_var_out:
1488c96822cf311d764a3cf6a2c62145851e8326c896Ian Romanick	 var->shader_out = true;
1489c96822cf311d764a3cf6a2c62145851e8326c896Ian Romanick	 break;
1490c96822cf311d764a3cf6a2c62145851e8326c896Ian Romanick      case ir_var_inout:
149171df19f5ef6e78beb5160801f81468184b75447eEric Anholt	 var->shader_in = true;
149271df19f5ef6e78beb5160801f81468184b75447eEric Anholt	 var->shader_out = true;
1493c96822cf311d764a3cf6a2c62145851e8326c896Ian Romanick	 break;
1494c96822cf311d764a3cf6a2c62145851e8326c896Ian Romanick      default:
1495c96822cf311d764a3cf6a2c62145851e8326c896Ian Romanick	 break;
1496c96822cf311d764a3cf6a2c62145851e8326c896Ian Romanick      }
149771df19f5ef6e78beb5160801f81468184b75447eEric Anholt   }
149871df19f5ef6e78beb5160801f81468184b75447eEric Anholt
1499a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   if (qual->flat)
1500a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      var->interpolation = ir_var_flat;
1501a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   else if (qual->noperspective)
1502a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      var->interpolation = ir_var_noperspective;
1503a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   else
1504a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      var->interpolation = ir_var_smooth;
15059d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick
15069d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick   if (var->type->is_array() && (state->language_version >= 120)) {
15079d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick      var->array_lvalue = true;
15089d975377ca6dae7805804c0fbe625bb7c5f9e095Ian Romanick   }
1509a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
1510a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1511a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1512fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue *
15130044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickast_declarator_list::hir(exec_list *instructions,
151418238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick			 struct _mesa_glsl_parse_state *state)
1515a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
1516a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const struct glsl_type *decl_type;
1517a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *type_name = NULL;
15188558459512594216c5aed0bb8d2b0efcbc8b921cEric Anholt   ir_rvalue *result = NULL;
1519c824e35dd092a9cc0dbfd36d90fcdf1488c8942dIan Romanick   YYLTYPE loc = this->get_location();
1520a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
15213455ce614424a5a23a23037e23d0454e476bceeaIan Romanick   /* The type specifier may contain a structure definition.  Process that
15223455ce614424a5a23a23037e23d0454e476bceeaIan Romanick    * before any of the variable declarations.
15233455ce614424a5a23a23037e23d0454e476bceeaIan Romanick    */
15243455ce614424a5a23a23037e23d0454e476bceeaIan Romanick   (void) this->type->specifier->hir(instructions, state);
15253455ce614424a5a23a23037e23d0454e476bceeaIan Romanick
1526a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* FINISHME: Handle vertex shader "invariant" declarations that do not
1527a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * FINISHME: include a type.  These re-declare built-in variables to be
1528a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * FINISHME: invariant.
1529a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1530a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1531d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick   decl_type = this->type->specifier->glsl_type(& type_name, state);
1532304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick   if (this->declarations.is_empty()) {
1533c824e35dd092a9cc0dbfd36d90fcdf1488c8942dIan Romanick      /* There are only two valid cases where the declaration list can be
1534c824e35dd092a9cc0dbfd36d90fcdf1488c8942dIan Romanick       * empty.
1535c824e35dd092a9cc0dbfd36d90fcdf1488c8942dIan Romanick       *
1536c824e35dd092a9cc0dbfd36d90fcdf1488c8942dIan Romanick       * 1. The declaration is setting the default precision of a built-in
1537c824e35dd092a9cc0dbfd36d90fcdf1488c8942dIan Romanick       *    type (e.g., 'precision highp vec4;').
1538c824e35dd092a9cc0dbfd36d90fcdf1488c8942dIan Romanick       *
1539c824e35dd092a9cc0dbfd36d90fcdf1488c8942dIan Romanick       * 2. Adding 'invariant' to an existing vertex shader output.
1540c824e35dd092a9cc0dbfd36d90fcdf1488c8942dIan Romanick       */
1541c824e35dd092a9cc0dbfd36d90fcdf1488c8942dIan Romanick
1542c824e35dd092a9cc0dbfd36d90fcdf1488c8942dIan Romanick      if (this->type->qualifier.invariant) {
1543c824e35dd092a9cc0dbfd36d90fcdf1488c8942dIan Romanick      } else if (decl_type != NULL) {
1544c824e35dd092a9cc0dbfd36d90fcdf1488c8942dIan Romanick      } else {
1545c824e35dd092a9cc0dbfd36d90fcdf1488c8942dIan Romanick	    _mesa_glsl_error(& loc, state, "incomplete declaration");
1546c824e35dd092a9cc0dbfd36d90fcdf1488c8942dIan Romanick      }
1547c824e35dd092a9cc0dbfd36d90fcdf1488c8942dIan Romanick   }
1548a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
15492b97dc657a0e762bc67216405419cd348eb948c0Ian Romanick   foreach_list_typed (ast_declaration, decl, link, &this->declarations) {
1550a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      const struct glsl_type *var_type;
1551a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      struct ir_variable *var;
1552a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1553a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* FINISHME: Emit a warning if a variable declaration shadows a
1554a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       * FINISHME: declaration at a higher scope.
1555a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       */
1556a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1557cec65a6b76290ee4da91691bd3ef01c3fb8a0c37Ian Romanick      if ((decl_type == NULL) || decl_type->is_void()) {
1558a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 if (type_name != NULL) {
1559a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	    _mesa_glsl_error(& loc, state,
1560a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick			     "invalid type `%s' in declaration of `%s'",
1561a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick			     type_name, decl->identifier);
1562a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 } else {
1563a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	    _mesa_glsl_error(& loc, state,
1564a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick			     "invalid type in declaration of `%s'",
1565a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick			     decl->identifier);
1566a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 }
1567a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 continue;
1568a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      }
1569a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1570a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      if (decl->is_array) {
157128009cd75cd3328774bd80a5b87a255ac881a710Ian Romanick	 var_type = process_array_type(decl_type, decl->array_size, state);
1572a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      } else {
1573a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 var_type = decl_type;
1574a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      }
1575a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1576a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      var = new ir_variable(var_type, decl->identifier);
1577a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
15783f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt      /* From page 22 (page 28 of the PDF) of the GLSL 1.10 specification;
15793f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt       *
15803f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt       *     "Global variables can only use the qualifiers const,
15813f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt       *     attribute, uni form, or varying. Only one may be
15823f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt       *     specified.
15833f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt       *
15843f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt       *     Local variables can only use the qualifier const."
15853f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt       *
15863f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt       * This is relaxed in GLSL 1.30.
15873f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt       */
15883f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt      if (state->language_version < 120) {
15893f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt	 if (this->type->qualifier.out) {
15903f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt	    _mesa_glsl_error(& loc, state,
15913f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt			     "`out' qualifier in declaration of `%s' "
15923f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt			     "only valid for function parameters in GLSL 1.10.",
15933f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt			     decl->identifier);
15943f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt	 }
15953f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt	 if (this->type->qualifier.in) {
15963f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt	    _mesa_glsl_error(& loc, state,
15973f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt			     "`in' qualifier in declaration of `%s' "
15983f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt			     "only valid for function parameters in GLSL 1.10.",
15993f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt			     decl->identifier);
16003f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt	 }
16013f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt	 /* FINISHME: Test for other invalid qualifiers. */
16023f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt      }
16033f151509327629ce7d7cbfec42cae987ebf6639fEric Anholt
16042e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt      apply_type_qualifier_to_variable(& this->type->qualifier, var, state,
16052e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt				       & loc);
1606a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1607a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      /* Attempt to add the variable to the symbol table.  If this fails, it
1608a4f308f0663208eec07cc320ff4a67589d4b5a7fIan Romanick       * means the variable has already been declared at this scope.  Arrays
1609a4f308f0663208eec07cc320ff4a67589d4b5a7fIan Romanick       * fudge this rule a little bit.
1610a4f308f0663208eec07cc320ff4a67589d4b5a7fIan Romanick       *
1611a4f308f0663208eec07cc320ff4a67589d4b5a7fIan Romanick       * From page 24 (page 30 of the PDF) of the GLSL 1.50 spec,
1612a4f308f0663208eec07cc320ff4a67589d4b5a7fIan Romanick       *
1613a4f308f0663208eec07cc320ff4a67589d4b5a7fIan Romanick       *    "It is legal to declare an array without a size and then
1614a4f308f0663208eec07cc320ff4a67589d4b5a7fIan Romanick       *    later re-declare the same name as an array of the same
1615a4f308f0663208eec07cc320ff4a67589d4b5a7fIan Romanick       *    type and specify a size."
1616a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick       */
16173359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick      if (state->symbols->name_declared_this_scope(decl->identifier)) {
1618a4f308f0663208eec07cc320ff4a67589d4b5a7fIan Romanick	 ir_variable *const earlier =
1619a4f308f0663208eec07cc320ff4a67589d4b5a7fIan Romanick	    state->symbols->get_variable(decl->identifier);
1620a4f308f0663208eec07cc320ff4a67589d4b5a7fIan Romanick
1621a4f308f0663208eec07cc320ff4a67589d4b5a7fIan Romanick	 if ((earlier != NULL)
1622a4f308f0663208eec07cc320ff4a67589d4b5a7fIan Romanick	     && (earlier->type->array_size() == 0)
1623a4f308f0663208eec07cc320ff4a67589d4b5a7fIan Romanick	     && var->type->is_array()
1624a4f308f0663208eec07cc320ff4a67589d4b5a7fIan Romanick	     && (var->type->element_type() == earlier->type->element_type())) {
1625a4f308f0663208eec07cc320ff4a67589d4b5a7fIan Romanick	    /* FINISHME: This doesn't match the qualifiers on the two
1626a4f308f0663208eec07cc320ff4a67589d4b5a7fIan Romanick	     * FINISHME: declarations.  It's not 100% clear whether this is
1627a4f308f0663208eec07cc320ff4a67589d4b5a7fIan Romanick	     * FINISHME: required or not.
1628a4f308f0663208eec07cc320ff4a67589d4b5a7fIan Romanick	     */
1629b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick
1630894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt	    if (var->type->array_size() <= (int)earlier->max_array_access) {
1631b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick	       YYLTYPE loc = this->get_location();
1632b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick
1633b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick	       _mesa_glsl_error(& loc, state, "array size must be > %u due to "
1634b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick				"previous access",
1635b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick				earlier->max_array_access);
1636b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick	    }
1637b8a21cc6df7e9da15a24ed3dbf60cd4aeb8effaaIan Romanick
1638a4f308f0663208eec07cc320ff4a67589d4b5a7fIan Romanick	    earlier->type = var->type;
1639a4f308f0663208eec07cc320ff4a67589d4b5a7fIan Romanick	    delete var;
1640a4f308f0663208eec07cc320ff4a67589d4b5a7fIan Romanick	    var = NULL;
1641a4f308f0663208eec07cc320ff4a67589d4b5a7fIan Romanick	 } else {
1642a4f308f0663208eec07cc320ff4a67589d4b5a7fIan Romanick	    YYLTYPE loc = this->get_location();
1643a4f308f0663208eec07cc320ff4a67589d4b5a7fIan Romanick
1644a4f308f0663208eec07cc320ff4a67589d4b5a7fIan Romanick	    _mesa_glsl_error(& loc, state, "`%s' redeclared",
1645a4f308f0663208eec07cc320ff4a67589d4b5a7fIan Romanick			     decl->identifier);
1646a4f308f0663208eec07cc320ff4a67589d4b5a7fIan Romanick	 }
1647a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1648a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 continue;
1649a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      }
1650a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1651b97ee2e260efb68849ee13402072b7d7185746d5Eric Anholt      /* From page 15 (page 21 of the PDF) of the GLSL 1.10 spec,
1652b97ee2e260efb68849ee13402072b7d7185746d5Eric Anholt       *
1653b97ee2e260efb68849ee13402072b7d7185746d5Eric Anholt       *   "Identifiers starting with "gl_" are reserved for use by
1654b97ee2e260efb68849ee13402072b7d7185746d5Eric Anholt       *   OpenGL, and may not be declared in a shader as either a
1655b97ee2e260efb68849ee13402072b7d7185746d5Eric Anholt       *   variable or a function."
1656b97ee2e260efb68849ee13402072b7d7185746d5Eric Anholt       */
1657b97ee2e260efb68849ee13402072b7d7185746d5Eric Anholt      if (strncmp(decl->identifier, "gl_", 3) == 0) {
1658b97ee2e260efb68849ee13402072b7d7185746d5Eric Anholt	 /* FINISHME: This should only trigger if we're not redefining
1659b97ee2e260efb68849ee13402072b7d7185746d5Eric Anholt	  * FINISHME: a builtin (to add a qualifier, for example).
1660b97ee2e260efb68849ee13402072b7d7185746d5Eric Anholt	  */
1661b97ee2e260efb68849ee13402072b7d7185746d5Eric Anholt	 _mesa_glsl_error(& loc, state,
1662b97ee2e260efb68849ee13402072b7d7185746d5Eric Anholt			  "identifier `%s' uses reserved `gl_' prefix",
1663b97ee2e260efb68849ee13402072b7d7185746d5Eric Anholt			  decl->identifier);
1664b97ee2e260efb68849ee13402072b7d7185746d5Eric Anholt      }
1665b97ee2e260efb68849ee13402072b7d7185746d5Eric Anholt
16660044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick      instructions->push_tail(var);
1667a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1668e1c1a3f3bd139da47a1184a8c69af6239973a90cIan Romanick      if (state->current_function != NULL) {
1669b168e53452592ce7364a3ce46a6d30c5b746fc3bIan Romanick	 const char *mode = NULL;
1670e0800062daf237a9e4f893bc3db473da8f7472c0Ian Romanick	 const char *extra = "";
1671b168e53452592ce7364a3ce46a6d30c5b746fc3bIan Romanick
1672e0800062daf237a9e4f893bc3db473da8f7472c0Ian Romanick	 /* There is no need to check for 'inout' here because the parser will
1673e0800062daf237a9e4f893bc3db473da8f7472c0Ian Romanick	  * only allow that in function parameter lists.
1674e1c1a3f3bd139da47a1184a8c69af6239973a90cIan Romanick	  */
1675e1c1a3f3bd139da47a1184a8c69af6239973a90cIan Romanick	 if (this->type->qualifier.attribute) {
1676b168e53452592ce7364a3ce46a6d30c5b746fc3bIan Romanick	    mode = "attribute";
1677b168e53452592ce7364a3ce46a6d30c5b746fc3bIan Romanick	 } else if (this->type->qualifier.uniform) {
1678b168e53452592ce7364a3ce46a6d30c5b746fc3bIan Romanick	    mode = "uniform";
1679b168e53452592ce7364a3ce46a6d30c5b746fc3bIan Romanick	 } else if (this->type->qualifier.varying) {
1680b168e53452592ce7364a3ce46a6d30c5b746fc3bIan Romanick	    mode = "varying";
1681e0800062daf237a9e4f893bc3db473da8f7472c0Ian Romanick	 } else if (this->type->qualifier.in) {
1682e0800062daf237a9e4f893bc3db473da8f7472c0Ian Romanick	    mode = "in";
1683e0800062daf237a9e4f893bc3db473da8f7472c0Ian Romanick	    extra = " or in function parameter list";
1684e0800062daf237a9e4f893bc3db473da8f7472c0Ian Romanick	 } else if (this->type->qualifier.out) {
1685e0800062daf237a9e4f893bc3db473da8f7472c0Ian Romanick	    mode = "out";
1686e0800062daf237a9e4f893bc3db473da8f7472c0Ian Romanick	    extra = " or in function parameter list";
1687b168e53452592ce7364a3ce46a6d30c5b746fc3bIan Romanick	 }
1688b168e53452592ce7364a3ce46a6d30c5b746fc3bIan Romanick
1689b168e53452592ce7364a3ce46a6d30c5b746fc3bIan Romanick	 if (mode) {
1690e1c1a3f3bd139da47a1184a8c69af6239973a90cIan Romanick	    _mesa_glsl_error(& loc, state,
1691b168e53452592ce7364a3ce46a6d30c5b746fc3bIan Romanick			     "%s variable `%s' must be declared at "
1692e0800062daf237a9e4f893bc3db473da8f7472c0Ian Romanick			     "global scope%s",
1693e0800062daf237a9e4f893bc3db473da8f7472c0Ian Romanick			     mode, var->name, extra);
1694e1c1a3f3bd139da47a1184a8c69af6239973a90cIan Romanick	 }
1695e1c1a3f3bd139da47a1184a8c69af6239973a90cIan Romanick      } else if (var->mode == ir_var_in) {
1696fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	 if (state->target == vertex_shader) {
1697fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	    bool error_emitted = false;
1698fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick
1699fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	    /* From page 31 (page 37 of the PDF) of the GLSL 1.50 spec:
1700fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     *
1701fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     *    "Vertex shader inputs can only be float, floating-point
1702fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     *    vectors, matrices, signed and unsigned integers and integer
1703fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     *    vectors. Vertex shader inputs can also form arrays of these
1704fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     *    types, but not structures."
1705fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     *
17062d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick	     * From page 31 (page 27 of the PDF) of the GLSL 1.30 spec:
17072d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick	     *
17082d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick	     *    "Vertex shader inputs can only be float, floating-point
17092d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick	     *    vectors, matrices, signed and unsigned integers and integer
17102d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick	     *    vectors. They cannot be arrays or structures."
17112d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick	     *
1712fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     * From page 23 (page 29 of the PDF) of the GLSL 1.20 spec:
1713fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     *
1714fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     *    "The attribute qualifier can be used only with float,
1715fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     *    floating-point vectors, and matrices. Attribute variables
1716fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     *    cannot be declared as arrays or structures."
1717fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	     */
1718fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	    const glsl_type *check_type = var->type->is_array()
1719fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	       ? var->type->fields.array : var->type;
1720fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick
1721fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	    switch (check_type->base_type) {
1722fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	    case GLSL_TYPE_FLOAT:
1723fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	       break;
1724fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	    case GLSL_TYPE_UINT:
1725fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	    case GLSL_TYPE_INT:
1726fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	       if (state->language_version > 120)
1727fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick		  break;
1728fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	       /* FALLTHROUGH */
1729fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	    default:
1730fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	       _mesa_glsl_error(& loc, state,
1731fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick				"vertex shader input / attribute cannot have "
1732fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick				"type %s`%s'",
1733fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick				var->type->is_array() ? "array of " : "",
1734fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick				check_type->name);
1735fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	       error_emitted = true;
1736fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	    }
1737fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick
17382d816204c875ace0fc363d3eeada2255a5009d5cIan Romanick	    if (!error_emitted && (state->language_version <= 130)
1739fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick		&& var->type->is_array()) {
1740fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	       _mesa_glsl_error(& loc, state,
1741fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick				"vertex shader input / attribute cannot have "
1742fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick				"array type");
1743fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	       error_emitted = true;
1744fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	    }
1745fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick	 }
1746fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick      }
1747fb9f5b0675bd714fd6d6325479f62435aaabc2eeIan Romanick
174866faec4895b7bb59a614087a200c05157191b4aeIan Romanick      if (decl->initializer != NULL) {
174943de17282017bdf187d6e646de3262cc64b7f46bIan Romanick	 YYLTYPE initializer_loc = decl->initializer->get_location();
175043de17282017bdf187d6e646de3262cc64b7f46bIan Romanick
175166faec4895b7bb59a614087a200c05157191b4aeIan Romanick	 /* From page 24 (page 30 of the PDF) of the GLSL 1.10 spec:
175266faec4895b7bb59a614087a200c05157191b4aeIan Romanick	  *
175366faec4895b7bb59a614087a200c05157191b4aeIan Romanick	  *    "All uniform variables are read-only and are initialized either
175466faec4895b7bb59a614087a200c05157191b4aeIan Romanick	  *    directly by an application via API commands, or indirectly by
175566faec4895b7bb59a614087a200c05157191b4aeIan Romanick	  *    OpenGL."
175666faec4895b7bb59a614087a200c05157191b4aeIan Romanick	  */
175766faec4895b7bb59a614087a200c05157191b4aeIan Romanick	 if ((state->language_version <= 110)
175866faec4895b7bb59a614087a200c05157191b4aeIan Romanick	     && (var->mode == ir_var_uniform)) {
175943de17282017bdf187d6e646de3262cc64b7f46bIan Romanick	    _mesa_glsl_error(& initializer_loc, state,
176043de17282017bdf187d6e646de3262cc64b7f46bIan Romanick			     "cannot initialize uniforms in GLSL 1.10");
176143de17282017bdf187d6e646de3262cc64b7f46bIan Romanick	 }
176243de17282017bdf187d6e646de3262cc64b7f46bIan Romanick
176343de17282017bdf187d6e646de3262cc64b7f46bIan Romanick	 if (var->type->is_sampler()) {
176443de17282017bdf187d6e646de3262cc64b7f46bIan Romanick	    _mesa_glsl_error(& initializer_loc, state,
176543de17282017bdf187d6e646de3262cc64b7f46bIan Romanick			     "cannot initialize samplers");
176643de17282017bdf187d6e646de3262cc64b7f46bIan Romanick	 }
176719360152f5bd8cff93359dbfe5a50a90b699c118Ian Romanick
176843de17282017bdf187d6e646de3262cc64b7f46bIan Romanick	 if ((var->mode == ir_var_in) && (state->current_function == NULL)) {
176943de17282017bdf187d6e646de3262cc64b7f46bIan Romanick	    _mesa_glsl_error(& initializer_loc, state,
177043de17282017bdf187d6e646de3262cc64b7f46bIan Romanick			     "cannot initialize %s shader input / %s",
1771ae4c4c07959f059e557ea44e98552ced1fec9f47Ian Romanick			     _mesa_glsl_shader_target_name(state->target),
177243de17282017bdf187d6e646de3262cc64b7f46bIan Romanick			     (state->target == vertex_shader)
177343de17282017bdf187d6e646de3262cc64b7f46bIan Romanick			     ? "attribute" : "varying");
177466faec4895b7bb59a614087a200c05157191b4aeIan Romanick	 }
177566faec4895b7bb59a614087a200c05157191b4aeIan Romanick
177670fe8b66632f4afd87ebb12a450b1e639428e88fIan Romanick	 ir_dereference *const lhs = new ir_dereference_variable(var);
1777307c71bf24a3c99409ccf4b8b10f161e4b032cbaEric Anholt	 ir_rvalue *rhs = decl->initializer->hir(instructions, state);
177819360152f5bd8cff93359dbfe5a50a90b699c118Ian Romanick
1779ce030884064046925a655413097dd8257e9392ddIan Romanick	 /* Calculate the constant value if this is a const or uniform
1780307c71bf24a3c99409ccf4b8b10f161e4b032cbaEric Anholt	  * declaration.
178166faec4895b7bb59a614087a200c05157191b4aeIan Romanick	  */
1782ce030884064046925a655413097dd8257e9392ddIan Romanick	 if (this->type->qualifier.constant || this->type->qualifier.uniform) {
1783326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt	    ir_constant *constant_value = rhs->constant_expression_value();
1784326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt	    if (!constant_value) {
1785307c71bf24a3c99409ccf4b8b10f161e4b032cbaEric Anholt	       _mesa_glsl_error(& initializer_loc, state,
1786ce030884064046925a655413097dd8257e9392ddIan Romanick				"initializer of %s variable `%s' must be a "
1787307c71bf24a3c99409ccf4b8b10f161e4b032cbaEric Anholt				"constant expression",
1788ce030884064046925a655413097dd8257e9392ddIan Romanick				(this->type->qualifier.constant)
1789ce030884064046925a655413097dd8257e9392ddIan Romanick				? "const" : "uniform",
1790307c71bf24a3c99409ccf4b8b10f161e4b032cbaEric Anholt				decl->identifier);
1791326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt	    } else {
1792326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt	       rhs = constant_value;
1793326c676236e6a3c90db63e4d0c893aa4f9c21876Eric Anholt	       var->constant_value = constant_value;
1794307c71bf24a3c99409ccf4b8b10f161e4b032cbaEric Anholt	    }
1795307c71bf24a3c99409ccf4b8b10f161e4b032cbaEric Anholt	 }
179666faec4895b7bb59a614087a200c05157191b4aeIan Romanick
1797307c71bf24a3c99409ccf4b8b10f161e4b032cbaEric Anholt	 if (rhs && !rhs->type->is_error()) {
1798ac3af37d27c49704dd3b2d303b4497b08f8b47fdEric Anholt	    bool temp = var->read_only;
1799ac3af37d27c49704dd3b2d303b4497b08f8b47fdEric Anholt	    if (this->type->qualifier.constant)
1800ac3af37d27c49704dd3b2d303b4497b08f8b47fdEric Anholt	       var->read_only = false;
1801ce030884064046925a655413097dd8257e9392ddIan Romanick
1802ce030884064046925a655413097dd8257e9392ddIan Romanick	    /* Never emit code to initialize a uniform.
1803ce030884064046925a655413097dd8257e9392ddIan Romanick	     */
1804ce030884064046925a655413097dd8257e9392ddIan Romanick	    if (!this->type->qualifier.uniform)
1805ce030884064046925a655413097dd8257e9392ddIan Romanick	       result = do_assignment(instructions, state, lhs, rhs,
1806ce030884064046925a655413097dd8257e9392ddIan Romanick				      this->get_location());
1807ac3af37d27c49704dd3b2d303b4497b08f8b47fdEric Anholt	    var->read_only = temp;
180866faec4895b7bb59a614087a200c05157191b4aeIan Romanick	 }
180966faec4895b7bb59a614087a200c05157191b4aeIan Romanick      }
181017d86f4371da413176ba365ca26a58bac172d365Ian Romanick
18110ed61257253fc0df1dde9042cb0e7fe22d58077aEric Anholt      /* From page 23 (page 29 of the PDF) of the GLSL 1.10 spec:
18120ed61257253fc0df1dde9042cb0e7fe22d58077aEric Anholt       *
18130ed61257253fc0df1dde9042cb0e7fe22d58077aEric Anholt       *     "It is an error to write to a const variable outside of
18140ed61257253fc0df1dde9042cb0e7fe22d58077aEric Anholt       *      its declaration, so they must be initialized when
18150ed61257253fc0df1dde9042cb0e7fe22d58077aEric Anholt       *      declared."
18160ed61257253fc0df1dde9042cb0e7fe22d58077aEric Anholt       */
18170ed61257253fc0df1dde9042cb0e7fe22d58077aEric Anholt      if (this->type->qualifier.constant && decl->initializer == NULL) {
18180ed61257253fc0df1dde9042cb0e7fe22d58077aEric Anholt	 _mesa_glsl_error(& loc, state,
18190ed61257253fc0df1dde9042cb0e7fe22d58077aEric Anholt			  "const declaration of `%s' must be initialized");
18200ed61257253fc0df1dde9042cb0e7fe22d58077aEric Anholt      }
18210ed61257253fc0df1dde9042cb0e7fe22d58077aEric Anholt
182217d86f4371da413176ba365ca26a58bac172d365Ian Romanick      /* Add the vairable to the symbol table after processing the initializer.
182317d86f4371da413176ba365ca26a58bac172d365Ian Romanick       * This differs from most C-like languages, but it follows the GLSL
182417d86f4371da413176ba365ca26a58bac172d365Ian Romanick       * specification.  From page 28 (page 34 of the PDF) of the GLSL 1.50
182517d86f4371da413176ba365ca26a58bac172d365Ian Romanick       * spec:
182617d86f4371da413176ba365ca26a58bac172d365Ian Romanick       *
182717d86f4371da413176ba365ca26a58bac172d365Ian Romanick       *     "Within a declaration, the scope of a name starts immediately
182817d86f4371da413176ba365ca26a58bac172d365Ian Romanick       *     after the initializer if present or immediately after the name
182917d86f4371da413176ba365ca26a58bac172d365Ian Romanick       *     being declared if not."
183017d86f4371da413176ba365ca26a58bac172d365Ian Romanick       */
183117d86f4371da413176ba365ca26a58bac172d365Ian Romanick      const bool added_variable =
183217d86f4371da413176ba365ca26a58bac172d365Ian Romanick	 state->symbols->add_variable(decl->identifier, var);
183317d86f4371da413176ba365ca26a58bac172d365Ian Romanick      assert(added_variable);
1834a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
1835a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
18368558459512594216c5aed0bb8d2b0efcbc8b921cEric Anholt
18378558459512594216c5aed0bb8d2b0efcbc8b921cEric Anholt   /* Generally, variable declarations do not have r-values.  However,
18388558459512594216c5aed0bb8d2b0efcbc8b921cEric Anholt    * one is used for the declaration in
18398558459512594216c5aed0bb8d2b0efcbc8b921cEric Anholt    *
18408558459512594216c5aed0bb8d2b0efcbc8b921cEric Anholt    * while (bool b = some_condition()) {
18418558459512594216c5aed0bb8d2b0efcbc8b921cEric Anholt    *   ...
18428558459512594216c5aed0bb8d2b0efcbc8b921cEric Anholt    * }
18438558459512594216c5aed0bb8d2b0efcbc8b921cEric Anholt    *
18448558459512594216c5aed0bb8d2b0efcbc8b921cEric Anholt    * so we return the rvalue from the last seen declaration here.
1845a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
18468558459512594216c5aed0bb8d2b0efcbc8b921cEric Anholt   return result;
1847a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
1848a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1849a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1850fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue *
18510044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanickast_parameter_declarator::hir(exec_list *instructions,
185218238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick			      struct _mesa_glsl_parse_state *state)
1853a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
1854a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const struct glsl_type *type;
1855a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   const char *name = NULL;
18562e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt   YYLTYPE loc = this->get_location();
1857a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1858d612a127ccf12c11204f7f72a332de12f58f85a2Ian Romanick   type = this->type->specifier->glsl_type(& name, state);
1859a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1860a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   if (type == NULL) {
1861a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      if (name != NULL) {
1862a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 _mesa_glsl_error(& loc, state,
1863a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick			  "invalid type `%s' in declaration of `%s'",
186418238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick			  name, this->identifier);
1865a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      } else {
1866a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 _mesa_glsl_error(& loc, state,
1867a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick			  "invalid type in declaration of `%s'",
186818238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick			  this->identifier);
1869a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      }
1870a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
18710471e8b0896e05b3bc81ccad6184e6e35fb61425Ian Romanick      type = glsl_type::error_type;
1872a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
1873a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1874068c80cfe0a280490353b6b007165d717c672eedEric Anholt   /* From page 62 (page 68 of the PDF) of the GLSL 1.50 spec:
1875068c80cfe0a280490353b6b007165d717c672eedEric Anholt    *
1876068c80cfe0a280490353b6b007165d717c672eedEric Anholt    *    "Functions that accept no input arguments need not use void in the
1877068c80cfe0a280490353b6b007165d717c672eedEric Anholt    *    argument list because prototypes (or definitions) are required and
1878068c80cfe0a280490353b6b007165d717c672eedEric Anholt    *    therefore there is no ambiguity when an empty argument list "( )" is
1879068c80cfe0a280490353b6b007165d717c672eedEric Anholt    *    declared. The idiom "(void)" as a parameter list is provided for
1880068c80cfe0a280490353b6b007165d717c672eedEric Anholt    *    convenience."
1881068c80cfe0a280490353b6b007165d717c672eedEric Anholt    *
1882068c80cfe0a280490353b6b007165d717c672eedEric Anholt    * Placing this check here prevents a void parameter being set up
1883068c80cfe0a280490353b6b007165d717c672eedEric Anholt    * for a function, which avoids tripping up checks for main taking
1884068c80cfe0a280490353b6b007165d717c672eedEric Anholt    * parameters and lookups of an unnamed symbol.
1885068c80cfe0a280490353b6b007165d717c672eedEric Anholt    */
1886cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick   if (type->is_void()) {
1887cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick      if (this->identifier != NULL)
1888cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick	 _mesa_glsl_error(& loc, state,
1889cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick			  "named parameter cannot have type `void'");
1890cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick
1891cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick      is_void = true;
1892068c80cfe0a280490353b6b007165d717c672eedEric Anholt      return NULL;
1893cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick   }
1894068c80cfe0a280490353b6b007165d717c672eedEric Anholt
189545d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick   if (formal_parameter && (this->identifier == NULL)) {
189645d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick      _mesa_glsl_error(& loc, state, "formal parameter lacks a name");
189745d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick      return NULL;
189845d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick   }
189945d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick
1900cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick   is_void = false;
190118238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   ir_variable *var = new ir_variable(type, this->identifier);
1902a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1903a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* FINISHME: Handle array declarations.  Note that this requires
1904a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * FINISHME: complete handling of constant expressions.
1905a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1906a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1907cdb8d54b6808b13092cb85e44cf02e4e91c3a669Ian Romanick   /* Apply any specified qualifiers to the parameter declaration.  Note that
1908cdb8d54b6808b13092cb85e44cf02e4e91c3a669Ian Romanick    * for function parameters the default mode is 'in'.
1909cdb8d54b6808b13092cb85e44cf02e4e91c3a669Ian Romanick    */
19102e063f1adf9e529697483eaabc7e015b4b740267Eric Anholt   apply_type_qualifier_to_variable(& this->type->qualifier, var, state, & loc);
1911cdb8d54b6808b13092cb85e44cf02e4e91c3a669Ian Romanick   if (var->mode == ir_var_auto)
1912cdb8d54b6808b13092cb85e44cf02e4e91c3a669Ian Romanick      var->mode = ir_var_in;
1913a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
19140044e7edcea22d2456c051a1c4b744a26960ad27Ian Romanick   instructions->push_tail(var);
1915a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1916a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* Parameter declarations do not have r-values.
1917a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
1918a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   return NULL;
1919a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
1920a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1921a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
192245d8a70c12ee6ea956baaf898324a828496382f6Ian Romanickvoid
1923304ea90233baeac6801a98e981658cb7a2d2501cIan Romanickast_parameter_declarator::parameters_to_hir(exec_list *ast_parameters,
192445d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick					    bool formal,
192545d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick					    exec_list *ir_parameters,
192645d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick					    _mesa_glsl_parse_state *state)
1927a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
1928cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick   ast_parameter_declarator *void_param = NULL;
1929cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick   unsigned count = 0;
1930a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
19312b97dc657a0e762bc67216405419cd348eb948c0Ian Romanick   foreach_list_typed (ast_parameter_declarator, param, link, ast_parameters) {
193245d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick      param->formal_parameter = formal;
1933068c80cfe0a280490353b6b007165d717c672eedEric Anholt      param->hir(ir_parameters, state);
1934cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick
1935cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick      if (param->is_void)
1936cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick	 void_param = param;
1937cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick
1938cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick      count++;
1939cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick   }
1940cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick
1941cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick   if ((void_param != NULL) && (count > 1)) {
1942cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick      YYLTYPE loc = void_param->get_location();
1943cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick
1944cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick      _mesa_glsl_error(& loc, state,
1945cf37c9e8dad4349e45cb91d36957484fd76ce264Ian Romanick		       "`void' parameter must be only parameter");
1946a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
1947a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
1948a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1949a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1950fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue *
195192318a947958892497722772b03c643ebc943294Ian Romanickast_function::hir(exec_list *instructions,
195292318a947958892497722772b03c643ebc943294Ian Romanick		  struct _mesa_glsl_parse_state *state)
1953a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
195418238de6c34a1a32c452f1006ed13d8adc1bc9d7Ian Romanick   ir_function *f = NULL;
195592318a947958892497722772b03c643ebc943294Ian Romanick   ir_function_signature *sig = NULL;
195692318a947958892497722772b03c643ebc943294Ian Romanick   exec_list hir_parameters;
1957a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1958a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1959a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* Convert the list of function parameters to HIR now so that they can be
1960a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * used below to compare this function's signature with previously seen
1961a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * signatures for functions with the same name.
1962a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
196345d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick   ast_parameter_declarator::parameters_to_hir(& this->parameters,
196445d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick					       is_definition,
196545d8a70c12ee6ea956baaf898324a828496382f6Ian Romanick					       & hir_parameters, state);
1966a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
1967e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick   const char *return_type_name;
1968e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick   const glsl_type *return_type =
196992318a947958892497722772b03c643ebc943294Ian Romanick      this->return_type->specifier->glsl_type(& return_type_name, state);
1970e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick
1971e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick   assert(return_type != NULL);
1972e39cc69fa3cb830b803fe0c4f6c30915aa886b5bIan Romanick
1973a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* Verify that this function's signature either doesn't match a previously
1974a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * seen signature for a function with the same name, or, if a match is found,
1975a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    * that the previously seen signature does not have an associated definition.
1976a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
197792318a947958892497722772b03c643ebc943294Ian Romanick   const char *const name = identifier;
19783359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick   f = state->symbols->get_function(name);
1979a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   if (f != NULL) {
19800d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke      ir_function_signature *sig = f->exact_matching_signature(&hir_parameters);
19810d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke      if (sig != NULL) {
19820d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke	 const char *badvar = sig->qualifiers_match(&hir_parameters);
19830d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke	 if (badvar != NULL) {
19840d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke	    YYLTYPE loc = this->get_location();
1985abd40b15210c17b2a3ba8fcffc868fda203efa01Kenneth Graunke
19860d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke	    _mesa_glsl_error(&loc, state, "function `%s' parameter `%s' "
19870d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke			     "qualifiers don't match prototype", name, badvar);
19880d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke	 }
19891e7ec3ce128a9d30d7d9e1707a22b270eb525075Eric Anholt
19900d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke	 if (sig->return_type != return_type) {
19910d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke	    YYLTYPE loc = this->get_location();
199260be7626b829af7e1d07330b9a88468924ba350eEric Anholt
19930d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke	    _mesa_glsl_error(&loc, state, "function `%s' return type doesn't "
19940d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke			     "match prototype", name);
19950d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke	 }
1996a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
19970d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke	 if (is_definition && sig->is_defined) {
19980d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke	    YYLTYPE loc = this->get_location();
1999a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
20000d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke	    _mesa_glsl_error(& loc, state, "function `%s' redefined", name);
20010d605cb97c9cd2f9a170e3aa15bdf4021a75fc14Kenneth Graunke	    sig = NULL;
2002a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 }
2003a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      }
20043359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick   } else if (state->symbols->name_declared_this_scope(name)) {
20053359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick      /* This function name shadows a non-function use of the same name.
20063359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick       */
20073359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick      YYLTYPE loc = this->get_location();
20083359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick
20093359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick      _mesa_glsl_error(& loc, state, "function name `%s' conflicts with "
20103359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick		       "non-function", name);
201192318a947958892497722772b03c643ebc943294Ian Romanick      sig = NULL;
2012a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   } else {
2013882dad75408fc4071a9dd700309f9e54f6ad2650Ian Romanick      f = new ir_function(name);
20148bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick      state->symbols->add_function(f->name, f);
20159fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke
20169fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke      /* Emit the new function header */
20179fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke      instructions->push_tail(f);
2018a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
2019a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2020ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt   /* Verify the return type of main() */
2021ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt   if (strcmp(name, "main") == 0) {
202225711a85c22bed305c9b52b89feb9c600d1892dfIan Romanick      if (! return_type->is_void()) {
2023ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt	 YYLTYPE loc = this->get_location();
2024ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt
2025ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt	 _mesa_glsl_error(& loc, state, "main() must return void");
2026ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt      }
2027174cc03edcd6861ba416cc1afb19d4d43933ac84Eric Anholt
202892318a947958892497722772b03c643ebc943294Ian Romanick      if (!hir_parameters.is_empty()) {
2029174cc03edcd6861ba416cc1afb19d4d43933ac84Eric Anholt	 YYLTYPE loc = this->get_location();
2030174cc03edcd6861ba416cc1afb19d4d43933ac84Eric Anholt
2031174cc03edcd6861ba416cc1afb19d4d43933ac84Eric Anholt	 _mesa_glsl_error(& loc, state, "main() must not take any parameters");
2032174cc03edcd6861ba416cc1afb19d4d43933ac84Eric Anholt      }
2033ab372dab2a013e5d0c8ee57bb799a76c9a78abf2Eric Anholt   }
2034a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2035a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* Finish storing the information about this new function in its signature.
2036a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
203792318a947958892497722772b03c643ebc943294Ian Romanick   if (sig == NULL) {
203892318a947958892497722772b03c643ebc943294Ian Romanick      sig = new ir_function_signature(return_type);
203992318a947958892497722772b03c643ebc943294Ian Romanick      f->add_signature(sig);
2040a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
2041a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2042bff6013d469b3d4e54cdc5731801c56994a523ecKenneth Graunke   sig->replace_parameters(&hir_parameters);
204392318a947958892497722772b03c643ebc943294Ian Romanick   signature = sig;
204492318a947958892497722772b03c643ebc943294Ian Romanick
204592318a947958892497722772b03c643ebc943294Ian Romanick   /* Function declarations (prototypes) do not have r-values.
204692318a947958892497722772b03c643ebc943294Ian Romanick    */
204792318a947958892497722772b03c643ebc943294Ian Romanick   return NULL;
204892318a947958892497722772b03c643ebc943294Ian Romanick}
204992318a947958892497722772b03c643ebc943294Ian Romanick
205092318a947958892497722772b03c643ebc943294Ian Romanick
205192318a947958892497722772b03c643ebc943294Ian Romanickir_rvalue *
205292318a947958892497722772b03c643ebc943294Ian Romanickast_function_definition::hir(exec_list *instructions,
205392318a947958892497722772b03c643ebc943294Ian Romanick			     struct _mesa_glsl_parse_state *state)
205492318a947958892497722772b03c643ebc943294Ian Romanick{
205592318a947958892497722772b03c643ebc943294Ian Romanick   prototype->is_definition = true;
205692318a947958892497722772b03c643ebc943294Ian Romanick   prototype->hir(instructions, state);
2057e29a5859891eb9e1587396dea0e8010f7d88f68cIan Romanick
205892318a947958892497722772b03c643ebc943294Ian Romanick   ir_function_signature *signature = prototype->signature;
2059a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
206041ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick   assert(state->current_function == NULL);
206141ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick   state->current_function = signature;
206241ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick
2063e29a5859891eb9e1587396dea0e8010f7d88f68cIan Romanick   /* Duplicate parameters declared in the prototype as concrete variables.
2064e29a5859891eb9e1587396dea0e8010f7d88f68cIan Romanick    * Add these to the symbol table.
2065a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
20668bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick   state->symbols->push_scope();
2067e29a5859891eb9e1587396dea0e8010f7d88f68cIan Romanick   foreach_iter(exec_list_iterator, iter, signature->parameters) {
2068fbc7c0b8f2e161bce1c048c63d2d5cfcdeb096f1Eric Anholt      ir_variable *const var = ((ir_instruction *) iter.get())->as_variable();
2069e29a5859891eb9e1587396dea0e8010f7d88f68cIan Romanick
2070fbc7c0b8f2e161bce1c048c63d2d5cfcdeb096f1Eric Anholt      assert(var != NULL);
2071a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
20723359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick      /* The only way a parameter would "exist" is if two parameters have
20733359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick       * the same name.
20743359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick       */
20753359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick      if (state->symbols->name_declared_this_scope(var->name)) {
20763359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick	 YYLTYPE loc = this->get_location();
20773359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick
20783359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick	 _mesa_glsl_error(& loc, state, "parameter `%s' redeclared", var->name);
20793359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick      } else {
20803359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick	 state->symbols->add_variable(var->name, var);
20813359e58eac19dd7771a78310c8a0e3d3ded55063Ian Romanick      }
2082a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
2083a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
20849fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke   /* Convert the body of the function to HIR. */
2085894ea972a4defdaafeaa3a248c113b06c7ae0c7eEric Anholt   this->body->hir(&signature->body, state);
20869fa99f3b6c84fe927ba97e6584cd919f097a6c9aKenneth Graunke   signature->is_defined = true;
2087a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
20888bde4cec6b189564b1f2d58514bd7e7a4b40f714Ian Romanick   state->symbols->pop_scope();
2089a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
209041ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick   assert(state->current_function == signature);
209141ec6a47ab81620bab9182f987e4bc4780e3a6abIan Romanick   state->current_function = NULL;
2092a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
2093a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* Function definitions do not have r-values.
2094a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick    */
2095a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   return NULL;
2096a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
209716a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick
209816a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick
2099fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunkeir_rvalue *
210016a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanickast_jump_statement::hir(exec_list *instructions,
210116a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick			struct _mesa_glsl_parse_state *state)
210216a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick{
210316a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick
2104c0e76d8352fbe96efb0338e9d98b08494671e504Ian Romanick   switch (mode) {
2105c0e76d8352fbe96efb0338e9d98b08494671e504Ian Romanick   case ast_return: {
210616a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick      ir_return *inst;
2107aad7c7793788f34e98fb7264dc2219fc73002877Eric Anholt      assert(state->current_function);
210816a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick
210916a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick      if (opt_return_value) {
2110ab79d4ec6e7c5639084f71f93857f39239e8b848Eric Anholt	 if (state->current_function->return_type->base_type ==
2111ab79d4ec6e7c5639084f71f93857f39239e8b848Eric Anholt	     GLSL_TYPE_VOID) {
2112ab79d4ec6e7c5639084f71f93857f39239e8b848Eric Anholt	    YYLTYPE loc = this->get_location();
2113ab79d4ec6e7c5639084f71f93857f39239e8b848Eric Anholt
2114ab79d4ec6e7c5639084f71f93857f39239e8b848Eric Anholt	    _mesa_glsl_error(& loc, state,
2115ab79d4ec6e7c5639084f71f93857f39239e8b848Eric Anholt			     "`return` with a value, in function `%s' "
2116ab79d4ec6e7c5639084f71f93857f39239e8b848Eric Anholt			     "returning void",
2117f96c52ba2e290e3ba5f14cd7f87ba5b4382a1785Kenneth Graunke			     state->current_function->function_name());
2118ab79d4ec6e7c5639084f71f93857f39239e8b848Eric Anholt	 }
211916a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick
212016a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick	 ir_expression *const ret = (ir_expression *)
212116a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick	    opt_return_value->hir(instructions, state);
212216a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick	 assert(ret != NULL);
212316a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick
212416a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick	 /* FINISHME: Make sure the type of the return value matches the return
212516a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick	  * FINISHME: type of the enclosing function.
212616a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick	  */
212716a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick
212816a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick	 inst = new ir_return(ret);
212916a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick      } else {
2130aad7c7793788f34e98fb7264dc2219fc73002877Eric Anholt	 if (state->current_function->return_type->base_type !=
2131aad7c7793788f34e98fb7264dc2219fc73002877Eric Anholt	     GLSL_TYPE_VOID) {
2132aad7c7793788f34e98fb7264dc2219fc73002877Eric Anholt	    YYLTYPE loc = this->get_location();
2133aad7c7793788f34e98fb7264dc2219fc73002877Eric Anholt
2134aad7c7793788f34e98fb7264dc2219fc73002877Eric Anholt	    _mesa_glsl_error(& loc, state,
2135aad7c7793788f34e98fb7264dc2219fc73002877Eric Anholt			     "`return' with no value, in function %s returning "
2136aad7c7793788f34e98fb7264dc2219fc73002877Eric Anholt			     "non-void",
2137f96c52ba2e290e3ba5f14cd7f87ba5b4382a1785Kenneth Graunke			     state->current_function->function_name());
2138aad7c7793788f34e98fb7264dc2219fc73002877Eric Anholt	 }
213916a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick	 inst = new ir_return;
214016a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick      }
214116a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick
214216a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick      instructions->push_tail(inst);
2143c0e76d8352fbe96efb0338e9d98b08494671e504Ian Romanick      break;
214416a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick   }
214516a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick
2146c0e76d8352fbe96efb0338e9d98b08494671e504Ian Romanick   case ast_discard:
2147b98020770730bd4a7e9bd5c2e4ab2ae8c1eb0376Eric Anholt      /* FINISHME: discard support */
2148b98020770730bd4a7e9bd5c2e4ab2ae8c1eb0376Eric Anholt      if (state->target != fragment_shader) {
2149b98020770730bd4a7e9bd5c2e4ab2ae8c1eb0376Eric Anholt	 YYLTYPE loc = this->get_location();
2150b98020770730bd4a7e9bd5c2e4ab2ae8c1eb0376Eric Anholt
2151b98020770730bd4a7e9bd5c2e4ab2ae8c1eb0376Eric Anholt	 _mesa_glsl_error(& loc, state,
2152b98020770730bd4a7e9bd5c2e4ab2ae8c1eb0376Eric Anholt			  "`discard' may only appear in a fragment shader");
2153b98020770730bd4a7e9bd5c2e4ab2ae8c1eb0376Eric Anholt      }
2154c0e76d8352fbe96efb0338e9d98b08494671e504Ian Romanick      break;
2155c0e76d8352fbe96efb0338e9d98b08494671e504Ian Romanick
2156c0e76d8352fbe96efb0338e9d98b08494671e504Ian Romanick   case ast_break:
2157c0e76d8352fbe96efb0338e9d98b08494671e504Ian Romanick   case ast_continue:
21584cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick      /* FINISHME: Handle switch-statements.  They cannot contain 'continue',
21594cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick       * FINISHME: and they use a different IR instruction for 'break'.
21604cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick       */
21614cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick      /* FINISHME: Correctly handle the nesting.  If a switch-statement is
21624cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick       * FINISHME: inside a loop, a 'continue' is valid and will bind to the
21634cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick       * FINISHME: loop.
21644cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick       */
21654cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick      if (state->loop_or_switch_nesting == NULL) {
21664cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick	 YYLTYPE loc = this->get_location();
21674cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick
21684cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick	 _mesa_glsl_error(& loc, state,
21694cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick			  "`%s' may only appear in a loop",
21704cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick			  (mode == ast_break) ? "break" : "continue");
21714cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick      } else {
21724cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick	 ir_loop *const loop = state->loop_or_switch_nesting->as_loop();
21734cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick
21744cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick	 if (loop != NULL) {
21754cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick	    ir_loop_jump *const jump =
21764b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt	       new ir_loop_jump((mode == ast_break)
21774cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick				? ir_loop_jump::jump_break
21784cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick				: ir_loop_jump::jump_continue);
21794cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick	    instructions->push_tail(jump);
21804cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick	 }
21814cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick      }
21824cf20cd37c12c6243a09d52739d3d47f030a1799Ian Romanick
2183c0e76d8352fbe96efb0338e9d98b08494671e504Ian Romanick      break;
2184b98020770730bd4a7e9bd5c2e4ab2ae8c1eb0376Eric Anholt   }
2185b98020770730bd4a7e9bd5c2e4ab2ae8c1eb0376Eric Anholt
218616a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick   /* Jump instructions do not have r-values.
218716a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick    */
218816a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick   return NULL;
218916a246c049fa3c8d7841f87c8defdd0f26f302eeIan Romanick}
21903c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
21913c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
21923c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickir_rvalue *
21933c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanickast_selection_statement::hir(exec_list *instructions,
21943c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick			     struct _mesa_glsl_parse_state *state)
21953c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick{
21963c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   ir_rvalue *const condition = this->condition->hir(instructions, state);
21973c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
21983c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   /* From page 66 (page 72 of the PDF) of the GLSL 1.50 spec:
21993c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick    *
22003c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick    *    "Any expression whose type evaluates to a Boolean can be used as the
22013c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick    *    conditional expression bool-expression. Vector types are not accepted
22023c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick    *    as the expression to if."
22033c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick    *
22043c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick    * The checks are separated so that higher quality diagnostics can be
22053c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick    * generated for cases where both rules are violated.
22063c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick    */
22073c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   if (!condition->type->is_boolean() || !condition->type->is_scalar()) {
22083c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      YYLTYPE loc = this->condition->get_location();
22093c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
22103c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick      _mesa_glsl_error(& loc, state, "if-statement condition must be scalar "
22113c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick		       "boolean");
22123c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   }
22133c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
22143c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   ir_if *const stmt = new ir_if(condition);
22153c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
22164f9d72fa9e2a4ff1a2aca6de8ee4fa93639c75f1Ian Romanick   if (then_statement != NULL)
22174f9d72fa9e2a4ff1a2aca6de8ee4fa93639c75f1Ian Romanick      then_statement->hir(& stmt->then_instructions, state);
22183c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
22194f9d72fa9e2a4ff1a2aca6de8ee4fa93639c75f1Ian Romanick   if (else_statement != NULL)
22204f9d72fa9e2a4ff1a2aca6de8ee4fa93639c75f1Ian Romanick      else_statement->hir(& stmt->else_instructions, state);
22213c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
22223c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   instructions->push_tail(stmt);
22233c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick
22243c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   /* if-statements do not have r-values.
22253c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick    */
22263c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   return NULL;
22273c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick}
22289e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick
22299e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick
22308c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanickvoid
22318c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanickast_iteration_statement::condition_to_hir(ir_loop *stmt,
22328c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick					  struct _mesa_glsl_parse_state *state)
22339e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick{
22349e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick   if (condition != NULL) {
22359e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick      ir_rvalue *const cond =
22369e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick	 condition->hir(& stmt->body_instructions, state);
22379e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick
22389e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick      if ((cond == NULL)
22399e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick	  || !cond->type->is_boolean() || !cond->type->is_scalar()) {
22409e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick	 YYLTYPE loc = condition->get_location();
22419e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick
22429e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick	 _mesa_glsl_error(& loc, state,
22439e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick			  "loop condition must be scalar boolean");
22449e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick      } else {
22459e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick	 /* As the first code in the loop body, generate a block that looks
22469e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick	  * like 'if (!condition) break;' as the loop termination condition.
22479e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick	  */
22489e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick	 ir_rvalue *const not_cond =
22499e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick	    new ir_expression(ir_unop_logic_not, glsl_type::bool_type, cond,
22509e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick			      NULL);
22519e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick
22529e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick	 ir_if *const if_stmt = new ir_if(not_cond);
22539e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick
22549e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick	 ir_jump *const break_stmt =
22554b6fd39c89f308a379882426c1ed3616d60c4628Eric Anholt	    new ir_loop_jump(ir_loop_jump::jump_break);
22569e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick
22579e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick	 if_stmt->then_instructions.push_tail(break_stmt);
22589e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick	 stmt->body_instructions.push_tail(if_stmt);
22599e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick      }
22609e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick   }
22618c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick}
22628c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick
22638c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick
22648c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanickir_rvalue *
22658c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanickast_iteration_statement::hir(exec_list *instructions,
22668c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick			     struct _mesa_glsl_parse_state *state)
22678c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick{
2268484606610e36ec7598f7733e9787d888b6a63d64Ian Romanick   /* For-loops and while-loops start a new scope, but do-while loops do not.
22698c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick    */
2270484606610e36ec7598f7733e9787d888b6a63d64Ian Romanick   if (mode != ast_do_while)
22718c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick      state->symbols->push_scope();
22728c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick
22738c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick   if (init_statement != NULL)
22748c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick      init_statement->hir(instructions, state);
22758c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick
22768c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick   ir_loop *const stmt = new ir_loop();
22778c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick   instructions->push_tail(stmt);
22788c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick
22798c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick   /* Track the current loop and / or switch-statement nesting.
22808c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick    */
22818c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick   ir_instruction *const nesting = state->loop_or_switch_nesting;
22828c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick   state->loop_or_switch_nesting = stmt;
22838c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick
22848c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick   if (mode != ast_do_while)
22858c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick      condition_to_hir(stmt, state);
22869e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick
22874f9d72fa9e2a4ff1a2aca6de8ee4fa93639c75f1Ian Romanick   if (body != NULL)
22884f9d72fa9e2a4ff1a2aca6de8ee4fa93639c75f1Ian Romanick      body->hir(& stmt->body_instructions, state);
22899e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick
22909e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick   if (rest_expression != NULL)
22919e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick      rest_expression->hir(& stmt->body_instructions, state);
22929e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick
22938c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick   if (mode == ast_do_while)
22948c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick      condition_to_hir(stmt, state);
22958c46ed24906ee10dd2f2cfaf4cf9803eca1ba523Ian Romanick
2296484606610e36ec7598f7733e9787d888b6a63d64Ian Romanick   if (mode != ast_do_while)
22979e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick      state->symbols->pop_scope();
22989e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick
2299e9d0f265aabb39928d4d8a527684bf3b9eebc21cIan Romanick   /* Restore previous nesting before returning.
2300e9d0f265aabb39928d4d8a527684bf3b9eebc21cIan Romanick    */
2301e9d0f265aabb39928d4d8a527684bf3b9eebc21cIan Romanick   state->loop_or_switch_nesting = nesting;
2302e9d0f265aabb39928d4d8a527684bf3b9eebc21cIan Romanick
23039e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick   /* Loops do not have r-values.
23049e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick    */
23059e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick   return NULL;
23069e7d010ee0ed89f1fe07a06a9d9bb22e15106ae2Ian Romanick}
23073455ce614424a5a23a23037e23d0454e476bceeaIan Romanick
23083455ce614424a5a23a23037e23d0454e476bceeaIan Romanick
23093455ce614424a5a23a23037e23d0454e476bceeaIan Romanickir_rvalue *
23103455ce614424a5a23a23037e23d0454e476bceeaIan Romanickast_type_specifier::hir(exec_list *instructions,
23113455ce614424a5a23a23037e23d0454e476bceeaIan Romanick			  struct _mesa_glsl_parse_state *state)
23123455ce614424a5a23a23037e23d0454e476bceeaIan Romanick{
23133455ce614424a5a23a23037e23d0454e476bceeaIan Romanick   if (this->structure != NULL)
23143455ce614424a5a23a23037e23d0454e476bceeaIan Romanick      return this->structure->hir(instructions, state);
231585ba37b97df8edd18b757bc475b12b66f4b117edIan Romanick
231685ba37b97df8edd18b757bc475b12b66f4b117edIan Romanick   return NULL;
23173455ce614424a5a23a23037e23d0454e476bceeaIan Romanick}
23183455ce614424a5a23a23037e23d0454e476bceeaIan Romanick
23193455ce614424a5a23a23037e23d0454e476bceeaIan Romanick
23203455ce614424a5a23a23037e23d0454e476bceeaIan Romanickir_rvalue *
23213455ce614424a5a23a23037e23d0454e476bceeaIan Romanickast_struct_specifier::hir(exec_list *instructions,
23223455ce614424a5a23a23037e23d0454e476bceeaIan Romanick			  struct _mesa_glsl_parse_state *state)
23233455ce614424a5a23a23037e23d0454e476bceeaIan Romanick{
23243455ce614424a5a23a23037e23d0454e476bceeaIan Romanick   unsigned decl_count = 0;
23253455ce614424a5a23a23037e23d0454e476bceeaIan Romanick
23263455ce614424a5a23a23037e23d0454e476bceeaIan Romanick   /* Make an initial pass over the list of structure fields to determine how
23273455ce614424a5a23a23037e23d0454e476bceeaIan Romanick    * many there are.  Each element in this list is an ast_declarator_list.
23283455ce614424a5a23a23037e23d0454e476bceeaIan Romanick    * This means that we actually need to count the number of elements in the
23293455ce614424a5a23a23037e23d0454e476bceeaIan Romanick    * 'declarations' list in each of the elements.
23303455ce614424a5a23a23037e23d0454e476bceeaIan Romanick    */
23312b97dc657a0e762bc67216405419cd348eb948c0Ian Romanick   foreach_list_typed (ast_declarator_list, decl_list, link,
23322b97dc657a0e762bc67216405419cd348eb948c0Ian Romanick		       &this->declarations) {
2333304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick      foreach_list_const (decl_ptr, & decl_list->declarations) {
23343455ce614424a5a23a23037e23d0454e476bceeaIan Romanick	 decl_count++;
23353455ce614424a5a23a23037e23d0454e476bceeaIan Romanick      }
23363455ce614424a5a23a23037e23d0454e476bceeaIan Romanick   }
23373455ce614424a5a23a23037e23d0454e476bceeaIan Romanick
23383455ce614424a5a23a23037e23d0454e476bceeaIan Romanick
23393455ce614424a5a23a23037e23d0454e476bceeaIan Romanick   /* Allocate storage for the structure fields and process the field
23403455ce614424a5a23a23037e23d0454e476bceeaIan Romanick    * declarations.  As the declarations are processed, try to also convert
23413455ce614424a5a23a23037e23d0454e476bceeaIan Romanick    * the types to HIR.  This ensures that structure definitions embedded in
23423455ce614424a5a23a23037e23d0454e476bceeaIan Romanick    * other structure definitions are processed.
23433455ce614424a5a23a23037e23d0454e476bceeaIan Romanick    */
23443455ce614424a5a23a23037e23d0454e476bceeaIan Romanick   glsl_struct_field *const fields = (glsl_struct_field *)
23453455ce614424a5a23a23037e23d0454e476bceeaIan Romanick      malloc(sizeof(*fields) * decl_count);
23463455ce614424a5a23a23037e23d0454e476bceeaIan Romanick
23473455ce614424a5a23a23037e23d0454e476bceeaIan Romanick   unsigned i = 0;
23482b97dc657a0e762bc67216405419cd348eb948c0Ian Romanick   foreach_list_typed (ast_declarator_list, decl_list, link,
23492b97dc657a0e762bc67216405419cd348eb948c0Ian Romanick		       &this->declarations) {
23503455ce614424a5a23a23037e23d0454e476bceeaIan Romanick      const char *type_name;
23513455ce614424a5a23a23037e23d0454e476bceeaIan Romanick
23523455ce614424a5a23a23037e23d0454e476bceeaIan Romanick      decl_list->type->specifier->hir(instructions, state);
23533455ce614424a5a23a23037e23d0454e476bceeaIan Romanick
23543455ce614424a5a23a23037e23d0454e476bceeaIan Romanick      const glsl_type *decl_type =
23553455ce614424a5a23a23037e23d0454e476bceeaIan Romanick	 decl_list->type->specifier->glsl_type(& type_name, state);
23563455ce614424a5a23a23037e23d0454e476bceeaIan Romanick
23572b97dc657a0e762bc67216405419cd348eb948c0Ian Romanick      foreach_list_typed (ast_declaration, decl, link,
23582b97dc657a0e762bc67216405419cd348eb948c0Ian Romanick			  &decl_list->declarations) {
23593455ce614424a5a23a23037e23d0454e476bceeaIan Romanick	 const struct glsl_type *const field_type =
23603455ce614424a5a23a23037e23d0454e476bceeaIan Romanick	    (decl->is_array)
23613455ce614424a5a23a23037e23d0454e476bceeaIan Romanick	    ? process_array_type(decl_type, decl->array_size, state)
23623455ce614424a5a23a23037e23d0454e476bceeaIan Romanick	    : decl_type;
23633455ce614424a5a23a23037e23d0454e476bceeaIan Romanick
236473986a7a262807ab2cfd6d46ae17cfc7a30cdfecIan Romanick	 fields[i].type = (field_type != NULL)
236573986a7a262807ab2cfd6d46ae17cfc7a30cdfecIan Romanick	    ? field_type : glsl_type::error_type;
23663455ce614424a5a23a23037e23d0454e476bceeaIan Romanick	 fields[i].name = decl->identifier;
23673455ce614424a5a23a23037e23d0454e476bceeaIan Romanick	 i++;
23683455ce614424a5a23a23037e23d0454e476bceeaIan Romanick      }
23693455ce614424a5a23a23037e23d0454e476bceeaIan Romanick   }
23703455ce614424a5a23a23037e23d0454e476bceeaIan Romanick
23713455ce614424a5a23a23037e23d0454e476bceeaIan Romanick   assert(i == decl_count);
23723455ce614424a5a23a23037e23d0454e476bceeaIan Romanick
23731d28b617ba66cfcb1641c9f516146d51aa82b118Ian Romanick   const char *name;
23741d28b617ba66cfcb1641c9f516146d51aa82b118Ian Romanick   if (this->name == NULL) {
23751d28b617ba66cfcb1641c9f516146d51aa82b118Ian Romanick      static unsigned anon_count = 1;
23761d28b617ba66cfcb1641c9f516146d51aa82b118Ian Romanick      char buf[32];
23773455ce614424a5a23a23037e23d0454e476bceeaIan Romanick
23781d28b617ba66cfcb1641c9f516146d51aa82b118Ian Romanick      snprintf(buf, sizeof(buf), "#anon_struct_%04x", anon_count);
23791d28b617ba66cfcb1641c9f516146d51aa82b118Ian Romanick      anon_count++;
23801d28b617ba66cfcb1641c9f516146d51aa82b118Ian Romanick
23811d28b617ba66cfcb1641c9f516146d51aa82b118Ian Romanick      name = strdup(buf);
23821d28b617ba66cfcb1641c9f516146d51aa82b118Ian Romanick   } else {
23831d28b617ba66cfcb1641c9f516146d51aa82b118Ian Romanick      name = this->name;
23841d28b617ba66cfcb1641c9f516146d51aa82b118Ian Romanick   }
23851d28b617ba66cfcb1641c9f516146d51aa82b118Ian Romanick
23861d28b617ba66cfcb1641c9f516146d51aa82b118Ian Romanick   glsl_type *t = new glsl_type(fields, decl_count, name);
23871d28b617ba66cfcb1641c9f516146d51aa82b118Ian Romanick
2388ab89927a91a0ea6ffdb56e5e75044472f7277f4aIan Romanick   YYLTYPE loc = this->get_location();
2389ab89927a91a0ea6ffdb56e5e75044472f7277f4aIan Romanick   if (!state->symbols->add_type(name, t)) {
2390ab89927a91a0ea6ffdb56e5e75044472f7277f4aIan Romanick      _mesa_glsl_error(& loc, state, "struct `%s' previously defined", name);
2391ab89927a91a0ea6ffdb56e5e75044472f7277f4aIan Romanick   } else {
2392ab89927a91a0ea6ffdb56e5e75044472f7277f4aIan Romanick      /* This logic is a bit tricky.  It is an error to declare a structure at
2393ab89927a91a0ea6ffdb56e5e75044472f7277f4aIan Romanick       * global scope if there is also a function with the same name.
2394ab89927a91a0ea6ffdb56e5e75044472f7277f4aIan Romanick       */
2395ab89927a91a0ea6ffdb56e5e75044472f7277f4aIan Romanick      if ((state->current_function == NULL)
2396ab89927a91a0ea6ffdb56e5e75044472f7277f4aIan Romanick	  && (state->symbols->get_function(name) != NULL)) {
2397ab89927a91a0ea6ffdb56e5e75044472f7277f4aIan Romanick	 _mesa_glsl_error(& loc, state, "name `%s' previously defined", name);
2398ab89927a91a0ea6ffdb56e5e75044472f7277f4aIan Romanick      } else {
2399ab89927a91a0ea6ffdb56e5e75044472f7277f4aIan Romanick	 t->generate_constructor(state->symbols);
2400ab89927a91a0ea6ffdb56e5e75044472f7277f4aIan Romanick      }
2401a2c6df556655e3619f5a0cd82b0d11aac37c5692Ian Romanick
2402a2c6df556655e3619f5a0cd82b0d11aac37c5692Ian Romanick      const glsl_type **s = (const glsl_type **)
2403a2c6df556655e3619f5a0cd82b0d11aac37c5692Ian Romanick	 realloc(state->user_structures,
2404a2c6df556655e3619f5a0cd82b0d11aac37c5692Ian Romanick		 sizeof(state->user_structures[0]) *
2405a2c6df556655e3619f5a0cd82b0d11aac37c5692Ian Romanick		 (state->num_user_structures + 1));
2406a2c6df556655e3619f5a0cd82b0d11aac37c5692Ian Romanick      if (s != NULL) {
2407a2c6df556655e3619f5a0cd82b0d11aac37c5692Ian Romanick	 s[state->num_user_structures] = t;
2408a2c6df556655e3619f5a0cd82b0d11aac37c5692Ian Romanick	 state->user_structures = s;
2409a2c6df556655e3619f5a0cd82b0d11aac37c5692Ian Romanick	 state->num_user_structures++;
2410a2c6df556655e3619f5a0cd82b0d11aac37c5692Ian Romanick      }
2411ab89927a91a0ea6ffdb56e5e75044472f7277f4aIan Romanick   }
24123455ce614424a5a23a23037e23d0454e476bceeaIan Romanick
24133455ce614424a5a23a23037e23d0454e476bceeaIan Romanick   /* Structure type definitions do not have r-values.
24143455ce614424a5a23a23037e23d0454e476bceeaIan Romanick    */
24153455ce614424a5a23a23037e23d0454e476bceeaIan Romanick   return NULL;
24163455ce614424a5a23a23037e23d0454e476bceeaIan Romanick}
2417