[PATCH] D20040: Treat qualifiers on elaborated types for qualtypenames appropriately.

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Mon May 9 11:17:14 PDT 2016


rsmith added a subscriber: rsmith.

================
Comment at: lib/Tooling/Core/QualTypeNames.cpp:386
@@ -385,2 +385,3 @@
   NestedNameSpecifier *Prefix = nullptr;
-  Qualifiers PrefixQualifiers;
+  // Local qualifiers are attached to the Qualtype outside of the
+  // elaborated type.  Retrieve them before descending into the
----------------
Qualtype -> QualType

================
Comment at: lib/Tooling/Core/QualTypeNames.cpp:392
@@ -388,3 +391,3 @@
   if (const auto *ETypeInput = dyn_cast<ElaboratedType>(QT.getTypePtr())) {
     QT = ETypeInput->getNamedType();
     Keyword = ETypeInput->getKeyword();
----------------
Maybe add an assert that `QT` is unqualified here?

================
Comment at: lib/Tooling/Core/QualTypeNames.cpp:401-403
@@ -397,6 +400,5 @@
   // move the qualifiers on the outer type (avoid 'std::const string'!)
-  if (Prefix) {
-    PrefixQualifiers = QT.getLocalQualifiers();
+  if (Prefix || Keyword != ETK_None) {
     QT = QualType(QT.getTypePtr(), 0);
   }
 
----------------
I find the way this code ensures that we preserve the qualifiers to be a little subtle. It's not obvious to me that this does the right thing for a case like

    struct X;
    void f(const ::X x) {}

... where we have an `ElaboratedType` with no keyword, and for which we will generate an empty `Prefix` -- it looks like we would lose the `const` on line 392 and never add it back.

Can you remove and re-add the qualifiers unconditionally? (That is, move this removal of qualifiers from `QT` to after line 389, and move line 419 outside the `if`.) I think that'll make the logic clearer.

================
Comment at: lib/Tooling/Core/QualTypeNames.cpp:413-415
@@ -410,5 +412,5 @@
 
     Qualifiers Quals = QT.getLocalQualifiers();
     const Type *TypePtr = getFullyQualifiedTemplateType(Ctx, QT.getTypePtr());
     QT = Ctx.getQualifiedType(TypePtr, Quals);
   }
----------------
With the change suggested above, you should be able to delete the handling of qualifiers here.


http://reviews.llvm.org/D20040





More information about the cfe-commits mailing list