summaryrefslogtreecommitdiff
path: root/cpp/src/Slice/Parser.cpp
diff options
context:
space:
mode:
authorMichi Henning <michi@zeroc.com>2004-10-13 04:44:26 +0000
committerMichi Henning <michi@zeroc.com>2004-10-13 04:44:26 +0000
commit499842ec315c35d931231b61daf02d8998765dc3 (patch)
tree2eed7cd15b8db1d578a39c6694068220cbefadcb /cpp/src/Slice/Parser.cpp
parentadded missing config file (diff)
downloadice-499842ec315c35d931231b61daf02d8998765dc3.tar.bz2
ice-499842ec315c35d931231b61daf02d8998765dc3.tar.xz
ice-499842ec315c35d931231b61daf02d8998765dc3.zip
Made it illegal for non-local interfaces/classes to be derived from
non-local ones.
Diffstat (limited to 'cpp/src/Slice/Parser.cpp')
-rw-r--r--cpp/src/Slice/Parser.cpp22
1 files changed, 11 insertions, 11 deletions
diff --git a/cpp/src/Slice/Parser.cpp b/cpp/src/Slice/Parser.cpp
index 82f90b974cd..70730ee9314 100644
--- a/cpp/src/Slice/Parser.cpp
+++ b/cpp/src/Slice/Parser.cpp
@@ -542,7 +542,7 @@ Slice::Container::createClassDef(const string& name, bool intf, const ClassList&
return 0;
}
- ClassDecl::checkBasesAreLegal(name, local, bases, _unit);
+ ClassDecl::checkBasesAreLegal(name, intf, local, bases, _unit);
ClassDefPtr def = new ClassDef(this, name, intf, bases, local);
_contents.push_back(def);
@@ -2244,21 +2244,21 @@ Slice::ClassDecl::recDependencies(set<ConstructedPtr>& dependencies)
}
void
-Slice::ClassDecl::checkBasesAreLegal(const string& name, bool local, const ClassList& bases, const UnitPtr& unit)
+Slice::ClassDecl::checkBasesAreLegal(const string& name, bool intf, bool local, const ClassList& bases,
+ const UnitPtr& unit)
{
//
- // If this definition is non-local, no base can be local.
+ // Local definitions cannot have non-local bases, and vice versa.
//
- if(!local)
+ for(ClassList::const_iterator p = bases.begin(); p != bases.end(); ++p)
{
- for(ClassList::const_iterator p = bases.begin(); p != bases.end(); ++p)
+ if(local != (*p)->isLocal())
{
- if((*p)->isLocal())
- {
- string msg = "non-local `" + name + "' cannot have base ";
- msg += (*p)->kindOf() + " `" + (*p)->name() + "'";
- unit->error(msg);
- }
+ ostringstream msg;
+ msg << (local ? "local" : "non-local") << " " << (intf ? "interface" : "class") << " `"
+ << name << "' cannot have " << ((*p)->isLocal() ? "local" : "non-local") << " base "
+ << ((*p)->isInterface() ? "interface" : "class") << " `" << (*p)->name() << "'";
+ unit->error(msg.str());
}
}