From: Jason Merrill Date: Thu, 15 Mar 2018 03:08:24 +0000 (-0400) Subject: PR c++/81236 - auto variable and auto function X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b149eb04c87823dc2f0b9f141fbbc149fd21598a;p=gcc.git PR c++/81236 - auto variable and auto function * pt.c (tsubst_baselink): Update the type of the BASELINK after mark_used. From-SVN: r258547 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a4ffc663dc1..fc124b440bb 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2018-03-14 Jason Merrill + + PR c++/81236 - auto variable and auto function + * pt.c (tsubst_baselink): Update the type of the BASELINK after + mark_used. + 2018-03-14 Jason Merrill PR c++/83916 - ICE with template template parameters. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 14321816cde..2ea5fc79a2c 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -14700,9 +14700,16 @@ tsubst_baselink (tree baselink, tree object_type, /* If lookup found a single function, mark it as used at this point. (If lookup found multiple functions the one selected later by overload resolution will be marked as used at that point.) */ - if (!template_id_p && !really_overloaded_fn (fns) - && !mark_used (OVL_FIRST (fns), complain) && !(complain & tf_error)) - return error_mark_node; + if (!template_id_p && !really_overloaded_fn (fns)) + { + tree fn = OVL_FIRST (fns); + bool ok = mark_used (fn, complain); + if (!ok && !(complain & tf_error)) + return error_mark_node; + if (ok && BASELINK_P (baselink)) + /* We might have instantiated an auto function. */ + TREE_TYPE (baselink) = TREE_TYPE (fn); + } if (BASELINK_P (baselink)) { diff --git a/gcc/testsuite/g++.dg/cpp1y/auto-fn48.C b/gcc/testsuite/g++.dg/cpp1y/auto-fn48.C new file mode 100644 index 00000000000..bf9448e793e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/auto-fn48.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++14 } } + +template struct A +{ + static auto fn() { } + static void f() + { + auto x = fn; + } +}; + +int main() +{ + A::f(); +} diff --git a/gcc/testsuite/g++.dg/cpp1y/auto-fn49.C b/gcc/testsuite/g++.dg/cpp1y/auto-fn49.C new file mode 100644 index 00000000000..d2e490604a7 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/auto-fn49.C @@ -0,0 +1,12 @@ +// CWG issue 2335 +// { dg-do compile { target c++14 } } + +template struct partition_indices { + static auto compute_right () {} + static constexpr auto right = compute_right; +}; +auto foo () -> partition_indices<>; +void f() { + auto x = foo(); + auto y = x.right; +}