www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 7449] New: Algebraic's operator[] is incorrect

reply d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=7449

           Summary: Algebraic's operator[] is incorrect
           Product: D
           Version: D2
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: nobody puremagic.com
        ReportedBy: andrei metalanguage.com



20:26:58 PST ---
import std.variant;
import std.stdio;

void main() {
    int[string] o;
    o["foo"] = 42;

    Variant a = o;
    Algebraic!(int[string], string) b = o;

    writeln(a["foo"]);
    writeln(b["foo"]);
}

The last line fails at runtime with an exception.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Feb 05 2012
parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=7449




20:27:44 PST ---
Hans Fugal identified this blames to revision 3a1f9109, this snippet:
   -313,20 +364,23    private:

         case OpID.index:
             auto me = cast(A*) pStore;
-            static if (isArray!(A))
+            // Added allowed!(...) prompted by a bug report by Chris
+            // Nicholson-Sauls.
+            static if (isArray!(A) && allowed!(typeof(A.init[0])))
             {
                 // array type; input and output are the same VariantN 
                 auto result = cast(VariantN*) parm;
                 size_t index = result.convertsTo!(int)
                     ? result.get!(int) : result.get!(size_t);
                 *result = (*me)[index];
-               break;
+                break;
             }
-            else static if (isAssociativeArray!(A))
+            else static if (isAssociativeArray!(A)
+                    && allowed!(typeof(A.init.values[0])))
             {
                 auto result = cast(VariantN*) parm;
                 *result = (*me)[result.get!(typeof(A.keys[0]))];
-               break;
+                break;
             }
             else
             {

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Feb 05 2012