Format string errors should underling the format string, not the function name.
llvm-svn: 54067
This commit is contained in:
parent
3f375d055e
commit
870f750434
|
@ -454,14 +454,16 @@ Sema::CheckPrintfArguments(CallExpr *TheCall, bool HasVAListArg,
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Diag(TheCall->getArg(format_idx)->getLocStart(),
|
Diag(TheCall->getArg(format_idx)->getLocStart(),
|
||||||
diag::warn_printf_not_string_constant, Fn->getSourceRange());
|
diag::warn_printf_not_string_constant,
|
||||||
|
OrigFormatExpr->getSourceRange());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK: is the format string a wide literal?
|
// CHECK: is the format string a wide literal?
|
||||||
if (FExpr->isWide()) {
|
if (FExpr->isWide()) {
|
||||||
Diag(FExpr->getLocStart(),
|
Diag(FExpr->getLocStart(),
|
||||||
diag::warn_printf_format_string_is_wide_literal, Fn->getSourceRange());
|
diag::warn_printf_format_string_is_wide_literal,
|
||||||
|
OrigFormatExpr->getSourceRange());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -473,7 +475,7 @@ Sema::CheckPrintfArguments(CallExpr *TheCall, bool HasVAListArg,
|
||||||
|
|
||||||
if (StrLen == 0) {
|
if (StrLen == 0) {
|
||||||
Diag(FExpr->getLocStart(), diag::warn_printf_empty_format_string,
|
Diag(FExpr->getLocStart(), diag::warn_printf_empty_format_string,
|
||||||
Fn->getSourceRange());
|
OrigFormatExpr->getSourceRange());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -513,7 +515,7 @@ Sema::CheckPrintfArguments(CallExpr *TheCall, bool HasVAListArg,
|
||||||
// so the presence of a null character is likely an error.
|
// so the presence of a null character is likely an error.
|
||||||
Diag(PP.AdvanceToTokenCharacter(FExpr->getLocStart(), StrIdx+1),
|
Diag(PP.AdvanceToTokenCharacter(FExpr->getLocStart(), StrIdx+1),
|
||||||
diag::warn_printf_format_string_contains_null_char,
|
diag::warn_printf_format_string_contains_null_char,
|
||||||
Fn->getSourceRange());
|
OrigFormatExpr->getSourceRange());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -538,10 +540,10 @@ Sema::CheckPrintfArguments(CallExpr *TheCall, bool HasVAListArg,
|
||||||
|
|
||||||
if (Str[StrIdx-1] == '.')
|
if (Str[StrIdx-1] == '.')
|
||||||
Diag(Loc, diag::warn_printf_asterisk_precision_missing_arg,
|
Diag(Loc, diag::warn_printf_asterisk_precision_missing_arg,
|
||||||
Fn->getSourceRange());
|
OrigFormatExpr->getSourceRange());
|
||||||
else
|
else
|
||||||
Diag(Loc, diag::warn_printf_asterisk_width_missing_arg,
|
Diag(Loc, diag::warn_printf_asterisk_width_missing_arg,
|
||||||
Fn->getSourceRange());
|
OrigFormatExpr->getSourceRange());
|
||||||
|
|
||||||
// Don't do any more checking. We'll just emit spurious errors.
|
// Don't do any more checking. We'll just emit spurious errors.
|
||||||
return;
|
return;
|
||||||
|
@ -604,7 +606,7 @@ Sema::CheckPrintfArguments(CallExpr *TheCall, bool HasVAListArg,
|
||||||
SourceLocation Loc = PP.AdvanceToTokenCharacter(FExpr->getLocStart(),
|
SourceLocation Loc = PP.AdvanceToTokenCharacter(FExpr->getLocStart(),
|
||||||
LastConversionIdx+1);
|
LastConversionIdx+1);
|
||||||
|
|
||||||
Diag(Loc, diag::warn_printf_write_back, Fn->getSourceRange());
|
Diag(Loc, diag::warn_printf_write_back, OrigFormatExpr->getSourceRange());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -621,7 +623,7 @@ Sema::CheckPrintfArguments(CallExpr *TheCall, bool HasVAListArg,
|
||||||
Diag(Loc, diag::warn_printf_invalid_conversion,
|
Diag(Loc, diag::warn_printf_invalid_conversion,
|
||||||
std::string(Str+LastConversionIdx,
|
std::string(Str+LastConversionIdx,
|
||||||
Str+std::min(LastConversionIdx+2, StrLen)),
|
Str+std::min(LastConversionIdx+2, StrLen)),
|
||||||
Fn->getSourceRange());
|
OrigFormatExpr->getSourceRange());
|
||||||
}
|
}
|
||||||
++numConversions;
|
++numConversions;
|
||||||
break;
|
break;
|
||||||
|
@ -641,7 +643,7 @@ Sema::CheckPrintfArguments(CallExpr *TheCall, bool HasVAListArg,
|
||||||
|
|
||||||
Diag(Loc, diag::warn_printf_invalid_conversion,
|
Diag(Loc, diag::warn_printf_invalid_conversion,
|
||||||
std::string(Str+LastConversionIdx, Str+StrIdx),
|
std::string(Str+LastConversionIdx, Str+StrIdx),
|
||||||
Fn->getSourceRange());
|
OrigFormatExpr->getSourceRange());
|
||||||
|
|
||||||
// This conversion is broken. Advance to the next format
|
// This conversion is broken. Advance to the next format
|
||||||
// conversion.
|
// conversion.
|
||||||
|
@ -665,7 +667,7 @@ Sema::CheckPrintfArguments(CallExpr *TheCall, bool HasVAListArg,
|
||||||
Diag(Loc, diag::warn_printf_invalid_conversion,
|
Diag(Loc, diag::warn_printf_invalid_conversion,
|
||||||
std::string(Str+LastConversionIdx,
|
std::string(Str+LastConversionIdx,
|
||||||
Str+std::min(LastConversionIdx+2, StrLen)),
|
Str+std::min(LastConversionIdx+2, StrLen)),
|
||||||
Fn->getSourceRange());
|
OrigFormatExpr->getSourceRange());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -677,13 +679,14 @@ Sema::CheckPrintfArguments(CallExpr *TheCall, bool HasVAListArg,
|
||||||
LastConversionIdx);
|
LastConversionIdx);
|
||||||
|
|
||||||
Diag(Loc, diag::warn_printf_insufficient_data_args,
|
Diag(Loc, diag::warn_printf_insufficient_data_args,
|
||||||
Fn->getSourceRange());
|
OrigFormatExpr->getSourceRange());
|
||||||
}
|
}
|
||||||
// CHECK: Does the number of data arguments exceed the number of
|
// CHECK: Does the number of data arguments exceed the number of
|
||||||
// format conversions in the format string?
|
// format conversions in the format string?
|
||||||
else if (numConversions < numDataArgs)
|
else if (numConversions < numDataArgs)
|
||||||
Diag(TheCall->getArg(format_idx+numConversions+1)->getLocStart(),
|
Diag(TheCall->getArg(format_idx+numConversions+1)->getLocStart(),
|
||||||
diag::warn_printf_too_many_data_args, Fn->getSourceRange());
|
diag::warn_printf_too_many_data_args,
|
||||||
|
OrigFormatExpr->getSourceRange());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue