[Issue 21492] New: betterC: TypeInfo is generated for code guarded by if(__ctfe)

d-bugmail at puremagic.com d-bugmail at puremagic.com
Sat Dec 19 19:43:53 UTC 2020


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

          Issue ID: 21492
           Summary: betterC: TypeInfo is generated for code guarded by
                    if(__ctfe)
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Keywords: betterC, CTFE
          Severity: normal
          Priority: P1
         Component: dmd
          Assignee: nobody at puremagic.com
          Reporter: dave287091 at gmail.com

Example code that demonstrates the issue, compiled with dmd and the -betterC
flag

DMD64 D Compiler v2.094.2

int bar(){
    if(__ctfe){
        int[] foo = [1]; // Error: TypeInfo cannot be used with -betterC
    }
    return 0;
}

The same code compiles with ldc without issue.

My understanding of the difference between the two compilers is that ldc
doesn’t generate code at all for `if`s that have compile-time known
constant-expressions with no labels. I don’t know how dmd works, but presumably
it is instead relying on the backend optimizing out the dead branch?

In other words, the __ctfe is not treated as a special case by ldc. The same
result is seen with this code, which compiles with ldc but fails with dmd:

int bar(){
    if(false){
        int[] foo = [1];
    }
    return 0;
}


I’m posting this as an issue as it means that betterC code that compiles with
ldc won’t compile with dmd. betterC is under-specified, so I don’t know if ldc
is being overly-permissive or if dmd is improperly detecting betterC violations
when it attempts to generate code instead of during semantic analysis.

This issue crops up if you want CTFE-able code that calculates something
inefficiently at ctfe while it just calls some external function at runtime.

--


More information about the Digitalmars-d-bugs mailing list