From: Ian Romanick Date: Fri, 23 Apr 2010 20:24:08 +0000 (-0700) Subject: Reject conflicting struct declarations, generate struct constructor X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ab89927a91a0ea6ffdb56e5e75044472f7277f4a;p=mesa.git Reject conflicting struct declarations, generate struct constructor --- diff --git a/ast_to_hir.cpp b/ast_to_hir.cpp index 704f2745a74..a32805b38f0 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. */