diff options
author | Jason Merrill <jason@redhat.com> | 2018-03-14 23:08:24 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2018-03-14 23:08:24 -0400 |
commit | b149eb04c87823dc2f0b9f141fbbc149fd21598a (patch) | |
tree | 9a613c3cf8b5ba5489411f04e27d1c803a6df8a6 | |
parent | e786e485a7e6dda1c6d0ecf8981edade93d73110 (diff) | |
download | gcc-b149eb04c87823dc2f0b9f141fbbc149fd21598a.zip gcc-b149eb04c87823dc2f0b9f141fbbc149fd21598a.tar.gz gcc-b149eb04c87823dc2f0b9f141fbbc149fd21598a.tar.bz2 |
PR c++/81236 - auto variable and auto function
* pt.c (tsubst_baselink): Update the type of the BASELINK after
mark_used.
From-SVN: r258547
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/pt.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/auto-fn48.C | 15 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/auto-fn49.C | 12 |
4 files changed, 43 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a4ffc66..fc124b44 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2018-03-14 Jason Merrill <jason@redhat.com> + 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 <jason@redhat.com> + PR c++/83916 - ICE with template template parameters. * pt.c (convert_template_argument): Don't substitute into type of non-type parameter if we don't have enough arg levels. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 1432181..2ea5fc7 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 0000000..bf9448e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/auto-fn48.C @@ -0,0 +1,15 @@ +// { dg-do compile { target c++14 } } + +template <class T> struct A +{ + static auto fn() { } + static void f() + { + auto x = fn; + } +}; + +int main() +{ + A<int>::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 0000000..d2e4906 --- /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 <class... Ts> 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; +} |