glsl: subroutine signatures must match exactly
authorYevhenii Kolesnikov <yevhenii.kolesnikov@globallogic.com>
Wed, 20 May 2020 16:16:28 +0000 (19:16 +0300)
committerMarge Bot <eric+marge@anholt.net>
Sun, 24 May 2020 23:55:44 +0000 (23:55 +0000)
From GLSL 4.60.7 spec, section 6.1.2 "Subroutines":

It is a compile-time error if arguments and return type don’t match
between the function and each associated subroutine type.

Before, if subroutine type and implementation function were declared
with types, that could be implicitly converted, it led to a runtime crash.

Signed-off-by: Yevhenii Kolesnikov <yevhenii.kolesnikov@globallogic.com>
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5125>

src/compiler/glsl/ir_function.cpp

index 97262f0f4b93c84c8903d830432a76e55a0b6169..a38e5285292d906087a81969dc2871b5f35daa1e 100644 (file)
@@ -329,6 +329,9 @@ ir_function::matching_signature(_mesa_glsl_parse_state *state,
          free(inexact_matches);
          return sig;
       case PARAMETER_LIST_INEXACT_MATCH:
+         /* Subroutine signatures must match exactly */
+         if (this->is_subroutine)
+            continue;
          inexact_matches_temp = (ir_function_signature **)
                realloc(inexact_matches,
                        sizeof(*inexact_matches) *