3775 – Segfault(cast.c): casting no-parameter template function using property syntax

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
Add an attachment (proposed patch, testcase, etc.)

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 4 Kosmonaut 2010年02月12日 11:46:05 UTC
(In reply to comment #3)
> changeset 378 and 379
http://www.dsource.org/projects/dmd/changeset/378
http://www.dsource.org/projects/dmd/changeset/379 
Comment 5 Walter Bright 2010年03月08日 22:23:27 UTC
Fixed dmd 1.057 and 2.041


AltStyle によって変換されたページ (->オリジナル) /