charmxi: report an error when a non-constructor is missing a return type, rather...
authorPhil Miller <mille121@illinois.edu>
Sun, 30 Sep 2012 19:48:26 +0000 (14:48 -0500)
committerPhil Miller <mille121@illinois.edu>
Sun, 30 Sep 2012 20:20:56 +0000 (15:20 -0500)
src/xlat-i/xi-main.C
src/xlat-i/xi-symbol.C
src/xlat-i/xi-symbol.h

index 53bb2a26e7175d8c5dfda2cc770a10ed5386f2cb..fcc801b52112071269cff81cf541359839b57c20 100644 (file)
@@ -169,6 +169,7 @@ int main(int argc, char *argv[])
   ModuleList *m = Parse(openFile(fname)) ;
   if (!m) return 0;
   m->preprocess();
+  m->check();
   if (dependsMode)
   {
       std::string ciFileBaseName = fname;
index 9024c1947fcb4490e86937e269f0e4fb0c2560f6..09f03ed4765423ce5d4b5300a7a4b328a63d183f 100644 (file)
@@ -488,6 +488,39 @@ Module::print(XStr& str)
   }
 }
 
+void Module::check() {
+  if (clist)
+    clist->check();
+}
+
+void ConstructList::check() {
+  perElem(constructs, &Construct::check);
+}
+
+void Scope::check() {
+  if (contents_)
+    contents_->check();
+}
+
+void Entry::check() {
+  if (!external) {
+    if(isConstructor() && retType && !retType->isVoid())
+      die("Constructors cannot return a value",line);
+
+    if (!isConstructor() && !retType)
+      die("Non-constructor entry methods must specify a return type (probably void)", line);
+  }
+}
+
+void Chare::check() {
+  if (list)
+    list->check();
+}
+
+void MemberList::check() {
+  perElem(members, &Member::check);
+}
+
 void
 Module::generate()
 {
@@ -662,6 +695,12 @@ ModuleList::generate()
   perElem(modules, &Module::generate);
 }
 
+void
+ModuleList::check()
+{
+  perElem(modules, &Module::check);
+}
+
 void
 ModuleList::preprocess()
 {
@@ -4140,9 +4179,6 @@ void Entry::genDecls(XStr& str)
   if (external)
     return;
 
-  if(isConstructor() && retType && !retType->isVoid())
-    die("Constructors cannot return a value",line);
-
   str << "/* DECLS: "; print(str); str << " */\n";
   if(retType==0 && !isConstructor())
     die("Entry methods must specify a return type-- \n"
index 1493dd21fad5006bbe791702652d197beef25488..804088b0be2be8940c074ee3274d23ad7e17e9f8 100644 (file)
@@ -108,6 +108,7 @@ class Construct : public Printable {
     virtual void genDefs(XStr& str) { (void)str; }
     virtual void genReg(XStr& str) { (void)str; }
     virtual void preprocess() { }
+    virtual void check() { }
 
     // DMK - Accel Support
     virtual int genAccels_spe_c_funcBodies(XStr& str) { (void)str; return 0; }
@@ -125,6 +126,7 @@ class ConstructList : public Construct {
     void setExtern(int e);
     void setModule(Module *m);
     void print(XStr& str);
+    void check();
     void genPub(XStr& declstr, XStr& defstr, XStr& defconstr, int& connectPresent);
     void genDecls(XStr& str);
     void genDefs(XStr& str);
@@ -489,6 +491,7 @@ class Scope : public Construct {
         contents_->print(str);
         str << "} // namespace " << name_ << "\n";
     }
+    void check();
 
     // DMK - Accel Support
     virtual int genAccels_spe_c_funcBodies(XStr& str) {
@@ -663,6 +666,7 @@ class MemberList : public Printable {
     void genDefs(XStr& str);
     void genReg(XStr& str);
     void preprocess();
+    void check();
 
     // DMK - Accel Support
     int genAccels_spe_c_funcBodies(XStr& str);
@@ -741,6 +745,7 @@ class Chare : public TEntity {
     void  setSdag(int f) { hasSdagEntry = f; }
     forWhom getForWhom(void) const {return forElement;}
     void print(XStr& str);
+    void check();
     void genDefs(XStr& str);
     void genReg(XStr& str);
     void genPub(XStr& declstr, XStr& defstr, XStr& defconstr, int& connectPresent);
@@ -1033,6 +1038,7 @@ class Entry : public Member {
     int isReductionTarget(void) { return (attribs & SREDUCE); }
 
     void print(XStr& str);
+    void check();
     void genIndexDecls(XStr& str);
     void genPub(XStr& declstr, XStr& defstr, XStr& defconstr, int& connectPresent);
     void genDecls(XStr& str);
@@ -1107,6 +1113,7 @@ class Module : public Construct {
            if (clist!=NULL) clist->setModule(this);
     }
     void print(XStr& str);
+    void check();
     void generate();
     void setModule();
     void prependConstruct(Construct *c) { clist = new ConstructList(-1, c, clist); }
@@ -1140,6 +1147,7 @@ class ModuleList : public Printable {
                               n->modules.begin(), n->modules.end());
        }
     void print(XStr& str);
+    void check();
     void generate();
     void preprocess();
     void genDepends(std::string ciFileBaseName);