D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 3775 - Segfault(cast.c): casting no-parameter template function using property syntax
Summary: Segfault(cast.c): casting no-parameter template function using property syntax
Status: RESOLVED FIXED
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D1 (retired)
Hardware: x86 Linux
: P2 normal
Assignee: No Owner
URL:
Keywords: ice-on-invalid-code, patch
Depends on:
Blocks:
 
Reported: 2010-02-05 18:36 UTC by Bernard Helyer
Modified: 2014-02-15 13:13 UTC (History)
3 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description Bernard Helyer 2010-02-05 18:36:45 UTC
Apologies if this is a duplicate, I couldn't see anything *obvious*.

I'm sure this is invalid code, but I got on to doing this (don't ask):

---
module segfault;

import std.stdio;

void main()
{
    foreach (line; cast(string) stdin.byLine) {}
}
---

Which leads to:

---
$ dmd segfault
Segmentation fault
---

Needless to say, no object or executable file is produced.
Comment 1 Don 2010-02-09 06:10:02 UTC
Reduced test case also segfaults on D1, even ancient ones like DMD0.175.

struct Bug3775 {    
  static int byLine()()    { return 1;   }
}
   
static assert( cast(int) Bug3775.byLine);

Somehow, in DotIdExp::semantic, it has no type.
Comment 2 Don 2010-02-09 11:28:25 UTC
ROOT CAUSE: This is an interaction between IFTI and property syntax.

PATCH: At the end of CastExp::semantic, make sure that the function has a type.

Index: expression.c
===================================================================
--- expression.c	(revision 373)
+++ expression.c	(working copy)
@@ -7796,7 +7796,11 @@
 
 	// BUG: Check for casting array types, such as void[] to int*[]
     }
-
+    if (!e1->type && e1->op==TOKdottd)
+    {
+	error("%s is a template and cannot be called with property syntax", e1->toChars());
+	return new ErrorExp();
+    }
     e = e1->castTo(sc, to);
     return e;
 }

=====
Some similar cases cause the compiler to do strange things (see below), so I'm not completely satisfied with the patch. But let's just fix the segfault.

struct Bug3775 {
  static int byLine()()    { return 1;   }
}
void main(){ auto xxx = Bug3775.byLine; } // accepted; xxx is an int.
void main(){ int xxx = Bug3775.byLine; } // rejected: (Bug3775).byLine() has no value
Comment 3 Walter Bright 2010-02-11 22:55:17 UTC
changeset 378 and 379
Comment 5 Walter Bright 2010-03-08 22:23:27 UTC
Fixed dmd 1.057 and 2.041