changeset 834:f466f475b654

Added proper "need 'this' to access member foo" errors instead of "variable foo not resolved" for some cases, added FIXME for the old error! Added a bit more information to the runtime's cyclic dependency detection exception.
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Tue, 09 Dec 2008 01:56:39 +0100
parents 482cd74d1c71
children 3afe9f276db7
files gen/toir.cpp runtime/internal/genobj.d
diffstat 2 files changed, 17 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/gen/toir.cpp	Sun Dec 07 16:43:20 2008 +0100
+++ b/gen/toir.cpp	Tue Dec 09 01:56:39 2008 +0100
@@ -56,10 +56,18 @@
     LOG_SCOPE;
 
     assert(var);
+
     if (VarDeclaration* vd = var->isVarDeclaration())
     {
         Logger::println("VarDeclaration ' %s ' of type ' %s '", vd->toChars(), vd->type->toChars());
 
+        // this is an error! must be accessed with DotVarExp
+        if (var->needThis())
+        {
+            error("need 'this' to access member %s", toChars());
+            fatal();
+        }
+
         // _arguments
         if (vd->ident == Id::_arguments && p->func()->_arguments)
         {
@@ -144,6 +152,9 @@
             LLValue* val;
 
             if (!vd->ir.isSet() || !(val = vd->ir.getIrValue())) {
+                // FIXME: this error is bad!
+                // We should be VERY careful about adding errors in general, as they have
+                // a tendency to "mask" out the underlying problems ...
                 error("variable %s not resolved", vd->toChars());
                 if (Logger::enabled())
                     Logger::cout() << "unresolved variable had type: " << *DtoType(vd->type) << '\n';
--- a/runtime/internal/genobj.d	Sun Dec 07 16:43:20 2008 +0100
+++ b/runtime/internal/genobj.d	Tue Dec 09 01:56:39 2008 +0100
@@ -1060,7 +1060,7 @@
     _moduleinfo_dtors = new ModuleInfo[_moduleinfo_array.length];
     debug(PRINTF) printf("_moduleinfo_dtors = x%x\n", cast(void *)_moduleinfo_dtors);
     _moduleIndependentCtors();
-    _moduleCtor2(_moduleinfo_array, 0);
+    _moduleCtor2(null, _moduleinfo_array, 0);
 }
 
 extern (C) void _moduleIndependentCtors()
@@ -1076,7 +1076,7 @@
     debug(PRINTF) printf("_moduleIndependentCtors() DONE\n");
 }
 
-void _moduleCtor2(ModuleInfo[] mi, int skip)
+void _moduleCtor2(ModuleInfo from, ModuleInfo[] mi, int skip)
 {
     debug(PRINTF) printf("_moduleCtor2(): %d modules\n", mi.length);
     for (uint i = 0; i < mi.length; i++)
@@ -1096,11 +1096,12 @@
             if (m.flags & MIctorstart)
             {   if (skip || m.flags & MIstandalone)
                     continue;
-                    throw new Exception( "Cyclic dependency in module " ~ m.name );
+                assert(from !is null);
+                throw new Exception( "Cyclic dependency in module " ~ from.name ~ " for import " ~ m.name);
             }
 
             m.flags |= MIctorstart;
-            _moduleCtor2(m.importedModules, 0);
+            _moduleCtor2(m, m.importedModules, 0);
             if (m.ctor)
                 (*m.ctor)();
             m.flags &= ~MIctorstart;
@@ -1114,7 +1115,7 @@
         else
         {
             m.flags |= MIctordone;
-            _moduleCtor2(m.importedModules, 1);
+            _moduleCtor2(m, m.importedModules, 1);
         }
     }
     debug(PRINTF) printf("_moduleCtor2() DONE\n");