www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 3294] New: forward reference to inferred return type of function call

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

           Summary: forward reference to inferred return type of function
                    call
           Product: D
           Version: 2.031
          Platform: Other
        OS/Version: Windows
            Status: NEW
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: nobody puremagic.com
        ReportedBy: 2korden gmail.com


module Test;

struct SomeInfiniteRange
{
    int front() { return 42; }
    enum empty = false;

    void popFront() {}
}

struct SomeContainer(T)
{
    auto opSlice()
    {
        return SomeInfiniteRange();
    }
}

class Test
{
    void test()
    {
        foreach (int f; _foo[]) {
            // do nothing
        }
    }

    private SomeContainer!(int) _foo;
}

Test.d(23): Error: forward reference to inferred return type of function call
this._foo.opSlice()
Test.d(23): Error: foreach: int is not an aggregate type

Note that the code compiles just fine if SomeContainer is a concrete struct
(not a template)

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Sep 03 2009
next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=3294


Rainer Schuetze <r.sagitario gmx.de> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |patch, rejects-valid
                 CC|                            |r.sagitario gmx.de


--- Comment #1 from Rainer Schuetze <r.sagitario gmx.de> 2010-05-11 13:23:29
PDT ---
This one is a similar to #2810, i.e. the type inferring of the function is
missing. The patch is a bit more complicated, though, because the function
declaration is not available were it is needed, so it has to be added as an
argument to functionParameters():

Index: expression.c
===================================================================
--- expression.c    (revision 483)
+++ expression.c    (working copy)
   -642,7 +642,7   
  */

 Type *functionParameters(Loc loc, Scope *sc, TypeFunction *tf,
-        Expressions *arguments)
+        Expressions *arguments, FuncDeclaration* fd)
 {
     //printf("functionParameters()\n");
     assert(arguments);
   -931,6 +931,11   
                 arguments->dim - nparams);
         arguments->insert(0, e);
     }
+
+    // if inferring return type, semantic3 needs to be run
+    if(!tf->next && fd->inferRetType)
+        fd->semantic3(fd->scope);
+
     Type *tret = tf->next;
     if (wildmatch)
     {   /* Adjust function return type based on wildmatch
   -3972,7 +3977,7   

             if (!arguments)
                 arguments = new Expressions();
-            functionParameters(loc, sc, tf, arguments);
+            functionParameters(loc, sc, tf, arguments, f);

             type = type->addMod(tf->nextOf()->mod);
         }
   -3997,7 +4002,7   
             assert(allocator);

             tf = (TypeFunction *)f->type;
-            functionParameters(loc, sc, tf, newargs);
+            functionParameters(loc, sc, tf, newargs, f);
         }
         else
         {
   -4029,7 +4034,7   

             if (!arguments)
                 arguments = new Expressions();
-            functionParameters(loc, sc, tf, arguments);
+            functionParameters(loc, sc, tf, arguments, f);
         }
         else
         {
   -4053,7 +4058,7   
             assert(allocator);

             tf = (TypeFunction *)f->type;
-            functionParameters(loc, sc, tf, newargs);
+            functionParameters(loc, sc, tf, newargs, f);
 #if 0
             e = new VarExp(loc, f);
             e = new CallExp(loc, e, newargs);
   -7254,7 +7259,7   

     if (!arguments)
         arguments = new Expressions();
-    type = functionParameters(loc, sc, tf, arguments);
+    type = functionParameters(loc, sc, tf, arguments, f);

     if (!type)
     {

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 11 2010
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=3294


David Simcha <dsimcha yahoo.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
                 CC|                            |dsimcha yahoo.com
         Resolution|                            |FIXED


--- Comment #2 from David Simcha <dsimcha yahoo.com> 2010-08-10 20:57:34 PDT ---
Fixed 2.048

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Aug 10 2010
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=3294


Walter Bright <bugzilla digitalmars.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|RESOLVED                    |REOPENED
                 CC|                            |bugzilla digitalmars.com
         Resolution|FIXED                       |


--- Comment #3 from Walter Bright <bugzilla digitalmars.com> 2010-08-10
21:19:36 PDT ---
Although the test case works now, the bug isn't fixed properly. I need to undo
my fix and use Rainer's.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Aug 10 2010
prev sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=3294


Walter Bright <bugzilla digitalmars.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|REOPENED                    |RESOLVED
         Resolution|                            |FIXED


--- Comment #4 from Walter Bright <bugzilla digitalmars.com> 2010-08-11
23:11:06 PDT ---
http://www.dsource.org/projects/dmd/changeset/616

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Aug 11 2010