d: Fix multiple definition error when using mixins and interfaces.
gcc/d/ChangeLog: PR d/92216 * decl.cc (make_thunk): Don't set TREE_PUBLIC on thunks if the target function is external to the current compilation. gcc/testsuite/ChangeLog: PR d/92216 * gdc.dg/imports/pr92216.d: New. * gdc.dg/pr92216.d: New test.
This commit is contained in:
parent
c015ff8cca
commit
447d196e75
|
@ -1,3 +1,9 @@
|
|||
2020-03-16 Iain Buclaw <ibuclaw@gdcproject.org>
|
||||
|
||||
PR d/92216
|
||||
* decl.cc (make_thunk): Don't set TREE_PUBLIC on thunks if the target
|
||||
function is external to the current compilation.
|
||||
|
||||
2020-01-01 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
Update copyright years.
|
||||
|
|
|
@ -1803,8 +1803,11 @@ make_thunk (FuncDeclaration *decl, int offset)
|
|||
|
||||
DECL_CONTEXT (thunk) = d_decl_context (decl);
|
||||
|
||||
/* Thunks inherit the public access of the function they are targetting. */
|
||||
TREE_PUBLIC (thunk) = TREE_PUBLIC (function);
|
||||
/* Thunks inherit the public access of the function they are targetting.
|
||||
When the function is outside the current compilation unit however, then the
|
||||
thunk must be kept private to not conflict. */
|
||||
TREE_PUBLIC (thunk) = TREE_PUBLIC (function) && !DECL_EXTERNAL (function);
|
||||
|
||||
DECL_EXTERNAL (thunk) = 0;
|
||||
|
||||
/* Thunks are always addressable. */
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2020-03-16 Iain Buclaw <ibuclaw@gdcproject.org>
|
||||
|
||||
PR d/92216
|
||||
* gdc.dg/imports/pr92216.d: New.
|
||||
* gdc.dg/pr92216.d: New test.
|
||||
|
||||
2020-03-16 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c/94179
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
module imports.pr92216;
|
||||
|
||||
class B : I
|
||||
{
|
||||
protected override void getStruct(){}
|
||||
mixin A!();
|
||||
|
||||
}
|
||||
|
||||
mixin template A()
|
||||
{
|
||||
public void* getS()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public interface I
|
||||
{
|
||||
public void* getS();
|
||||
protected void getStruct();
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92216
|
||||
// { dg-options "-I $srcdir/gdc.dg" }
|
||||
// { dg-do compile }
|
||||
// { dg-final { scan-assembler "_DT16_D7imports7pr922161B8__mixin24getSMFZPv\[: \t\n\]" } }
|
||||
// { dg-final { scan-assembler-not "(.globl|.global)\[ \]+_DT16_D7imports7pr922161B8__mixin24getSMFZPv" } }
|
||||
module pr92216;
|
||||
|
||||
private import imports.pr92216;
|
||||
|
||||
class C : B
|
||||
{
|
||||
protected override void getStruct() {}
|
||||
}
|
Loading…
Reference in New Issue