From 009c0bd84020589c21ce25e5a5317abdd63cdb3a Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Mon, 29 Oct 2018 17:17:43 -0500 Subject: [PATCH] intel/defines: Explicitly cast to uint32_t in SET_FIELD and SET_BITS If you pass a bool in as the value to set, the C standard says that it gets converted to an int prior to shifting. If you try to set a bool to bit 31, this lands you in undefined behavior. It's better just to add the explicit cast and let the compiler delete it for us. Reviewed-by: Iago Toral Quiroga --- src/intel/compiler/brw_eu_defines.h | 4 ++-- src/mesa/drivers/dri/i965/brw_defines.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/intel/compiler/brw_eu_defines.h b/src/intel/compiler/brw_eu_defines.h index b7bd104be59..4640c98140f 100644 --- a/src/intel/compiler/brw_eu_defines.h +++ b/src/intel/compiler/brw_eu_defines.h @@ -41,14 +41,14 @@ /* Using the GNU statement expression extension */ #define SET_FIELD(value, field) \ ({ \ - uint32_t fieldval = (value) << field ## _SHIFT; \ + uint32_t fieldval = (uint32_t)(value) << field ## _SHIFT; \ assert((fieldval & ~ field ## _MASK) == 0); \ fieldval & field ## _MASK; \ }) #define SET_BITS(value, high, low) \ ({ \ - const uint32_t fieldval = (value) << (low); \ + const uint32_t fieldval = (uint32_t)(value) << (low); \ assert((fieldval & ~INTEL_MASK(high, low)) == 0); \ fieldval & INTEL_MASK(high, low); \ }) diff --git a/src/mesa/drivers/dri/i965/brw_defines.h b/src/mesa/drivers/dri/i965/brw_defines.h index 5017c41ab24..2729a54e144 100644 --- a/src/mesa/drivers/dri/i965/brw_defines.h +++ b/src/mesa/drivers/dri/i965/brw_defines.h @@ -38,7 +38,7 @@ /* Using the GNU statement expression extension */ #define SET_FIELD(value, field) \ ({ \ - uint32_t fieldval = (value) << field ## _SHIFT; \ + uint32_t fieldval = (uint32_t)(value) << field ## _SHIFT; \ assert((fieldval & ~ field ## _MASK) == 0); \ fieldval & field ## _MASK; \ }) -- 2.30.2