================
@@ -230,6 +241,37 @@ FormatStringConverter::FormatStringConverter(ASTContext
*ContextIn,
finalizeFormatText();
}
+std::optional<StringRef>
+FormatStringConverter::formatStringContainsUnreplaceableMacro(
+ const StringLiteral *FormatExpr, SourceManager &SM, Preprocessor &PP) {
+ for (auto I = FormatExpr->tokloc_begin(), E = FormatExpr->tokloc_end();
+ I != E; ++I) {
+ const SourceLocation &TokenLoc = *I;
+ if (TokenLoc.isMacroID()) {
+ const StringRef MacroName =
+ Lexer::getImmediateMacroName(TokenLoc, SM, PP.getLangOpts());
+
+ // glibc uses __PRI64_PREFIX and __PRIPTR_PREFIX to define the prefixes
+ // for types that change size so we must look for multiple prefixes.
+ if (!MacroName.starts_with("PRI") && !MacroName.starts_with("__PRI"))
+ return MacroName;
+
+ const SourceLocation TokenSpellingLoc = SM.getSpellingLoc(TokenLoc);
----------------
mikecrowe wrote:
Do you mean that I should check whether the `SourceLocation` returned from
`SourceManager::getSpellingLoc()` is valid?
Looking at the `SourceLocation` documentation and other checks that call
`SourceManager::getSpellingLoc()` I was unable to spot how to tell whether the
location returned is valid. All the other callers I looked at just went on to
use the returned location without any checking.
Can I arrange for an invalid location to be returned from the lit test somehow
to test this case?
https://github.com/llvm/llvm-project/pull/97911
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits