From 865a3a421ada308194ab5960e4931fa09c3c68ad Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Wed, 6 Aug 2008 19:08:12 +0000 Subject: [PATCH] re PR c++/36460 (No space between >'s not always handled in C++0x) 2008-08-06 Douglas Gregor 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 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 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/parser.c | 13 +++++++++---- gcc/testsuite/ChangeLog | 7 +++++++ gcc/testsuite/g++.dg/cpp0x/bracket3.C | 5 +++++ gcc/testsuite/g++.dg/cpp0x/bracket4.C | 10 +++++++++- 5 files changed, 36 insertions(+), 5 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4dfd564a7ec5..7bf5f014e2a3 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2008-08-06 Douglas Gregor + + 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 PR 26785 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 76adb633ed76..7c1b04d5d04f 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -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 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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e53ea0b28148..b1833996aec6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2008-08-06 Douglas Gregor + + 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 * gcc.dg/Wcxx-compat-2.c: Adjust test for more warnings. diff --git a/gcc/testsuite/g++.dg/cpp0x/bracket3.C b/gcc/testsuite/g++.dg/cpp0x/bracket3.C index eb1ef02297d5..4ef7a0e9d302 100644 --- a/gcc/testsuite/g++.dg/cpp0x/bracket3.C +++ b/gcc/testsuite/g++.dg/cpp0x/bracket3.C @@ -3,3 +3,8 @@ template struct X {}; X<1 >> 2> x; // { dg-warning "will be treated as|suggest parentheses" } + +// From cp/parser.c +typedef int Y; +template struct Foo {}; +Foo> 5> r; // { dg-warning "will be treated as|suggest parentheses" } diff --git a/gcc/testsuite/g++.dg/cpp0x/bracket4.C b/gcc/testsuite/g++.dg/cpp0x/bracket4.C index 2ac5ff3d7344..c0743fb7ff5c 100644 --- a/gcc/testsuite/g++.dg/cpp0x/bracket4.C +++ b/gcc/testsuite/g++.dg/cpp0x/bracket4.C @@ -1,6 +1,5 @@ // { dg-do "compile" } // { dg-options "-std=c++0x" } - template struct vector { }; @@ -25,3 +24,12 @@ void f() { vector>() + 2; } + +// PR c++/36460 +template +class A {}; +template +class B {}; + +A> x; + -- 2.47.2