[Issue 15671] New: The compiler should take into account inline pragmas when inlining

via Digitalmars-d-bugs digitalmars-d-bugs at puremagic.com
Wed Feb 10 14:28:17 PST 2016


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

          Issue ID: 15671
           Summary: The compiler should take into account inline pragmas
                    when inlining
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Keywords: rejects-valid
          Severity: enhancement
          Priority: P1
         Component: dmd
          Assignee: nobody at puremagic.com
          Reporter: schveiguy at yahoo.com

Given the following code:
import std.random;
shared int x;
void longFunc()
{
    version(good)
       x = uniform!int();
    x = uniform!int();
    x = uniform!int();
    x = uniform!int();
    x = uniform!int();
    x = uniform!int();
    x = uniform!int();
} 

void foo(alias func)()
{
    pragma(inline, true);
    func();
    x = uniform!int();
}

void main()
{
    foo!longFunc();
}

The compiler fails if passed the -inline command line switch. However, it
succeeds if -inline -version=good is passed

Here is what happens:

1. The compiler inlines longFunc into foo (perhaps even calls to uniform as
well)
2. The compiler tries to inline foo into main, but fails because of the inlined
call to longFunc.
3. Since pragma(inline, true) is specified for foo, this fails to compile.

However, the compiler could succeed inlining foo into main by not inlining
longFunc into foo first.

This is demonstrated by the version=good compilation (one extra call to uniform
prevents longFunc from being inlined)

--


More information about the Digitalmars-d-bugs mailing list