diff options
author | Gaius Mulley <gaiusmod2@gmail.com> | 2025-03-25 02:08:05 +0000 |
---|---|---|
committer | Gaius Mulley <gaiusmod2@gmail.com> | 2025-03-25 02:08:05 +0000 |
commit | 127a24ede2f82eafecb5eb142e21dbda38d06c18 (patch) | |
tree | b0ac917ddd328c515c66aedcde0f6f0b863a4d3b /gcc/m2/gm2-gcc | |
parent | 90ab42f92b876b74056db297557e8c3d51cdd773 (diff) | |
download | gcc-127a24ede2f82eafecb5eb142e21dbda38d06c18.zip gcc-127a24ede2f82eafecb5eb142e21dbda38d06c18.tar.gz gcc-127a24ede2f82eafecb5eb142e21dbda38d06c18.tar.bz2 |
PR modula2/119449 MAX of SYSTEM.REAL64 cause an ICE
This bugfix implements MAX(REAL64) and MIN(REAL64) etc for
REAL64, REAL96 and REAL128.
gcc/m2/ChangeLog:
PR modula2/119449
* gm2-compiler/M2GCCDeclare.def (TryDeclareType): Remove tokenno
parameter.
* gm2-compiler/M2GCCDeclare.mod (TryDeclareType): Ditto.
* gm2-compiler/M2GenGCC.mod (FoldTBitsize): Remove op2 and
rename op1 as res and op3 as type.
(FoldStandardFunction): Call FoldTBitsize omitting op2.
* gm2-compiler/M2Quads.mod (GetTypeMin): Rewrite.
(GetTypeMinLower): New procedure function.
(GetTypeMax): Rewrite.
(GetTypeMaxLower): New procedure function.
* gm2-compiler/M2Range.mod (CheckCancelled): Comment out.
* gm2-compiler/M2System.mod (CreateMinMaxFor): Add realtype
parameter.
(MapType): Rewrite to use realtype.
(CreateType): Ditto.
(AttemptToCreateType): Ditto.
(MakeFixedSizedTypes): Add realtype boolean.
(InitPIMTypes): Ditto.
(InitISOTypes): Ditto.
(MakeExtraSystemTypes): Ditto.
* gm2-gcc/m2pp.cc (m2pp_nop_expr): Remove code.
* gm2-gcc/m2type.cc (IsGccRealType): New function.
(m2type_GetMinFrom): Rewrite.
(m2type_GetMaxFrom): Ditto.
(do_min_real): Declare static.
(do_max_real): Declare static.
gcc/testsuite/ChangeLog:
PR modula2/119449
* gm2/pim/pass/minmaxreal.mod: New test.
* gm2/pim/pass/minmaxreal2.mod: New test.
* gm2/pim/pass/minmaxreal3.mod: New test.
Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
Diffstat (limited to 'gcc/m2/gm2-gcc')
-rw-r--r-- | gcc/m2/gm2-gcc/m2pp.cc | 1 | ||||
-rw-r--r-- | gcc/m2/gm2-gcc/m2type.cc | 29 |
2 files changed, 19 insertions, 11 deletions
diff --git a/gcc/m2/gm2-gcc/m2pp.cc b/gcc/m2/gm2-gcc/m2pp.cc index 6ec8aaa..7d4adb8 100644 --- a/gcc/m2/gm2-gcc/m2pp.cc +++ b/gcc/m2/gm2-gcc/m2pp.cc @@ -2367,7 +2367,6 @@ m2pp_asm_expr (pretty *state, tree node) static void m2pp_nop_expr (pretty *state, tree t) { - enum tree_code code = TREE_CODE (t); m2pp_begin (state); m2pp_print (state, "(* NOP for debug location *)"); m2pp_needspace (state); diff --git a/gcc/m2/gm2-gcc/m2type.cc b/gcc/m2/gm2-gcc/m2type.cc index e82857d..e486f12 100644 --- a/gcc/m2/gm2-gcc/m2type.cc +++ b/gcc/m2/gm2-gcc/m2type.cc @@ -1891,6 +1891,22 @@ m2type_GetDefaultType (location_t location, char *name, tree type) return id; } +/* IsGccRealType return true if type is a GCC realtype. */ + +static +bool +IsGccRealType (tree type) +{ + return (type == m2_real_type_node || type == m2type_GetRealType () || + type == m2_long_real_type_node || type == m2type_GetLongRealType () || + type == m2_short_real_type_node || type == m2type_GetShortRealType () || + type == m2type_GetM2Real32 () || + type == m2type_GetM2Real64 () || + type == m2type_GetM2Real96 () || + type == m2type_GetM2Real128 ()); +} + +static tree do_min_real (tree type) { @@ -1911,11 +1927,7 @@ m2type_GetMinFrom (location_t location, tree type) { m2assert_AssertLocation (location); - if (type == m2_real_type_node || type == m2type_GetRealType ()) - return do_min_real (type); - if (type == m2_long_real_type_node || type == m2type_GetLongRealType ()) - return do_min_real (type); - if (type == m2_short_real_type_node || type == m2type_GetShortRealType ()) + if (IsGccRealType (type)) return do_min_real (type); if (type == ptr_type_node) return m2expr_GetPointerZero (location); @@ -1923,6 +1935,7 @@ m2type_GetMinFrom (location_t location, tree type) return TYPE_MIN_VALUE (m2tree_skip_type_decl (type)); } +static tree do_max_real (tree type) { @@ -1943,11 +1956,7 @@ m2type_GetMaxFrom (location_t location, tree type) { m2assert_AssertLocation (location); - if (type == m2_real_type_node || type == m2type_GetRealType ()) - return do_max_real (type); - if (type == m2_long_real_type_node || type == m2type_GetLongRealType ()) - return do_max_real (type); - if (type == m2_short_real_type_node || type == m2type_GetShortRealType ()) + if (IsGccRealType (type)) return do_max_real (type); if (type == ptr_type_node) return fold (m2expr_BuildSub (location, m2expr_GetPointerZero (location), |