From: Jakub Jelinek Date: Fri, 20 Dec 2019 17:26:28 +0000 (+0100) Subject: backport: re PR c++/92695 (P1064R0 - virtual constexpr fails if object taken from... X-Git-Tag: releases/gcc-9.3.0~292 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e3edafbca9f3553ff95f3e083d9e5b67ff141ba3;p=thirdparty%2Fgcc.git backport: re PR c++/92695 (P1064R0 - virtual constexpr fails if object taken from array) Backported from mainline 2019-11-28 Jakub Jelinek PR c++/92695 * decl2.c (mark_used): Don't call note_vague_linkage_fn for pure virtual functions, even if they are declared inline. * g++.dg/warn/inline3.C: New test. From-SVN: r279661 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 83a9adc288a8..d95f679907e2 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,6 +1,12 @@ 2019-12-20 Jakub Jelinek Backported from mainline + 2019-11-28 Jakub Jelinek + + PR c++/92695 + * decl2.c (mark_used): Don't call note_vague_linkage_fn for pure + virtual functions, even if they are declared inline. + 2019-11-27 Jakub Jelinek PR c++/92524 diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 6f23ee1cd3fe..a46cbce08f4d 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -5501,8 +5501,11 @@ mark_used (tree decl, tsubst_flags_t complain) vec_safe_push (no_linkage_decls, decl); } - if (TREE_CODE (decl) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (decl) - && !DECL_INITIAL (decl) && !DECL_ARTIFICIAL (decl)) + if (TREE_CODE (decl) == FUNCTION_DECL + && DECL_DECLARED_INLINE_P (decl) + && !DECL_INITIAL (decl) + && !DECL_ARTIFICIAL (decl) + && !DECL_PURE_VIRTUAL_P (decl)) /* Remember it, so we can check it was defined. */ note_vague_linkage_fn (decl); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b10c2e057690..eb6108b3a3ed 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,11 @@ 2019-12-20 Jakub Jelinek Backported from mainline + 2019-11-28 Jakub Jelinek + + PR c++/92695 + * g++.dg/warn/inline3.C: New test. + 2019-11-27 Jakub Jelinek PR fortran/91944 diff --git a/gcc/testsuite/g++.dg/warn/inline3.C b/gcc/testsuite/g++.dg/warn/inline3.C new file mode 100644 index 000000000000..0d4dc8ff2685 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/inline3.C @@ -0,0 +1,20 @@ +struct S { + inline virtual void foo () = 0; // { dg-bogus "used but never defined" } +#if __cplusplus > 201703L + constexpr virtual void bar () = 0; // { dg-bogus "used but never defined" "" { target c++2a } } +#else + inline virtual void bar () = 0; // { dg-bogus "used but never defined" "" { target c++17_down } } +#endif + S () {} +}; +struct T : public S { + inline virtual void foo () {} +#if __cplusplus > 201703L + constexpr virtual void bar () {} +#else + inline virtual void bar () {} +#endif + T () {} +}; +T t; +void foo (S *s) { s->foo (); s->bar (); }