D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 8023 - (Regression git) Methods defined in external object files when template alias parameter is involved
Summary: (Regression git) Methods defined in external object files when template alias...
Status: RESOLVED FIXED
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D1 (retired)
Hardware: All All
: P2 regression
Assignee: No Owner
URL:
Keywords: pull, wrong-code
Depends on:
Blocks:
 
Reported: 2012-05-03 03:31 UTC by Leandro Lucarella
Modified: 2012-05-17 09:21 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 Leandro Lucarella 2012-05-03 03:31:28 UTC
+++ This issue was initially created as a clone of Issue #8016 +++

This looks like a reincarnation of bug 7745, but is different.

Testcase:

m1.d
---
module m1;

import m2;

private void t(alias Code)()
{
    return Code();
}

void f()
{
    t!( () { } )();
}
---

m2.d
---
module m2;
import m1;
---

dmd -c -inline -release -g m2.d && nm m2.o | grep '_D2m11fFZv$'
00000000 T _D2m11fFZv

Which means that _D2m11fFZv (AKA m1.f()) is included in the text
(code) section of m2.o, but it shouldn't, it should only be in m1.d (which I
didn't even compile), otherwise when linking both m1.o and m2.o you'll get a
"multiple definition" error. Symbol _D2m11fFZv should be not present at all in that object file.

Please note that the compiler flags -inline -release has to be used to
reproduce the bug, removing either makes it go away. -O is irrelevant.
Confirmed in both 32 and 64 bits.

This regression was introduced by commit "fix Issue 2962 - ICE(glue.c) or bad
codegen passing variable as template value parameter":
D1: https://github.com/D-Programming-Language/dmd/commit/d5a33a1

This pull request (for D2, expect a small conflict when merging), fixes the problem:
https://github.com/D-Programming-Language/dmd/pull/920
Comment 1 Leandro Lucarella 2012-05-03 04:22:06 UTC
Add a test case for this bug. Even when is not reproducible in D2 right now, maybe is a good idea to have the test case anyway so it doesn't fail in the future as D1 does now.

https://github.com/D-Programming-Language/dmd/pull/922

This includes also this test case, which is also a regression and it's fixed by the pull request. This testcase doesn't need -inline -release to be reproduced though!

m1.d
---
module m1;

import m2;

private void t(alias Code)()
{
    return Code();
}

void f()
{
    t!( () { } )();
}

bool forceSemantic()
{
    f();
    return true;
}

static assert(forceSemantic());
---

m2.d
---
module m2;
import m1;
---
Comment 2 github-bugzilla 2012-05-03 13:27:36 UTC
Commits pushed to master at https://github.com/D-Programming-Language/dmd

https://github.com/D-Programming-Language/dmd/commit/704977f1decd9b2d589bd40431f5d001b0aa6d4e
Add test cases for bug 8023

https://github.com/D-Programming-Language/dmd/commit/c947c201cd59ecb0db618acefe4a528a2d6ee1d5
Merge pull request #922 from llucax/test8023

Add test case for bug 8023
Comment 3 Leandro Lucarella 2012-05-04 01:38:44 UTC
Commit pushed to master at https://github.com/D-Programming-Language/dmd

https://github.com/D-Programming-Language/dmd/commit/d420faebda45eb27596697594a61ecd2a6d3b3d7
Fix issue 8016 Regression Methods defined in external object files when
template alias parameter is involved

Make the fix for bug 2962 a bit less aggressive. Still passes all test cases
for 2962.
Comment 4 github-bugzilla 2012-05-17 09:21:34 UTC
Commits pushed to master at https://github.com/D-Programming-Language/dmd

https://github.com/D-Programming-Language/dmd/commit/7206fc459027864dfb1990fc3b576c5ff8d08e68
Add testcase for bug 8023

https://github.com/D-Programming-Language/dmd/commit/98d21c4a910055e7b6a1471bb215a6a4955ea7fd
Merge pull request #923 from llucax/test8023

Add test cases for bug 8023