Fix parsing of class specifiers before '\n' 'operator'.
authorNico Weber <nicolasweber@gmx.de>
Fri, 18 Jan 2013 18:41:42 +0000 (18:41 +0000)
committerNico Weber <nicolasweber@gmx.de>
Fri, 18 Jan 2013 18:41:42 +0000 (18:41 +0000)
r159549 / r159164 regressed clang to reject

  struct s {};
  struct s
  operator++(struct s a)
  { return a; }

This fixes the regression. Richard, pleas check if this looks right.

llvm-svn: 172834

clang/lib/Parse/ParseDeclCXX.cpp
clang/test/Parser/cxx-decl.cpp

index cc33185..9aa3a8b 100644 (file)
@@ -964,6 +964,7 @@ bool Parser::isValidAfterTypeSpecifier(bool CouldBeBitfield) {
   case tok::annot_template_id:  // struct foo {...} a<int>    ::b;
   case tok::l_paren:            // struct foo {...} (         x);
   case tok::comma:              // __builtin_offsetof(struct foo{...} ,
+  case tok::kw_operator:        // struct foo operator++() {...}
     return true;
   case tok::colon:
     return CouldBeBitfield;     // enum E { ... }   :         2;
index 5a4c9da..aa775c8 100644 (file)
@@ -132,6 +132,24 @@ struct S {
   typedef S() : n(1), m(2) { } // expected-error {{function definition declared 'typedef'}}
 };
 
+
+namespace TestIsValidAfterTypeSpecifier {
+struct s {};
+
+namespace a {
+struct s operator++(struct s a)
+{ return a; }
+}
+
+namespace b {
+// The newline after s should make no difference.
+struct s
+operator++(struct s a)
+{ return a; }
+}
+
+}
+
 // PR8380
 extern ""      // expected-error {{unknown linkage language}}
 test6a { ;// expected-error {{C++ requires a type specifier for all declarations}} \