We can only do range for deduction if the range expression is non-dependent.

Tested x86_64-pc-linux-gnu, applied to trunk.
commit 2515fd89aeb268d395242d6ef3137da7119fdce8
Author: Jason Merrill <ja...@redhat.com>
Date:   Fri Aug 5 10:16:58 2011 -0400

    	PR c++/49983
    	* parser.c (cp_parser_range_for): Only do auto deduction in
    	template if the range is non-dependent.

diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 9b3e56d..84b8c60 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -8679,7 +8679,8 @@ cp_parser_range_for (cp_parser *parser, tree scope, tree init, tree range_decl)
     {
       stmt = begin_range_for_stmt (scope, init);
       finish_range_for_decl (stmt, range_decl, range_expr);
-      do_range_for_auto_deduction (range_decl, range_expr);
+      if (!type_dependent_expression_p (range_expr))
+	do_range_for_auto_deduction (range_decl, range_expr);
     }
   else
     {
diff --git a/gcc/testsuite/g++.dg/cpp0x/range-for21.C b/gcc/testsuite/g++.dg/cpp0x/range-for21.C
new file mode 100644
index 0000000..07bb95f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/range-for21.C
@@ -0,0 +1,8 @@
+// PR c++/49983
+// { dg-options -std=c++0x }
+
+template <class T>
+void f(T t)
+{
+  for (auto v : t);
+}

Reply via email to