================ @@ -2326,15 +2312,21 @@ static FixItList fixLocalVarDeclWithSpan(const VarDecl *D, ASTContext &Ctx, return {}; FixIts.insert(FixIts.end(), std::make_move_iterator(InitFixIts->begin()), std::make_move_iterator(InitFixIts->end())); - // If the declaration has the form `T *ident = init`, we want to replace - // `T *ident = ` with `std::span<T> ident`: - EndLocForReplacement = Init->getBeginLoc().getLocWithOffset(-1); } - SS << " " << IdentText->str(); + // For declaration of the form `T * ident = init;`, we want to replace + // `T * ` with `std::span<T>`. + // We ignore CV-qualifiers so for `T * const ident;` we also want to replace + // just `T *` with `std::span<T>`. + const SourceLocation EndLocForReplacement = D->getTypeSpecEndLoc(); if (!EndLocForReplacement.isValid()) { DEBUG_NOTE_DECL_FAIL(D, " : failed to locate the end of the declaration"); return {}; } + // The only exception is that for `T *ident` we'll add a single space between + // "std::span<T>" and "ident". + if (EndLocForReplacement.getLocWithOffset(1) == getVarDeclIdentifierLoc(D)) ---------------- ziqingluo-90 wrote:
In case the identifier is a macro expansion, e.g., ``` #define IDENT ident T *IDENT; ``` , the if-condition will evaluate to false because the files of the two source locations are different. But this is rare and the fix-it is still correct. https://github.com/llvm/llvm-project/pull/81935 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits