From: Eric Anholt Date: Wed, 31 Mar 2010 19:56:36 +0000 (-1000) Subject: Don't create a parameter declaration for a (void) parameter. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=068c80cfe0a280490353b6b007165d717c672eed;p=mesa.git 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 --- diff --git a/ast_to_hir.cpp b/ast_to_hir.cpp index ca3c869dd80..137abdaaa6c 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); + } }