Fix parser to recognize operator?:
authorMatthias Kretz <m.kretz@gsi.de>
Wed, 6 Nov 2019 16:06:08 +0000 (16:06 +0000)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 6 Nov 2019 16:06:08 +0000 (11:06 -0500)
This change lets grok_op_properties print its useful "ISO C++ prohibits
overloading operator ?:" message instead of the cryptic error message about
a missing type-specifier before '?' token.

2019-11-06  Matthias Kretz  <m.kretz@gsi.de>

* parser.c (cp_parser_operator): Parse operator?: as an
attempt to overload the conditional operator.

From-SVN: r277887

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/g++.dg/parse/operator9.C [new file with mode: 0644]
gcc/testsuite/g++.old-deja/g++.jason/operator.C

index d0b47f7c5629ed10b298c98a49fb761eced9810d..e60a45b869ea575dbb8b03b85acfca1fa6594a9b 100644 (file)
@@ -1,3 +1,8 @@
+2019-11-06  Matthias Kretz  <m.kretz@gsi.de>
+
+       * parser.c (cp_parser_operator): Parse operator?: as an
+       attempt to overload the conditional operator.
+
 2019-11-05  Jason Merrill  <jason@redhat.com>
 
        Implement C++20 operator<=>.
index cbbf946d32c12cd442c69ddd0c902a247a3ce933..b17e0336e1c988d696da43624fc99e813a54074a 100644 (file)
@@ -15542,6 +15542,15 @@ cp_parser_operator (cp_parser* parser, location_t start_loc)
       op = COMPONENT_REF;
       break;
 
+    case CPP_QUERY:
+      op = COND_EXPR;
+      /* Consume the `?'.  */
+      cp_lexer_consume_token (parser->lexer);
+      /* Look for the matching `:'.  */
+      cp_parser_require (parser, CPP_COLON, RT_COLON);
+      consumed = true;
+      break;
+
     case CPP_OPEN_PAREN:
       {
         /* Consume the `('.  */
diff --git a/gcc/testsuite/g++.dg/parse/operator9.C b/gcc/testsuite/g++.dg/parse/operator9.C
new file mode 100644 (file)
index 0000000..d66355a
--- /dev/null
@@ -0,0 +1,5 @@
+// { dg-do compile }
+
+struct A {};
+struct B {};
+int operator?:(bool, A, B);  // { dg-error "prohibits overloading" }
index c2fc212cef08f8cc1a1b6aeca3fdaaa2a1bb0826..69a41cf244844fec2539d9c0301419eef9186082 100644 (file)
@@ -5,7 +5,7 @@
 typedef __SIZE_TYPE__ size_t;
 
 struct A {
-  int operator?:(int a, int b);           // { dg-error "expected type-specifier" } 
+  int operator?:(int a, int b);           // { dg-error "prohibits overloading" } 
   static int operator()(int a);           // { dg-error "14:.static int A::operator\\(\\)\\(int\\). must be a nonstatic member function" }
   static int operator+(A,A);      // { dg-error "14:.static int A::operator\\+\\(A, A\\). must be either a non-static member function or a non-member function" } 
   int operator+(int a, int b = 1); // { dg-error "7:.int A::operator\\+\\(int, int\\). must have either zero or one argument" }