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 e8dcd6c793
commit 3e84ee0fab
5 changed files with 58 additions and 2 deletions

View File

@@ -1,3 +1,12 @@
2020-05-18 Iain Buclaw <ibuclaw@gdcproject.org>
Backport from mainline
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-05-17 Iain Buclaw <ibuclaw@gdcproject.org>
Backport from mainline

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,12 @@
2020-05-18 Iain Buclaw <ibuclaw@gdcproject.org>
Backport from mainline
2020-03-16 Iain Buclaw <ibuclaw@gdcproject.org>
PR d/92216
* gdc.dg/imports/pr92216.d: New.
* gdc.dg/pr92216.d: New test.
2020-05-17 Iain Buclaw <ibuclaw@gdcproject.org>
Backport from mainline

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 "_DT(4|8|16)_D7imports7pr922161B8__mixin24getSMFZPv\[: \t\n\]" } }
// { dg-final { scan-assembler-not "(.globl|.global)\[ \]+_DT(4|8|16)_D7imports7pr922161B8__mixin24getSMFZPv" } }
module pr92216;
private import imports.pr92216;
class C : B
{
protected override void getStruct() {}
}