diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-01-19 16:41:58 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-01-19 16:41:58 +0000 |
commit | 9ea416e598fa3cb09d67d514c4519c99abb81321 (patch) | |
tree | 1cb5e060b2ab76c14340c0ac0e475b4b7baf1399 | |
parent | 2998d6b0e6d5476c473f68012a851fe4a0f609c8 (diff) |
Parse the optional semicolon after a C++ in-class member function
definition, rather than complaining about it. Problem reported by
Marshall Clow.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123835 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Parse/ParseDeclCXX.cpp | 12 | ||||
-rw-r--r-- | test/Parser/cxx-class.cpp | 8 |
2 files changed, 18 insertions, 2 deletions
diff --git a/lib/Parse/ParseDeclCXX.cpp b/lib/Parse/ParseDeclCXX.cpp index 20e2b8b0be..75a6f59eac 100644 --- a/lib/Parse/ParseDeclCXX.cpp +++ b/lib/Parse/ParseDeclCXX.cpp @@ -1489,6 +1489,10 @@ void Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS, Diag(Tok, diag::err_func_def_no_params); ConsumeBrace(); SkipUntil(tok::r_brace, true); + + // Consume the optional ';' + if (Tok.is(tok::semi)) + ConsumeToken(); return; } @@ -1499,10 +1503,18 @@ void Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS, // assumes the declarator represents a function, not a typedef. ConsumeBrace(); SkipUntil(tok::r_brace, true); + + // Consume the optional ';' + if (Tok.is(tok::semi)) + ConsumeToken(); return; } ParseCXXInlineMethodDef(AS, DeclaratorInfo, TemplateInfo); + // Consume the optional ';' + if (Tok.is(tok::semi)) + ConsumeToken(); + return; } } diff --git a/test/Parser/cxx-class.cpp b/test/Parser/cxx-class.cpp index 57831a463b..f863bd198e 100644 --- a/test/Parser/cxx-class.cpp +++ b/test/Parser/cxx-class.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsyntax-only -verify %s +// RUN: %clang_cc1 -fsyntax-only -verify -pedantic %s class C; class C { public: @@ -14,7 +14,11 @@ protected: public: void m() { int l = 2; - } + }; + + template<typename T> void mt(T) { }; + ; // expected-warning{{extra ';' inside a class}} + virtual int vf() const volatile = 0; private: |