Fix parsing of class specifiers before '\n' 'operator'.

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
This commit is contained in:
Nico Weber 2013-01-18 18:41:42 +00:00
parent 1dc3940383
commit 0bba2d11d0
2 changed files with 19 additions and 0 deletions

View 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;

View 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}} \