D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 3238 - Template function reference being made without the template body being generated
Summary: Template function reference being made without the template body being generated
Status: RESOLVED WORKSFORME
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D2
Hardware: x86 Windows
: P2 major
Assignee: No Owner
URL:
Keywords: ice-on-invalid-code
Depends on:
Blocks:
 
Reported: 2009-08-09 20:53 UTC by Burton Radons
Modified: 2015-06-09 01:28 UTC (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description Burton Radons 2009-08-09 20:53:24 UTC
Given these two files (noting that the original file didn't have an error in it, it just allowed me to cut it down further), a.d:

  struct S (T)
  {
    void m ()
    {
      intentional mistake;
    }
  }

  S! (T) f (T) ()
  {
    return S! (T) ();
  }

b.d:

  import a;

  void main ()
  {
    f! (char) ().m ();
  }

Compile them separately then link them together. The link fails because b.obj has a reference to _D1a8__T1STaZ1S1mMFZv but doesn't have a COMDAT for it (not that it could compile it).
Comment 1 Burton Radons 2009-08-09 22:22:42 UTC
It turns out that there actually was a problem with the template; oddly enough the problem was one that causes the compiler to crash, unlike the banal semantic error here. So having invalid code appears to be a prerequisite for this problem to manifest.
Comment 2 Gide Nwawudu 2010-05-17 19:00:18 UTC
Works in DMD v2.046.

D:\test>dmd a.d b.d
a.d(5): Error: identifier 'intentional' is not defined
a.d(5): Error: intentional is used as a type
a.d(9): Error: template instance a.S!(char) error instantiating
b.d(5):        instantiated from here: f!(char)