From c2a0ee58865c5abad40acc59549dd98f40a8f7aa Mon Sep 17 00:00:00 2001 From: Thomas Koenig Date: Mon, 27 Jan 2025 18:43:44 +0100 Subject: Add modular exponentiation for UNSIGNED. gcc/fortran/ChangeLog: * arith.cc (arith_power): Handle modular arithmetic for BT_UNSIGNED. (eval_intrinsic): Error for unsigned exponentiation with -pedantic. * expr.cc (gfc_type_convert_binary): Use type of first argument for unsigned exponentiation. * gfortran.texi: Mention arithmetic exponentiation. * resolve.cc (resolve_operator): Allow unsigned exponentiation. * trans-decl.cc (gfc_build_intrinsic_function_decls): Build declarations for unsigned exponentiation. * trans-expr.cc (gfc_conv_cst_uint_power): New function. (gfc_conv_power_op): Call it. Handle unsigned exponentiation. * trans.h (gfor_fndecl_unsigned_pow_list): Add declaration. libgfortran/ChangeLog: * Makefile.am: Add files for unsigned exponentiation. * Makefile.in: Regenerate. * gfortran.map: Add functions for unsigned exponentiation. * generated/pow_m16_m1.c: New file. * generated/pow_m16_m16.c: New file. * generated/pow_m16_m2.c: New file. * generated/pow_m16_m4.c: New file. * generated/pow_m16_m8.c: New file. * generated/pow_m1_m1.c: New file. * generated/pow_m1_m16.c: New file. * generated/pow_m1_m2.c: New file. * generated/pow_m1_m4.c: New file. * generated/pow_m1_m8.c: New file. * generated/pow_m2_m1.c: New file. * generated/pow_m2_m16.c: New file. * generated/pow_m2_m2.c: New file. * generated/pow_m2_m4.c: New file. * generated/pow_m2_m8.c: New file. * generated/pow_m4_m1.c: New file. * generated/pow_m4_m16.c: New file. * generated/pow_m4_m2.c: New file. * generated/pow_m4_m4.c: New file. * generated/pow_m4_m8.c: New file. * generated/pow_m8_m1.c: New file. * generated/pow_m8_m16.c: New file. * generated/pow_m8_m2.c: New file. * generated/pow_m8_m4.c: New file. * generated/pow_m8_m8.c: New file. * m4/powu.m4: New file. gcc/testsuite/ChangeLog: * gfortran.dg/unsigned_15.f90: Adjust error messages. * gfortran.dg/unsigned_43.f90: New test. * gfortran.dg/unsigned_44.f90: New test. --- gcc/fortran/expr.cc | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'gcc/fortran/expr.cc') diff --git a/gcc/fortran/expr.cc b/gcc/fortran/expr.cc index 7f3f6c5..e4ab3ba 100644 --- a/gcc/fortran/expr.cc +++ b/gcc/fortran/expr.cc @@ -981,6 +981,14 @@ gfc_type_convert_binary (gfc_expr *e, int wconversion) goto done; } + /* Unsigned exponentiation is special, we need the type of the first + argument here because of modulo arithmetic. */ + if (op1->ts.type == BT_UNSIGNED && e->value.op.op == INTRINSIC_POWER) + { + e->ts = op1->ts; + goto done; + } + if (op1->ts.kind > op2->ts.kind) gfc_convert_type_warn (op2, &op1->ts, 2, wconversion); else -- cgit v1.1