diff --git a/tools/qfcc/include/expr.h b/tools/qfcc/include/expr.h index a1650cbed..dee210ee3 100644 --- a/tools/qfcc/include/expr.h +++ b/tools/qfcc/include/expr.h @@ -542,7 +542,7 @@ expr_t *new_horizontal_expr (int op, const expr_t *vec, type_t *type); const expr_t *new_swizzle_expr (const expr_t *src, const char *swizzle); -expr_t *new_extend_expr (const expr_t *src, type_t *type, int ext, bool rev); +const expr_t *new_extend_expr (const expr_t *src, type_t *type, int ext, bool rev); /** Create a new def reference (non-temporary variable) expression node. diff --git a/tools/qfcc/source/evaluate.c b/tools/qfcc/source/evaluate.c index c4278405e..9cac3cd7e 100644 --- a/tools/qfcc/source/evaluate.c +++ b/tools/qfcc/source/evaluate.c @@ -240,6 +240,10 @@ evaluate_constexpr (const expr_t *e) if (!is_constant (e->alias.expr)) { return e; } + } else if (e->type == ex_extend) { + if (!is_constant (e->extend.src)) { + return e; + } } else { return e; } diff --git a/tools/qfcc/source/expr.c b/tools/qfcc/source/expr.c index b2f83a909..5ae429c9e 100644 --- a/tools/qfcc/source/expr.c +++ b/tools/qfcc/source/expr.c @@ -660,7 +660,7 @@ new_swizzle_expr (const expr_t *src, const char *swizzle) return expr; } -expr_t * +const expr_t * new_extend_expr (const expr_t *src, type_t *type, int ext, bool rev) { expr_t *expr = new_expr (); @@ -669,7 +669,7 @@ new_extend_expr (const expr_t *src, type_t *type, int ext, bool rev) expr->extend.extend = ext; expr->extend.reverse = rev; expr->extend.type = type; - return expr; + return evaluate_constexpr (expr); } expr_t *