Reject conflicting struct declarations, generate struct constructor
authorIan Romanick <ian.d.romanick@intel.com>
Fri, 23 Apr 2010 20:24:08 +0000 (13:24 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Thu, 29 Apr 2010 01:22:54 +0000 (18:22 -0700)
ast_to_hir.cpp

index 704f2745a74d0745114a786f8be0aa24cee438f9..a32805b38f0ff954997ba2120f4a718a73565218 100644 (file)
@@ -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.
     */