Author: rsmith Date: Tue Feb 7 19:16:55 2017 New Revision: 294396 URL: http://llvm.org/viewvc/llvm-project?rev=294396&view=rev Log: Fix constructor declarator detection for the case when the name is followed by an attribute-specifier-seq. (Also fixes the same problem for deduction-guides.)
Modified: cfe/trunk/lib/Parse/ParseDecl.cpp cfe/trunk/test/CXX/temp/temp.deduct.guide/p1.cpp cfe/trunk/test/Parser/cxx0x-attributes.cpp Modified: cfe/trunk/lib/Parse/ParseDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=294396&r1=294395&r2=294396&view=diff ============================================================================== --- cfe/trunk/lib/Parse/ParseDecl.cpp (original) +++ cfe/trunk/lib/Parse/ParseDecl.cpp Tue Feb 7 19:16:55 2017 @@ -4675,6 +4675,10 @@ bool Parser::isConstructorDeclarator(boo return false; } + // There may be attributes here, appertaining to the constructor name or type + // we just stepped past. + SkipCXX11Attributes(); + // Current class name must be followed by a left parenthesis. if (Tok.isNot(tok::l_paren)) { TPA.Revert(); @@ -4742,18 +4746,24 @@ bool Parser::isConstructorDeclarator(boo case tok::r_paren: // C(X ) + + // Skip past the right-paren and any following attributes to get to + // the function body or trailing-return-type. + ConsumeParen(); + SkipCXX11Attributes(); + if (DeductionGuide) { // C(X) -> ... is a deduction guide. - IsConstructor = NextToken().is(tok::arrow); + IsConstructor = Tok.is(tok::arrow); break; } - if (NextToken().is(tok::colon) || NextToken().is(tok::kw_try)) { + if (Tok.is(tok::colon) || Tok.is(tok::kw_try)) { // Assume these were meant to be constructors: // C(X) : (the name of a bit-field cannot be parenthesized). // C(X) try (this is otherwise ill-formed). IsConstructor = true; } - if (NextToken().is(tok::semi) || NextToken().is(tok::l_brace)) { + if (Tok.is(tok::semi) || Tok.is(tok::l_brace)) { // If we have a constructor name within the class definition, // assume these were meant to be constructors: // C(X) { Modified: cfe/trunk/test/CXX/temp/temp.deduct.guide/p1.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/temp/temp.deduct.guide/p1.cpp?rev=294396&r1=294395&r2=294396&view=diff ============================================================================== --- cfe/trunk/test/CXX/temp/temp.deduct.guide/p1.cpp (original) +++ cfe/trunk/test/CXX/temp/temp.deduct.guide/p1.cpp Tue Feb 7 19:16:55 2017 @@ -31,7 +31,7 @@ A(int(&)[5])[3] -> A<int>; // (Pending DR) attributes and parens around the declarator-id are OK. [[deprecated]] A(int(&)[6]) [[]] -> A<int> [[]]; -A [[]] (int(&)[7]) -> A<int>; // FIXME: expected-error 2{{expected}} expected-note {{to match}} +A [[]] (int(&)[7]) -> A<int>; (A)(int(&)[8]) -> A<int>; // ... but the trailing-return-type is part of the function-declarator as normal Modified: cfe/trunk/test/Parser/cxx0x-attributes.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/cxx0x-attributes.cpp?rev=294396&r1=294395&r2=294396&view=diff ============================================================================== --- cfe/trunk/test/Parser/cxx0x-attributes.cpp (original) +++ cfe/trunk/test/Parser/cxx0x-attributes.cpp Tue Feb 7 19:16:55 2017 @@ -99,11 +99,13 @@ void fn_with_structs() { } [[]]; struct ctordtor { - [[]] ctordtor(); - [[]] ~ctordtor(); + [[]] ctordtor [[]] () [[]]; + ctordtor (C) [[]]; + [[]] ~ctordtor [[]] () [[]]; }; -[[]] ctordtor::ctordtor() {} -[[]] ctordtor::~ctordtor() {} +[[]] ctordtor::ctordtor [[]] () [[]] {} +[[]] ctordtor::ctordtor (C) [[]] try {} catch (...) {} +[[]] ctordtor::~ctordtor [[]] () [[]] {} extern "C++" [[]] int extern_attr; template <typename T> [[]] void template_attr (); [[]] [[]] int [[]] [[]] multi_attr [[]] [[]]; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits