diff options
author | Kenneth Graunke <[email protected]> | 2010-08-25 17:10:16 -0700 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2010-08-26 09:19:48 -0700 |
commit | ac2376e6f51677ab321930b0200a79d1683cfbba (patch) | |
tree | 2894ed6e3488c17cf8b0a511fc01c50aa3a04856 /src | |
parent | e09591317b2470fe9c104606577d4e10255727c0 (diff) |
glsl: Don't add overloads to existing structure constructors.
Instead, make a new ir_function and try to add it to the symbol table.
Fixes piglit test redeclaration-08.vert.
Diffstat (limited to 'src')
-rw-r--r-- | src/glsl/ast_to_hir.cpp | 2 | ||||
-rw-r--r-- | src/glsl/glsl_symbol_table.cpp | 9 | ||||
-rw-r--r-- | src/glsl/glsl_symbol_table.h | 2 |
3 files changed, 9 insertions, 4 deletions
diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp index 8caf950c2d2..c666da300b7 100644 --- a/src/glsl/ast_to_hir.cpp +++ b/src/glsl/ast_to_hir.cpp @@ -2172,7 +2172,7 @@ ast_function::hir(exec_list *instructions, * seen signature for a function with the same name, or, if a match is found, * that the previously seen signature does not have an associated definition. */ - f = state->symbols->get_function(name); + f = state->symbols->get_function(name, false); if (f != NULL) { sig = f->exact_matching_signature(&hir_parameters); if (sig != NULL) { diff --git a/src/glsl/glsl_symbol_table.cpp b/src/glsl/glsl_symbol_table.cpp index 76c440c3420..11e16713351 100644 --- a/src/glsl/glsl_symbol_table.cpp +++ b/src/glsl/glsl_symbol_table.cpp @@ -147,10 +147,15 @@ const glsl_type *glsl_symbol_table::get_type(const char *name) return entry != NULL ? entry->t : NULL; } -ir_function *glsl_symbol_table::get_function(const char *name) +ir_function *glsl_symbol_table::get_function(const char *name, + bool return_constructors) { symbol_table_entry *entry = get_entry(name); - return entry != NULL ? entry->f : NULL; + // If there's a type, the function is a constructor; caller may not want it. + if (entry != NULL && (return_constructors || entry->t == NULL)) + return entry->f; + + return NULL; } symbol_table_entry *glsl_symbol_table::get_entry(const char *name) diff --git a/src/glsl/glsl_symbol_table.h b/src/glsl/glsl_symbol_table.h index d71be5578be..c90fdc3c1d9 100644 --- a/src/glsl/glsl_symbol_table.h +++ b/src/glsl/glsl_symbol_table.h @@ -109,7 +109,7 @@ public: /*@{*/ ir_variable *get_variable(const char *name); const glsl_type *get_type(const char *name); - ir_function *get_function(const char *name); + ir_function *get_function(const char *name, bool return_constructors = true); /*@}*/ private: |