diff --git a/loopy/target/c/codegen/expression.py b/loopy/target/c/codegen/expression.py index 5d269a8bcbfb07405f76a5ac1821500b87212c2a..93ebf51dbec49a30b0cdc8fdeb989bffd329e9a7 100644 --- a/loopy/target/c/codegen/expression.py +++ b/loopy/target/c/codegen/expression.py @@ -361,16 +361,29 @@ class ExpressionToCExpressionMapper(IdentityMapper): return var("%s_new" % cast_type)(expr.real, expr.imag) else: + def map_integer_literal(expr): + if isinstance(expr, np.integer): + # If someone went to the trouble of supplying a sized + # integer, trust them. + + from loopy.types import NumpyType + return Literal("(%s) (%s)" % ( + self.codegen_state.ast_builder.dtype_to_ctype( + NumpyType(type(expr))), + int(expr))) + else: + return Literal(str(int(expr))) + from loopy.symbolic import Literal if type_context == "f": return Literal(repr(float(expr))+"f") elif type_context == "d": return Literal(repr(float(expr))) elif type_context == "i": - return int(expr) + return map_integer_literal(expr) else: if is_integer(expr): - return int(expr) + return map_integer_literal(expr) raise RuntimeError("don't know how to generate code " "for constant '%s'" % expr) diff --git a/test/test_target.py b/test/test_target.py index ad0cb7439bfdd6200e020c0becadcd73072ceef4..f8f279d3e1a147dcffbbcf7d70f4f5dd86fa2c09 100644 --- a/test/test_target.py +++ b/test/test_target.py @@ -240,6 +240,26 @@ def test_numba_cuda_target(): print(lp.generate_code_v2(knl).all_code()) +def test_sized_integer_c_codegen(ctx_factory): + ctx = ctx_factory() + queue = cl.CommandQueue(ctx) + + from pymbolic import var + knl = lp.make_kernel( + "{[i]: 0<=i 1: exec(sys.argv[1])