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