From 20a0c6f9bdbd781ed5d413a10a06764a174dc394 Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Mon, 8 Feb 2016 23:02:50 +0000 Subject: [PATCH] Fix PR c++/69283 (auto deduction fails when ADL is required) gcc/cp/ChangeLog: PR c++/69283 PR c++/67835 * decl2.c (mark_used): When given a TEMPLATE_DECL, return after setting its TREE_USED flag. gcc/testsuite/ChangeLog: PR c++/69283 PR c++/67835 * g++.dg/cpp1y/auto-fn29.C: New test. * g++.dg/cpp1y/auto-fn30.C: New test. From-SVN: r233230 --- gcc/cp/ChangeLog | 7 ++++++ gcc/cp/decl2.c | 4 +++ gcc/testsuite/ChangeLog | 7 ++++++ gcc/testsuite/g++.dg/cpp1y/auto-fn29.C | 34 ++++++++++++++++++++++++++ gcc/testsuite/g++.dg/cpp1y/auto-fn30.C | 21 ++++++++++++++++ 5 files changed, 73 insertions(+) create mode 100644 gcc/testsuite/g++.dg/cpp1y/auto-fn29.C create mode 100644 gcc/testsuite/g++.dg/cpp1y/auto-fn30.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 563a1b37c8c..0fc40477714 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2016-02-08 Patrick Palka + + PR c++/69283 + PR c++/67835 + * decl2.c (mark_used): When given a TEMPLATE_DECL, return after + setting its TREE_USED flag. + 2016-02-08 Jason Merrill PR c++/69657 diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 7d68961cd20..15d7617a4f5 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -5068,6 +5068,10 @@ mark_used (tree decl, tsubst_flags_t complain) /* Set TREE_USED for the benefit of -Wunused. */ TREE_USED (decl) = 1; + + if (TREE_CODE (decl) == TEMPLATE_DECL) + return true; + if (DECL_CLONED_FUNCTION_P (decl)) TREE_USED (DECL_CLONED_FUNCTION (decl)) = 1; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d958e5d4814..4af81dd126f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2016-02-08 Patrick Palka + + PR c++/69283 + PR c++/67835 + * g++.dg/cpp1y/auto-fn29.C: New test. + * g++.dg/cpp1y/auto-fn30.C: New test. + 2016-02-08 Jakub Jelinek PR tree-optimization/69209 diff --git a/gcc/testsuite/g++.dg/cpp1y/auto-fn29.C b/gcc/testsuite/g++.dg/cpp1y/auto-fn29.C new file mode 100644 index 00000000000..f9260e0ec30 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/auto-fn29.C @@ -0,0 +1,34 @@ +// PR c++/69283 +// { dg-do compile { target c++14 } } + +namespace Ape { + struct Type {}; + + template + auto f1(T const& v){ + return true; + } + + template + auto f2(T const& v){ + return f2(v); // { dg-error "auto" } + } +} + +namespace Baboon { + template + bool f3(T const& v){ + return f1(v); + } + + template + bool f4(T const& v){ + f2(v); + } +} + +int main(){ + Ape::Type x; + Baboon::f3(x); + Baboon::f4(x); +} diff --git a/gcc/testsuite/g++.dg/cpp1y/auto-fn30.C b/gcc/testsuite/g++.dg/cpp1y/auto-fn30.C new file mode 100644 index 00000000000..e005e6ec692 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/auto-fn30.C @@ -0,0 +1,21 @@ +// PR c++/67835 +// { dg-do compile { target c++14 } } + +template +auto g(Tag tag, T x) { + return f(tag, x); +} + +namespace abc { +struct tag {}; + +struct A {}; + +template +auto f(tag, T x) { return x; } +} + +int main() { + g(abc::tag(), abc::A()); + return 0; +} -- 2.30.2