From 90f88fab4f3a104f59f619047d66fc7069d67f69 Mon Sep 17 00:00:00 2001 From: batt Date: Tue, 4 Mar 2008 16:21:00 +0000 Subject: [PATCH] Fix unwanted type promotion. git-svn-id: https://src.develer.com/svnoss/bertos/trunk@1161 38d2e660-2303-0410-9eaa-f027e97ec537 --- cfg/macros.h | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/cfg/macros.h b/cfg/macros.h index f0520eff..1006fc42 100644 --- a/cfg/macros.h +++ b/cfg/macros.h @@ -60,13 +60,33 @@ typeof(a) _a = (a); \ typeof(b) _b = (b); \ ASSERT_TYPE_EQUAL(_a, _b); \ - (_a < _b) ? _a : _b; \ + /** \ + * The (typeof(_a)) cast in necessary: \ + * result type of conditional expressions is \ + * *NOT* the type of the value returned but \ + * the type that would be produced if _a and _b \ + * were mixed in an expression. \ + * Even in _a and _b are of the same type, \ + * if mixed in an expression the type will be \ + * promoted to int! \ + */ \ + ((typeof(_a))((_a < _b) ? _a : _b)); \ }) #define MAX(a,b) ({ \ typeof(a) _a = (a); \ typeof(b) _b = (b); \ ASSERT_TYPE_EQUAL(_a, _b); \ - (_a > _b) ? _a : _b; \ + /** \ + * The (typeof(_a)) cast in necessary: \ + * result type of conditional expressions is \ + * *NOT* the type of the value returned but \ + * the type that would be produced if _a and _b \ + * were mixed in an expression. \ + * Even in _a and _b are of the same type, \ + * if mixed in an expression the type will be \ + * promoted to int! \ + */ \ + ((typeof(_a))((_a > _b) ? _a : _b)); \ }) #else /* !(COMPILER_STATEMENT_EXPRESSIONS && COMPILER_TYPEOF) */ /* Buggy macros for inferior compilers. */ -- 2.25.1