aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDouglas Gregor <doug.gregor@gmail.com>2008-08-06 19:08:12 +0000
committerDoug Gregor <dgregor@gcc.gnu.org>2008-08-06 19:08:12 +0000
commit865a3a421ada308194ab5960e4931fa09c3c68ad (patch)
tree9c00222f32383f6e7a60ef225649e796d310d8aa /gcc
parent2696a995839501cf16495ff72f2a0bbc7cc0b72b (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cp/parser.c13
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/bracket3.C5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/bracket4.C10
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;
+