summaryrefslogtreecommitdiff
path: root/cpp/src/Slice/Parser.cpp
diff options
context:
space:
mode:
authorMark Spruiell <mes@zeroc.com>2010-07-23 16:02:04 -0700
committerMark Spruiell <mes@zeroc.com>2010-07-23 16:02:04 -0700
commit2414545a397baa35e90fbc04c807b2b96ed7cc93 (patch)
tree271b74750e65d3eb64ef39299b14658b420eb6d9 /cpp/src/Slice/Parser.cpp
parentBug-fix for 4793. As well as some refactoring. (diff)
downloadice-2414545a397baa35e90fbc04c807b2b96ed7cc93.tar.bz2
ice-2414545a397baa35e90fbc04c807b2b96ed7cc93.tar.xz
ice-2414545a397baa35e90fbc04c807b2b96ed7cc93.zip
bug 4794 - allow default values to refer to constants
Diffstat (limited to 'cpp/src/Slice/Parser.cpp')
-rwxr-xr-xcpp/src/Slice/Parser.cpp152
1 files changed, 108 insertions, 44 deletions
diff --git a/cpp/src/Slice/Parser.cpp b/cpp/src/Slice/Parser.cpp
index b4269abccf4..0460bf38122 100755
--- a/cpp/src/Slice/Parser.cpp
+++ b/cpp/src/Slice/Parser.cpp
@@ -1033,7 +1033,7 @@ Slice::Container::createEnumerator(const string& name)
ConstPtr
Slice::Container::createConst(const string name, const TypePtr& constType, const StringList& metaData,
- const SyntaxTreeBasePtr& literalType, const string& value, const string& literal,
+ const SyntaxTreeBasePtr& valueType, const string& value, const string& literal,
NodeType nt)
{
checkIdentifier(name);
@@ -1074,12 +1074,12 @@ Slice::Container::createConst(const string name, const TypePtr& constType, const
//
// Validate the constant and its value.
//
- if(nt == Real && !validateConstant(name, constType, literalType, value, true))
+ if(nt == Real && !validateConstant(name, constType, valueType, value, true))
{
return 0;
}
- ConstPtr p = new Const(this, name, constType, metaData, value, literal);
+ ConstPtr p = new Const(this, name, constType, metaData, valueType, value, literal);
_contents.push_back(p);
return p;
}
@@ -2270,16 +2270,27 @@ Slice::Container::checkGlobalMetaData(const StringList& m1, const StringList& m2
}
bool
-Slice::Container::validateConstant(const string& name, const TypePtr& type, const SyntaxTreeBasePtr& literalType,
- const string& value, bool constant)
+Slice::Container::validateConstant(const string& name, const TypePtr& type, const SyntaxTreeBasePtr& valueType,
+ const string& value, bool isConstant)
{
- const string desc = constant ? "constant" : "data member";
+ //
+ // isConstant indicates whether a constant or a data member (with a default value) is
+ // being defined.
+ //
- if(type == 0)
+ if(!type)
{
return false;
}
+ const string desc = isConstant ? "constant" : "data member";
+
+ //
+ // If valueType is a ConstPtr, it means the constant or data member being defined
+ // refers to another constant.
+ //
+ const ConstPtr constant = ConstPtr::dynamicCast(valueType);
+
//
// First verify that it is legal to specify a constant or default value for the given type.
//
@@ -2302,7 +2313,7 @@ Slice::Container::validateConstant(const string& name, const TypePtr& type, cons
break;
default:
{
- if(constant)
+ if(isConstant)
{
_unit->error("constant `" + name + "' has illegal type: `" + b->kindAsString() + "'");
}
@@ -2317,7 +2328,7 @@ Slice::Container::validateConstant(const string& name, const TypePtr& type, cons
}
else if(!e)
{
- if(constant)
+ if(isConstant)
{
_unit->error("constant `" + name + "' has illegal type");
}
@@ -2334,13 +2345,28 @@ Slice::Container::validateConstant(const string& name, const TypePtr& type, cons
if(b)
{
+ BuiltinPtr lt;
+
+ if(constant)
+ {
#if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x530)
- // Strange Sun C++ 5.3 bug.
- const IceUtil::HandleBase<SyntaxTreeBase>& hb = literalType;
- BuiltinPtr lt = BuiltinPtr::dynamicCast(hb);
+ // Strange Sun C++ 5.3 bug.
+ const IceUtil::HandleBase<SyntaxTreeBase>& hb = constant->type();
+ lt = BuiltinPtr::dynamicCast(hb);
#else
- BuiltinPtr lt = BuiltinPtr::dynamicCast(literalType);
+ lt = BuiltinPtr::dynamicCast(constant->type());
#endif
+ }
+ else
+ {
+#if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x530)
+ // Strange Sun C++ 5.3 bug.
+ const IceUtil::HandleBase<SyntaxTreeBase>& hb = valueType;
+ lt = BuiltinPtr::dynamicCast(hb);
+#else
+ lt = BuiltinPtr::dynamicCast(valueType);
+#endif
+ }
if(lt)
{
@@ -2360,18 +2386,34 @@ Slice::Container::validateConstant(const string& name, const TypePtr& type, cons
case Builtin::KindInt:
case Builtin::KindLong:
{
- if(lt->kind() != Builtin::KindLong)
+ switch(lt->kind())
{
+ case Builtin::KindByte:
+ case Builtin::KindShort:
+ case Builtin::KindInt:
+ case Builtin::KindLong:
+ break;
+ default:
ok = false;
+ break;
}
break;
}
case Builtin::KindFloat:
case Builtin::KindDouble:
{
- if(lt->kind() != Builtin::KindDouble)
+ switch(lt->kind())
{
+ case Builtin::KindByte:
+ case Builtin::KindShort:
+ case Builtin::KindInt:
+ case Builtin::KindLong:
+ case Builtin::KindFloat:
+ case Builtin::KindDouble:
+ break;
+ default:
ok = false;
+ break;
}
break;
}
@@ -2383,7 +2425,6 @@ Slice::Container::validateConstant(const string& name, const TypePtr& type, cons
}
break;
}
-
case Builtin::KindObject:
case Builtin::KindObjectProxy:
case Builtin::KindLocalObject:
@@ -2457,19 +2498,33 @@ Slice::Container::validateConstant(const string& name, const TypePtr& type, cons
if(e)
{
- EnumeratorPtr lte = EnumeratorPtr::dynamicCast(literalType);
- if(!lte)
+ if(constant)
{
- string msg = "type of initializer is incompatible with the type of " + desc + " `" + name + "'";
- _unit->error(msg);
- return false;
+ EnumPtr ec = EnumPtr::dynamicCast(constant->type());
+ if(e != ec)
+ {
+ string msg = "type of initializer is incompatible with the type of " + desc + " `" + name + "'";
+ _unit->error(msg);
+ return false;
+ }
}
- EnumeratorList elist = e->getEnumerators();
- if(find(elist.begin(), elist.end(), lte) == elist.end())
+ else
{
- string msg = "enumerator `" + value + "' is not defined in enumeration `" + e->scoped() + "'";
- _unit->error(msg);
- return false;
+ EnumeratorPtr lte = EnumeratorPtr::dynamicCast(valueType);
+
+ if(!lte)
+ {
+ string msg = "type of initializer is incompatible with the type of " + desc + " `" + name + "'";
+ _unit->error(msg);
+ return false;
+ }
+ EnumeratorList elist = e->getEnumerators();
+ if(find(elist.begin(), elist.end(), lte) == elist.end())
+ {
+ string msg = "enumerator `" + value + "' is not defined in enumeration `" + e->scoped() + "'";
+ _unit->error(msg);
+ return false;
+ }
}
}
@@ -2954,7 +3009,7 @@ Slice::ClassDef::createOperation(const string& name,
}
DataMemberPtr
-Slice::ClassDef::createDataMember(const string& name, const TypePtr& type, const SyntaxTreeBasePtr& defaultLiteralType,
+Slice::ClassDef::createDataMember(const string& name, const TypePtr& type, const SyntaxTreeBasePtr& defaultValueType,
const string& defaultValue, const string& defaultLiteral)
{
checkIdentifier(name);
@@ -3077,7 +3132,7 @@ Slice::ClassDef::createDataMember(const string& name, const TypePtr& type, const
_unit->error(msg);
}
- SyntaxTreeBasePtr dlt = defaultLiteralType;
+ SyntaxTreeBasePtr dlt = defaultValueType;
string dv = defaultValue;
string dl = defaultLiteral;
@@ -3335,7 +3390,7 @@ Slice::ClassDef::hasDefaultValues() const
DataMemberList dml = dataMembers();
for(DataMemberList::const_iterator i = dml.begin(); i != dml.end(); ++i)
{
- if((*i)->hasDefaultValue())
+ if((*i)->defaultValueType())
{
return true;
}
@@ -3462,7 +3517,7 @@ Slice::Exception::destroy()
}
DataMemberPtr
-Slice::Exception::createDataMember(const string& name, const TypePtr& type, const SyntaxTreeBasePtr& defaultLiteralType,
+Slice::Exception::createDataMember(const string& name, const TypePtr& type, const SyntaxTreeBasePtr& defaultValueType,
const string& defaultValue, const string& defaultLiteral)
{
checkIdentifier(name);
@@ -3574,7 +3629,7 @@ Slice::Exception::createDataMember(const string& name, const TypePtr& type, cons
_unit->error(msg);
}
- SyntaxTreeBasePtr dlt = defaultLiteralType;
+ SyntaxTreeBasePtr dlt = defaultValueType;
string dv = defaultValue;
string dl = defaultLiteral;
@@ -3764,7 +3819,7 @@ Slice::Exception::hasDefaultValues() const
DataMemberList dml = dataMembers();
for(DataMemberList::const_iterator i = dml.begin(); i != dml.end(); ++i)
{
- if((*i)->hasDefaultValue())
+ if((*i)->defaultValueType())
{
return true;
}
@@ -3803,7 +3858,7 @@ Slice::Exception::Exception(const ContainerPtr& container, const string& name, c
// ----------------------------------------------------------------------
DataMemberPtr
-Slice::Struct::createDataMember(const string& name, const TypePtr& type, const SyntaxTreeBasePtr& defaultLiteralType,
+Slice::Struct::createDataMember(const string& name, const TypePtr& type, const SyntaxTreeBasePtr& defaultValueType,
const string& defaultValue, const string& defaultLiteral)
{
checkIdentifier(name);
@@ -3897,7 +3952,7 @@ Slice::Struct::createDataMember(const string& name, const TypePtr& type, const S
_unit->error(msg);
}
- SyntaxTreeBasePtr dlt = defaultLiteralType;
+ SyntaxTreeBasePtr dlt = defaultValueType;
string dv = defaultValue;
string dl = defaultLiteral;
@@ -4021,7 +4076,7 @@ Slice::Struct::hasDefaultValues() const
DataMemberList dml = dataMembers();
for(DataMemberList::const_iterator i = dml.begin(); i != dml.end(); ++i)
{
- if((*i)->hasDefaultValue())
+ if((*i)->defaultValueType())
{
return true;
}
@@ -4482,6 +4537,12 @@ Slice::Const::typeMetaData() const
return _typeMetaData;
}
+SyntaxTreeBasePtr
+Slice::Const::valueType() const
+{
+ return _valueType;
+}
+
string
Slice::Const::value() const
{
@@ -4520,11 +4581,13 @@ Slice::Const::visit(ParserVisitor* visitor, bool)
}
Slice::Const::Const(const ContainerPtr& container, const string& name, const TypePtr& type,
- const StringList& typeMetaData, const string& value, const string& literal) :
+ const StringList& typeMetaData, const SyntaxTreeBasePtr& valueType, const string& value,
+ const string& literal) :
SyntaxTreeBase(container->unit()),
Contained(container, name),
_type(type),
_typeMetaData(typeMetaData),
+ _valueType(valueType),
_value(value),
_literal(literal)
{
@@ -5026,12 +5089,6 @@ Slice::DataMember::type() const
return _type;
}
-bool
-Slice::DataMember::hasDefaultValue() const
-{
- return _hasDefaultValue;
-}
-
string
Slice::DataMember::defaultValue() const
{
@@ -5044,6 +5101,12 @@ Slice::DataMember::defaultLiteral() const
return _defaultLiteral;
}
+SyntaxTreeBasePtr
+Slice::DataMember::defaultValueType() const
+{
+ return _defaultValueType;
+}
+
Contained::ContainedType
Slice::DataMember::containedType() const
{
@@ -5075,11 +5138,12 @@ Slice::DataMember::visit(ParserVisitor* visitor, bool)
}
Slice::DataMember::DataMember(const ContainerPtr& container, const string& name, const TypePtr& type,
- bool hasDefaultValue, const string& defaultValue, const string& defaultLiteral) :
+ const SyntaxTreeBasePtr& defaultValueType, const string& defaultValue,
+ const string& defaultLiteral) :
SyntaxTreeBase(container->unit()),
Contained(container, name),
_type(type),
- _hasDefaultValue(hasDefaultValue),
+ _defaultValueType(defaultValueType),
_defaultValue(defaultValue),
_defaultLiteral(defaultLiteral)
{