diff options
Diffstat (limited to 'contrib/llvm/tools/clang/lib/Basic/Diagnostic.cpp')
-rw-r--r-- | contrib/llvm/tools/clang/lib/Basic/Diagnostic.cpp | 212 |
1 files changed, 104 insertions, 108 deletions
diff --git a/contrib/llvm/tools/clang/lib/Basic/Diagnostic.cpp b/contrib/llvm/tools/clang/lib/Basic/Diagnostic.cpp index 45d4b53..4567e32 100644 --- a/contrib/llvm/tools/clang/lib/Basic/Diagnostic.cpp +++ b/contrib/llvm/tools/clang/lib/Basic/Diagnostic.cpp @@ -24,15 +24,13 @@ using namespace clang; static void DummyArgToStringFn(DiagnosticsEngine::ArgumentKind AK, intptr_t QT, - const char *Modifier, unsigned ML, - const char *Argument, unsigned ArgLen, - const DiagnosticsEngine::ArgumentValue *PrevArgs, - unsigned NumPrevArgs, - SmallVectorImpl<char> &Output, - void *Cookie, - ArrayRef<intptr_t> QualTypeVals) { - const char *Str = "<can't format argument>"; - Output.append(Str, Str+strlen(Str)); + StringRef Modifier, StringRef Argument, + ArrayRef<DiagnosticsEngine::ArgumentValue> PrevArgs, + SmallVectorImpl<char> &Output, + void *Cookie, + ArrayRef<intptr_t> QualTypeVals) { + StringRef Str = "<can't format argument>"; + Output.append(Str.begin(), Str.end()); } @@ -41,9 +39,9 @@ DiagnosticsEngine::DiagnosticsEngine( DiagnosticOptions *DiagOpts, DiagnosticConsumer *client, bool ShouldOwnClient) : Diags(diags), DiagOpts(DiagOpts), Client(client), - OwnsDiagClient(ShouldOwnClient), SourceMgr(0) { + OwnsDiagClient(ShouldOwnClient), SourceMgr(nullptr) { ArgToStringFn = DummyArgToStringFn; - ArgToStringCookie = 0; + ArgToStringCookie = nullptr; AllExtensionsSilenced = 0; IgnoreAllWarnings = false; @@ -56,7 +54,7 @@ DiagnosticsEngine::DiagnosticsEngine( PrintTemplateTree = false; ShowColors = false; ShowOverloads = Ovl_All; - ExtBehavior = Ext_Ignore; + ExtBehavior = diag::Severity::Ignored; ErrorLimit = 0; TemplateBacktraceLimit = 0; @@ -157,17 +155,17 @@ DiagnosticsEngine::GetDiagStatePointForLoc(SourceLocation L) const { if (LastStateChangePos.isValid() && Loc.isBeforeInTranslationUnitThan(LastStateChangePos)) Pos = std::upper_bound(DiagStatePoints.begin(), DiagStatePoints.end(), - DiagStatePoint(0, Loc)); + DiagStatePoint(nullptr, Loc)); --Pos; return Pos; } -void DiagnosticsEngine::setDiagnosticMapping(diag::kind Diag, diag::Mapping Map, - SourceLocation L) { +void DiagnosticsEngine::setSeverity(diag::kind Diag, diag::Severity Map, + SourceLocation L) { assert(Diag < diag::DIAG_UPPER_LIMIT && "Can only map builtin diagnostics"); assert((Diags->isBuiltinWarningOrExtension(Diag) || - (Map == diag::MAP_FATAL || Map == diag::MAP_ERROR)) && + (Map == diag::Severity::Fatal || Map == diag::Severity::Error)) && "Cannot map errors into warnings!"); assert(!DiagStatePoints.empty()); assert((L.isInvalid() || SourceMgr) && "No SourceMgr for valid location"); @@ -175,17 +173,17 @@ void DiagnosticsEngine::setDiagnosticMapping(diag::kind Diag, diag::Mapping Map, FullSourceLoc Loc = SourceMgr? FullSourceLoc(L, *SourceMgr) : FullSourceLoc(); FullSourceLoc LastStateChangePos = DiagStatePoints.back().Loc; // Don't allow a mapping to a warning override an error/fatal mapping. - if (Map == diag::MAP_WARNING) { - DiagnosticMappingInfo &Info = GetCurDiagState()->getOrAddMappingInfo(Diag); - if (Info.getMapping() == diag::MAP_ERROR || - Info.getMapping() == diag::MAP_FATAL) - Map = Info.getMapping(); + if (Map == diag::Severity::Warning) { + DiagnosticMapping &Info = GetCurDiagState()->getOrAddMapping(Diag); + if (Info.getSeverity() == diag::Severity::Error || + Info.getSeverity() == diag::Severity::Fatal) + Map = Info.getSeverity(); } - DiagnosticMappingInfo MappingInfo = makeMappingInfo(Map, L); + DiagnosticMapping Mapping = makeUserMapping(Map, L); // Common case; setting all the diagnostics of a group in one place. if (Loc.isInvalid() || Loc == LastStateChangePos) { - GetCurDiagState()->setMappingInfo(Diag, MappingInfo); + GetCurDiagState()->setMapping(Diag, Mapping); return; } @@ -198,7 +196,7 @@ void DiagnosticsEngine::setDiagnosticMapping(diag::kind Diag, diag::Mapping Map, // the new state became active. DiagStates.push_back(*GetCurDiagState()); PushDiagStatePoint(&DiagStates.back(), Loc); - GetCurDiagState()->setMappingInfo(Diag, MappingInfo); + GetCurDiagState()->setMapping(Diag, Mapping); return; } @@ -211,81 +209,64 @@ void DiagnosticsEngine::setDiagnosticMapping(diag::kind Diag, diag::Mapping Map, // Update all diagnostic states that are active after the given location. for (DiagStatePointsTy::iterator I = Pos+1, E = DiagStatePoints.end(); I != E; ++I) { - GetCurDiagState()->setMappingInfo(Diag, MappingInfo); + GetCurDiagState()->setMapping(Diag, Mapping); } // If the location corresponds to an existing point, just update its state. if (Pos->Loc == Loc) { - GetCurDiagState()->setMappingInfo(Diag, MappingInfo); + GetCurDiagState()->setMapping(Diag, Mapping); return; } // Create a new state/point and fit it into the vector of DiagStatePoints // so that the vector is always ordered according to location. - Pos->Loc.isBeforeInTranslationUnitThan(Loc); + assert(Pos->Loc.isBeforeInTranslationUnitThan(Loc)); DiagStates.push_back(*Pos->State); DiagState *NewState = &DiagStates.back(); - GetCurDiagState()->setMappingInfo(Diag, MappingInfo); + GetCurDiagState()->setMapping(Diag, Mapping); DiagStatePoints.insert(Pos+1, DiagStatePoint(NewState, FullSourceLoc(Loc, *SourceMgr))); } -bool DiagnosticsEngine::setDiagnosticGroupMapping( - StringRef Group, diag::Mapping Map, SourceLocation Loc) -{ +bool DiagnosticsEngine::setSeverityForGroup(diag::Flavor Flavor, + StringRef Group, diag::Severity Map, + SourceLocation Loc) { // Get the diagnostics in this group. SmallVector<diag::kind, 8> GroupDiags; - if (Diags->getDiagnosticsInGroup(Group, GroupDiags)) + if (Diags->getDiagnosticsInGroup(Flavor, Group, GroupDiags)) return true; // Set the mapping. for (unsigned i = 0, e = GroupDiags.size(); i != e; ++i) - setDiagnosticMapping(GroupDiags[i], Map, Loc); + setSeverity(GroupDiags[i], Map, Loc); return false; } -void DiagnosticsEngine::setDiagnosticWarningAsError(diag::kind Diag, - bool Enabled) { - // If we are enabling this feature, just set the diagnostic mappings to map to - // errors. - if (Enabled) - setDiagnosticMapping(Diag, diag::MAP_ERROR, SourceLocation()); - - // Otherwise, we want to set the diagnostic mapping's "no Werror" bit, and - // potentially downgrade anything already mapped to be a warning. - DiagnosticMappingInfo &Info = GetCurDiagState()->getOrAddMappingInfo(Diag); - - if (Info.getMapping() == diag::MAP_ERROR || - Info.getMapping() == diag::MAP_FATAL) - Info.setMapping(diag::MAP_WARNING); - - Info.setNoWarningAsError(true); -} - bool DiagnosticsEngine::setDiagnosticGroupWarningAsError(StringRef Group, bool Enabled) { // If we are enabling this feature, just set the diagnostic mappings to map to // errors. if (Enabled) - return setDiagnosticGroupMapping(Group, diag::MAP_ERROR); + return setSeverityForGroup(diag::Flavor::WarningOrError, Group, + diag::Severity::Error); // Otherwise, we want to set the diagnostic mapping's "no Werror" bit, and // potentially downgrade anything already mapped to be a warning. // Get the diagnostics in this group. SmallVector<diag::kind, 8> GroupDiags; - if (Diags->getDiagnosticsInGroup(Group, GroupDiags)) + if (Diags->getDiagnosticsInGroup(diag::Flavor::WarningOrError, Group, + GroupDiags)) return true; // Perform the mapping change. for (unsigned i = 0, e = GroupDiags.size(); i != e; ++i) { - DiagnosticMappingInfo &Info = GetCurDiagState()->getOrAddMappingInfo( - GroupDiags[i]); + DiagnosticMapping &Info = GetCurDiagState()->getOrAddMapping(GroupDiags[i]); - if (Info.getMapping() == diag::MAP_ERROR || - Info.getMapping() == diag::MAP_FATAL) - Info.setMapping(diag::MAP_WARNING); + if (Info.getSeverity() == diag::Severity::Error || + Info.getSeverity() == diag::Severity::Fatal) + Info.setSeverity(diag::Severity::Warning); Info.setNoWarningAsError(true); } @@ -293,45 +274,29 @@ bool DiagnosticsEngine::setDiagnosticGroupWarningAsError(StringRef Group, return false; } -void DiagnosticsEngine::setDiagnosticErrorAsFatal(diag::kind Diag, - bool Enabled) { - // If we are enabling this feature, just set the diagnostic mappings to map to - // errors. - if (Enabled) - setDiagnosticMapping(Diag, diag::MAP_FATAL, SourceLocation()); - - // Otherwise, we want to set the diagnostic mapping's "no Werror" bit, and - // potentially downgrade anything already mapped to be a warning. - DiagnosticMappingInfo &Info = GetCurDiagState()->getOrAddMappingInfo(Diag); - - if (Info.getMapping() == diag::MAP_FATAL) - Info.setMapping(diag::MAP_ERROR); - - Info.setNoErrorAsFatal(true); -} - bool DiagnosticsEngine::setDiagnosticGroupErrorAsFatal(StringRef Group, bool Enabled) { // If we are enabling this feature, just set the diagnostic mappings to map to // fatal errors. if (Enabled) - return setDiagnosticGroupMapping(Group, diag::MAP_FATAL); + return setSeverityForGroup(diag::Flavor::WarningOrError, Group, + diag::Severity::Fatal); // Otherwise, we want to set the diagnostic mapping's "no Werror" bit, and // potentially downgrade anything already mapped to be an error. // Get the diagnostics in this group. SmallVector<diag::kind, 8> GroupDiags; - if (Diags->getDiagnosticsInGroup(Group, GroupDiags)) + if (Diags->getDiagnosticsInGroup(diag::Flavor::WarningOrError, Group, + GroupDiags)) return true; // Perform the mapping change. for (unsigned i = 0, e = GroupDiags.size(); i != e; ++i) { - DiagnosticMappingInfo &Info = GetCurDiagState()->getOrAddMappingInfo( - GroupDiags[i]); + DiagnosticMapping &Info = GetCurDiagState()->getOrAddMapping(GroupDiags[i]); - if (Info.getMapping() == diag::MAP_FATAL) - Info.setMapping(diag::MAP_ERROR); + if (Info.getSeverity() == diag::Severity::Fatal) + Info.setSeverity(diag::Severity::Error); Info.setNoErrorAsFatal(true); } @@ -339,16 +304,17 @@ bool DiagnosticsEngine::setDiagnosticGroupErrorAsFatal(StringRef Group, return false; } -void DiagnosticsEngine::setMappingToAllDiagnostics(diag::Mapping Map, - SourceLocation Loc) { +void DiagnosticsEngine::setSeverityForAll(diag::Flavor Flavor, + diag::Severity Map, + SourceLocation Loc) { // Get all the diagnostics. SmallVector<diag::kind, 64> AllDiags; - Diags->getAllDiagnostics(AllDiags); + Diags->getAllDiagnostics(Flavor, AllDiags); // Set the mapping. for (unsigned i = 0, e = AllDiags.size(); i != e; ++i) if (Diags->isBuiltinWarningOrExtension(AllDiags[i])) - setDiagnosticMapping(AllDiags[i], Map, Loc); + setSeverity(AllDiags[i], Map, Loc); } void DiagnosticsEngine::Report(const StoredDiagnostic &storedDiag) { @@ -358,22 +324,19 @@ void DiagnosticsEngine::Report(const StoredDiagnostic &storedDiag) { CurDiagID = storedDiag.getID(); NumDiagArgs = 0; - NumDiagRanges = storedDiag.range_size(); - assert(NumDiagRanges < DiagnosticsEngine::MaxRanges && - "Too many arguments to diagnostic!"); - unsigned i = 0; + DiagRanges.clear(); + DiagRanges.reserve(storedDiag.range_size()); for (StoredDiagnostic::range_iterator RI = storedDiag.range_begin(), RE = storedDiag.range_end(); RI != RE; ++RI) - DiagRanges[i++] = *RI; + DiagRanges.push_back(*RI); - assert(NumDiagRanges < DiagnosticsEngine::MaxFixItHints && - "Too many arguments to diagnostic!"); - NumDiagFixItHints = 0; + DiagFixItHints.clear(); + DiagFixItHints.reserve(storedDiag.fixit_size()); for (StoredDiagnostic::fixit_iterator FI = storedDiag.fixit_begin(), FE = storedDiag.fixit_end(); FI != FE; ++FI) - DiagFixItHints[NumDiagFixItHints++] = *FI; + DiagFixItHints.push_back(*FI); assert(Client && "DiagnosticConsumer not set!"); Level DiagLevel = storedDiag.getLevel(); @@ -639,6 +602,17 @@ static void HandlePluralModifier(const Diagnostic &DInfo, unsigned ValNo, } } +/// \brief Returns the friendly description for a token kind that will appear +/// without quotes in diagnostic messages. These strings may be translatable in +/// future. +static const char *getTokenDescForDiagnostic(tok::TokenKind Kind) { + switch (Kind) { + case tok::identifier: + return "identifier"; + default: + return nullptr; + } +} /// FormatDiagnostic - Format this diagnostic into a string, substituting the /// formal arguments into the %0 slots. The result is appended onto the Str @@ -696,7 +670,7 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd, // The digit is a number from 0-9 indicating which argument this comes from. // The modifier is a string of digits from the set [-a-z]+, arguments is a // brace enclosed string. - const char *Modifier = 0, *Argument = 0; + const char *Modifier = nullptr, *Argument = nullptr; unsigned ModifierLen = 0, ArgumentLen = 0; // Check to see if we have a modifier. If so eat it. @@ -812,6 +786,28 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd, } break; } + // ---- TOKEN SPELLINGS ---- + case DiagnosticsEngine::ak_tokenkind: { + tok::TokenKind Kind = static_cast<tok::TokenKind>(getRawArg(ArgNo)); + assert(ModifierLen == 0 && "No modifiers for token kinds yet"); + + llvm::raw_svector_ostream Out(OutStr); + if (const char *S = tok::getPunctuatorSpelling(Kind)) + // Quoted token spelling for punctuators. + Out << '\'' << S << '\''; + else if (const char *S = tok::getKeywordSpelling(Kind)) + // Unquoted token spelling for keywords. + Out << S; + else if (const char *S = getTokenDescForDiagnostic(Kind)) + // Unquoted translatable token name. + Out << S; + else if (const char *S = tok::getTokenName(Kind)) + // Debug name, shouldn't appear in user-facing diagnostics. + Out << '<' << S << '>'; + else + Out << "(null)"; + break; + } // ---- NAMES and TYPES ---- case DiagnosticsEngine::ak_identifierinfo: { const IdentifierInfo *II = getArgIdentifier(ArgNo); @@ -832,10 +828,11 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd, case DiagnosticsEngine::ak_nameddecl: case DiagnosticsEngine::ak_nestednamespec: case DiagnosticsEngine::ak_declcontext: + case DiagnosticsEngine::ak_attr: getDiags()->ConvertArgToString(Kind, getRawArg(ArgNo), - Modifier, ModifierLen, - Argument, ArgumentLen, - FormattedArgs.data(), FormattedArgs.size(), + StringRef(Modifier, ModifierLen), + StringRef(Argument, ArgumentLen), + FormattedArgs, OutStr, QualTypeVals); break; case DiagnosticsEngine::ak_qualtype_pair: @@ -857,10 +854,9 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd, TDT.PrintFromType = true; TDT.PrintTree = true; getDiags()->ConvertArgToString(Kind, val, - Modifier, ModifierLen, - Argument, ArgumentLen, - FormattedArgs.data(), - FormattedArgs.size(), + StringRef(Modifier, ModifierLen), + StringRef(Argument, ArgumentLen), + FormattedArgs, Tree, QualTypeVals); // If there is no tree information, fall back to regular printing. if (!Tree.empty()) { @@ -881,9 +877,9 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd, TDT.PrintTree = false; TDT.PrintFromType = true; getDiags()->ConvertArgToString(Kind, val, - Modifier, ModifierLen, - Argument, ArgumentLen, - FormattedArgs.data(), FormattedArgs.size(), + StringRef(Modifier, ModifierLen), + StringRef(Argument, ArgumentLen), + FormattedArgs, OutStr, QualTypeVals); if (!TDT.TemplateDiffUsed) FormattedArgs.push_back(std::make_pair(DiagnosticsEngine::ak_qualtype, @@ -895,9 +891,9 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd, // Append second type TDT.PrintFromType = false; getDiags()->ConvertArgToString(Kind, val, - Modifier, ModifierLen, - Argument, ArgumentLen, - FormattedArgs.data(), FormattedArgs.size(), + StringRef(Modifier, ModifierLen), + StringRef(Argument, ArgumentLen), + FormattedArgs, OutStr, QualTypeVals); if (!TDT.TemplateDiffUsed) FormattedArgs.push_back(std::make_pair(DiagnosticsEngine::ak_qualtype, |