diff --git a/modcc/module.cpp b/modcc/module.cpp index c167b0537f9d347da8d2f13f8b80a8c358effe3b..6d6a56a0dd1b980e0b486d0b48407d8135b8bddf 100644 --- a/modcc/module.cpp +++ b/modcc/module.cpp @@ -723,11 +723,8 @@ void Module::add_variables_to_symbols() { } std::set<std::string> cond; - for(auto const& ion : neuron_block_.ions) { - for(auto const& var : ion.read) { - update_ion_symbols(var, accessKind::read, ion.name); - } - for(auto const& var : ion.write) { + for(auto const& ion: neuron_block_.ions) { + for(auto const& var: ion.write) { update_ion_symbols(var, accessKind::write, ion.name); auto name = "conductivity_" + ion.name + "_"; if (cond.find(name) == cond.end()) { @@ -736,6 +733,16 @@ void Module::add_variables_to_symbols() { } } + for(auto const& var: ion.read) { + // Skip vars we have already processed as WRITE, since those can be read as well. + if (std::count_if(ion.write.begin(), + ion.write.end(), + [&var](const auto& it) { return var.spelling == it.spelling; })) { + continue; + } + update_ion_symbols(var, accessKind::read, ion.name); + } + if(ion.uses_valence()) { Token valence_var = ion.valence_var; create_indexed_variable(valence_var.spelling, sourceKind::ion_valence, diff --git a/test/unit-modcc/mod_files/test-rw-ion.mod b/test/unit-modcc/mod_files/test-rw-ion.mod new file mode 100644 index 0000000000000000000000000000000000000000..ea2800db1d2702d484376a16ac0905d524691bfb --- /dev/null +++ b/test/unit-modcc/mod_files/test-rw-ion.mod @@ -0,0 +1,8 @@ +NEURON { + SUFFIX hh + USEION na READ ena, ina WRITE ina +} + +BREAKPOINT { ina = 5*(v - ena) } + +INITIAL {} diff --git a/test/unit-modcc/test_module.cpp b/test/unit-modcc/test_module.cpp index f708fc91d5af3b4b6d283a4fcb038c3bb21d281f..34ff5b4d9ba4d129410d4b9310a4e847dca7368f 100644 --- a/test/unit-modcc/test_module.cpp +++ b/test/unit-modcc/test_module.cpp @@ -113,3 +113,12 @@ TEST(Module, breakpoint) { EXPECT_TRUE(m.semantic()); } + +TEST(Module, read_write_ion) { + Module m(io::read_all(DATADIR "/mod_files/test-rw-ion.mod"), "test-rw-ion.mod"); + EXPECT_NE(m.buffer().size(), 0); + + Parser p(m, false); + EXPECT_TRUE(p.parse()); + EXPECT_TRUE(m.semantic()); +}