diff options
Diffstat (limited to 'ast_to_hir.cpp')
-rw-r--r-- | ast_to_hir.cpp | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/ast_to_hir.cpp b/ast_to_hir.cpp index ec1562f8cb..277e67ba38 100644 --- a/ast_to_hir.cpp +++ b/ast_to_hir.cpp @@ -867,7 +867,8 @@ type_specifier_to_glsl_type(const struct ast_type_specifier *spec, static void apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual, struct ir_variable *var, - struct _mesa_glsl_parse_state *state) + struct _mesa_glsl_parse_state *state, + YYLTYPE *loc) { if (qual->invariant) var->invariant = 1; @@ -880,6 +881,13 @@ apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual, if (qual->centroid) var->centroid = 1; + if (qual->attribute && state->target == fragment_shader) { + var->type = glsl_type::error_type; + _mesa_glsl_error(loc, state, + "`attribute' variables may not be declared in the " + "fragment shader"); + } + if (qual->in && qual->out) var->mode = ir_var_inout; else if (qual->attribute || qual->in @@ -922,16 +930,13 @@ ast_declarator_list::hir(exec_list *instructions, struct ast_declaration *const decl = (struct ast_declaration * )ptr; const struct glsl_type *var_type; struct ir_variable *var; - + YYLTYPE loc = this->get_location(); /* FINISHME: Emit a warning if a variable declaration shadows a * FINISHME: declaration at a higher scope. */ if ((decl_type == NULL) || decl_type->is_void()) { - YYLTYPE loc; - - loc = this->get_location(); if (type_name != NULL) { _mesa_glsl_error(& loc, state, "invalid type `%s' in declaration of `%s'", @@ -962,7 +967,8 @@ ast_declarator_list::hir(exec_list *instructions, * FINISHME: in a parameter list (in and out only). */ - apply_type_qualifier_to_variable(& this->type->qualifier, var, state); + apply_type_qualifier_to_variable(& this->type->qualifier, var, state, + & loc); /* Attempt to add the variable to the symbol table. If this fails, it * means the variable has already been declared at this scope. @@ -1036,12 +1042,11 @@ ast_parameter_declarator::hir(exec_list *instructions, { const struct glsl_type *type; const char *name = NULL; - + YYLTYPE loc = this->get_location(); type = type_specifier_to_glsl_type(this->type->specifier, & name, state); if (type == NULL) { - YYLTYPE loc = this->get_location(); if (name != NULL) { _mesa_glsl_error(& loc, state, "invalid type `%s' in declaration of `%s'", @@ -1064,7 +1069,7 @@ ast_parameter_declarator::hir(exec_list *instructions, /* Apply any specified qualifiers to the parameter declaration. Note that * for function parameters the default mode is 'in'. */ - apply_type_qualifier_to_variable(& this->type->qualifier, var, state); + apply_type_qualifier_to_variable(& this->type->qualifier, var, state, & loc); if (var->mode == ir_var_auto) var->mode = ir_var_in; |