diff options
author | Douglas Gregor <doug.gregor@gmail.com> | 2008-08-06 19:08:12 +0000 |
---|---|---|
committer | Doug Gregor <dgregor@gcc.gnu.org> | 2008-08-06 19:08:12 +0000 |
commit | 865a3a421ada308194ab5960e4931fa09c3c68ad (patch) | |
tree | 9c00222f32383f6e7a60ef225649e796d310d8aa /gcc | |
parent | 2696a995839501cf16495ff72f2a0bbc7cc0b72b (diff) | |
download | gcc-865a3a421ada308194ab5960e4931fa09c3c68ad.zip gcc-865a3a421ada308194ab5960e4931fa09c3c68ad.tar.gz gcc-865a3a421ada308194ab5960e4931fa09c3c68ad.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/parser.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/bracket3.C | 5 | ||||
-rw-r--r-- | 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 4dfd564..7bf5f01 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 76adb63..7c1b04d 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 <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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e53ea0b..b183399 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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. diff --git a/gcc/testsuite/g++.dg/cpp0x/bracket3.C b/gcc/testsuite/g++.dg/cpp0x/bracket3.C index eb1ef02..4ef7a0e 100644 --- a/gcc/testsuite/g++.dg/cpp0x/bracket3.C +++ b/gcc/testsuite/g++.dg/cpp0x/bracket3.C @@ -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" } diff --git a/gcc/testsuite/g++.dg/cpp0x/bracket4.C b/gcc/testsuite/g++.dg/cpp0x/bracket4.C index 2ac5ff3..c0743fb 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<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; + |