summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenneth Graunke <kenneth@whitecape.org>2010-08-25 17:10:16 -0700
committerIan Romanick <ian.d.romanick@intel.com>2010-08-26 09:19:48 -0700
commitac2376e6f51677ab321930b0200a79d1683cfbba (patch)
tree2894ed6e3488c17cf8b0a511fc01c50aa3a04856
parente09591317b2470fe9c104606577d4e10255727c0 (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.
-rw-r--r--src/glsl/ast_to_hir.cpp2
-rw-r--r--src/glsl/glsl_symbol_table.cpp9
-rw-r--r--src/glsl/glsl_symbol_table.h2
3 files changed, 9 insertions, 4 deletions
diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
index 8caf950c2d..c666da300b 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 76c440c342..11e1671335 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 d71be5578b..c90fdc3c1d 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: