r294396 - Fix constructor declarator detection for the case when the name is followed by
Richard Smith via cfe-commits
cfe-commits at lists.llvm.org
Tue Feb 7 17:16:56 PST 2017
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 [[]] [[]];
More information about the cfe-commits
mailing list