diff dmd/statement.c @ 275:665b81613475 trunk

[svn r296] Removed: the 'suite' dir, it never took off! Fixed: foreach statement, key-type checks were buggy. Fixed: setting LLVMDC versions on the command line is now an error. Fixed: array compare runtime had incorrect param attrs on call. Fixed: index expressions on dynamic array slices w/o storage was broken. Fixed: scope classes had incorrect finalization in some cases. Fixed: when outputting !ClassInfoS !OffsetTypeInfoS, static class members were trying to be included, crashing the compiler. Fixed: calling LLVMDC with -inline but not any -O option caused assertion failure. Changed: the runtime now uses a single interface to "get" to !TypeInfoS, part of eliminating duplicate !TypeInfo codegen.
author lindquist
date Thu, 19 Jun 2008 17:30:32 +0200
parents 88252a1af660
children 3ebc136702dd
line wrap: on
line diff
--- a/dmd/statement.c	Thu Jun 19 13:54:31 2008 +0200
+++ b/dmd/statement.c	Thu Jun 19 17:30:32 2008 +0200
@@ -1180,12 +1180,17 @@
 		if (arg->storageClass & (STCout | STCref | STClazy))
 		    error("no storage class for key %s", arg->ident->toChars());
 		TY keyty = arg->type->ty;
-		if ((keyty != Tint32 && keyty != Tuns32) &&
-		    (global.params.is64bit && keyty != Tint64 && keyty != Tuns64)
-		   )
-		{
-		    error("foreach: key type must be %s, not %s", global.params.is64bit ? "int, uint, long or ulong" : "int or uint",arg->type->toChars());
-		}
+        if (global.params.is64bit)
+        {
+            if (keyty != Tint32 && keyty != Tuns32 && keyty != Tint64 && keyty != Tuns64)
+            {
+                error("foreach: key type must be int, uint, long or ulong, not %s", key->type->toChars());
+            }
+        }
+        else if (keyty != Tint32 && keyty != Tuns32)
+        {
+            error("foreach: key type must be int or uint, not %s", key->type->toChars());
+        }
 		Initializer *ie = new ExpInitializer(0, new IntegerExp(k));
 		VarDeclaration *var = new VarDeclaration(loc, arg->type, arg->ident, ie);
 		var->storage_class |= STCconst;
@@ -1320,14 +1325,20 @@
 		    error("foreach: %s is not an array of %s", tab->toChars(), value->type->toChars());
 	    }
 
-	    if (key &&
-		((key->type->ty != Tint32 && key->type->ty != Tuns32) &&
-		 (global.params.is64bit && key->type->ty != Tint64 && key->type->ty != Tuns64)
-	        )
-	       )
-	    {
-        error("foreach: key type must be %s, not %s", global.params.is64bit ? "int, uint, long or ulong" : "int or uint", key->type->toChars());
-	    }
+        if (key)
+        {
+            if (global.params.is64bit)
+            {
+                if (key->type->ty != Tint32 && key->type->ty != Tuns32 && key->type->ty != Tint64 && key->type->ty != Tuns64)
+                {
+                    error("foreach: key type must be int, uint, long or ulong, not %s", key->type->toChars());
+                }
+            }
+            else if (key->type->ty != Tint32 && key->type->ty != Tuns32)
+            {
+                error("foreach: key type must be int or uint, not %s", key->type->toChars());
+            }
+        }
 
 	    if (key && key->storage_class & (STCout | STCref))
 		error("foreach: key cannot be out or ref");