From 068c80cfe0a280490353b6b007165d717c672eed Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Wed, 31 Mar 2010 09:56:36 -1000 Subject: [PATCH] Don't create a parameter declaration for a (void) parameter. Fixes segfaults in a shader consisting of just: void main(void) { } Signed-off-by: Ian Romanick --- ast_to_hir.cpp | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/ast_to_hir.cpp b/ast_to_hir.cpp index ca3c869..137abda 100644 --- a/ast_to_hir.cpp +++ b/ast_to_hir.cpp @@ -1501,6 +1501,21 @@ ast_parameter_declarator::hir(exec_list *instructions, type = glsl_type::error_type; } + /* From page 62 (page 68 of the PDF) of the GLSL 1.50 spec: + * + * "Functions that accept no input arguments need not use void in the + * argument list because prototypes (or definitions) are required and + * therefore there is no ambiguity when an empty argument list "( )" is + * declared. The idiom "(void)" as a parameter list is provided for + * convenience." + * + * Placing this check here prevents a void parameter being set up + * for a function, which avoids tripping up checks for main taking + * parameters and lookups of an unnamed symbol. + */ + if (type->is_void() && (this->identifier == NULL)) + return NULL; + ir_variable *var = new ir_variable(type, this->identifier); /* FINISHME: Handle array declarations. Note that this requires @@ -1530,7 +1545,9 @@ ast_function_parameters_to_hir(struct simple_node *ast_parameters, struct simple_node *ptr; foreach (ptr, ast_parameters) { - ((ast_node *)ptr)->hir(ir_parameters, state); + ast_node *param = (ast_node *)ptr; + param->hir(ir_parameters, state); + } } -- 2.7.4