[Issue 13465] Segfault by eager semantic2 running in template instantiation

via Digitalmars-d-bugs digitalmars-d-bugs at puremagic.com
Tue Sep 23 19:52:39 PDT 2014


https://issues.dlang.org/show_bug.cgi?id=13465

Kenji Hara <k.hara.pg at gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Hardware|x86_64                      |All
            Summary|Segfault in dmd (2.066.0    |Segfault by eager semantic2
                   |and 2.067.0-b1)             |running in template
                   |                            |instantiation
                 OS|Linux                       |All

--- Comment #2 from Kenji Hara <k.hara.pg at gmail.com> ---
Reduced test case:

// [checkpoint.d]
module checkpoint;
import field;
auto createCheckpointMixins()
{
    enum b = isMatchingMaskField!();
}
immutable checkpointMixins = createCheckpointMixins;

// [field.d]
module field;
template isMaskField() { import field; }
template isMatchingMaskField()
{
    enum isMatchingMaskField = isMaskField!();
}

Command line:
dmd -o- checkpoint.d field.d


The route of semantic analysis that starts from the isMatchingMaskField!()
instantiation.

 TemplateInstance('isMaskField!T')->semantic()
  TemplateInstance('isMaskField!T')->semantic2() <---[1]
   Import('import imports.ice1365a;')->semantic2()
    Module('imports.ice1365a')->semantic2()
    
VarDeclaration('imports.ice1365a.isMatchingMaskField!().isMatchingMaskField')->semantic2()
<---[2]

[1] TemplateInstance::semantic() runs its semantic2() always. It was a fix for
the issue 782,  but it violates the semantic analysis invariance, that
semantic2 should be done after semantic completed in each symbols.

[2] The type field is yet NULL, and then ICE happens.

--


More information about the Digitalmars-d-bugs mailing list