summaryrefslogtreecommitdiff
path: root/cpp/src/Slice/Parser.cpp
diff options
context:
space:
mode:
authorMark Spruiell <mes@zeroc.com>2017-04-13 12:32:20 -0700
committerMark Spruiell <mes@zeroc.com>2017-04-13 12:32:20 -0700
commit374836e7212304e93ef708955c88f9388f5ea665 (patch)
tree764514579588bae04a5cde5cff71bf4feed24a0b /cpp/src/Slice/Parser.cpp
parentUse the term Slice compiler instead of Slice translator in READMEs (diff)
downloadice-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.cpp32
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;
}
// ----------------------------------------------------------------------