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:
Iain Buclaw 2020-03-16 23:04:49 +01:00
parent c015ff8cca
commit 447d196e75
5 changed files with 52 additions and 2 deletions

View File

@ -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.

View File

@ -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. */

View File

@ -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

View File

@ -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();
}

View File

@ -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() {}
}