charmxi: Throw an error when declaring a constructor as [threaded] 48/4948/3
authorEvan Ramos <evan@hpccharm.com>
Tue, 12 Feb 2019 20:55:41 +0000 (14:55 -0600)
committerRonak Buch <rabuch2@illinois.edu>
Thu, 14 Feb 2019 18:49:34 +0000 (12:49 -0600)
Change-Id: I4eb31f4178200a1fbdcfc08d429ba4028dc495ea

src/xlat-i/xi-Entry.C

index c44ac6672058a18cdf152925ab17f1dc48b2927d..5c42a75199293e0a784be581f9b3d78034ab8072 100644 (file)
@@ -2324,6 +2324,9 @@ void Entry::genClosure(XStr& decls, bool isDef) {
 // It ends the current procedure with a call to awaken another thread,
 // and defines the thread function to handle that call.
 XStr Entry::callThread(const XStr& procName, int prependEntryName) {
+  if (isConstructor() || isMigrationConstructor())
+    die("Constructors may not be 'threaded'", first_line_);
+
   XStr str, procFull;
   procFull << "_callthr_";
   if (prependEntryName) procFull << name << "_";
@@ -2342,8 +2345,9 @@ XStr Entry::callThread(const XStr& procName, int prependEntryName) {
   str << makeDecl("void") << "::" << procFull << "(CkThrCallArg *impl_arg)\n";
   str << "{\n";
   str << "  void *impl_msg = impl_arg->msg;\n";
-  str << "  " << container->baseName() << " *impl_obj = (" << container->baseName()
-      << " *) impl_arg->obj;\n";
+  str << "  void *impl_obj_void = impl_arg->obj;\n";
+  str << "  " << container->baseName() << " *impl_obj = static_cast<"
+      << container->baseName() << " *>(impl_obj_void);\n";
   str << "  delete impl_arg;\n";
   return str;
 }