From: Chris Lattner Date: Wed, 13 Jan 2010 03:06:50 +0000 (+0000) Subject: diagnose invalid values of -ftabstop, patch by Christian Adaker! X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=52388f9aefba585475a38081272ce582d033c883;p=clang diagnose invalid values of -ftabstop, patch by Christian Adaker! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@93288 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticDriverKinds.td b/include/clang/Basic/DiagnosticDriverKinds.td index efbc787ef0..dfb6f8ddc1 100644 --- a/include/clang/Basic/DiagnosticDriverKinds.td +++ b/include/clang/Basic/DiagnosticDriverKinds.td @@ -81,5 +81,7 @@ def warn_drv_clang_unsupported : Warning< "the clang compiler does not support '%0'">; def warn_drv_assuming_mfloat_abi_is : Warning< "unknown platform, assuming -mfloat-abi=%0">; +def warn_ignoring_ftabstop_value : Warning< + "ignoring invalid -ftabstop value '%0', using default value %1">; } diff --git a/include/clang/Frontend/DiagnosticOptions.h b/include/clang/Frontend/DiagnosticOptions.h index 0220e6416e..13039bb506 100644 --- a/include/clang/Frontend/DiagnosticOptions.h +++ b/include/clang/Frontend/DiagnosticOptions.h @@ -37,6 +37,7 @@ public: /// The distance between tab stops. unsigned TabStop; + enum { DefaultTabStop = 8, MaxTabStop = 100 }; /// Column limit for formatting message diagnostics, or 0 if unused. unsigned MessageLength; @@ -52,7 +53,7 @@ public: public: DiagnosticOptions() { IgnoreWarnings = 0; - TabStop = 8; + TabStop = DefaultTabStop; MessageLength = 0; NoRewriteMacros = 0; Pedantic = 0; diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index 375c75c47e..0bca4754ec 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -222,7 +222,7 @@ static void DiagnosticOptsToArgs(const DiagnosticOptions &Opts, Res.push_back("-verify"); if (Opts.ShowOptionNames) Res.push_back("-fdiagnostics-show-option"); - if (Opts.TabStop != 8) { + if (Opts.TabStop != DiagnosticOptions::DefaultTabStop) { Res.push_back("-ftabstop"); Res.push_back(llvm::utostr(Opts.TabStop)); } @@ -808,7 +808,13 @@ static void ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args, Opts.ShowOptionNames = Args.hasArg(OPT_fdiagnostics_show_option); Opts.ShowSourceRanges = Args.hasArg(OPT_fdiagnostics_print_source_range_info); Opts.VerifyDiagnostics = Args.hasArg(OPT_verify); - Opts.TabStop = getLastArgIntValue(Args, OPT_ftabstop, 8, Diags); + Opts.TabStop = getLastArgIntValue(Args, OPT_ftabstop, + DiagnosticOptions::DefaultTabStop, Diags); + if (Opts.TabStop == 0 || Opts.TabStop > DiagnosticOptions::MaxTabStop) { + Diags.Report(diag::warn_ignoring_ftabstop_value) + << Opts.TabStop << DiagnosticOptions::DefaultTabStop; + Opts.TabStop = DiagnosticOptions::DefaultTabStop; + } Opts.MessageLength = getLastArgIntValue(Args, OPT_fmessage_length, 0, Diags); Opts.DumpBuildInformation = getLastArgValue(Args, OPT_dump_build_information); Opts.Warnings = getAllArgValues(Args, OPT_W); diff --git a/lib/Frontend/TextDiagnosticPrinter.cpp b/lib/Frontend/TextDiagnosticPrinter.cpp index c27d112c03..fcefd4e358 100644 --- a/lib/Frontend/TextDiagnosticPrinter.cpp +++ b/lib/Frontend/TextDiagnosticPrinter.cpp @@ -371,15 +371,17 @@ void TextDiagnosticPrinter::EmitCaretDiagnostic(SourceLocation Loc, CaretLine.push_back('^'); // Scan the source line, looking for tabs. If we find any, manually expand - // them to 8 characters and update the CaretLine to match. + // them to spaces and update the CaretLine to match. for (unsigned i = 0; i != SourceLine.size(); ++i) { if (SourceLine[i] != '\t') continue; // Replace this tab with at least one space. SourceLine[i] = ' '; - unsigned TabStop = DiagOpts->TabStop > 0 ? DiagOpts->TabStop : 8; // Compute the number of spaces we need to insert. + unsigned TabStop = DiagOpts->TabStop; + assert(0 < TabStop && TabStop <= DiagnosticOptions::MaxTabStop && + "Invalid -ftabstop value"); unsigned NumSpaces = ((i+TabStop)/TabStop * TabStop) - (i+1); assert(NumSpaces < TabStop && "Invalid computation of space amt");