re PR c++/65091 (decltype(~arg) fails for template functions)
authorJason Merrill <jason@redhat.com>
Wed, 15 Jul 2015 14:13:22 +0000 (10:13 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 15 Jul 2015 14:13:22 +0000 (10:13 -0400)
PR c++/65091
* parser.c (cp_parser_unqualified_id): Don't accept ~x in a
template if there is no type x in scope.

From-SVN: r225831

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/g++.dg/parse/dtor17.C [new file with mode: 0644]

index 00cbe47dfa42637e78a314116363128086cab26e..6b92826118e4210ce76bdb621cd7618280eca76d 100644 (file)
@@ -1,3 +1,9 @@
+2015-07-15  Jason Merrill  <jason@redhat.com>
+
+       PR c++/65091
+       * parser.c (cp_parser_unqualified_id): Don't accept ~x in a
+       template if there is no type x in scope.
+
 2015-07-14  Patrick Palka  <ppalka@gcc.gnu.org>
 
        PR c++/66850
index 574ffba3ecec5e6246f458533547d10c834c7f9c..f1d5656055ce06760e08ef99a9c64f582f6a3876 100644 (file)
@@ -5162,8 +5162,15 @@ cp_parser_unqualified_id (cp_parser* parser,
            if (processing_template_decl
                && ! cp_parser_parse_definitely (parser))
              {
-               /* We couldn't find a type with this name, so just accept
-                  it and check for a match at instantiation time.  */
+               /* We couldn't find a type with this name.  If we're parsing
+                  tentatively, fail and try something else.  */
+               if (cp_parser_uncommitted_to_tentative_parse_p (parser))
+                 {
+                   cp_parser_simulate_error (parser);
+                   return error_mark_node;
+                 }
+               /* Otherwise, accept it and check for a match at instantiation
+                  time.  */
                type_decl = cp_parser_identifier (parser);
                if (type_decl != error_mark_node)
                  type_decl = build_nt (BIT_NOT_EXPR, type_decl);
diff --git a/gcc/testsuite/g++.dg/parse/dtor17.C b/gcc/testsuite/g++.dg/parse/dtor17.C
new file mode 100644 (file)
index 0000000..1fca413
--- /dev/null
@@ -0,0 +1,11 @@
+// PR c++/65091
+// { dg-do compile { target c++11 } }
+
+template<typename T>
+auto foo(T x) -> decltype(~x) {
+  return ~x;
+}
+
+int bar() {
+  return foo(10);
+}