diff options
author | Mark Spruiell <mes@zeroc.com> | 2017-04-13 12:32:20 -0700 |
---|---|---|
committer | Mark Spruiell <mes@zeroc.com> | 2017-04-13 12:32:20 -0700 |
commit | 374836e7212304e93ef708955c88f9388f5ea665 (patch) | |
tree | 764514579588bae04a5cde5cff71bf4feed24a0b /cpp/src/Slice/Parser.cpp | |
parent | Use the term Slice compiler instead of Slice translator in READMEs (diff) | |
download | ice-374836e7212304e93ef708955c88f9388f5ea665.tar.bz2 ice-374836e7212304e93ef708955c88f9388f5ea665.tar.xz ice-374836e7212304e93ef708955c88f9388f5ea665.zip |
ignore enumerator redefinitions when necessary
Diffstat (limited to 'cpp/src/Slice/Parser.cpp')
-rw-r--r-- | cpp/src/Slice/Parser.cpp | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/cpp/src/Slice/Parser.cpp b/cpp/src/Slice/Parser.cpp index 00fb1d42047..d07e7e85f3c 100644 --- a/cpp/src/Slice/Parser.cpp +++ b/cpp/src/Slice/Parser.cpp @@ -1167,18 +1167,24 @@ Slice::Container::createEnum(const string& name, bool local, NodeType nt) EnumeratorPtr Slice::Container::createEnumerator(const string& name) { - validateEnumerator(name); - EnumeratorPtr p = new Enumerator(this, name); - _contents.push_back(p); + EnumeratorPtr p = validateEnumerator(name); + if(!p) + { + p = new Enumerator(this, name); + _contents.push_back(p); + } return p; } EnumeratorPtr Slice::Container::createEnumerator(const string& name, int value) { - validateEnumerator(name); - EnumeratorPtr p = new Enumerator(this, name, value); - _contents.push_back(p); + EnumeratorPtr p = validateEnumerator(name); + if(!p) + { + p = new Enumerator(this, name, value); + _contents.push_back(p); + } return p; } @@ -2986,7 +2992,7 @@ Slice::Container::validateConstant(const string& name, const TypePtr& type, Synt return true; } -void +EnumeratorPtr Slice::Container::validateEnumerator(const string& name) { checkIdentifier(name); @@ -2994,6 +3000,15 @@ Slice::Container::validateEnumerator(const string& name) ContainedList matches = _unit->findContents(thisScope() + name); if(!matches.empty()) { + EnumeratorPtr p = EnumeratorPtr::dynamicCast(matches.front()); + if(p) + { + if(_unit->ignRedefs()) + { + p->updateIncludeLevel(); + return p; + } + } if(matches.front()->name() == name) { _unit->error(string("redefinition of enumerator `") + name + "'"); @@ -3006,7 +3021,8 @@ Slice::Container::validateEnumerator(const string& name) } } - nameIsLegal(name, "enumerator"); // Don't return here -- we create the enumerator anyway. + nameIsLegal(name, "enumerator"); // Ignore return value. + return 0; } // ---------------------------------------------------------------------- |