[PATCH] D55948: Modify DeclaratorChuck::getFunction to use DeclSpec for qualifiers

John McCall via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Jan 2 10:27:10 PST 2019


rjmccall added inline comments.


================
Comment at: lib/Parse/ParseDeclCXX.cpp:2368
         }
       };
+      DeclSpecCheck(DeclSpec::TQ_const, "const", DS.getConstSpecLoc());
----------------
Anastasia wrote:
> rjmccall wrote:
> > Please remove this dead semicolon since you're touching this code anyway.
> Here the semicolon is at the end of a lambda declaration statement.
Oh, yes it is, sorry.


================
Comment at: lib/Parse/ParseExprCXX.cpp:1264
     SourceLocation NoLoc;
+    DeclSpec NoDS(AttrFactory);
     D.AddTypeInfo(DeclaratorChunk::getFunction(
----------------
This is dead now.


================
Comment at: lib/Sema/DeclSpec.cpp:220
+
+  I.Fun.QualAttrFactory         = nullptr;
+
----------------
Spacing?


================
Comment at: lib/Sema/SemaDeclCXX.cpp:8175
   DeclaratorChunk::FunctionTypeInfo &FTI = D.getFunctionTypeInfo();
-  if (FTI.TypeQuals != 0) {
-    if (FTI.TypeQuals & Qualifiers::Const)
-      Diag(D.getIdentifierLoc(), diag::err_invalid_qualified_constructor)
-        << "const" << SourceRange(D.getIdentifierLoc());
-    if (FTI.TypeQuals & Qualifiers::Volatile)
-      Diag(D.getIdentifierLoc(), diag::err_invalid_qualified_constructor)
-        << "volatile" << SourceRange(D.getIdentifierLoc());
-    if (FTI.TypeQuals & Qualifiers::Restrict)
-      Diag(D.getIdentifierLoc(), diag::err_invalid_qualified_constructor)
-        << "restrict" << SourceRange(D.getIdentifierLoc());
+  if (FTI.MethodQualifiers && FTI.MethodQualifiers->getTypeQualifiers() != 0) {
+    auto DiagQual = [&](DeclSpec::TQ TypeQual, StringRef QualName,
----------------
I think you should add a `hasMethodQualifiers` method to FTI that does this check.  Note that it needs to check for attributes, too, and I think you need to figure out some way to generalize `forEachCVRUQual` to cover those.


================
Comment at: lib/Sema/SemaDeclCXX.cpp:8181
+    };
+    FTI.MethodQualifiers->forEachCVRUQual(DiagQual);
     D.setInvalidType();
----------------
I'd write this lambda inline as the argument, but if you think it's better separate, that's okay.


================
Comment at: lib/Sema/SemaDeclCXX.cpp:8361
   DeclaratorChunk::FunctionTypeInfo &FTI = D.getFunctionTypeInfo();
-  if (FTI.TypeQuals != 0 && !D.isInvalidType()) {
-    if (FTI.TypeQuals & Qualifiers::Const)
-      Diag(D.getIdentifierLoc(), diag::err_invalid_qualified_destructor)
-        << "const" << SourceRange(D.getIdentifierLoc());
-    if (FTI.TypeQuals & Qualifiers::Volatile)
-      Diag(D.getIdentifierLoc(), diag::err_invalid_qualified_destructor)
-        << "volatile" << SourceRange(D.getIdentifierLoc());
-    if (FTI.TypeQuals & Qualifiers::Restrict)
-      Diag(D.getIdentifierLoc(), diag::err_invalid_qualified_destructor)
-        << "restrict" << SourceRange(D.getIdentifierLoc());
+  if (FTI.MethodQualifiers && FTI.MethodQualifiers->getTypeQualifiers() != 0 &&
+      !D.isInvalidType()) {
----------------
Another place for `hasMethodQualifiers`.


================
Comment at: lib/Sema/SemaType.cpp:719
   SourceLocation NoLoc;
+  AttributeFactory attrFactory;
   declarator.AddInnermostTypeInfo(DeclaratorChunk::getFunction(
----------------
This is dead now.


================
Comment at: lib/Sema/SemaType.cpp:4460
+      IsQualifiedFunction =
+          (FTI.MethodQualifiers && FTI.MethodQualifiers->getTypeQualifiers()) ||
+          FTI.hasRefQualifier();
----------------
This would be a good place to use `hasMethodQualifiers` (unless there's a reason to ignore attribute qualifiers here).


================
Comment at: lib/Sema/SemaType.cpp:5035
+            RemovalLocs.push_back(SL);
+          };
+          Chunk.Fun.MethodQualifiers->forEachCVRUQual(AddToRemovals);
----------------
A lambda this simple should definitely be written inline.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D55948/new/

https://reviews.llvm.org/D55948





More information about the cfe-commits mailing list