diff --git a/sumpy/assignment_collection.py b/sumpy/assignment_collection.py index 8aa07d813066f6dc0382a57e34c42f14ae8bced7..a12a17fd84b7158628c120a4626464fd288940bb 100644 --- a/sumpy/assignment_collection.py +++ b/sumpy/assignment_collection.py @@ -48,7 +48,14 @@ class _SymbolGenerator(object): from collections import defaultdict self.base_to_count = defaultdict(lambda: 0) + def _normalize(self, base): + # Strip off any _N suffix, to avoid generating conflicting names. + import re + base = re.split("_\d+$", base)[0] + return base if base != "" else "expr" + def __call__(self, base="expr"): + base = self._normalize(base) count = self.base_to_count[base] def make_id_str(base, count): diff --git a/test/test_codegen.py b/test/test_codegen.py index 376a8fcf8a142da5867875f9b3fcc15df805fe72..c7b5e0bc357ace12ecc59d11ead7ac9af7d19b1d 100644 --- a/test/test_codegen.py +++ b/test/test_codegen.py @@ -61,6 +61,23 @@ def test_kill_trivial_assignments(): ('u2', _s(6*x, 1))] +def test_symbolic_assignment_name_uniqueness(): + # https://gitlab.tiker.net/inducer/sumpy/issues/13 + from sumpy.assignment_collection import SymbolicAssignmentCollection + + sac = SymbolicAssignmentCollection({"s_0": 1}) + sac.assign_unique("s_", 1) + sac.assign_unique("s_", 1) + assert len(sac.assignments) == 3 + + sac = SymbolicAssignmentCollection() + sac.assign_unique("s_0", 1) + sac.assign_unique("s_", 1) + sac.assign_unique("s_", 1) + + assert len(sac.assignments) == 3 + + # You can test individual routines by typing # $ python test_fmm.py 'test_sumpy_fmm(cl.create_some_context)'