Fix PR c++/69283 (auto deduction fails when ADL is required)
authorppalka <ppalka@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 8 Feb 2016 23:02:50 +0000 (23:02 +0000)
committerppalka <ppalka@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 8 Feb 2016 23:02:50 +0000 (23:02 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@233230 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/decl2.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp1y/auto-fn29.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp1y/auto-fn30.C [new file with mode: 0644]

index 563a1b3..0fc4047 100644 (file)
@@ -1,3 +1,10 @@
+2016-02-08  Patrick Palka  <ppalka@gcc.gnu.org>
+
+       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  <jason@redhat.com>
 
        PR c++/69657
index 7d68961..15d7617 100644 (file)
@@ -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;
 
index d958e5d..4af81dd 100644 (file)
@@ -1,3 +1,10 @@
+2016-02-08  Patrick Palka  <ppalka@gcc.gnu.org>
+
+       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  <jakub@redhat.com>
 
        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 (file)
index 0000000..f9260e0
--- /dev/null
@@ -0,0 +1,34 @@
+// PR c++/69283
+// { dg-do compile { target c++14 } }
+
+namespace Ape {
+   struct Type {};
+
+   template <typename T>
+   auto f1(T const& v){
+       return true;
+   }
+
+   template <typename T>
+   auto f2(T const& v){
+       return f2(v); // { dg-error "auto" }
+   }
+}
+
+namespace Baboon {
+   template <typename T>
+   bool f3(T const& v){
+       return f1(v);
+   }
+
+   template <typename T>
+   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 (file)
index 0000000..e005e6e
--- /dev/null
@@ -0,0 +1,21 @@
+// PR c++/67835
+// { dg-do compile { target c++14 } }
+
+template<class Tag, class T>
+auto g(Tag tag, T x) {
+ return f(tag, x);
+}
+
+namespace abc {
+struct tag {};
+
+struct A {};
+
+template<class T>
+auto f(tag, T x) { return x; }
+}
+
+int main() {
+ g(abc::tag(), abc::A());
+ return 0;
+}