Thread overview
[Issue 9055] New: Compiler bails out on initializing a variable
Nov 22, 2012
Manfred Nowak
Nov 22, 2012
Manfred Nowak
Nov 22, 2012
Manfred Nowak
Nov 22, 2012
Manfred Nowak
[Issue 9055] [CTFE] Compiler segfaults on paren-free auto-return forward referenced member function call on nonexistent 'this' receiver
Nov 23, 2012
timon.gehr@gmx.ch
[Issue 9055] Compiler segfaults on forward reference to auto-return member function
Jan 04, 2013
Don
Jan 04, 2013
Don
Jan 04, 2013
timon.gehr@gmx.ch
Oct 07, 2013
Walter Bright
November 22, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=9055

           Summary: Compiler bails out on initializing a variable
           Product: D
           Version: D2
          Platform: x86
        OS/Version: Windows
            Status: NEW
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: nobody@puremagic.com
        ReportedBy: svv1999@hotmail.com


--- Comment #0 from Manfred Nowak <svv1999@hotmail.com> 2012-11-22 04:11:31 PST ---
Created an attachment (id=1164)
the source

On compiling with the `-debug' option, i.e. initializing the variable, the compiler evokes an exception.

Without `-debug', i.e. _not_ initializing the variable, compilation ends flawlessly.

-manfred

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
November 22, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=9055


bearophile_hugs@eml.cc changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |bearophile_hugs@eml.cc


--- Comment #1 from bearophile_hugs@eml.cc 2012-11-22 04:21:03 PST ---
Is this a valid reduction of your code?


class Foo {
    int bar() {
        return 0;
    }
    int x = bar();
}
void main() {}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
November 22, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=9055


Manfred Nowak <svv1999@hotmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Attachment #1164|application/octet-stream    |text/plain
          mime type|                            |


-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
November 22, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=9055



--- Comment #2 from Manfred Nowak <svv1999@hotmail.com> 2012-11-22 04:42:51 PST ---
My text seems to be lost. Retry:

On compiling with `-debug' dmd 2.060 evokes an exception on winXp x86 with all updates.

Without `-debug', i.e without initializing the variable, no comülaints.

-manfred

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
November 22, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=9055



--- Comment #3 from Manfred Nowak <svv1999@hotmail.com> 2012-11-22 05:09:15 PST ---
(In reply to comment #1)
> Is this a valid reduction of your code?
>     int bar() {
>     int x = bar();

Not at first glance.

1)
In your code the missing `this' is declared as the root of the bug report. In
my code `this' is present.

2)
In your code reversing the lexical sequence of call and declaration does not
change the error message. In my code reversing eliminates the bailing out. In
addition no error is reported.

-manfred

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
November 23, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=9055


timon.gehr@gmx.ch changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |CTFE
                 CC|                            |timon.gehr@gmx.ch
            Summary|Compiler bails out on       |[CTFE] Compiler segfaults
                   |initializing a variable     |on paren-free auto-return
                   |                            |forward referenced member
                   |                            |function call on
                   |                            |nonexistent 'this' receiver


--- Comment #4 from timon.gehr@gmx.ch 2012-11-23 05:53:32 PST ---
Reduced test case:

class C{
    enum a=this.b;
    auto b(){ return 0; }
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
January 04, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=9055


Don <clugdbug@yahoo.com.au> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|CTFE                        |ice
            Summary|[CTFE] Compiler segfaults   |Compiler segfaults on
                   |on paren-free auto-return   |forward reference to
                   |forward referenced member   |auto-return member function
                   |function call on            |
                   |nonexistent 'this' receiver |


--- Comment #5 from Don <clugdbug@yahoo.com.au> 2013-01-04 02:00:12 PST ---
This is not a CTFE bug. Here is an example which doesn't use CTFE, properties, or invalid use of 'this':
---
class C
{
    enum a = typeof(this.b()).init;
    static auto b(){ return 0; }
}

---
If in any of these examples you replace this.b() by simply b(), you get a
"forward reference to b" error message.

Here's a basic patch to do the same thing in this case. I'm not really happy
with it though, the errors for b() and this.b() should be generated in the same
function.

-- a/src/expression.c
+++ b/src/expression.c
@@ -929,6 +929,11 @@ Type *functionParameters(Loc loc, Scope *sc, TypeFunction
*tf,
     if (!tf->next && fd->inferRetType)
     {
         TemplateInstance *spec = fd->isSpeculative();
+        if ( fd->semanticRun < PASSsemanticdone )
+        {   // We haven't run semantic() yet, eg bug 9055.
+            error(loc, "forward reference to %s", fd->toChars());
+            return Type::terror;
+        }
         int olderrs = global.errors;
         // If it isn't speculative, we need to show errors
         unsigned oldgag = global.gag;

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
January 04, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=9055



--- Comment #6 from Don <clugdbug@yahoo.com.au> 2013-01-04 02:04:17 PST ---
Better test case:

class Bug9055
{
    typeof( Bug9055.b() ) x;
    auto b(){ return 0; }
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
January 04, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=9055



--- Comment #7 from timon.gehr@gmx.ch 2013-01-04 10:22:07 PST ---
(In reply to comment #5)
> This is not a CTFE bug. Here is an example which doesn't use CTFE, properties, or invalid use of 'this':
> ---
> class C
> {
>     enum a = typeof(this.b()).init;
>     static auto b(){ return 0; }
> }
> 
> ---
> If in any of these examples you replace this.b() by simply b(), you get a
> "forward reference to b" error message.
> 

But forward references are allowed. This is another bug.

> Here's a basic patch to do the same thing in this case. I'm not really happy
> with it though, the errors for b() and this.b() should be generated in the same
> function.
> ...

Both cases are valid D code. No error should be generated in either case.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
October 07, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=9055


Walter Bright <bugzilla@digitalmars.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
                 CC|                            |bugzilla@digitalmars.com
         Resolution|                            |WORKSFORME


--- Comment #8 from Walter Bright <bugzilla@digitalmars.com> 2013-10-06 23:59:42 PDT ---
The attachment code:
---------------------------
import std.array: Appender;
class Silent{
  debug
    private Appender!string retval= this.ini;
  else
    private Appender!string retval;
  auto ini(){
    return Appender!string("");
  }
}
void main(){
}
--------------------------
dmd test
test.d(8): Error: constructor std.array.Appender!string.Appender.this (char[]
arr) is not callable using argument types (string)

dmd test -debug
test.d(8): Error: constructor std.array.Appender!string.Appender.this (char[]
arr) is not callable using argument types (string)
---------------------------

No seg faults on this or the other examples. If there's some other issue, please open a separate issue.

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