Mesa (glsl2): glsl2: Check for non-void functions that don' t have a return statement.

Ian Romanick idr at kemper.freedesktop.org
Tue Jun 29 11:15:11 PDT 2010


Module: Mesa
Branch: glsl2
Commit: 6de825650560198eb97f19e72b2d56e68e3d7a63
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=6de825650560198eb97f19e72b2d56e68e3d7a63

Author: Kenneth Graunke <kenneth at whitecape.org>
Date:   Tue Jun 29 09:59:40 2010 -0700

glsl2: Check for non-void functions that don't have a return statement.

This doesn't do any control flow analysis to ensure that the return
statements are actually reached.

Fixes piglit tests function5.frag and function-07.vert.

---

 src/glsl/ast_to_hir.cpp       |   10 ++++++++++
 src/glsl/glsl_parser_extras.h |    3 +++
 2 files changed, 13 insertions(+), 0 deletions(-)

diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
index 5a13b74..c5df0b0 100644
--- a/src/glsl/ast_to_hir.cpp
+++ b/src/glsl/ast_to_hir.cpp
@@ -2097,6 +2097,7 @@ ast_function_definition::hir(exec_list *instructions,
 
    assert(state->current_function == NULL);
    state->current_function = signature;
+   state->found_return = false;
 
    /* Duplicate parameters declared in the prototype as concrete variables.
     * Add these to the symbol table.
@@ -2128,6 +2129,14 @@ ast_function_definition::hir(exec_list *instructions,
    assert(state->current_function == signature);
    state->current_function = NULL;
 
+   if (!signature->return_type->is_void() && !state->found_return) {
+      YYLTYPE loc = this->get_location();
+      _mesa_glsl_error(& loc, state, "function `%s' has non-void return type "
+		       "%s, but no return statement",
+		       signature->function_name(),
+		       signature->return_type->name);
+   }
+
    /* Function definitions do not have r-values.
     */
    return NULL;
@@ -2186,6 +2195,7 @@ ast_jump_statement::hir(exec_list *instructions,
 	 inst = new(ctx) ir_return;
       }
 
+      state->found_return = true;
       instructions->push_tail(inst);
       break;
    }
diff --git a/src/glsl/glsl_parser_extras.h b/src/glsl/glsl_parser_extras.h
index cfe02e3..726bafa 100644
--- a/src/glsl/glsl_parser_extras.h
+++ b/src/glsl/glsl_parser_extras.h
@@ -51,6 +51,9 @@ struct _mesa_glsl_parse_state {
     */
    class ir_function_signature *current_function;
 
+   /** Have we found a return statement in this function? */
+   bool found_return;
+
    /** Was there an error during compilation? */
    bool error;
 



More information about the mesa-commit mailing list