diff --git a/pytato/target/loopy/codegen.py b/pytato/target/loopy/codegen.py index 1bf286e3785decb91a6d8d77c666b4e0d94fa9cb..8055c12f5b5d9d5c78989ca3d68f51e9e9dd9648 100644 --- a/pytato/target/loopy/codegen.py +++ b/pytato/target/loopy/codegen.py @@ -746,8 +746,9 @@ def _generate_name_for_temp(expr: Array, state: CodeGenState) -> str: name_tag, = expr.tags_of_type(Named) if state.var_name_gen.is_name_conflicting(name_tag.name): raise ValueError(f"Cannot assign the name {name_tag.name} to the" - f" temporary corresponding to {expr} as it is" - " referring a loopy kernel argument.") + f" temporary corresponding to {expr} as it " + "conflicts with an existing name. ") + state.var_name_gen.add_name(name_tag.name) return name_tag.name elif expr.tags_of_type(PrefixNamed): prefix_tag, = expr.tags_of_type(PrefixNamed) diff --git a/test/test_codegen.py b/test/test_codegen.py index 2e619f7dbe5ad925ab35f65e1b5f53ab2c942b57..6a2080a76892076f95d0223f2867d45b89f5ae5b 100755 --- a/test/test_codegen.py +++ b/test/test_codegen.py @@ -59,6 +59,18 @@ def test_basic_codegen(ctx_factory): assert (out == x_in * x_in).all() +def test_named_clash(ctx_factory): + x = pt.make_placeholder("x", (5,), np.int64) + + from pytato.tags import ImplStored, Named + expr = ( + (2*x).tagged((Named("xx"), ImplStored())) + + (3*x).tagged((Named("xx"), ImplStored()))) + + with pytest.raises(ValueError): + pt.generate_loopy(expr) + + def test_scalar_placeholder(ctx_factory): ctx = ctx_factory() queue = cl.CommandQueue(ctx)