diff --git a/loopy/target/c/codegen/expression.py b/loopy/target/c/codegen/expression.py index ffa2c4e629f25eb4c79966320d8e23202880b103..bd5a74782dc5dce7bf82985bea3a7c77404d9d26 100644 --- a/loopy/target/c/codegen/expression.py +++ b/loopy/target/c/codegen/expression.py @@ -148,6 +148,10 @@ class ExpressionToCExpressionMapper(IdentityMapper): from loopy.kernel.data import ValueArg if isinstance(arg, ValueArg) and self.fortran_abi: postproc = lambda x: x[0] # noqa + elif expr.name in self.kernel.temporary_variables: + temporary = self.kernel.temporary_variables[expr.name] + if temporary.base_storage: + postproc = lambda x: x[0] # noqa result = self.kernel.mangle_symbol(self.codegen_state.ast_builder, expr.name) if result is not None: @@ -216,12 +220,14 @@ class ExpressionToCExpressionMapper(IdentityMapper): elif isinstance(ary, (GlobalArg, TemporaryVariable, ConstantArg)): if len(access_info.subscripts) == 0: - if isinstance(ary, GlobalArg) or isinstance(ary, ConstantArg): + if (isinstance(ary, (ConstantArg, GlobalArg)) or + (isinstance(ary, TemporaryVariable) and ary.base_storage)): # unsubscripted global args are pointers result = var(access_info.array_name)[0] else: # unsubscripted temp vars are scalars + # (unless they use base_storage) result = var(access_info.array_name) else: diff --git a/test/test_loopy.py b/test/test_loopy.py index e0e619a1cd488b3946fdf7b2c519c22b15b04632..347c08d0d1f68544cca628b688767b3054630870 100644 --- a/test/test_loopy.py +++ b/test/test_loopy.py @@ -1587,17 +1587,18 @@ def test_temp_initializer(ctx_factory, src_order, tmp_order): assert np.array_equal(a, a2) -def test_base_storage_decl(): +def test_scalars_with_base_storage(ctx_factory): + """ Regression test for !50 """ + ctx = ctx_factory() + queue = cl.CommandQueue(ctx) + knl = lp.make_kernel( - "{ [i]: 0<=i