diff options
author | Jordan Rose <jordan_rose@apple.com> | 2012-09-13 02:11:15 +0000 |
---|---|---|
committer | Jordan Rose <jordan_rose@apple.com> | 2012-09-13 02:11:15 +0000 |
commit | 4c266aa371b115175688a4b584e9e7980f4e3d1a (patch) | |
tree | 7ffdd3d6f32178456cc73cc8af273482ae457a51 /clang/lib/Sema/SemaChecking.cpp | |
parent | 510260c2bffb9212cdaeace66020ed8dd6f421ca (diff) | |
download | bcm5719-llvm-4c266aa371b115175688a4b584e9e7980f4e3d1a.tar.gz bcm5719-llvm-4c266aa371b115175688a4b584e9e7980f4e3d1a.zip |
Format strings: offer a fixit for Darwin's %D/%U/%O to ISO %d/%u/%o.
<rdar://problem/12061922>
llvm-svn: 163772
Diffstat (limited to 'clang/lib/Sema/SemaChecking.cpp')
-rw-r--r-- | clang/lib/Sema/SemaChecking.cpp | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index 2ae1d6ee918..b46081dc99a 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -2095,11 +2095,28 @@ void CheckFormatHandler::HandleNonStandardLengthModifier( void CheckFormatHandler::HandleNonStandardConversionSpecifier( const analyze_format_string::ConversionSpecifier &CS, const char *startSpecifier, unsigned specifierLen) { - EmitFormatDiagnostic(S.PDiag(diag::warn_format_non_standard) << CS.toString() - << 1, - getLocationOfByte(CS.getStart()), - /*IsStringLocation*/true, - getSpecifierRange(startSpecifier, specifierLen)); + using namespace analyze_format_string; + + // See if we know how to fix this conversion specifier. + llvm::Optional<ConversionSpecifier> FixedCS = CS.getStandardSpecifier(); + if (FixedCS) { + EmitFormatDiagnostic(S.PDiag(diag::warn_format_non_standard) + << CS.toString() << /*conversion specifier*/1, + getLocationOfByte(CS.getStart()), + /*IsStringLocation*/true, + getSpecifierRange(startSpecifier, specifierLen)); + + CharSourceRange CSRange = getSpecifierRange(CS.getStart(), CS.getLength()); + S.Diag(getLocationOfByte(CS.getStart()), diag::note_format_fix_specifier) + << FixedCS->toString() + << FixItHint::CreateReplacement(CSRange, FixedCS->toString()); + } else { + EmitFormatDiagnostic(S.PDiag(diag::warn_format_non_standard) + << CS.toString() << /*conversion specifier*/1, + getLocationOfByte(CS.getStart()), + /*IsStringLocation*/true, + getSpecifierRange(startSpecifier, specifierLen)); + } } void CheckFormatHandler::HandlePosition(const char *startPos, |