Commit 865a3a42 by Douglas Gregor Committed by Doug Gregor

re PR c++/36460 (No space between >'s not always handled in C++0x)

2008-08-06  Douglas Gregor  <doug.gregor@gmail.com>

       PR c++/36460
       * parser.c (cp_parser_template_argument): Don't assume that '>>'
       following a type-id is an error when in C++0x mode.

2008-08-06  Douglas Gregor  <doug.gregor@gmail.com>

       PR c++/36460
       * g++.dg/cpp0x/bracket3.C: Add another test case for the >>
       warning under -Wc++0x-compat.
       * g++.dg/cpp0x/bracket4.C: Add testcase for PR c++/36460.

From-SVN: r138819
parent 2696a995
2008-08-06 Douglas Gregor <doug.gregor@gmail.com>
PR c++/36460
* parser.c (cp_parser_template_argument): Don't assume that '>>'
following a type-id is an error when in C++0x mode.
2008-08-06 Manuel Lopez-Ibanez <manu@gcc.gnu.org> 2008-08-06 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR 26785 PR 26785
......
...@@ -10386,9 +10386,10 @@ cp_parser_template_argument (cp_parser* parser) ...@@ -10386,9 +10386,10 @@ cp_parser_template_argument (cp_parser* parser)
Therefore, we try a type-id first. */ Therefore, we try a type-id first. */
cp_parser_parse_tentatively (parser); cp_parser_parse_tentatively (parser);
argument = cp_parser_type_id (parser); argument = cp_parser_type_id (parser);
/* If there was no error parsing the type-id but the next token is a '>>', /* If there was no error parsing the type-id but the next token is a
we probably found a typo for '> >'. But there are type-id which are '>>', our behavior depends on which dialect of C++ we're
also valid expressions. For instance: parsing. In C++98, we probably found a typo for '> >'. But there
are type-id which are also valid expressions. For instance:
struct X { int operator >> (int); }; struct X { int operator >> (int); };
template <int V> struct Foo {}; template <int V> struct Foo {};
...@@ -10397,8 +10398,12 @@ cp_parser_template_argument (cp_parser* parser) ...@@ -10397,8 +10398,12 @@ cp_parser_template_argument (cp_parser* parser)
Here 'X()' is a valid type-id of a function type, but the user just Here 'X()' is a valid type-id of a function type, but the user just
wanted to write the expression "X() >> 5". Thus, we remember that we wanted to write the expression "X() >> 5". Thus, we remember that we
found a valid type-id, but we still try to parse the argument as an found a valid type-id, but we still try to parse the argument as an
expression to see what happens. */ expression to see what happens.
In C++0x, the '>>' will be considered two separate '>'
tokens. */
if (!cp_parser_error_occurred (parser) if (!cp_parser_error_occurred (parser)
&& cxx_dialect == cxx98
&& cp_lexer_next_token_is (parser->lexer, CPP_RSHIFT)) && cp_lexer_next_token_is (parser->lexer, CPP_RSHIFT))
{ {
maybe_type_id = true; maybe_type_id = true;
......
2008-08-06 Douglas Gregor <doug.gregor@gmail.com>
PR c++/36460
* g++.dg/cpp0x/bracket3.C: Add another test case for the >>
warning under -Wc++0x-compat.
* g++.dg/cpp0x/bracket4.C: Add testcase for PR c++/36460.
2008-08-06 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> 2008-08-06 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* gcc.dg/Wcxx-compat-2.c: Adjust test for more warnings. * gcc.dg/Wcxx-compat-2.c: Adjust test for more warnings.
......
...@@ -3,3 +3,8 @@ ...@@ -3,3 +3,8 @@
template<int N> struct X {}; template<int N> struct X {};
X<1 >> 2> x; // { dg-warning "will be treated as|suggest parentheses" } X<1 >> 2> x; // { dg-warning "will be treated as|suggest parentheses" }
// From cp/parser.c
typedef int Y;
template <int V> struct Foo {};
Foo<Y () >> 5> r; // { dg-warning "will be treated as|suggest parentheses" }
// { dg-do "compile" } // { dg-do "compile" }
// { dg-options "-std=c++0x" } // { dg-options "-std=c++0x" }
template<typename T> template<typename T>
struct vector { struct vector {
}; };
...@@ -25,3 +24,12 @@ void f() ...@@ -25,3 +24,12 @@ void f()
{ {
vector<vector<int>>() + 2; vector<vector<int>>() + 2;
} }
// PR c++/36460
template <class a>
class A {};
template <class b>
class B {};
A<B<void()>> x;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment