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
This commit is contained in:
parent
2696a99583
commit
865a3a421a
5 changed files with 36 additions and 5 deletions
|
@ -1,3 +1,9 @@
|
|||
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>
|
||||
|
||||
PR 26785
|
||||
|
|
|
@ -10386,9 +10386,10 @@ cp_parser_template_argument (cp_parser* parser)
|
|||
Therefore, we try a type-id first. */
|
||||
cp_parser_parse_tentatively (parser);
|
||||
argument = cp_parser_type_id (parser);
|
||||
/* 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
|
||||
also valid expressions. For instance:
|
||||
/* If there was no error parsing the type-id but the next token is a
|
||||
'>>', our behavior depends on which dialect of C++ we're
|
||||
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); };
|
||||
template <int V> struct Foo {};
|
||||
|
@ -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
|
||||
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
|
||||
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)
|
||||
&& cxx_dialect == cxx98
|
||||
&& cp_lexer_next_token_is (parser->lexer, CPP_RSHIFT))
|
||||
{
|
||||
maybe_type_id = true;
|
||||
|
|
|
@ -1,3 +1,10 @@
|
|||
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>
|
||||
|
||||
* gcc.dg/Wcxx-compat-2.c: Adjust test for more warnings.
|
||||
|
|
|
@ -3,3 +3,8 @@
|
|||
template<int N> struct X {};
|
||||
|
||||
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" }
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
// { dg-do "compile" }
|
||||
// { dg-options "-std=c++0x" }
|
||||
|
||||
template<typename T>
|
||||
struct vector {
|
||||
};
|
||||
|
@ -25,3 +24,12 @@ void f()
|
|||
{
|
||||
vector<vector<int>>() + 2;
|
||||
}
|
||||
|
||||
// PR c++/36460
|
||||
template <class a>
|
||||
class A {};
|
||||
template <class b>
|
||||
class B {};
|
||||
|
||||
A<B<void()>> x;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue