From: Jakub Jelinek Date: Fri, 12 Oct 2018 17:27:56 +0000 (+0200) Subject: backport: re PR c++/3698 (improper handling of an extern declared inline function) X-Git-Tag: releases/gcc-6.5.0~32 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=30de465eef6d3ac3bd08638305ebc508a3243203;p=thirdparty%2Fgcc.git backport: re PR c++/3698 (improper handling of an extern declared inline function) Backported from mainline 2018-07-16 Jakub Jelinek PR c++/3698 PR c++/86208 * cp-gimplify.c (cp_genericize_r): When using extern_decl_map, or in TREE_USED flag from stmt to h->to. * g++.dg/opt/pr3698.C: New test. From-SVN: r265115 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 738b043732a3..800856077a2f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,13 @@ +2018-10-12 Jakub Jelinek + + Backported from mainline + 2018-07-16 Jakub Jelinek + + PR c++/3698 + PR c++/86208 + * cp-gimplify.c (cp_genericize_r): When using extern_decl_map, or + in TREE_USED flag from stmt to h->to. + 2018-06-26 Jakub Jelinek PR c++/86291 diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c index 58037e56e6c4..e071569b7949 100644 --- a/gcc/cp/cp-gimplify.c +++ b/gcc/cp/cp-gimplify.c @@ -1064,6 +1064,7 @@ cp_genericize_r (tree *stmt_p, int *walk_subtrees, void *data) if (h) { *stmt_p = h->to; + TREE_USED (h->to) |= TREE_USED (stmt); *walk_subtrees = 0; return NULL; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f933ad258115..29b048361a5f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2018-10-12 Jakub Jelinek + + Backported from mainline + 2018-07-16 Jakub Jelinek + + PR c++/3698 + PR c++/86208 + * g++.dg/opt/pr3698.C: New test. + 2018-10-12 Richard Biener PR c++/54278 diff --git a/gcc/testsuite/g++.dg/opt/pr3698.C b/gcc/testsuite/g++.dg/opt/pr3698.C new file mode 100644 index 000000000000..ebdf5731eb30 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr3698.C @@ -0,0 +1,21 @@ +// PR c++/3698 +// { dg-do link } +// { dg-options "-O0" } + +struct X { + int i; +}; + +inline const int& +OHashKey (const X& x) +{ + return x.i; +} + +int +main () +{ + extern const int& OHashKey (const X& x); + X x; + return OHashKey (x); +}