From ab89927a91a0ea6ffdb56e5e75044472f7277f4a Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Fri, 23 Apr 2010 13:24:08 -0700 Subject: [PATCH] Reject conflicting struct declarations, generate struct constructor --- ast_to_hir.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/ast_to_hir.cpp b/ast_to_hir.cpp index 704f274..a32805b 100644 --- a/ast_to_hir.cpp +++ b/ast_to_hir.cpp @@ -2346,7 +2346,20 @@ ast_struct_specifier::hir(exec_list *instructions, glsl_type *t = new glsl_type(fields, decl_count, name); - state->symbols->add_type(name, t); + YYLTYPE loc = this->get_location(); + if (!state->symbols->add_type(name, t)) { + _mesa_glsl_error(& loc, state, "struct `%s' previously defined", name); + } else { + /* This logic is a bit tricky. It is an error to declare a structure at + * global scope if there is also a function with the same name. + */ + if ((state->current_function == NULL) + && (state->symbols->get_function(name) != NULL)) { + _mesa_glsl_error(& loc, state, "name `%s' previously defined", name); + } else { + t->generate_constructor(state->symbols); + } + } /* Structure type definitions do not have r-values. */ -- 2.7.4