Module:ClangDiags/DiagsLongData16

From emmtrix Wiki
Jump to navigation Jump to search

Documentation for this module may be created at Module:ClangDiags/DiagsLongData16/doc

local a="category_hist";
local b="hierarchical_hist";
local c="source";
local d="commit";
local e="regex3";
local f="regex1";
local g="regex2";
local h="message_hist";
local i="id_hist";
local j="(?:warning|error|fatal error)\\: ";
local k="maingroup";
local l="groups";
local m="tests2";
local n="c++98-compat-pedantic";
local o="c++98-compat";
local p="c++11-compat-pedantic";
local q="c++14-compat-pedantic";
local r="Semantic Issue";
local s="10.0";
local t="9.0";
local u="c++17-compat-pedantic";
local v="8.0";
local w="c++11-compat";
local x="14.0";
local y="c++0x-compat";
local z="13.0";
local A="None";
local B=" \\[(?:\\-Werror,)?\\-Wc\\+\\+98\\-compat[^\\]]*\\]";
local C="clang/test/SemaCXX/cxx98-compat.cpp";
local D="15.0";
local E="c++14-compat";
local F="Parse Issue";
local G="pre-c++20-compat";
local H="6.0";
local I="c++1z-compat";
local J="c++17-compat";
local K="clang/lib/Sema/SemaDeclCXX.cpp";
local L="documentation";
local M="c++2a-compat-pedantic";
local N="c++20-compat-pedantic";
local O="7.0";
local P="c++20-compat";
local Q="pre-c++17-compat";
local R="11.0";
local S="pre-c++20-compat-pedantic";
local T="c++98-c++11-c++14-c++17-compat-pedantic";
local U="16.0";
local V="pre-c++23-compat";
local W="12.0";
local X="c++98-c++11-c++14-c++17-compat";
local Y=" \\[(?:\\-Werror,)?\\-Wpre\\-c\\+\\+20\\-compat[^\\]]*\\]";
local Z="Lexical or Preprocessor Issue";
local ab="deprecated";
local bb="clang/lib/Sema/SemaDecl.cpp";
local cb="clang/lib/Driver/ToolChains/Clang.cpp";
local db="c++2a-compat";
local eb="Documentation Issue";
local fb="Deprecations";
local gb="clang/lib/Parse/ParseDeclCXX.cpp";
local hb="clang/lib/Sema/SemaExpr.cpp";
local ib="pre-c++14-compat";
local jb="clang/lib/AST/CommentSema.cpp";
local kb="constructor";
local lb="pre-c++17-compat-pedantic";
local mb="option-ignored";
local nb="clang/lib/Lex/Lexer.cpp";
local ob="clang/lib/Sema/SemaInit.cpp";
local pb="c++98-c++11-c++14-compat-pedantic";
local qb=" \\[(?:\\-Werror,)?\\-Wdocumentation[^\\]]*\\]";
local rb="Implement -Wc++98-compat warnings for the parser.\n\nllvm-svn: 142056";
local sb="Implement -Wc++98-compat warnings for the parser.";
local tb="5.0";
local ub=" \\[(?:\\-Werror,)?\\-Wpre\\-c\\+\\+17\\-compat[^\\]]*\\]";
local vb="";
local wb="5d164bc5e005";
local xb="c++98-c++11-c++14-compat";
local yb="clang/lib/Sema/SemaTemplate.cpp";
local zb="function";
local Ab="unused-command-line-argument";
local Bb="invalid-command-line-argument";
local Cb=" \\[(?:\\-Werror,)?\\-Wpre\\-c\\+\\+23\\-compat[^\\]]*\\]";
local Db="pre-c++23-compat-pedantic";
local Eb="-Wc++98-compat and -Wc++98-compat-pedantic warnings for Sema, part 1.\n\nllvm-svn: 142419";
local Fb="Implement P2361 Unevaluated string literals";
local Gb="95f50964fbf5";
local Hb="clang/test/Sema/warn-documentation.cpp";
local Ib="0bf8a492fd75";
local Jb="-Wc++98-compat and -Wc++98-compat-pedantic warnings for Sema, part 1.";
local Kb="Implement P2361 Unevaluated string literals\n\nThis patch proposes to handle in an uniform fashion\nthe parsing of strings that are never evaluated,\nin asm statement, static assert, attrributes, extern,\netc.\n\nUnevaluated strings are UTF-8 internally and so currently\nbehave as narrow strings, but these things will diverge with\nD93031.\n\nThe big question both for this patch and the P2361 paper\nis whether we risk breaking code by disallowing\nencoding prefixes in this context.\nI hope this patch may allow to gather some data on that.\n\nFuture work:\nImprove the rendering of unicode characters, line break\nand so forth in static-assert messages\n\nReviewed By: aaron.ballman, shafik\n\nDifferential Revision: https://reviews.llvm.org/D105759";
local Lb="clang/lib/Parse/ParseExprCXX.cpp";
local Mb="c++98-c++11-compat-pedantic";
local Nb="pre-c++14-compat-pedantic";
local Ob="ignored-attributes";
local Pb="clang/lib/Sema/SemaType.cpp";
local Qb="clang/test/SemaCXX/cxx17-compat.cpp";
local Rb="clang/lib/Driver/Driver.cpp";
local Sb="\\";
local Tb="AMDGPU: Teach toolchain to link rocm device libs\n\nCurrently the library is separately linked, but this isn\'t correct to\nimplement fast math flags correctly. Each module should get the\nversion of the library appropriate for its combination of fast math\nand related flags, with the attributes propagated into its functions\nand internalized.\n\nHIP already maintains the list of libraries, but this is not used for\nOpenCL. Unfortunately, HIP uses a separate --hip-device-lib argument,\ndespite both languages using the same bitcode library. Eventually\nthese two searches need to be merged.\n\nAn additional problem is there are 3 different locations the libraries\nare installed, depending on which build is used. This also needs to be\nconsolidated (or at least the search logic needs to deal with this\nunnecessary complexity).";
local Ub="c++98-c++11-compat";
local Vb="clang/lib/Parse/ParseDecl.cpp";
local Wb=" \\[(?:\\-Werror,)?\\-Wpre\\-c\\+\\+14\\-compat[^\\]]*\\]";
local Xb="[clang] New __attribute__((__clang_arm_mve_alias)).\n\nThis allows you to declare a function with a name of your choice (say\n`foo`), but have clang treat it as if it were a builtin function (say\n`__builtin_foo`), by writing\n\n  static __inline__ __attribute__((__clang_arm_mve_alias(__builtin_foo)))\n  int foo(args);\n\nI\'m intending to use this for the ACLE intrinsics for MVE, which have\nto be polymorphic on their argument types and also need to be\nimplemented by builtins. To avoid having to implement the polymorphism\nwith several layers of nested _Generic and make error reporting\nhideous, I want to make all the user-facing intrinsics correspond\ndirectly to clang builtins, so that after clang resolves\n__attribute__((overloadable)) polymorphism it\'s already holding the\nright BuiltinID for the intrinsic it selected.\n\nHowever, this commit itself just introduces the new attribute, and\ndoesn\'t use it for anything.\n\nTo avoid unanticipated side effects if this attribute is used to make\naliases to other builtins, there\'s a restriction mechanism: only\n(BuiltinID, alias) pairs that are approved by the function\nArmMveAliasValid() will be permitted. At present, that function\ndoesn\'t permit anything, because the Tablegen that will generate its\nlist of valid pairs isn\'t yet implemented. So the only test of this\nfacility is one that checks that an unapproved builtin _can\'t_ be\naliased.\n\nReviewers: dmgreen, miyuki, ostannard\n\nSubscribers: cfe-commits\n\nTags: #clang\n\nDifferential Revision: https://reviews.llvm.org/D67159";
local Yb="4593e4131aff";
local Zb="AMDGPU: Teach toolchain to link rocm device libs";
local ac="[clang] New __attribute__((__clang_arm_mve_alias)).";
local bc="@";
local cc="7c11da0cfd33";
local dc="clang/lib/Sema/SemaExprCXX.cpp";
local ec="deprecated-volatile";
local fc="avr-rtlib-linking-quirks";
local gc=" \\[(?:\\-Werror,)?\\-Wc\\+\\+20\\-compat[^\\]]*\\]";
local hc="0687578728ea";
local ic="[C++20][Modules][HU 2/5] Support searching Header Units in user or system search paths.\n\nThis is support for the user-facing options to create importable header units\nfrom headers in the user or system search paths (or to be given an absolute path).\n\nThis means that an incomplete header path will be passed by the driver and the\nlookup carried out using the search paths present when the front end is run.\n\nTo support this, we introduce file fypes for c++-{user,system,header-unit}-header.\nThese terms are the same as the ones used by GCC, to minimise the differences for\ntooling (and users).\n\nThe preprocessor checks for headers before issuing a warning for\n\"#pragma once\" in a header build.  We ensure that the importable header units\nare recognised as headers in order to avoid such warnings.\n\nDifferential Revision: https://reviews.llvm.org/D121096";
local jc="clang/lib/Parse/ParseExpr.cpp";
local kc=" \\[(?:\\-Werror,)?\\-Wc\\+\\+98\\-compat\\-pedantic[^\\]]*\\]";
local lc="[C++20][Modules][HU 2/5] Support searching Header Units in user or system search paths.";
local mc="\'";
local nc="destructor";
local oc="Add -Wc++98-compat warnings for uses of the new keywords \'alignof\', \'char16_t\',\n\'char32_t\', \'constexpr\', \'decltype\', \'noexcept\', \'nullptr\' and \'static_assert\'.\n\nllvm-svn: 142302";
local pc="Add -Wc++98-compat warnings for uses of the new keywords \'alignof\', \'char16_t\',";
local qc=" \\[(?:\\-Werror,)?\\-Woption\\-ignored[^\\]]*\\]";
local rc="documentation-html";
local sc="b15c11c81907";
local tc="clang/lib/Parse/ParseStmt.cpp";
local uc="clang/test/SemaCXX/cxx98-compat-pedantic.cpp";
local vc="CL4";
local wc="-Wc++98-compat warnings for the lexer.";
local xc="-Wc++98-compat warnings for the lexer.\n\nThis also adds a -Wc++98-compat-pedantic for warning on constructs which would\nbe diagnosed by -std=c++98 -pedantic (that is, it warns even on C++11 features\nwhich we enable by default, with no warning, in C++98 mode).\n\nllvm-svn: 142034";
local yc="union";
local zc="class";
local Ac="acd4d3d52abb";
local Bc=" \\[(?:\\-Werror,)?\\-Wignored\\-attributes[^\\]]*\\]";
local Cc="deprecated-declarations";
local Dc="Lambda Issue";
local Ec="clang/lib/Lex/LiteralSupport.cpp";
local Fc="unknown-argument";
local Gc="clang/lib/Driver/SanitizerArgs.cpp";
local Hc="assignment operator";
local Ic="local variable";
local Jc="declaration shadows a ";
local Kc="macro expansion producing \'defined\' has undefined behavior";
local Lc="variable in C";
local Mc="static data member of C";
local Nc="field of C";
local Oc="attributes";
local Pc=" \\[(?:\\-Werror,)?\\-Winvalid\\-command\\-line\\-argument[^\\]]*\\]";
local Qc=" \\[(?:\\-Werror,)?\\-Wunused\\-command\\-line\\-argument[^\\]]*\\]";
local Rc="[C++20][Modules][3/8] Initial handling for module partitions.\n\nThis implements the parsing and recognition of module partition CMIs\nand removes the FIXMEs in the parser.\n\nModule partitions are recognised in the base computation of visibility,\nhowever additional amendments to visibility follow in subsequent patches.\n\nDifferential Revision: https://reviews.llvm.org/D118586";
local Sc="3dbcea8b957a";
local Tc="Reland [clang] Check unsupported types in expressions\n\nThis was committed as ec6c847179fd, but then reverted after a failure\nin: https://lab.llvm.org/buildbot/#/builders/84/builds/13983\n\nI was not able to reproduce the problem, but I added an extra check\nfor a NULL QualType just in case.\n\nOriginal comit message:\n\nThe patch adds missing diagnostics for cases like:\n\n  float F3 = ((__float128)F1 * (__float128)F2) / 2.0f;\n\nSema::checkDeviceDecl (renamed to checkTypeSupport) is changed to work\nwith a type without the corresponding ValueDecl. It is also refactored\nso that host diagnostics for unsupported types can be added here as\nwell.\n\nDifferential Revision: https://reviews.llvm.org/D109315";
local Uc="Reland [clang] Check unsupported types in expressions";
local Vc="C++1y constexpr extensions, round 1: Allow most forms of declaration and\nstatement in constexpr functions. Everything which doesn\'t require variable\nmutation is also allowed as an extension in C++11. \'void\' becomes a literal\ntype to support constexpr functions which return \'void\'.\n\nllvm-svn: 180022";
local Wc="f26054f0fb53";
local Xc="(?: \\[(?:\\-Werror)?[^\\]]*\\])?";
local Yc="clang/lib/Sema/DeclSpec.cpp";
local Zc="C++1y constexpr extensions, round 1: Allow most forms of declaration and";
local ad="d9f663b510c4";
local bd="clang/lib/Frontend/CompilerInvocation.cpp";
local cd="clang/lib/Lex/PPDirectives.cpp";
local dd="Comment parsing: repaint the bikesched: rename \'HTML open tags\' to \'HTML start tags\' and \'HTML close tags\' to \'HTML end tags\' according to HTML spec.\n\nllvm-svn: 160153";
local ed="[C++20][Modules][3/8] Initial handling for module partitions.";
local fd=" \\[(?:\\-Werror,)?\\-Wavr\\-rtlib\\-linking\\-quirks[^\\]]*\\]";
local gd="Comment parsing: repaint the bikesched: rename \'HTML open tags\' to \'HTML start tags\' and \'HTML close...";
local hd="use of this statement in a constexpr ";
local id="clang/test/SemaCXX/cxx11-compat.cpp";
local jd="e00ffc7bb836";
local kd="struct";
local ld="Enable comment parsing and semantic analysis to emit diagnostics.  A few\ndiagnostics implemented -- see testcases.\n\nI created a new TableGen file for comment diagnostics,\nDiagnosticCommentKinds.td, because comment diagnostics don\'t logically\nfit into AST diagnostics file.  But I don\'t feel strongly about it.\n\nThis also implements support for self-closing HTML tags in comment\nlexer and parser (for example, <br />).\n\nIn order to issue precise diagnostics CommentSema needs to know the\ndeclaration the comment is attached to.  There is no easy way to find a decl by \ncomment, so we match comments and decls in lockstep: after parsing one\ndeclgroup we check if we have any new, not yet attached comments.  If we do --\nthen we do the usual comment-finding process.\n\nIt is interesting that this automatically handles trailing comments.\nWe pick up not only comments that precede the declaration, but also\ncomments that *follow* the declaration -- thanks to the lookahead in\nthe lexer: after parsing the declgroup we\'ve consumed the semicolon\nand looked ahead through comments.\n\nAdded -Wdocumentation-html flag for semantic HTML errors to allow the user to \ndisable only HTML warnings (but not HTML parse errors, which we emit as\nwarnings in -Wdocumentation).\n\nllvm-svn: 160078";
local md="interface";
local nd="Enable comment parsing and semantic analysis to emit diagnostics.  A few";
local od="clang/lib/Driver/ToolChains/AVR.cpp";
local pd="move assignment operator";
local qd="clang/lib/AST/CommentParser.cpp";
local rd="clang/lib/Sema/SemaDeclAttr.cpp";
local sd="dangling";
local td="69350e569dc4";
local ud=" \\[(?:\\-Werror,)?\\-Wdeprecated\\-volatile[^\\]]*\\]";
local vd="copy constructor";
local wd="move constructor";
local xd="copy assignment operator";
local yd="clang/lib/Sema/SemaLambda.cpp";

return {
	["warn_ctu_incompat_triple"]={
		[l]={"ctu"},
		[k]="ctu",
		[i]={{nil,v,"warn_ctu_incompat_triple"}},
		[h]={{nil,v,"imported AST from \'%0\' had been generated for a different target, current: %1, imported: %2"}},
		[b]={{nil,v,"imported AST from \'A\' had been generated for a different target, current: B, imported: C"}},
		[f]=j,
		[g]="imported AST from \'(.*?)\' had been generated for a different target, current\\: (.*?), imported\\: (.*?)",
		[e]=" \\[(?:\\-Werror,)?\\-Wctu[^\\]]*\\]",
		[a]={{nil,v,A}},
		[d]={"32aff2eb793c",1544200363,"[CTU] Add triple/lang mismatch handling","[CTU] Add triple/lang mismatch handling\n\nSummary:\nWe introduce a strict policy for C++ CTU. It can work across TUs only if\nthe C++ dialects are the same. We neither allow C vs C++ CTU.  We do this\nbecause the same constructs might be represented with different properties in\nthe corresponding AST nodes or even the nodes might be completely different (a\nstruct will be RecordDecl in C, but it will be a CXXRectordDecl in C++, thus it\nmay cause certain assertions during cast operations).\n\nReviewers: xazax.hun, a_sidorin\n\nSubscribers: rnkovacs, dkrupp, Szelethus, gamesh411, cfe-commits\n\nDifferential Revision: https://reviews.llvm.org/D55134\n\nllvm-svn: 348610"},
		[c]={{"clang/lib/CrossTU/CrossTranslationUnit.cpp",386,"void CrossTranslationUnitContext::emitCrossTUDiagnostics(const IndexError &IE) {\n  // ...\n  case index_error_code::triple_mismatch:\n    Context.getDiagnostics().Report(diag::warn_ctu_incompat_triple) << IE.getFileName() << IE.getTripleToName() << IE.getTripleFromName();"}}
	},
	["warn_cuda_attr_lambda_position"]={
		[l]={"cuda-compat"},
		[k]="cuda-compat",
		[i]="warn_cuda_attr_lambda_position",
		[h]={{nil,x,"nvcc does not allow \'__%0__\' to appear after the parameter list in lambdas"},{z,nil,"nvcc does not allow \'__%0__\' to appear after \'()\' in lambdas"}},
		[b]={{nil,x,"nvcc does not allow \'__A__\' to appear after the parameter list in lambdas"},{z,nil,"nvcc does not allow \'__A__\' to appear after \'()\' in lambdas"}},
		[f]=j,
		[g]="nvcc does not allow \'__(.*?)__\' to appear after the parameter list in lambdas",
		[e]=" \\[(?:\\-Werror,)?\\-Wcuda\\-compat[^\\]]*\\]",
		[a]=F,
		[d]={"e46ea72d97e5",1475265355,"[CUDA] Emit a warning if a CUDA host/device/global attribute is placed after \'(...)\'.","[CUDA] Emit a warning if a CUDA host/device/global attribute is placed after \'(...)\'.\n\nSummary:\nThis is probably the sane place for the attribute to go, but nvcc\nspecifically rejects it.  Other GNU-style attributes are allowed in this\nposition (although judging from the warning it emits for\nhost/device/global, those attributes are applied to the lambda\'s\nanonymous struct, not to the function itself).\n\nIt would be nice to have a FixIt message here, but doing so, or even\njust getting the correct range for the attribute, including its \'((\' and\n\'))\'s, is apparently Hard.\n\nReviewers: rnk\n\nSubscribers: cfe-commits, tra\n\nDifferential Revision: https://reviews.llvm.org/D25115\n\nllvm-svn: 282911"},
		[c]={{Lb,1323,"/// ParseLambdaExpressionAfterIntroducer - Parse the rest of a lambda\n/// expression.\nExprResult Parser::ParseLambdaExpressionAfterIntroducer(LambdaIntroducer &Intro) {\n  // ...\n  // Helper to emit a warning if we see a CUDA host/device/global attribute\n  // after \'(...)\'. nvcc doesn\'t accept this.\n  auto WarnIfHasCUDATargetAttr = [&] {\n    if (getLangOpts().CUDA)\n      for (const ParsedAttr &A : Attributes)\n        if (A.getKind() == ParsedAttr::AT_CUDADevice || A.getKind() == ParsedAttr::AT_CUDAHost || A.getKind() == ParsedAttr::AT_CUDAGlobal)\n          Diag(A.getLoc(), diag::warn_cuda_attr_lambda_position) << A.getAttrName()->getName();"}},
		[m]={
			["clang/test/Parser/lambda-attr.cu"]={"clang/test/Parser/lambda-attr.cu:8:24: warning: nvcc does not allow \'__device__\' to appear after the parameter list in lambdas [-Wcuda-compat]","clang/test/Parser/lambda-attr.cu:13:25: warning: nvcc does not allow \'__device__\' to appear after the parameter list in lambdas [-Wcuda-compat]","clang/test/Parser/lambda-attr.cu:18:28: warning: nvcc does not allow \'__device__\' to appear after the parameter list in lambdas [-Wcuda-compat]","clang/test/Parser/lambda-attr.cu:28:24: warning: nvcc does not allow \'__host__\' to appear after the parameter list in lambdas [-Wcuda-compat]","clang/test/Parser/lambda-attr.cu:28:46: warning: nvcc does not allow \'__device__\' to appear after the parameter list in lambdas [-Wcuda-compat]","clang/test/Parser/lambda-attr.cu:34:25: warning: nvcc does not allow \'__host__\' to appear after the parameter list in lambdas [-Wcuda-compat]","clang/test/Parser/lambda-attr.cu:34:47: warning: nvcc does not allow \'__device__\' to appear after the parameter list in lambdas [-Wcuda-compat]","clang/test/Parser/lambda-attr.cu:40:28: warning: nvcc does not allow \'__host__\' to appear after the parameter list in lambdas [-Wcuda-compat]","clang/test/Parser/lambda-attr.cu:40:50: warning: nvcc does not allow \'__device__\' to appear after the parameter list in lambdas [-Wcuda-compat]"}
		}
	},
	["warn_cxx11_compat_binary_literal"]={
		[l]={"binary-literal",p,"c++98-c++11-compat-binary-literal",Mb,n,Nb},
		[k]="c++98-c++11-compat-binary-literal",
		[i]="warn_cxx11_compat_binary_literal",
		[h]="binary integer literals are incompatible with C++ standards before C++14",
		[b]="binary integer literals are incompatible with C++ standards before C++14",
		[f]=j,
		[g]="binary integer literals are incompatible with C\\+\\+ standards before C\\+\\+14",
		[e]=" \\[(?:\\-Werror,)?\\-Wc\\+\\+98\\-c\\+\\+11\\-compat\\-binary\\-literal[^\\]]*\\]",
		[a]=Z,
		[d]={"c5c27f2a1f26",1366404440,"Note that we support (and in fact have supported since the dawn of time itself)","Note that we support (and in fact have supported since the dawn of time itself)\nC++1y binary literals.\n\nllvm-svn: 179883"},
		[c]={{Ec,1347,"/// ParseNumberStartingWithZero - This method is called when the first character\n/// of the number is found to be a zero.  This means it is either an octal\n/// number (like \'04\') or a hex number (\'0x123a\') a binary number (\'0b1010\') or\n/// a floating point number (01239.123e4).  Eat the prefix, determining the\n/// radix etc.\nvoid NumericLiteralParser::ParseNumberStartingWithZero(SourceLocation TokLoc) {\n  // ...\n  // Handle simple binary numbers 0b01010\n  if ((c1 == \'b\' || c1 == \'B\') && (s[1] == \'0\' || s[1] == \'1\')) {\n    // ...\n    Diags.Report(TokLoc, LangOpts.CPlusPlus14 ? diag::warn_cxx11_compat_binary_literal : LangOpts.CPlusPlus ? diag::ext_binary_literal_cxx14 : diag::ext_binary_literal);"}},
		[m]={
			["clang/test/SemaCXX/cxx98-compat-flags.cpp"]={"clang/test/SemaCXX/cxx98-compat-flags.cpp:36:11: warning: binary integer literals are incompatible with C++ standards before C++14 [-Wc++98-c++11-compat-binary-literal]"}
		}
	},
	["warn_cxx11_compat_constexpr_body_invalid_stmt"]={
		[l]={y,w,p,p,Ub,Mb,o,n,n,ib,Nb},
		[k]=ib,
		[i]="warn_cxx11_compat_constexpr_body_invalid_stmt",
		[h]="use of this statement in a constexpr %select{function|constructor}0 is incompatible with C++ standards before C++14",
		[b]={{nil,nil,{hd,{zb,kb}," is incompatible with C++ standards before C++14"}}},
		[f]=j,
		[g]="use of this statement in a constexpr (?:function|constructor) is incompatible with C\\+\\+ standards before C\\+\\+14",
		[e]=Wb,
		[a]=r,
		[d]={ad,1366644711,Zc,Vc},
		[c]={{K,2300,"/// Check the body for the given constexpr function declaration only contains\n/// the permitted types of statement. C++11 [dcl.constexpr]p3,p4.\n///\n/// \\return true if the body is OK, false if we have found or diagnosed a\n/// problem.\nstatic bool CheckConstexprFunctionBody(Sema &SemaRef, const FunctionDecl *Dcl, Stmt *Body, Sema::CheckConstexprKind Kind) {\n  // ...\n  if (Kind == Sema::CheckConstexprKind::CheckValid) {\n  // ...\n  } else if (Cxx2bLoc.isValid()) {\n  // ...\n  } else if (Cxx2aLoc.isValid()) {\n  // ...\n  } else if (Cxx1yLoc.isValid()) {\n    SemaRef.Diag(Cxx1yLoc, SemaRef.getLangOpts().CPlusPlus14 ? diag::warn_cxx11_compat_constexpr_body_invalid_stmt : diag::ext_constexpr_body_invalid_stmt) << isa<CXXConstructorDecl>(Dcl);"}}
	},
	["warn_cxx11_compat_constexpr_body_multiple_return"]={
		[l]={y,w,p,p,Ub,Mb,o,n,n,ib,Nb},
		[k]=ib,
		[i]="warn_cxx11_compat_constexpr_body_multiple_return",
		[h]="multiple return statements in constexpr function is incompatible with C++ standards before C++14",
		[b]="multiple return statements in constexpr function is incompatible with C++ standards before C++14",
		[f]=j,
		[g]="multiple return statements in constexpr function is incompatible with C\\+\\+ standards before C\\+\\+14",
		[e]=Wb,
		[a]=r,
		[d]={ad,1366644711,Zc,Vc},
		[c]={{K,2399,"/// Check the body for the given constexpr function declaration only contains\n/// the permitted types of statement. C++11 [dcl.constexpr]p3,p4.\n///\n/// \\return true if the body is OK, false if we have found or diagnosed a\n/// problem.\nstatic bool CheckConstexprFunctionBody(Sema &SemaRef, const FunctionDecl *Dcl, Stmt *Body, Sema::CheckConstexprKind Kind) {\n  // ...\n  if (const CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(Dcl)) {\n  // ...\n  } else {\n    if (ReturnStmts.empty()) {\n    // ...\n    } else if (ReturnStmts.size() > 1) {\n      // ...\n      case Sema::CheckConstexprKind::Diagnose:\n        SemaRef.Diag(ReturnStmts.back(), SemaRef.getLangOpts().CPlusPlus14 ? diag::warn_cxx11_compat_constexpr_body_multiple_return : diag::ext_constexpr_body_multiple_return);"}}
	},
	["warn_cxx11_compat_constexpr_body_no_return"]={
		[l]={y,w,p,p,Ub,Mb,o,n,n,ib,Nb},
		[k]=ib,
		[i]="warn_cxx11_compat_constexpr_body_no_return",
		[h]="constexpr function with no return statements is incompatible with C++ standards before C++14",
		[b]="constexpr function with no return statements is incompatible with C++ standards before C++14",
		[f]=j,
		[g]="constexpr function with no return statements is incompatible with C\\+\\+ standards before C\\+\\+14",
		[e]=Wb,
		[a]=r,
		[d]={ad,1366644711,Zc,Vc},
		[c]={{K,2378,"/// Check the body for the given constexpr function declaration only contains\n/// the permitted types of statement. C++11 [dcl.constexpr]p3,p4.\n///\n/// \\return true if the body is OK, false if we have found or diagnosed a\n/// problem.\nstatic bool CheckConstexprFunctionBody(Sema &SemaRef, const FunctionDecl *Dcl, Stmt *Body, Sema::CheckConstexprKind Kind) {\n  // ...\n  if (const CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(Dcl)) {\n  // ...\n  } else {\n    if (ReturnStmts.empty()) {\n      // ...\n      case Sema::CheckConstexprKind::Diagnose:\n        SemaRef.Diag(Dcl->getLocation(), OK ? diag::warn_cxx11_compat_constexpr_body_no_return : diag::err_constexpr_body_no_return) << Dcl->isConsteval();"}}
	},
	["warn_cxx11_compat_constexpr_local_var"]={
		[l]={y,w,p,p,Ub,Mb,o,n,n,ib,Nb},
		[k]=ib,
		[i]="warn_cxx11_compat_constexpr_local_var",
		[h]="variable declaration in a constexpr %select{function|constructor}0 is incompatible with C++ standards before C++14",
		[b]={{nil,nil,{"variable declaration in a constexpr ",{zb,kb}," is incompatible with C++ standards before C++14"}}},
		[f]=j,
		[g]="variable declaration in a constexpr (?:function|constructor) is incompatible with C\\+\\+ standards before C\\+\\+14",
		[e]=Wb,
		[a]=r,
		[d]={ad,1366644711,Zc,Vc},
		[c]={{K,1971,"/// Check the given declaration statement is legal within a constexpr function\n/// body. C++11 [dcl.constexpr]p3,p4, and C++1y [dcl.constexpr]p3.\n///\n/// \\return true if the body is OK (maybe only as an extension), false if we\n///         have diagnosed a problem.\nstatic bool CheckConstexprDeclStmt(Sema &SemaRef, const FunctionDecl *Dcl, DeclStmt *DS, SourceLocation &Cxx1yLoc, Sema::CheckConstexprKind Kind) {\n  // C++11 [dcl.constexpr]p3 and p4:\n  //  The definition of a constexpr function(p3) or constructor(p4) [...] shall\n  //  contain only\n  for (const auto *DclIt : DS->decls()) {\n    // ...\n    case Decl::Var:\n    case Decl::Decomposition: {\n      // ...\n      if (Kind == Sema::CheckConstexprKind::Diagnose) {\n        SemaRef.Diag(VD->getLocation(), SemaRef.getLangOpts().CPlusPlus14 ? diag::warn_cxx11_compat_constexpr_local_var : diag::ext_constexpr_local_var) << isa<CXXConstructorDecl>(Dcl);"}}
	},
	["warn_cxx11_compat_constexpr_type_definition"]={
		[l]={y,w,p,p,Ub,Mb,o,n,n,ib,Nb},
		[k]=ib,
		[i]="warn_cxx11_compat_constexpr_type_definition",
		[h]="type definition in a constexpr %select{function|constructor}0 is incompatible with C++ standards before C++14",
		[b]={{nil,nil,{"type definition in a constexpr ",{zb,kb}," is incompatible with C++ standards before C++14"}}},
		[f]=j,
		[g]="type definition in a constexpr (?:function|constructor) is incompatible with C\\+\\+ standards before C\\+\\+14",
		[e]=Wb,
		[a]=r,
		[d]={ad,1366644711,Zc,Vc},
		[c]={{K,1906,"/// Check the given declaration statement is legal within a constexpr function\n/// body. C++11 [dcl.constexpr]p3,p4, and C++1y [dcl.constexpr]p3.\n///\n/// \\return true if the body is OK (maybe only as an extension), false if we\n///         have diagnosed a problem.\nstatic bool CheckConstexprDeclStmt(Sema &SemaRef, const FunctionDecl *Dcl, DeclStmt *DS, SourceLocation &Cxx1yLoc, Sema::CheckConstexprKind Kind) {\n  // C++11 [dcl.constexpr]p3 and p4:\n  //  The definition of a constexpr function(p3) or constructor(p4) [...] shall\n  //  contain only\n  for (const auto *DclIt : DS->decls()) {\n    // ...\n    case Decl::Enum:\n    case Decl::CXXRecord:\n      // C++1y allows types to be defined, not just declared.\n      if (cast<TagDecl>(DclIt)->isThisDeclarationADefinition()) {\n        if (Kind == Sema::CheckConstexprKind::Diagnose) {\n          SemaRef.Diag(DS->getBeginLoc(), SemaRef.getLangOpts().CPlusPlus14 ? diag::warn_cxx11_compat_constexpr_type_definition : diag::ext_constexpr_type_definition) << isa<CXXConstructorDecl>(Dcl);"}}
	},
	["warn_cxx11_compat_decltype_auto_type_specifier"]={
		[l]={y,w,p,p,Ub,Mb,o,n,n,ib,Nb},
		[k]=ib,
		[i]="warn_cxx11_compat_decltype_auto_type_specifier",
		[h]="\'decltype(auto)\' type specifier is incompatible with C++ standards before C++14",
		[b]="\'decltype(auto)\' type specifier is incompatible with C++ standards before C++14",
		[f]=j,
		[g]="\'decltype\\(auto\\)\' type specifier is incompatible with C\\+\\+ standards before C\\+\\+14",
		[e]=Wb,
		[a]=F,
		[d]={"74aeef50a0cc",1366992935,"Implement C++1y decltype(auto).","Implement C++1y decltype(auto).\n\nllvm-svn: 180610"},
		[c]={{gb,1104,"/// ParseDecltypeSpecifier - Parse a C++11 decltype specifier.\n///\n/// \'decltype\' ( expression )\n/// \'decltype\' ( \'auto\' )      [C++1y]\n///\nSourceLocation Parser::ParseDecltypeSpecifier(DeclSpec &DS) {\n  // ...\n  if (Tok.is(tok::annot_decltype)) {\n  // ...\n  } else {\n    // ...\n    // Check for C++1y \'decltype(auto)\'.\n    if (Tok.is(tok::kw_auto) && NextToken().is(tok::r_paren)) {\n      // ...\n      Diag(Tok.getLocation(), getLangOpts().CPlusPlus14 ? diag::warn_cxx11_compat_decltype_auto_type_specifier : diag::ext_decltype_auto_type_specifier);"}},
		[m]={
			[id]={"clang/test/SemaCXX/cxx11-compat.cpp:50:10: warning: \'decltype(auto)\' type specifier is incompatible with C++ standards before C++14 [-Wpre-c++14-compat]","clang/test/SemaCXX/cxx11-compat.cpp:61:10: warning: \'decltype(auto)\' type specifier is incompatible with C++ standards before C++14 [-Wpre-c++14-compat]"}
		}
	},
	["warn_cxx11_compat_deduced_return_type"]={
		[l]={y,w,p,p,Ub,Mb,o,n,n,ib,Nb},
		[k]=ib,
		[i]={{nil,v,"warn_cxx11_compat_deduced_return_type"}},
		[h]={{nil,v,"return type deduction is incompatible with C++ standards before C++14"}},
		[b]={{nil,v,"return type deduction is incompatible with C++ standards before C++14"}},
		[f]=j,
		[g]="return type deduction is incompatible with C\\+\\+ standards before C\\+\\+14",
		[e]=Wb,
		[a]={{nil,v,r}},
		[d]={"218538ebe952",1535656595,"Add missing -Wc++11-compat / -Wc++14-compat warnings for:","Add missing -Wc++11-compat / -Wc++14-compat warnings for:\n\n * generic lambdas\n * return type deduction\n * class template argument deduction\n\nllvm-svn: 341098"},
		[c]={{Pb,3750,"static QualType GetDeclSpecTypeForDeclarator(TypeProcessingState &state, TypeSourceInfo *&ReturnTypeInfo) {\n  // ...\n  // C++11 [dcl.spec.auto]p5: reject \'auto\' if it is not in an allowed context.\n  if (Deduced) {\n    // ...\n    if (Error != -1) {\n    // ...\n    } else if (Auto && D.getContext() != DeclaratorContext::LambdaExpr) {\n      // ...\n      SemaRef.Diag(AutoRange.getBegin(), D.getContext() == DeclaratorContext::LambdaExprParameter ? diag::warn_cxx11_compat_generic_lambda : IsDeducedReturnType ? diag::warn_cxx11_compat_deduced_return_type : diag::warn_cxx98_compat_auto_type_specifier) << AutoRange;"},{Pb,5205,"static TypeSourceInfo *GetFullTypeForDeclarator(TypeProcessingState &state, QualType declSpecType, TypeSourceInfo *TInfo) {\n  // ...\n  for (unsigned i = 0, e = D.getNumTypeObjects(); i != e; ++i) {\n    // ...\n    case DeclaratorChunk::Function: {\n      // ...\n      // Check for auto functions and trailing return type and adjust the\n      // return type accordingly.\n      if (!D.isInvalidType()) {\n        // trailing-return-type is only required if we\'re declaring a function,\n        // and not, for instance, a pointer to a function.\n        if (D.getDeclSpec().hasAutoTypeSpec() && !FTI.hasTrailingReturnType() && chunkIndex == 0) {\n          if (!S.getLangOpts().CPlusPlus14) {\n          // ...\n          } else {\n            S.Diag(D.getDeclSpec().getTypeSpecTypeLoc(), diag::warn_cxx11_compat_deduced_return_type);"}},
		[m]={
			[id]={"clang/test/SemaCXX/cxx11-compat.cpp:59:1: warning: return type deduction is incompatible with C++ standards before C++14 [-Wpre-c++14-compat]","clang/test/SemaCXX/cxx11-compat.cpp:60:1: warning: return type deduction is incompatible with C++ standards before C++14 [-Wpre-c++14-compat]","clang/test/SemaCXX/cxx11-compat.cpp:61:1: warning: return type deduction is incompatible with C++ standards before C++14 [-Wpre-c++14-compat]","clang/test/SemaCXX/cxx11-compat.cpp:66:3: warning: return type deduction is incompatible with C++ standards before C++14 [-Wpre-c++14-compat]","clang/test/SemaCXX/cxx11-compat.cpp:70:40: warning: return type deduction is incompatible with C++ standards before C++14 [-Wpre-c++14-compat]","clang/test/SemaCXX/cxx11-compat.cpp:73:12: warning: return type deduction is incompatible with C++ standards before C++14 [-Wpre-c++14-compat]"}
		}
	},
	["warn_cxx11_compat_digit_separator"]={
		[l]={y,w,p,p,Ub,Mb,o,n,n,ib,Nb},
		[k]=ib,
		[i]="warn_cxx11_compat_digit_separator",
		[h]="digit separators are incompatible with C++ standards before C++14",
		[b]="digit separators are incompatible with C++ standards before C++14",
		[f]=j,
		[g]="digit separators are incompatible with C\\+\\+ standards before C\\+\\+14",
		[e]=Wb,
		[a]=Z,
		[d]={"fde948529789",1380166386,"Implement C++1y digit separator proposal (\' as a digit separator). This is not","Implement C++1y digit separator proposal (\' as a digit separator). This is not\nyet approved by full committee, but was unanimously supported by EWG.\n\nllvm-svn: 191417"},
		[c]={{nb,1962,"/// LexNumericConstant - Lex the remainder of a integer or floating point\n/// constant. From[-1] is the first character lexed.  Return the end of the\n/// constant.\nbool Lexer::LexNumericConstant(Token &Result, const char *CurPtr) {\n  // ...\n  // If we have a digit separator, continue.\n  if (C == \'\\\'\' && (LangOpts.CPlusPlus14 || LangOpts.C2x)) {\n    // ...\n    if (isAsciiIdentifierContinue(Next)) {\n      if (!isLexingRawMode())\n        Diag(CurPtr, LangOpts.CPlusPlus ? diag::warn_cxx11_compat_digit_separator : diag::warn_c2x_compat_digit_separator);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:410:21: warning: digit separators are incompatible with C++ standards before C++14 [-Wpre-c++14-compat]"}
		}
	},
	["warn_cxx11_compat_generic_lambda"]={
		[l]={y,w,p,p,Ub,Mb,o,n,n,ib,Nb},
		[k]=ib,
		[i]={{nil,v,"warn_cxx11_compat_generic_lambda"}},
		[h]={{nil,v,"generic lambdas are incompatible with C++11"}},
		[b]={{nil,v,"generic lambdas are incompatible with C++11"}},
		[f]=j,
		[g]="generic lambdas are incompatible with C\\+\\+11",
		[e]=Wb,
		[a]={{nil,v,Dc}},
		[d]={"218538ebe952",1535656595,"Add missing -Wc++11-compat / -Wc++14-compat warnings for:","Add missing -Wc++11-compat / -Wc++14-compat warnings for:\n\n * generic lambdas\n * return type deduction\n * class template argument deduction\n\nllvm-svn: 341098"},
		[c]={{Pb,3748,"static QualType GetDeclSpecTypeForDeclarator(TypeProcessingState &state, TypeSourceInfo *&ReturnTypeInfo) {\n  // ...\n  // C++11 [dcl.spec.auto]p5: reject \'auto\' if it is not in an allowed context.\n  if (Deduced) {\n    // ...\n    if (Error != -1) {\n    // ...\n    } else if (Auto && D.getContext() != DeclaratorContext::LambdaExpr) {\n      // ...\n      SemaRef.Diag(AutoRange.getBegin(), D.getContext() == DeclaratorContext::LambdaExprParameter ? diag::warn_cxx11_compat_generic_lambda : IsDeducedReturnType ? diag::warn_cxx11_compat_deduced_return_type : diag::warn_cxx98_compat_auto_type_specifier) << AutoRange;"}},
		[m]={
			[id]={"clang/test/SemaCXX/cxx11-compat.cpp:56:8: warning: generic lambdas are incompatible with C++11 [-Wpre-c++14-compat]"}
		}
	},
	["warn_cxx11_compat_init_capture"]={
		[l]={y,w,p,p,Ub,Mb,o,n,n,ib,Nb},
		[k]=ib,
		[i]="warn_cxx11_compat_init_capture",
		[h]="initialized lambda captures are incompatible with C++ standards before C++14",
		[b]="initialized lambda captures are incompatible with C++ standards before C++14",
		[f]=j,
		[g]="initialized lambda captures are incompatible with C\\+\\+ standards before C\\+\\+14",
		[e]=Wb,
		[a]=Dc,
		[d]={"5b013f505068",1380346707,"Add compat/extension warnings for init captures.","Add compat/extension warnings for init captures.\n\nllvm-svn: 191609"},
		[c]={{yd,1071,"void Sema::ActOnLambdaExpressionAfterIntroducer(LambdaIntroducer &Intro, Scope *CurrentScope) {\n  // ...\n  for (auto C = Intro.Captures.begin(), E = Intro.Captures.end(); C != E; PrevCaptureLoc = C->Loc, ++C) {\n    // ...\n    if (C->Init.isUsable()) {\n      Diag(C->Loc, getLangOpts().CPlusPlus14 ? diag::warn_cxx11_compat_init_capture : diag::ext_init_capture);"}},
		[m]={
			[id]={"clang/test/SemaCXX/cxx11-compat.cpp:52:22: warning: initialized lambda captures are incompatible with C++ standards before C++14 [-Wpre-c++14-compat]"}
		}
	},
	["warn_cxx11_compat_reserved_user_defined_literal"]={
		[l]={y,w,p,"c++11-compat-reserved-user-defined-literal","reserved-user-defined-literal"},
		[k]="c++11-compat-reserved-user-defined-literal",
		[i]="warn_cxx11_compat_reserved_user_defined_literal",
		[h]="identifier after literal will be treated as a reserved user-defined literal suffix in C++11",
		[b]="identifier after literal will be treated as a reserved user-defined literal suffix in C++11",
		[f]=j,
		[g]="identifier after literal will be treated as a reserved user\\-defined literal suffix in C\\+\\+11",
		[e]=" \\[(?:\\-Werror,)?\\-Wc\\+\\+11\\-compat\\-reserved\\-user\\-defined\\-literal[^\\]]*\\]",
		[a]=Z,
		[d]={"0df56f4a9000",1331174361,"Implement C++11 [lex.ext]p10 for string and character literals: a ud-suffix not","Implement C++11 [lex.ext]p10 for string and character literals: a ud-suffix not\nstarting with an underscore is ill-formed.\n\nSince this rule rejects programs that were using <inttypes.h>\'s macros, recover\nfrom this error by treating the ud-suffix as a separate preprocessing-token,\nwith a DefaultError ExtWarn. The approach of treating such cases as two tokens\nis under discussion for standardization, but is in any case a conforming\nextension and allows existing codebases to keep building while the committee\nmakes up its mind.\n\nReword the warning on the definition of literal operators not starting with\nunderscores (which are, strangely, legal) to more explicitly state that such\noperators can\'t be called by literals. Remove the special-case diagnostic for\nhexfloats, since it was both triggering in the wrong cases and incorrect.\n\nllvm-svn: 152287"},
		[c]={{nb,2007,"/// LexUDSuffix - Lex the ud-suffix production for user-defined literal suffixes\n/// in C++11, or warn on a ud-suffix in C++98.\nconst char *Lexer::LexUDSuffix(Token &Result, const char *CurPtr, bool IsStringLiteral) {\n  // ...\n  if (!LangOpts.CPlusPlus11) {\n    if (!isLexingRawMode())\n      Diag(CurPtr, C == \'_\' ? diag::warn_cxx11_compat_user_defined_literal : diag::warn_cxx11_compat_reserved_user_defined_literal) << FixItHint::CreateInsertion(getSourceLocation(CurPtr), \" \");"}},
		[m]={
			["clang/test/Lexer/ms-extensions.cpp"]={"clang/test/Lexer/ms-extensions.cpp:5:15: warning: identifier after literal will be treated as a reserved user-defined literal suffix in C++11 [-Wc++11-compat-reserved-user-defined-literal]"}
		}
	},
	["warn_cxx11_compat_user_defined_literal"]={
		[l]={y,w,p},
		[k]=w,
		[i]="warn_cxx11_compat_user_defined_literal",
		[h]="identifier after literal will be treated as a user-defined literal suffix in C++11",
		[b]="identifier after literal will be treated as a user-defined literal suffix in C++11",
		[f]=j,
		[g]="identifier after literal will be treated as a user\\-defined literal suffix in C\\+\\+11",
		[e]=" \\[(?:\\-Werror,)?\\-Wc\\+\\+11\\-compat[^\\]]*\\]",
		[a]=Z,
		[d]={"3e4a60a2cd88",1331089980,"Add -Wc++11-compat warning for string and character literals followed by","Add -Wc++11-compat warning for string and character literals followed by\nidentifiers, in cases where those identifiers would be treated as\nuser-defined literal suffixes in C++11.\n\nllvm-svn: 152198"},
		[c]={{nb,2006,"/// LexUDSuffix - Lex the ud-suffix production for user-defined literal suffixes\n/// in C++11, or warn on a ud-suffix in C++98.\nconst char *Lexer::LexUDSuffix(Token &Result, const char *CurPtr, bool IsStringLiteral) {\n  // ...\n  if (!LangOpts.CPlusPlus11) {\n    if (!isLexingRawMode())\n      Diag(CurPtr, C == \'_\' ? diag::warn_cxx11_compat_user_defined_literal : diag::warn_cxx11_compat_reserved_user_defined_literal) << FixItHint::CreateInsertion(getSourceLocation(CurPtr), \" \");"}},
		[m]={
			[id]={"clang/test/SemaCXX/cxx11-compat.cpp:42:13: warning: identifier after literal will be treated as a user-defined literal suffix in C++11 [-Wc++11-compat]"}
		}
	},
	["warn_cxx11_compat_variable_template"]={
		[l]={y,w,p,p,Ub,Mb,o,n,n,ib,Nb},
		[k]=ib,
		[i]="warn_cxx11_compat_variable_template",
		[h]="variable templates are incompatible with C++ standards before C++14",
		[b]="variable templates are incompatible with C++ standards before C++14",
		[f]=j,
		[g]="variable templates are incompatible with C\\+\\+ standards before C\\+\\+14",
		[e]=Wb,
		[a]=r,
		[d]={"39a1e507ff0b",1375750985,"Started implementing variable templates. Top level declarations should be fully supported, up to som...","Started implementing variable templates. Top level declarations should be fully supported, up to some limitations documented as FIXMEs or TODO. Static data member templates work very partially. Static data member templates of class templates need particular attention...\n\nllvm-svn: 187762"},
		[c]={{bb,7652,"NamedDecl *Sema::ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope, ArrayRef<BindingDecl *> Bindings) {\n  // ...\n  if (!getLangOpts().CPlusPlus) {\n  // ...\n  } else {\n    // ...\n    if (TemplateParams) {\n      if (!TemplateParams->size() && D.getName().getKind() != UnqualifiedIdKind::IK_TemplateId) {\n      // ...\n      } else {\n        // ...\n        if (D.getName().getKind() == UnqualifiedIdKind::IK_TemplateId) {\n        // ...\n        } else { // if (TemplateParams->size() > 0)\n          // ...\n          Diag(D.getIdentifierLoc(), getLangOpts().CPlusPlus14 ? diag::warn_cxx11_compat_variable_template : diag::ext_variable_template);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:365:24: warning: variable templates are incompatible with C++ standards before C++14 [-Wpre-c++14-compat]","clang/test/SemaCXX/cxx98-compat.cpp:380:33: warning: variable templates are incompatible with C++ standards before C++14 [-Wpre-c++14-compat]","clang/test/SemaCXX/cxx98-compat.cpp:390:43: warning: variable templates are incompatible with C++ standards before C++14 [-Wpre-c++14-compat]","clang/test/SemaCXX/cxx98-compat.cpp:397:27: warning: variable templates are incompatible with C++ standards before C++14 [-Wpre-c++14-compat]"}
		}
	},
	["warn_cxx11_gnu_attribute_on_type"]={
		[l]={Oc,Ob},
		[k]=Ob,
		[i]="warn_cxx11_gnu_attribute_on_type",
		[h]="attribute %0 ignored, because it cannot be applied to a type",
		[b]="attribute A ignored, because it cannot be applied to a type",
		[f]=j,
		[g]="attribute (.*?) ignored, because it cannot be applied to a type",
		[e]=Bc,
		[a]=r,
		[d]={"368ca52cd91b",1358149981,"Accept [[gnu::*]] for all __attribute__((*))s which are:","Accept [[gnu::*]] for all __attribute__((*))s which are:\n 1) Supported by Clang, and\n 2) Supported by GCC, and\n 3) Documented in GCC\'s manual.\n\ng++ allows its C++11-style attributes to appertain only to the entity being\ndeclared, and never to a type (even for a type attribute), so we do the same.\n\nllvm-svn: 172382"},
		[c]={{Pb,8546,"static void processTypeAttrs(TypeProcessingState &state, QualType &type, TypeAttrLocation TAL, const ParsedAttributesView &attrs) {\n  // ...\n  for (ParsedAttr &attr : AttrsCopy) {\n    // ...\n    if (attr.isStandardAttributeSyntax() || attr.isRegularKeywordAttribute()) {\n      // [[gnu::...]] attributes are treated as declaration attributes, so may\n      // not appertain to a DeclaratorChunk. If we handle them as type\n      // attributes, accept them in that position and diagnose the GCC\n      // incompatibility.\n      if (attr.isGNUScope()) {\n        // ...\n        if (TAL == TAL_DeclChunk) {\n          state.getSema().Diag(attr.getLoc(), IsTypeAttr ? diag::warn_gcc_ignores_type_attr : diag::warn_cxx11_gnu_attribute_on_type) << attr;"}},
		[m]={
			["clang/test/CXX/expr/expr.prim/expr.prim.lambda/p5.cpp"]={"clang/test/CXX/expr/expr.prim/expr.prim.lambda/p5.cpp:9:22: warning: attribute \'noreturn\' ignored, because it cannot be applied to a type [-Wignored-attributes]"}
		}
	},
	["warn_cxx11_keyword"]={
		[l]={y,w,p},
		[k]=w,
		[i]="warn_cxx11_keyword",
		[h]="\'%0\' is a keyword in C++11",
		[b]="\'A\' is a keyword in C++11",
		[f]=j,
		[g]="\'(.*?)\' is a keyword in C\\+\\+11",
		[e]=" \\[(?:\\-Werror,)?\\-Wc\\+\\+11\\-compat[^\\]]*\\]",
		[a]=Z,
		[d]={"4dd85d6fa114",1318363072,"Add a -Wc++0x-compat warning for C++11 keywords used as identifiers when in","Add a -Wc++0x-compat warning for C++11 keywords used as identifiers when in\nC++98 mode. Only the first occurrence of each keyword will produce a warning.\n\nllvm-svn: 141700"},
		[c]={{"clang/lib/Basic/IdentifierTable.cpp",907,"#include \"clang/Basic/TokenKinds.def\"\n  // ...\n  if (LangOpts.CPlusPlus) {\n    if ((Flags & KEYCXX11) == KEYCXX11)\n      return diag::warn_cxx11_keyword;"}},
		[m]={
			["clang/test/Lexer/cxx0x_keyword_as_cxx98.cpp"]={"clang/test/Lexer/cxx0x_keyword_as_cxx98.cpp:9:21: warning: \'nullptr\' is a keyword in C++11 [-Wc++11-compat]","clang/test/Lexer/cxx0x_keyword_as_cxx98.cpp:17:15: warning: \'decltype\' is a keyword in C++11 [-Wc++11-compat]","clang/test/Lexer/cxx0x_keyword_as_cxx98.cpp:19:12: warning: \'alignof\' is a keyword in C++11 [-Wc++11-compat]","clang/test/Lexer/cxx0x_keyword_as_cxx98.cpp:27:5: warning: \'alignas\' is a keyword in C++11 [-Wc++11-compat]","clang/test/Lexer/cxx0x_keyword_as_cxx98.cpp:29:5: warning: \'char16_t\' is a keyword in C++11 [-Wc++11-compat]","clang/test/Lexer/cxx0x_keyword_as_cxx98.cpp:30:5: warning: \'char32_t\' is a keyword in C++11 [-Wc++11-compat]","clang/test/Lexer/cxx0x_keyword_as_cxx98.cpp:31:5: warning: \'constexpr\' is a keyword in C++11 [-Wc++11-compat]","clang/test/Lexer/cxx0x_keyword_as_cxx98.cpp:33:5: warning: \'noexcept\' is a keyword in C++11 [-Wc++11-compat]","clang/test/Lexer/cxx0x_keyword_as_cxx98.cpp:35:5: warning: \'static_assert\' is a keyword in C++11 [-Wc++11-compat]","clang/test/Lexer/cxx0x_keyword_as_cxx98.cpp:36:5: warning: \'thread_local\' is a keyword in C++11 [-Wc++11-compat]"}
		}
	},
	["warn_cxx11_right_shift_in_template_arg"]={
		[l]={y,w,p},
		[k]=w,
		[i]="warn_cxx11_right_shift_in_template_arg",
		[h]="use of right-shift operator (\'>>\') in template argument will require parentheses in C++11",
		[b]="use of right-shift operator (\'>>\') in template argument will require parentheses in C++11",
		[f]=j,
		[g]="use of right\\-shift operator \\(\'\\>\\>\'\\) in template argument will require parentheses in C\\+\\+11",
		[e]=" \\[(?:\\-Werror,)?\\-Wc\\+\\+11\\-compat[^\\]]*\\]",
		[a]=F,
		[d]={"b1c4d5507fad",1236199783,"The basic representation of diagnostics information in tablegen format, plus (uncommented and incomp...","The basic representation of diagnostics information in tablegen format, plus (uncommented and incomplete) test conversions of the existing def files to this format.\n\nllvm-svn: 66064"},
		[c]={{jc,627,"/// Parse a binary expression that starts with \\p LHS and has a\n/// precedence of at least \\p MinPrec.\nExprResult Parser::ParseRHSOfBinaryExpression(ExprResult LHS, prec::Level MinPrec) {\n  // ...\n  while (true) {\n    // ...\n    if (!LHS.isInvalid()) {\n      // Combine the LHS and RHS into the LHS (e.g. build AST).\n      if (TernaryMiddle.isInvalid()) {\n        // If we\'re using \'>>\' as an operator within a template\n        // argument list (in C++98), suggest the addition of\n        // parentheses so that the code remains well-formed in C++0x.\n        if (!GreaterThanIsOperator && OpToken.is(tok::greatergreater))\n          SuggestParentheses(OpToken.getLocation(), diag::warn_cxx11_right_shift_in_template_arg, SourceRange(Actions.getExprRange(LHS.get()).getBegin(), Actions.getExprRange(RHS.get()).getEnd()));"}},
		[m]={
			["clang/test/CXX/temp/temp.param/p15.cpp"]={"clang/test/CXX/temp/temp.param/p15.cpp:12:5: warning: use of right-shift operator (\'>>\') in template argument will require parentheses in C++11 [-Wc++11-compat]"}
		}
	},
	["warn_cxx14_compat_class_template_argument_deduction"]={
		[l]={y,w,p,p,E,q,q,xb,pb,o,n,n,Q,lb},
		[k]=Q,
		[i]={{nil,v,"warn_cxx14_compat_class_template_argument_deduction"}},
		[h]={{nil,v,"class template argument deduction is incompatible with C++ standards before C++17%select{|; for compatibility, use explicit type name %1}0"}},
		[b]={{nil,v,{"class template argument deduction is incompatible with C++ standards before C++17",{vb,"; for compatibility, use explicit type name B"}}}},
		[f]=j,
		[g]="class template argument deduction is incompatible with C\\+\\+ standards before C\\+\\+17(?:|; for compatibility, use explicit type name (.*?))",
		[e]=ub,
		[a]={{nil,v,r}},
		[d]={"218538ebe952",1535656595,"Add missing -Wc++11-compat / -Wc++14-compat warnings for:","Add missing -Wc++11-compat / -Wc++14-compat warnings for:\n\n * generic lambdas\n * return type deduction\n * class template argument deduction\n\nllvm-svn: 341098"},
		[c]={{ob,10585,"QualType Sema::DeduceTemplateSpecializationFromInitializer(TypeSourceInfo *TSInfo, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Inits, ParenListExpr *PL) {\n  // ...\n  // Can\'t deduce from dependent arguments.\n  if (Expr::hasAnyTypeDependentArguments(Inits)) {\n    Diag(TSInfo->getTypeLoc().getBeginLoc(), diag::warn_cxx14_compat_class_template_argument_deduction) << TSInfo->getTypeLoc().getSourceRange() << 0;"},{ob,10910,"QualType Sema::DeduceTemplateSpecializationFromInitializer(TypeSourceInfo *TSInfo, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Inits, ParenListExpr *PL) {\n  // ...\n  Diag(TSInfo->getTypeLoc().getBeginLoc(), diag::warn_cxx14_compat_class_template_argument_deduction) << TSInfo->getTypeLoc().getSourceRange() << 1 << DeducedType;"}},
		[m]={
			["clang/test/SemaCXX/cxx14-compat.cpp"]={"clang/test/SemaCXX/cxx14-compat.cpp:19:1: warning: class template argument deduction is incompatible with C++ standards before C++17; for compatibility, use explicit type name \'X<>\' [-Wpre-c++17-compat]","clang/test/SemaCXX/cxx14-compat.cpp:25:3: warning: class template argument deduction is incompatible with C++ standards before C++17 [-Wpre-c++17-compat]","clang/test/SemaCXX/cxx14-compat.cpp:29:3: warning: class template argument deduction is incompatible with C++ standards before C++17; for compatibility, use explicit type name \'typename A::X<A>\' (aka \'A::X<A>\') [-Wpre-c++17-compat]"}
		}
	},
	["warn_cxx14_compat_constexpr_if"]={
		[l]={y,w,p,p,E,q,q,xb,pb,o,n,n,Q,lb},
		[k]=Q,
		[i]="warn_cxx14_compat_constexpr_if",
		[h]="constexpr if is incompatible with C++ standards before C++1z",
		[b]="constexpr if is incompatible with C++ standards before C++1z",
		[f]=j,
		[g]="constexpr if is incompatible with C\\+\\+ standards before C\\+\\+17",
		[e]=ub,
		[a]=F,
		[d]={"b130fe7d316e",1466709409,"Implement p0292r2 (constexpr if), a likely C++1z feature.","Implement p0292r2 (constexpr if), a likely C++1z feature.\n\nllvm-svn: 273602"},
		[c]={{tc,1469,"/// ParseIfStatement\n///       if-statement: [C99 6.8.4.1]\n///         \'if\' \'(\' expression \')\' statement\n///         \'if\' \'(\' expression \')\' statement \'else\' statement\n/// [C++]   \'if\' \'(\' condition \')\' statement\n/// [C++]   \'if\' \'(\' condition \')\' statement \'else\' statement\n/// [C++23] \'if\' \'!\' [opt] consteval compound-statement\n/// [C++23] \'if\' \'!\' [opt] consteval compound-statement \'else\' statement\n///\nStmtResult Parser::ParseIfStatement(SourceLocation *TrailingElseLoc) {\n  // ...\n  if (Tok.is(tok::kw_constexpr)) {\n    Diag(Tok, getLangOpts().CPlusPlus17 ? diag::warn_cxx14_compat_constexpr_if : diag::ext_constexpr_if);"}}
	},
	["warn_cxx14_compat_constexpr_not_const"]={
		[l]={"constexpr-not-const"},
		[k]="constexpr-not-const",
		[i]="warn_cxx14_compat_constexpr_not_const",
		[h]="\'constexpr\' non-static member function will not be implicitly \'const\' in C++14; add \'const\' to avoid a change in behavior",
		[b]="\'constexpr\' non-static member function will not be implicitly \'const\' in C++14; add \'const\' to avoid a change in behavior",
		[f]=j,
		[g]="\'constexpr\' non\\-static member function will not be implicitly \'const\' in C\\+\\+14; add \'const\' to avoid a change in behavior",
		[e]=" \\[(?:\\-Werror,)?\\-Wconstexpr\\-not\\-const[^\\]]*\\]",
		[a]=r,
		[d]={"034185c2f9e3",1366506530,"The \'constexpr implies const\' rule for non-static member functions is gone in","The \'constexpr implies const\' rule for non-static member functions is gone in\nC++1y, so stop adding the \'const\' there. Provide a compatibility warning for\ncode relying on this in C++11, with a fix-it hint. Update our lazily-written\ntests to add the const, except for those ones which were testing our\nimplementation of this rule.\n\nllvm-svn: 179969"},
		[c]={{bb,11810,"/// Perform semantic checking of a new function declaration.\n///\n/// Performs semantic analysis of the new function declaration\n/// NewFD. This routine performs all semantic checking that does not\n/// require the actual declarator involved in the declaration, and is\n/// used both for the declaration of functions as they are parsed\n/// (called via ActOnDeclarator) and for the declaration of functions\n/// that have been instantiated via C++ template instantiation (called\n/// via InstantiateDecl).\n///\n/// \\param IsMemberSpecialization whether this new function declaration is\n/// a member specialization (that replaces any definition provided by the\n/// previous declaration).\n///\n/// This sets NewFD->isInvalidDecl() to true if there was an error.\n///\n/// \\returns true if the function declaration is a redeclaration.\nbool Sema::CheckFunctionDeclaration(Scope *S, FunctionDecl *NewFD, LookupResult &Previous, bool IsMemberSpecialization, bool DeclIsDefn) {\n  // ...\n  if (!getLangOpts().CPlusPlus14 && MD && MD->isConstexpr() && !MD->isStatic() && !isa<CXXConstructorDecl>(MD) && !isa<CXXDestructorDecl>(MD) && !MD->getMethodQualifiers().hasConst()) {\n    // ...\n    if (!OldMD || !OldMD->isStatic()) {\n      // ...\n      // Warn that we did this, if we\'re not performing template instantiation.\n      // In that case, we\'ll have warned already when the template was defined.\n      if (!inTemplateInstantiation()) {\n        // ...\n        Diag(MD->getLocation(), diag::warn_cxx14_compat_constexpr_not_const) << FixItHint::CreateInsertion(AddConstLoc, \" const\");"}},
		[m]={
			["clang/test/CXX/temp/temp.spec/temp.explicit/p1-0x.cpp"]={"clang/test/CXX/temp/temp.spec/temp.explicit/p1-0x.cpp:12:17: warning: \'constexpr\' non-static member function will not be implicitly \'const\' in C++14; add \'const\' to avoid a change in behavior [-Wconstexpr-not-const]"}
		}
	},
	["warn_cxx14_compat_constexpr_on_lambda"]={
		[l]={y,w,p,p,E,q,q,xb,pb,o,n,n,Q,lb},
		[k]=Q,
		[i]="warn_cxx14_compat_constexpr_on_lambda",
		[h]="constexpr on lambda expressions is incompatible with C++ standards before C++1z",
		[b]="constexpr on lambda expressions is incompatible with C++ standards before C++1z",
		[f]=j,
		[g]="constexpr on lambda expressions is incompatible with C\\+\\+ standards before C\\+\\+17",
		[e]=ub,
		[a]=F,
		[d]={"a734ab980865",1459008697,"[Cxx1z-constexpr-lambda-P0170R1]  Support parsing of constexpr specifier (and its inference) on lamb...","[Cxx1z-constexpr-lambda-P0170R1]  Support parsing of constexpr specifier (and its inference) on lambda expressions\n\nSupport the constexpr specifier on lambda expressions - and support its inference from the lambda call operator\'s body.\n\ni.e.\n  auto L = [] () constexpr { return 5; };\n  static_assert(L() == 5); // OK\n  auto Implicit = [] (auto a) { return a; };\n  static_assert(Implicit(5) == 5); \n\nWe do not support evaluation of lambda\'s within constant expressions just yet.\n\nImplementation Strategy:\n  - teach ParseLambdaExpressionAfterIntroducer to expect a constexpr specifier and mark the invented function call operator\'s declarator\'s decl-specifier with it; Have it emit fixits for multiple decl-specifiers (mutable or constexpr) in this location.\n  - for cases where constexpr is not explicitly specified, have buildLambdaExpr check whether the invented function call operator satisfies the requirements of a constexpr function, by calling CheckConstexprFunctionDecl/Body.\n\nMuch obliged to Richard Smith for his patience and his care, in ensuring the code is clang-worthy.\n\nllvm-svn: 264513"},
		[c]={{Lb,1228,"static void addConstexprToLambdaDeclSpecifier(Parser &P, SourceLocation ConstexprLoc, DeclSpec &DS) {\n  if (ConstexprLoc.isValid()) {\n    P.Diag(ConstexprLoc, !P.getLangOpts().CPlusPlus17 ? diag::ext_constexpr_on_lambda_cxx17 : diag::warn_cxx14_compat_constexpr_on_lambda);"}}
	},
	["warn_cxx14_compat_decomp_decl"]={
		[l]={y,w,p,p,E,q,q,xb,pb,o,n,n,Q,lb},
		[k]=Q,
		[i]="warn_cxx14_compat_decomp_decl",
		[h]="decomposition declarations are incompatible with C++ standards before C++1z",
		[b]="decomposition declarations are incompatible with C++ standards before C++1z",
		[f]=j,
		[g]="decomposition declarations are incompatible with C\\+\\+ standards before C\\+\\+17",
		[e]=ub,
		[a]=r,
		[d]={"bdb84f374cde",1469230619,"P0217R3: Parsing support and framework for AST representation of C++1z","P0217R3: Parsing support and framework for AST representation of C++1z\ndecomposition declarations.\n\nThere are a couple of things in the wording that seem strange here:\ndecomposition declarations are permitted at namespace scope (which we partially\nsupport here) and they are permitted as the declaration in a template (which we\nreject).\n\nllvm-svn: 276492"},
		[c]={{K,755,"NamedDecl *Sema::ActOnDecompositionDeclarator(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParamLists) {\n  // ...\n  Diag(Decomp.getLSquareLoc(), !getLangOpts().CPlusPlus17 ? diag::ext_decomp_decl : D.getContext() == DeclaratorContext::Condition ? diag::ext_decomp_decl_cond : diag::warn_cxx14_compat_decomp_decl) << Decomp.getSourceRange();"}}
	},
	["warn_cxx14_compat_fold_expression"]={
		[l]={y,w,p,p,E,q,q,xb,pb,o,n,n,Q,lb},
		[k]=Q,
		[i]="warn_cxx14_compat_fold_expression",
		[h]="pack fold expression is incompatible with C++ standards before C++1z",
		[b]="pack fold expression is incompatible with C++ standards before C++1z",
		[f]=j,
		[g]="pack fold expression is incompatible with C\\+\\+ standards before C\\+\\+17",
		[e]=ub,
		[a]=F,
		[d]={"0f0af19b0581",1415423236,"[c++1z] N4295: fold-expressions.","[c++1z] N4295: fold-expressions.\n\nThis is a new form of expression of the form:\n\n  (expr op ... op expr)\n\nwhere one of the exprs is a parameter pack. It expands into\n\n  (expr1 op (expr2onwards op ... op expr))\n\n(and likewise if the pack is on the right). The non-pack operand can be\nomitted; in that case, an empty pack gives a fallback value or an error,\ndepending on the operator.\n\nllvm-svn: 221573"},
		[c]={{jc,3454,"/// Parse A C++1z fold-expression after the opening paren and optional\n/// left-hand-side expression.\n///\n/// \\verbatim\n///   fold-expression:\n///       ( cast-expression fold-operator ... )\n///       ( ... fold-operator cast-expression )\n///       ( cast-expression fold-operator ... fold-operator cast-expression )\nExprResult Parser::ParseFoldExpression(ExprResult LHS, BalancedDelimiterTracker &T) {\n  // ...\n  Diag(EllipsisLoc, getLangOpts().CPlusPlus17 ? diag::warn_cxx14_compat_fold_expression : diag::ext_fold_expression);"}},
		[m]={
			["clang/test/SemaCXX/cxx14-compat.cpp"]={"clang/test/SemaCXX/cxx14-compat.cpp:13:42: warning: pack fold expression is incompatible with C++ standards before C++17 [-Wpre-c++17-compat]"}
		}
	},
	["warn_cxx14_compat_init_statement"]={
		[l]={y,w,p,p,E,q,q,xb,pb,o,n,n,Q,lb},
		[k]=Q,
		[i]="warn_cxx14_compat_init_statement",
		[h]="%select{if|switch}0 initialization statements are incompatible with C++ standards before C++1z",
		[b]={{nil,tb,{{"if","switch"}," initialization statements are incompatible with C++ standards before C++17"}},{nil,nil,{{"if","switch"}," initialization statements are incompatible with C++ standards before C++1z"}}},
		[f]=j,
		[g]="(?:if|switch) initialization statements are incompatible with C\\+\\+ standards before C\\+\\+17",
		[e]=ub,
		[a]=F,
		[d]={"fccb5128b201",1476822436,"Add missing warning for use of C++1z init-statements in C++14 and before.","Add missing warning for use of C++1z init-statements in C++14 and before.\n\nllvm-svn: 284530"},
		[c]={{Lb,2074,"/// ParseCXXCondition - if/switch/while condition expression.\n///\n///       condition:\n///         expression\n///         type-specifier-seq declarator \'=\' assignment-expression\n/// [C++11] type-specifier-seq declarator \'=\' initializer-clause\n/// [C++11] type-specifier-seq declarator braced-init-list\n/// [Clang] type-specifier-seq ref-qualifier[opt] \'[\' identifier-list \']\'\n///             brace-or-equal-initializer\n/// [GNU]   type-specifier-seq declarator simple-asm-expr[opt] attributes[opt]\n///             \'=\' assignment-expression\n///\n/// In C++1z, a condition may in some contexts be preceded by an\n/// optional init-statement. This function will parse that too.\n///\n/// \\param InitStmt If non-null, an init-statement is permitted, and if present\n/// will be parsed and stored here.\n///\n/// \\param Loc The location of the start of the statement that requires this\n/// condition, e.g., the \"for\" in a for loop.\n///\n/// \\param MissingOK Whether an empty condition is acceptable here. Otherwise\n/// it is considered an error to be recovered from.\n///\n/// \\param FRI If non-null, a for range declaration is permitted, and if\n/// present will be parsed and stored here, and a null result will be returned.\n///\n/// \\param EnterForConditionScope If true, enter a continue/break scope at the\n/// appropriate moment for a \'for\' loop.\n///\n/// \\returns The parsed condition.\nSema::ConditionResult Parser::ParseCXXCondition(StmtResult *InitStmt, SourceLocation Loc, Sema::ConditionKind CK, bool MissingOK, ForRangeInfo *FRI, bool EnterForConditionScope) {\n  // ...\n  const auto WarnOnInit = [this, &CK] { Diag(Tok.getLocation(), getLangOpts().CPlusPlus17 ? diag::warn_cxx14_compat_init_statement : diag::ext_init_statement) << (CK == Sema::ConditionKind::Switch); };"}},
		[m]={
			["clang/test/CXX/stmt.stmt/stmt.select/p3.cpp"]={"clang/test/CXX/stmt.stmt/stmt.select/p3.cpp:24:7: warning: if initialization statements are incompatible with C++ standards before C++17 [-Wpre-c++17-compat]","clang/test/CXX/stmt.stmt/stmt.select/p3.cpp:25:16: warning: if initialization statements are incompatible with C++ standards before C++17 [-Wpre-c++17-compat]","clang/test/CXX/stmt.stmt/stmt.select/p3.cpp:26:7: warning: if initialization statements are incompatible with C++ standards before C++17 [-Wpre-c++17-compat]","clang/test/CXX/stmt.stmt/stmt.select/p3.cpp:41:11: warning: switch initialization statements are incompatible with C++ standards before C++17 [-Wpre-c++17-compat]","clang/test/CXX/stmt.stmt/stmt.select/p3.cpp:42:20: warning: switch initialization statements are incompatible with C++ standards before C++17 [-Wpre-c++17-compat]","clang/test/CXX/stmt.stmt/stmt.select/p3.cpp:43:11: warning: switch initialization statements are incompatible with C++ standards before C++17 [-Wpre-c++17-compat]"}
		}
	},
	["warn_cxx14_compat_inline_variable"]={
		[l]={y,w,p,p,E,q,q,xb,pb,o,n,n,Q,lb},
		[k]=Q,
		[i]="warn_cxx14_compat_inline_variable",
		[h]="inline variables are incompatible with C++ standards before C++1z",
		[b]="inline variables are incompatible with C++ standards before C++1z",
		[f]=j,
		[g]="inline variables are incompatible with C\\+\\+ standards before C\\+\\+17",
		[e]=ub,
		[a]=r,
		[d]={"62f19e700d31",1466813756,"Implement C++17 P0386R2, inline variables. (The \'inline\' specifier gives a","Implement C++17 P0386R2, inline variables. (The \'inline\' specifier gives a\nvariable weak discardable linkage and partially-ordered initialization, and is\nimplied for constexpr static data members.)\n\nllvm-svn: 273754"},
		[c]={{bb,7731,"NamedDecl *Sema::ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope, ArrayRef<BindingDecl *> Bindings) {\n  // ...\n  if (D.getDeclSpec().isInlineSpecified()) {\n    if (!getLangOpts().CPlusPlus) {\n    // ...\n    } else if (CurContext->isFunctionOrMethod()) {\n    // ...\n    } else {\n      Diag(D.getDeclSpec().getInlineSpecLoc(), getLangOpts().CPlusPlus17 ? diag::warn_cxx14_compat_inline_variable : diag::ext_inline_variable);"}},
		[m]={
			["clang/test/SemaCXX/inline.cpp"]={"clang/test/SemaCXX/inline.cpp:17:1: warning: inline variables are incompatible with C++ standards before C++17 [-Wpre-c++17-compat]"}
		}
	},
	["warn_cxx14_compat_nested_namespace_definition"]={
		[l]={y,w,p,p,E,q,q,xb,pb,o,n,n,Q,lb},
		[k]=Q,
		[i]="warn_cxx14_compat_nested_namespace_definition",
		[h]="nested namespace definition is incompatible with C++ standards before C++1z",
		[b]="nested namespace definition is incompatible with C++ standards before C++1z",
		[f]=j,
		[g]="nested namespace definition is incompatible with C\\+\\+ standards before C\\+\\+17",
		[e]=ub,
		[a]=F,
		[d]={"13307f5f2429",1415425054,"[c++1z] Implement nested-namespace-definitions.","[c++1z] Implement nested-namespace-definitions.\n\nThis allows \'namespace A::B { ... }\' as a shorthand for \'namespace A {\nnamespace B { ... } }\'. We already supported this correctly for error recovery;\npromote that support to a full implementation.\n\nThis is not the right implementation: we do not maintain source fidelity\nbecause we desugar the nested namespace definition in the parser. This is\ntricky to avoid, since the definition genuinely does inject one named\nentity per level in the namespace name.\n\nllvm-svn: 221574"},
		[c]={{gb,175,"/// ParseNamespace - We know that the current token is a namespace keyword. This\n/// may either be a top level namespace or a block-level namespace alias. If\n/// there was an inline keyword, it has already been parsed.\n///\n///       namespace-definition: [C++: namespace.def]\n///         named-namespace-definition\n///         unnamed-namespace-definition\n///         nested-namespace-definition\n///\n///       named-namespace-definition:\n///         \'inline\'[opt] \'namespace\' attributes[opt] identifier \'{\'\n///         namespace-body \'}\'\n///\n///       unnamed-namespace-definition:\n///         \'inline\'[opt] \'namespace\' attributes[opt] \'{\' namespace-body \'}\'\n///\n///       nested-namespace-definition:\n///         \'namespace\' enclosing-namespace-specifier \'::\' \'inline\'[opt]\n///         identifier \'{\' namespace-body \'}\'\n///\n///       enclosing-namespace-specifier:\n///         identifier\n///         enclosing-namespace-specifier \'::\' \'inline\'[opt] identifier\n///\n///       namespace-alias-definition:  [C++ 7.3.2: namespace.alias]\n///         \'namespace\' identifier \'=\' qualified-namespace-specifier \';\'\n///\nParser::DeclGroupPtrTy Parser::ParseNamespace(DeclaratorContext Context, SourceLocation &DeclEnd, SourceLocation InlineLoc) {\n  // ...\n  if (ExtraNSs.empty()) {\n  // ...\n  } else if (InlineLoc.isValid()) {\n  // ...\n  } else if (getLangOpts().CPlusPlus20) {\n    Diag(ExtraNSs[0].NamespaceLoc, diag::warn_cxx14_compat_nested_namespace_definition);"},{gb,181,"/// ParseNamespace - We know that the current token is a namespace keyword. This\n/// may either be a top level namespace or a block-level namespace alias. If\n/// there was an inline keyword, it has already been parsed.\n///\n///       namespace-definition: [C++: namespace.def]\n///         named-namespace-definition\n///         unnamed-namespace-definition\n///         nested-namespace-definition\n///\n///       named-namespace-definition:\n///         \'inline\'[opt] \'namespace\' attributes[opt] identifier \'{\'\n///         namespace-body \'}\'\n///\n///       unnamed-namespace-definition:\n///         \'inline\'[opt] \'namespace\' attributes[opt] \'{\' namespace-body \'}\'\n///\n///       nested-namespace-definition:\n///         \'namespace\' enclosing-namespace-specifier \'::\' \'inline\'[opt]\n///         identifier \'{\' namespace-body \'}\'\n///\n///       enclosing-namespace-specifier:\n///         identifier\n///         enclosing-namespace-specifier \'::\' \'inline\'[opt] identifier\n///\n///       namespace-alias-definition:  [C++ 7.3.2: namespace.alias]\n///         \'namespace\' identifier \'=\' qualified-namespace-specifier \';\'\n///\nParser::DeclGroupPtrTy Parser::ParseNamespace(DeclaratorContext Context, SourceLocation &DeclEnd, SourceLocation InlineLoc) {\n  // ...\n  if (ExtraNSs.empty()) {\n  // ...\n  } else if (InlineLoc.isValid()) {\n  // ...\n  } else if (getLangOpts().CPlusPlus20) {\n  // ...\n  } else if (getLangOpts().CPlusPlus17) {\n    Diag(ExtraNSs[0].NamespaceLoc, diag::warn_cxx14_compat_nested_namespace_definition);"}},
		[m]={
			["clang/test/Parser/cxx1z-nested-namespace-definition.cpp"]={"clang/test/Parser/cxx1z-nested-namespace-definition.cpp:7:15: warning: nested namespace definition is incompatible with C++ standards before C++17 [-Wpre-c++17-compat]"}
		}
	},
	["warn_cxx14_compat_ns_enum_attribute"]={
		[l]={p,q,pb,n,lb},
		[k]=lb,
		[i]={{nil,H,"warn_cxx14_compat_ns_enum_attribute"}},
		[h]={{nil,H,"attributes on %select{a namespace|an enumerator}0 declaration are incompatible with C++ standards before C++17"}},
		[b]={{nil,H,{"attributes on ",{"a namespace","an enumerator"}," declaration are incompatible with C++ standards before C++17"}}},
		[f]=j,
		[g]="attributes on (?:a namespace|an enumerator) declaration are incompatible with C\\+\\+ standards before C\\+\\+17",
		[e]=" \\[(?:\\-Werror,)?\\-Wpre\\-c\\+\\+17\\-compat\\-pedantic[^\\]]*\\]",
		[a]={{nil,H,F}},
		[d]={"40e202f7d996",1507942584,"Fix backwards warning for use of C++17 attributes-on-namespaces-and-enumerators feature.","Fix backwards warning for use of C++17 attributes-on-namespaces-and-enumerators feature.\n\nllvm-svn: 315784"},
		[c]={{Vb,5202,"/// ParseEnumBody - Parse a {} enclosed enumerator-list.\n///       enumerator-list:\n///         enumerator\n///         enumerator-list \',\' enumerator\n///       enumerator:\n///         enumeration-constant attributes[opt]\n///         enumeration-constant attributes[opt] \'=\' constant-expression\n///       enumeration-constant:\n///         identifier\n///\nvoid Parser::ParseEnumBody(SourceLocation StartLoc, Decl *EnumDecl) {\n  // ...\n  // Parse the enumerator-list.\n  while (Tok.isNot(tok::r_brace)) {\n    // ...\n    if (isAllowedCXX11AttributeSpecifier()) {\n      if (getLangOpts().CPlusPlus)\n        Diag(Tok.getLocation(), getLangOpts().CPlusPlus17 ? diag::warn_cxx14_compat_ns_enum_attribute : diag::ext_ns_enum_attribute) << 1 /*enumerator*/;"},{gb,93,"/// ParseNamespace - We know that the current token is a namespace keyword. This\n/// may either be a top level namespace or a block-level namespace alias. If\n/// there was an inline keyword, it has already been parsed.\n///\n///       namespace-definition: [C++: namespace.def]\n///         named-namespace-definition\n///         unnamed-namespace-definition\n///         nested-namespace-definition\n///\n///       named-namespace-definition:\n///         \'inline\'[opt] \'namespace\' attributes[opt] identifier \'{\'\n///         namespace-body \'}\'\n///\n///       unnamed-namespace-definition:\n///         \'inline\'[opt] \'namespace\' attributes[opt] \'{\' namespace-body \'}\'\n///\n///       nested-namespace-definition:\n///         \'namespace\' enclosing-namespace-specifier \'::\' \'inline\'[opt]\n///         identifier \'{\' namespace-body \'}\'\n///\n///       enclosing-namespace-specifier:\n///         identifier\n///         enclosing-namespace-specifier \'::\' \'inline\'[opt] identifier\n///\n///       namespace-alias-definition:  [C++ 7.3.2: namespace.alias]\n///         \'namespace\' identifier \'=\' qualified-namespace-specifier \';\'\n///\nParser::DeclGroupPtrTy Parser::ParseNamespace(DeclaratorContext Context, SourceLocation &DeclEnd, SourceLocation InlineLoc) {\n  // ...\n  auto ReadAttributes = [&] {\n    // ...\n    do {\n      // ...\n      if (getLangOpts().CPlusPlus11 && isCXX11AttributeSpecifier()) {\n        Diag(Tok.getLocation(), getLangOpts().CPlusPlus17 ? diag::warn_cxx14_compat_ns_enum_attribute : diag::ext_ns_enum_attribute) << 0 /*namespace*/;"}},
		[m]={
			["clang/test/SemaCXX/cxx14-compat.cpp"]={"clang/test/SemaCXX/cxx14-compat.cpp:15:11: warning: attributes on a namespace declaration are incompatible with C++ standards before C++17 [-Wpre-c++17-compat-pedantic]","clang/test/SemaCXX/cxx14-compat.cpp:16:10: warning: attributes on an enumerator declaration are incompatible with C++ standards before C++17 [-Wpre-c++17-compat-pedantic]"}
		}
	},
	["warn_cxx14_compat_star_this_lambda_capture"]={
		[l]={y,w,p,p,E,q,q,xb,pb,o,n,n,Q,lb},
		[k]=Q,
		[i]="warn_cxx14_compat_star_this_lambda_capture",
		[h]="by value capture of \'*this\' is incompatible with C++ standards before C++1z",
		[b]="by value capture of \'*this\' is incompatible with C++ standards before C++1z",
		[f]=j,
		[g]="by value capture of \'\\*this\' is incompatible with C\\+\\+ standards before C\\+\\+17",
		[e]=ub,
		[a]=Dc,
		[d]={"dc6b596ebbd3",1458552337,"[Cxx1z] Implement Lambda Capture of *this by Value as [=,*this] (P0018R3)","[Cxx1z] Implement Lambda Capture of *this by Value as [=,*this] (P0018R3)\n\nImplement lambda capture of *this by copy.\nFor e.g.:\nstruct A {\n\n  int d = 10;\n  auto foo() { return [*this] (auto a) mutable { d+=a; return d; }; }\n\n};\n\nauto L = A{}.foo(); // A{}\'s lifetime is gone.\n\n// Below is still ok, because *this was captured by value.\nassert(L(10) == 20);\nassert(L(100) == 120);\n\nIf the capture was implicit, or [this] (i.e. *this was captured by reference), this code would be otherwise undefined.\n\nImplementation Strategy:\n  - amend the parser to accept *this in the lambda introducer\n  - add a new king of capture LCK_StarThis\n  - teach Sema::CheckCXXThisCapture to handle by copy captures of the\n    enclosing object (i.e. *this)\n  - when CheckCXXThisCapture does capture by copy, the corresponding \n    initializer expression for the closure\'s data member \n    direct-initializes it thus making a copy of \'*this\'.\n  - in codegen, when assigning to CXXThisValue, if *this was captured by \n    copy, make sure it points to the corresponding field member, and\n    not, unlike when captured by reference, what the field member points\n    to.\n  - mark feature as implemented in svn\n\nMuch gratitude to Richard Smith for his carefully illuminating reviews!   \n\nllvm-svn: 263921"},
		[c]={{yd,1023,"void Sema::ActOnLambdaExpressionAfterIntroducer(LambdaIntroducer &Intro, Scope *CurrentScope) {\n  // ...\n  for (auto C = Intro.Captures.begin(), E = Intro.Captures.end(); C != E; PrevCaptureLoc = C->Loc, ++C) {\n    if (C->Kind == LCK_This || C->Kind == LCK_StarThis) {\n      if (C->Kind == LCK_StarThis)\n        Diag(C->Loc, !getLangOpts().CPlusPlus17 ? diag::ext_star_this_lambda_capture_cxx17 : diag::warn_cxx14_compat_star_this_lambda_capture);"}}
	},
	["warn_cxx14_compat_static_assert_no_message"]={
		[l]={y,w,p,p,E,q,q,xb,pb,o,n,n,Q,lb},
		[k]=Q,
		[i]="warn_cxx14_compat_static_assert_no_message",
		[h]="static_assert with no message is incompatible with C++ standards before C++1z",
		[b]="static_assert with no message is incompatible with C++ standards before C++1z",
		[f]=j,
		[g]="\'static_assert\' with no message is incompatible with C\\+\\+ standards before C\\+\\+17",
		[e]=ub,
		[a]={{nil,v,F},{"7.1",nil,r}},
		[d]={"085a64ffc5d4",1403294232,"[C++1z] Implement N3928: message in static_assert is optional.","[C++1z] Implement N3928: message in static_assert is optional.\n\nllvm-svn: 211394"},
		[c]={{gb,1005,"/// ParseStaticAssertDeclaration - Parse C++0x or C11 static_assert-declaration.\n///\n/// [C++0x] static_assert-declaration:\n///           static_assert ( constant-expression  ,  string-literal  ) ;\n///\n/// [C11]   static_assert-declaration:\n///           _Static_assert ( constant-expression  ,  string-literal  ) ;\n///\nDecl *Parser::ParseStaticAssertDeclaration(SourceLocation &DeclEnd) {\n  // ...\n  if (Tok.is(tok::r_paren)) {\n    // ...\n    if (getLangOpts().CPlusPlus17)\n      DiagVal = diag::warn_cxx14_compat_static_assert_no_message;"}},
		[m]={
			["clang/test/SemaCXX/cxx14-compat.cpp"]={"clang/test/SemaCXX/cxx14-compat.cpp:11:19: warning: \'static_assert\' with no message is incompatible with C++ standards before C++17 [-Wpre-c++17-compat]"}
		}
	},
	["warn_cxx14_compat_template_nontype_parm_auto_type"]={
		[l]={y,w,p,p,E,q,q,xb,pb,o,n,n,Q,lb},
		[k]=Q,
		[i]="warn_cxx14_compat_template_nontype_parm_auto_type",
		[h]="non-type template parameters declared with %0 are incompatible with C++ standards before C++1z",
		[b]="non-type template parameters declared with A are incompatible with C++ standards before C++1z",
		[f]=j,
		[g]="non\\-type template parameters declared with (.*?) are incompatible with C\\+\\+ standards before C\\+\\+17",
		[e]=ub,
		[a]=r,
		[d]={"5f274389d1d9",1475106927,"P0127R2: Support type deduction for types of non-type template parameters in","P0127R2: Support type deduction for types of non-type template parameters in\nC++1z.\n\nPatch by James Touton! Some bugfixes and rebasing by me.\n\nllvm-svn: 282651"},
		[c]={{yb,1556,"NamedDecl *Sema::ActOnNonTypeTemplateParameter(Scope *S, Declarator &D, unsigned Depth, unsigned Position, SourceLocation EqualLoc, Expr *Default) {\n  // ...\n  if (const auto *T = TInfo->getType()->getContainedDeducedType())\n    if (isa<AutoType>(T))\n      Diag(D.getIdentifierLoc(), diag::warn_cxx14_compat_template_nontype_parm_auto_type) << QualType(TInfo->getType()->getContainedAutoType(), 0);"}},
		[m]={
			["clang/test/SemaTemplate/temp_arg_nontype_diagnostic_cxx17.cpp"]={"clang/test/SemaTemplate/temp_arg_nontype_diagnostic_cxx17.cpp:3:26: warning: non-type template parameters declared with \'decltype(auto)\' are incompatible with C++ standards before C++17 [-Wpre-c++17-compat]","clang/test/SemaTemplate/temp_arg_nontype_diagnostic_cxx17.cpp:6:16: warning: non-type template parameters declared with \'auto\' are incompatible with C++ standards before C++17 [-Wpre-c++17-compat]"}
		}
	},
	["warn_cxx14_compat_template_template_param_typename"]={
		[l]={y,w,p,p,E,q,q,xb,pb,o,n,n,Q,lb},
		[k]=Q,
		[i]="warn_cxx14_compat_template_template_param_typename",
		[h]="template template parameter using \'typename\' is incompatible with C++ standards before C++1z",
		[b]="template template parameter using \'typename\' is incompatible with C++ standards before C++1z",
		[f]=j,
		[g]="template template parameter using \'typename\' is incompatible with C\\+\\+ standards before C\\+\\+17",
		[e]=ub,
		[a]=F,
		[d]={"78e1ca692bf0",1402933882,"[C++1z] Implement N4051: \'typename\' is permitted instead of \'class\' when declaring a template templa...","[C++1z] Implement N4051: \'typename\' is permitted instead of \'class\' when declaring a template template parameter.\n\nllvm-svn: 211031"},
		[c]={{"clang/lib/Parse/ParseTemplate.cpp",934,"/// ParseTemplateTemplateParameter - Handle the parsing of template\n/// template parameters.\n///\n///       type-parameter:    [C++ temp.param]\n///         template-head type-parameter-key ...[opt] identifier[opt]\n///         template-head type-parameter-key identifier[opt] = id-expression\n///       type-parameter-key:\n///         \'class\'\n///         \'typename\'       [C++1z]\n///       template-head:     [C++2a]\n///         \'template\' \'<\' template-parameter-list \'>\'\n///             requires-clause[opt]\nNamedDecl *Parser::ParseTemplateTemplateParameter(unsigned Depth, unsigned Position) {\n  // ...\n  // Provide an ExtWarn if the C++1z feature of using \'typename\' here is used.\n  // Generate a meaningful error if the user forgot to put class before the\n  // identifier, comma, or greater. Provide a fixit if the identifier, comma,\n  // or greater appear immediately or after \'struct\'. In the latter case,\n  // replace the keyword with \'class\'.\n  if (!TryConsumeToken(tok::kw_class)) {\n    // ...\n    if (Tok.is(tok::kw_typename)) {\n      Diag(Tok.getLocation(), getLangOpts().CPlusPlus17 ? diag::warn_cxx14_compat_template_template_param_typename : diag::ext_template_template_param_typename) << (!getLangOpts().CPlusPlus17 ? FixItHint::CreateReplacement(Tok.getLocation(), \"class\") : FixItHint());"}}
	},
	["warn_cxx14_compat_u8_character_literal"]={
		[l]={y,w,p,p,E,q,q,xb,pb,o,n,n,Q,lb},
		[k]=Q,
		[i]="warn_cxx14_compat_u8_character_literal",
		[h]="unicode literals are incompatible with C++ standards before C++1z",
		[b]="unicode literals are incompatible with C++ standards before C++1z",
		[f]=j,
		[g]="unicode literals are incompatible with C\\+\\+ standards before C\\+\\+17",
		[e]=ub,
		[a]=Z,
		[d]={"3e3a705062fe",1415426922,"[c++1z] Support for u8 character literals.","[c++1z] Support for u8 character literals.\n\nllvm-svn: 221576"},
		[c]={{nb,2306,"/// LexCharConstant - Lex the remainder of a character constant, after having\n/// lexed either \' or L\' or u8\' or u\' or U\'.\nbool Lexer::LexCharConstant(Token &Result, const char *CurPtr, tok::TokenKind Kind) {\n  // ...\n  if (!isLexingRawMode()) {\n    if (Kind == tok::utf16_char_constant || Kind == tok::utf32_char_constant)\n    // ...\n    else if (Kind == tok::utf8_char_constant)\n      Diag(BufferPtr, diag::warn_cxx14_compat_u8_character_literal);"}}
	},
	["warn_cxx14_compat_using_attribute_ns"]={
		[l]={y,w,p,p,E,q,q,xb,pb,o,n,n,Q,lb},
		[k]=Q,
		[i]="warn_cxx14_compat_using_attribute_ns",
		[h]="default scope specifier for attributes is incompatible with C++ standards before C++1z",
		[b]="default scope specifier for attributes is incompatible with C++ standards before C++1z",
		[f]=j,
		[g]="default scope specifier for attributes is incompatible with C\\+\\+ standards before C\\+\\+17",
		[e]=ub,
		[a]=F,
		[d]={"b7d7a046d8e0",1466770512,"Using for attributes voted into C++17.","Using for attributes voted into C++17.\n\nllvm-svn: 273666"},
		[c]={{gb,4539,"/// Parse a C++11 or C2x attribute-specifier.\n///\n/// [C++11] attribute-specifier:\n///         \'[\' \'[\' attribute-list \']\' \']\'\n///         alignment-specifier\n///\n/// [C++11] attribute-list:\n///         attribute[opt]\n///         attribute-list \',\' attribute[opt]\n///         attribute \'...\'\n///         attribute-list \',\' attribute \'...\'\n///\n/// [C++11] attribute:\n///         attribute-token attribute-argument-clause[opt]\n///\n/// [C++11] attribute-token:\n///         identifier\n///         attribute-scoped-token\n///\n/// [C++11] attribute-scoped-token:\n///         attribute-namespace \'::\' identifier\n///\n/// [C++11] attribute-namespace:\n///         identifier\nvoid Parser::ParseCXX11AttributeSpecifierInternal(ParsedAttributes &Attrs, CachedTokens &OpenMPTokens, SourceLocation *EndLoc) {\n  // ...\n  if (Tok.is(tok::kw_using)) {\n    Diag(Tok.getLocation(), getLangOpts().CPlusPlus17 ? diag::warn_cxx14_compat_using_attribute_ns : diag::ext_using_attribute_ns);"}}
	},
	["warn_cxx17_compat_adl_only_template_id"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,X,T,o,n,n,G,S},
		[k]=G,
		[i]={{nil,t,"warn_cxx17_compat_adl_only_template_id"}},
		[h]={{nil,s,"use of function template name with no prior function template declaration in function call with explicit template arguments is incompatible with C++ standards before C++20"},{t,t,"use of function template name with no prior function template declaration in function call with explicit template arguments is incompatible with C++ standards before C++2a"}},
		[b]={{nil,s,"use of function template name with no prior function template declaration in function call with explicit template arguments is incompatible with C++ standards before C++20"},{t,t,"use of function template name with no prior function template declaration in function call with explicit template arguments is incompatible with C++ standards before C++2a"}},
		[f]=j,
		[g]="use of function template name with no prior function template declaration in function call with explicit template arguments is incompatible with C\\+\\+ standards before C\\+\\+20",
		[e]=Y,
		[a]={{nil,t,r}},
		[d]={"b23c5e8c3df8",1557372687,"[c++20] Implement P0846R0: allow (ADL-only) calls to template-ids whose","[c++20] Implement P0846R0: allow (ADL-only) calls to template-ids whose\ntemplate name is not visible to unqualified lookup.\n\nIn order to support this without a severe degradation in our ability to\ndiagnose typos in template names, this change significantly restructures\nthe way we handle template-id-shaped syntax for which lookup of the\ntemplate name finds nothing.\n\nInstead of eagerly diagnosing an undeclared template name, we now form a\nplaceholder template-name representing a name that is known to not find\nany templates. When the parser sees such a name, it attempts to\ndisambiguate whether we have a less-than comparison or a template-id.\nAny diagnostics or typo-correction for the name are delayed until its\npoint of use.\n\nThe upshot should be a small improvement of our diagostic quality\noverall: we now take more syntactic context into account when trying to\nresolve an undeclared identifier on the left hand side of a \'<\'. In\nfact, this works well enough that the backwards-compatible portion (for\nan undeclared identifier rather than a lookup that finds functions but\nno function templates) is enabled in all language modes.\n\nllvm-svn: 360308"},
		[c]={{hb,7044,"ExprResult Sema::ActOnCallExpr(Scope *Scope, Expr *Fn, SourceLocation LParenLoc, MultiExprArg ArgExprs, SourceLocation RParenLoc, Expr *ExecConfig) {\n  // ...\n  // Diagnose uses of the C++20 \"ADL-only template-id call\" feature in earlier\n  // language modes.\n  if (auto *ULE = dyn_cast<UnresolvedLookupExpr>(Fn)) {\n    if (ULE->hasExplicitTemplateArgs() && ULE->decls_begin() == ULE->decls_end()) {\n      Diag(Fn->getExprLoc(), getLangOpts().CPlusPlus20 ? diag::warn_cxx17_compat_adl_only_template_id : diag::ext_adl_only_template_id) << ULE->getName();"}}
	},
	["warn_cxx17_compat_aggregate_init_paren_list"]={
		[l]={"c++20-extensions","c++2a-extensions"},
		[k]="c++20-extensions",
		[i]={{nil,U,"warn_cxx17_compat_aggregate_init_paren_list"}},
		[h]={{nil,U,"aggregate initialization of type %0 from a parenthesized list of values is a C++20 extension"}},
		[b]={{nil,U,"aggregate initialization of type A from a parenthesized list of values is a C++20 extension"}},
		[f]=j,
		[g]="aggregate initialization of type (.*?) from a parenthesized list of values is a C\\+\\+20 extension",
		[e]=" \\[(?:\\-Werror,)?\\-Wc\\+\\+20\\-extensions[^\\]]*\\]",
		[a]={{nil,U,r}},
		[d]={Gb,1625925174,Fb,Kb},
		[c]={{ob,5658,"static void TryOrBuildParenListInitialization(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, ArrayRef<Expr *> Args, InitializationSequence &Sequence, bool VerifyOnly, ExprResult *Result = nullptr) {\n  // ...\n  if (VerifyOnly) {\n  // ...\n  } else if (Result) {\n    // ...\n    S.Diag(Kind.getLocation(), diag::warn_cxx17_compat_aggregate_init_paren_list) << Kind.getLocation() << SR << ResultType;"}},
		[m]={
			["clang/test/SemaCXX/paren-list-agg-init.cpp"]={"clang/test/SemaCXX/paren-list-agg-init.cpp:83:5: warning: aggregate initialization of type \'A\' from a parenthesized list of values is a C++20 extension [-Wc++20-extensions]","clang/test/SemaCXX/paren-list-agg-init.cpp:96:5: warning: aggregate initialization of type \'A\' from a parenthesized list of values is a C++20 extension [-Wc++20-extensions]","clang/test/SemaCXX/paren-list-agg-init.cpp:99:5: warning: aggregate initialization of type \'A\' from a parenthesized list of values is a C++20 extension [-Wc++20-extensions]","clang/test/SemaCXX/paren-list-agg-init.cpp:102:10: warning: aggregate initialization of type \'A\' from a parenthesized list of values is a C++20 extension [-Wc++20-extensions]","clang/test/SemaCXX/paren-list-agg-init.cpp:105:10: warning: aggregate initialization of type \'A\' from a parenthesized list of values is a C++20 extension [-Wc++20-extensions]","clang/test/SemaCXX/paren-list-agg-init.cpp:108:10: warning: aggregate initialization of type \'A\' from a parenthesized list of values is a C++20 extension [-Wc++20-extensions]","clang/test/SemaCXX/paren-list-agg-init.cpp:114:8: warning: aggregate initialization of type \'A\' from a parenthesized list of values is a C++20 extension [-Wc++20-extensions]","clang/test/SemaCXX/paren-list-agg-init.cpp:114:5: warning: aggregate initialization of type \'B\' from a parenthesized list of values is a C++20 extension [-Wc++20-extensions]","clang/test/SemaCXX/paren-list-agg-init.cpp:118:7: warning: aggregate initialization of type \'A\' from a parenthesized list of values is a C++20 extension [-Wc++20-extensions]","clang/test/SemaCXX/paren-list-agg-init.cpp:123:5: warning: aggregate initialization of type \'D\' from a parenthesized list of values is a C++20 extension [-Wc++20-extensions]","clang/test/SemaCXX/paren-list-agg-init.cpp:126:10: warning: aggregate initialization of type \'A\' from a parenthesized list of values is a C++20 extension [-Wc++20-extensions]","clang/test/SemaCXX/paren-list-agg-init.cpp:126:8: warning: aggregate initialization of type \'C\' from a parenthesized list of values is a C++20 extension [-Wc++20-extensions]","clang/test/SemaCXX/paren-list-agg-init.cpp:131:23: warning: aggregate initialization of type \'A\' from a parenthesized list of values is a C++20 extension [-Wc++20-extensions]","clang/test/SemaCXX/paren-list-agg-init.cpp:150:15: warning: aggregate initialization of type \'const F\' from a parenthesized list of values is a C++20 extension [-Wc++20-extensions]","clang/test/SemaCXX/paren-list-agg-init.cpp:154:15: warning: aggregate initialization of type \'const F\' from a parenthesized list of values is a C++20 extension [-Wc++20-extensions]","clang/test/SemaCXX/paren-list-agg-init.cpp:160:11: warning: aggregate initialization of type \'G<char>\' from a parenthesized list of values is a C++20 extension [-Wc++20-extensions]","clang/test/SemaCXX/paren-list-agg-init.cpp:166:5: warning: aggregate initialization of type \'L\' from a parenthesized list of values is a C++20 extension [-Wc++20-extensions]","clang/test/SemaCXX/paren-list-agg-init.cpp:170:7: warning: aggregate initialization of type \'int[2]\' from a parenthesized list of values is a C++20 extension [-Wc++20-extensions]","clang/test/SemaCXX/paren-list-agg-init.cpp:173:7: warning: aggregate initialization of type \'int[2]\' from a parenthesized list of values is a C++20 extension [-Wc++20-extensions]","clang/test/SemaCXX/paren-list-agg-init.cpp:185:5: warning: aggregate initialization of type \'M\' from a parenthesized list of values is a C++20 extension [-Wc++20-extensions]","clang/test/SemaCXX/paren-list-agg-init.cpp:243:3: warning: aggregate initialization of type \'M\' from a parenthesized list of values is a C++20 extension [-Wc++20-extensions]","clang/test/SemaCXX/paren-list-agg-init.cpp:247:3: warning: aggregate initialization of type \'N\' from a parenthesized list of values is a C++20 extension [-Wc++20-extensions]","clang/test/SemaCXX/paren-list-agg-init.cpp:260:3: warning: aggregate initialization of type \'O\' from a parenthesized list of values is a C++20 extension [-Wc++20-extensions]","clang/test/SemaCXX/paren-list-agg-init.cpp:263:3: warning: aggregate initialization of type \'O\' from a parenthesized list of values is a C++20 extension [-Wc++20-extensions]","clang/test/SemaCXX/paren-list-agg-init.cpp:271:14: warning: aggregate initialization of type \'A\' from a parenthesized list of values is a C++20 extension [-Wc++20-extensions]","clang/test/SemaCXX/paren-list-agg-init.cpp:289:5: warning: aggregate initialization of type \'S\' from a parenthesized list of values is a C++20 extension [-Wc++20-extensions]","clang/test/SemaCXX/paren-list-agg-init.cpp:310:15: warning: aggregate initialization of type \'const S\' from a parenthesized list of values is a C++20 extension [-Wc++20-extensions]","clang/test/SemaCXX/paren-list-agg-init.cpp:83:5: warning: aggregate initialization of type \'A\' from a parenthesized list of values is a C++20 extension [-Wc++20-extensions]","clang/test/SemaCXX/paren-list-agg-init.cpp:89:10: warning: aggregate initialization of type \'A\' from a parenthesized list of values is a C++20 extension [-Wc++20-extensions]"}
		}
	},
	["warn_cxx17_compat_bitfield_member_init"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,X,T,o,n,n,G,S},
		[k]=G,
		[i]={{nil,H,"warn_cxx17_compat_bitfield_member_init"}},
		[h]={{nil,s,"default member initializer for bit-field is incompatible with C++ standards before C++20"},{t,H,"default member initializer for bit-field is incompatible with C++ standards before C++2a"}},
		[b]={{nil,s,"default member initializer for bit-field is incompatible with C++ standards before C++20"},{t,H,"default member initializer for bit-field is incompatible with C++ standards before C++2a"}},
		[f]=j,
		[g]="default member initializer for bit\\-field is incompatible with C\\+\\+ standards before C\\+\\+20",
		[e]=Y,
		[a]={{nil,H,F}},
		[d]={"6b8e3c02ca44",1503880094,"[c++2a] P0683R1: Permit default member initializers for bit-fields.","[c++2a] P0683R1: Permit default member initializers for bit-fields.\n\nThis would be trivial, except that our in-memory and serialized representations\nfor FieldDecls assumed that this can\'t happen.\n\nllvm-svn: 311867"},
		[c]={{gb,3036,"/// ParseCXXClassMemberDeclaration - Parse a C++ class member declaration.\n///\n///       member-declaration:\n///         decl-specifier-seq[opt] member-declarator-list[opt] \';\'\n///         function-definition \';\'[opt]\n///         ::[opt] nested-name-specifier template[opt] unqualified-id \';\'[TODO]\n///         using-declaration                                            [TODO]\n/// [C++0x] static_assert-declaration\n///         template-declaration\n/// [GNU]   \'__extension__\' member-declaration\n///\n///       member-declarator-list:\n///         member-declarator\n///         member-declarator-list \',\' member-declarator\n///\n///       member-declarator:\n///         declarator virt-specifier-seq[opt] pure-specifier[opt]\n/// [C++2a] declarator requires-clause\n///         declarator constant-initializer[opt]\n/// [C++11] declarator brace-or-equal-initializer[opt]\n///         identifier[opt] \':\' constant-expression\n///\n///       virt-specifier-seq:\n///         virt-specifier\n///         virt-specifier-seq virt-specifier\n///\n///       virt-specifier:\n///         override\n///         final\n/// [MS]    sealed\n///\n///       pure-specifier:\n///         \'= 0\'\n///\n///       constant-initializer:\n///         \'=\' constant-expression\n///\nParser::DeclGroupPtrTy Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS, ParsedAttributes &AccessAttrs, const ParsedTemplateInfo &TemplateInfo, ParsingDeclRAIIObject *TemplateDiags) {\n  // ...\n  while (true) {\n    // ...\n    if (Tok.isOneOf(tok::equal, tok::l_brace) && PureSpecLoc.isInvalid()) {\n      // DRXXXX: Anonymous bit-fields cannot have a brace-or-equal-initializer.\n      if (BitfieldSize.isUsable() && !DeclaratorInfo.hasName()) {\n      // ...\n      } else if (DeclaratorInfo.isDeclarationOfFunction()) {\n      // ...\n      } else if (DeclaratorInfo.getDeclSpec().getStorageClassSpec() != DeclSpec::SCS_static && DeclaratorInfo.getDeclSpec().getStorageClassSpec() != DeclSpec::SCS_typedef && !DS.isFriendSpecified()) {\n        // It\'s a default member initializer.\n        if (BitfieldSize.get())\n          Diag(Tok, getLangOpts().CPlusPlus20 ? diag::warn_cxx17_compat_bitfield_member_init : diag::ext_bitfield_member_init);"}},
		[m]={
			[Qb]={"clang/test/SemaCXX/cxx17-compat.cpp:23:13: warning: default member initializer for bit-field is incompatible with C++ standards before C++20 [-Wpre-c++20-compat]"}
		}
	},
	["warn_cxx17_compat_capture_binding"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,X,T,o,n,n,G,S},
		[k]=G,
		[i]={{nil,U,"warn_cxx17_compat_capture_binding"}},
		[h]={{nil,U,"captured structured bindings are incompatible with C++ standards before C++20"}},
		[b]={{nil,U,"captured structured bindings are incompatible with C++ standards before C++20"}},
		[f]=j,
		[g]="captured structured bindings are incompatible with C\\+\\+ standards before C\\+\\+20",
		[e]=Y,
		[a]={{nil,U,r}},
		[d]={Gb,1625925174,Fb,Kb},
		[c]={{hb,19209,"// Certain capturing entities (lambdas, blocks etc.) are not allowed to capture\n// certain types of variables (unnamed, variably modified types etc.)\n// so check for eligibility.\nstatic bool isVariableCapturable(CapturingScopeInfo *CSI, ValueDecl *Var, SourceLocation Loc, const bool Diagnose, Sema &S) {\n  // ...\n  if (isa<BindingDecl>(Var)) {\n    if (!IsLambda || !S.getLangOpts().CPlusPlus) {\n    // ...\n    } else if (Diagnose && S.getLangOpts().CPlusPlus) {\n      S.Diag(Loc, S.LangOpts.CPlusPlus20 ? diag::warn_cxx17_compat_capture_binding : diag::ext_capture_binding) << Var;"}},
		[m]={
			["clang/test/SemaCXX/cxx1z-decomposition.cpp"]={"clang/test/SemaCXX/cxx1z-decomposition.cpp:75:22: warning: captured structured bindings are incompatible with C++ standards before C++20 [-Wpre-c++20-compat]","clang/test/SemaCXX/cxx1z-decomposition.cpp:76:10: warning: captured structured bindings are incompatible with C++ standards before C++20 [-Wpre-c++20-compat]","clang/test/SemaCXX/cxx1z-decomposition.cpp:89:11: warning: captured structured bindings are incompatible with C++ standards before C++20 [-Wpre-c++20-compat]","clang/test/SemaCXX/cxx1z-decomposition.cpp:98:22: warning: captured structured bindings are incompatible with C++ standards before C++20 [-Wpre-c++20-compat]"}
		}
	},
	["warn_cxx17_compat_constexpr_body_invalid_stmt"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,X,T,o,n,n,G,S},
		[k]=G,
		[i]={{nil,v,"warn_cxx17_compat_constexpr_body_invalid_stmt"}},
		[h]={{nil,s,"use of this statement in a constexpr %select{function|constructor}0 is incompatible with C++ standards before C++20"},{t,v,"use of this statement in a constexpr %select{function|constructor}0 is incompatible with C++ standards before C++2a"}},
		[b]={{nil,s,{hd,{zb,kb}," is incompatible with C++ standards before C++20"}},{t,v,{hd,{zb,kb}," is incompatible with C++ standards before C++2a"}}},
		[f]=j,
		[g]="use of this statement in a constexpr (?:function|constructor) is incompatible with C\\+\\+ standards before C\\+\\+20",
		[e]=Y,
		[a]={{nil,v,r}},
		[d]={"5c1399a58237",1544468592,"[constexpr][c++2a] Try-catch blocks in constexpr functions","[constexpr][c++2a] Try-catch blocks in constexpr functions\n\nImplement support for try-catch blocks in constexpr functions, as\nproposed in http://wg21.link/P1002 and voted in San Diego for c++20.\n\nThe idea is that we can still never throw inside constexpr, so the catch\nblock is never entered. A try-catch block like this:\n\ntry { f(); } catch (...) { }\n\nis then morally equivalent to just\n\n{ f(); }\n\nSame idea should apply for function/constructor try blocks.\n\nrdar://problem/45530773\n\nDifferential Revision: https://reviews.llvm.org/D55097\n\nllvm-svn: 348789"},
		[c]={{K,2294,"/// Check the body for the given constexpr function declaration only contains\n/// the permitted types of statement. C++11 [dcl.constexpr]p3,p4.\n///\n/// \\return true if the body is OK, false if we have found or diagnosed a\n/// problem.\nstatic bool CheckConstexprFunctionBody(Sema &SemaRef, const FunctionDecl *Dcl, Stmt *Body, Sema::CheckConstexprKind Kind) {\n  // ...\n  if (Kind == Sema::CheckConstexprKind::CheckValid) {\n  // ...\n  } else if (Cxx2bLoc.isValid()) {\n  // ...\n  } else if (Cxx2aLoc.isValid()) {\n    SemaRef.Diag(Cxx2aLoc, SemaRef.getLangOpts().CPlusPlus20 ? diag::warn_cxx17_compat_constexpr_body_invalid_stmt : diag::ext_constexpr_body_invalid_stmt_cxx20) << isa<CXXConstructorDecl>(Dcl);"}}
	},
	["warn_cxx17_compat_constexpr_ctor_missing_init"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,X,T,o,n,n,G,S},
		[k]=G,
		[i]={{nil,s,"warn_cxx17_compat_constexpr_ctor_missing_init"}},
		[h]={{nil,s,"constexpr constructor that does not initialize all members is incompatible with C++ standards before C++20"}},
		[b]={{nil,s,"constexpr constructor that does not initialize all members is incompatible with C++ standards before C++20"}},
		[f]=j,
		[g]="constexpr constructor that does not initialize all members is incompatible with C\\+\\+ standards before C\\+\\+20",
		[e]=Y,
		[a]={{nil,s,r}},
		[d]={cc,1567434909,ac,Xb},
		[c]={{K,2044,"/// Check that the given field is initialized within a constexpr constructor.\n///\n/// \\param Dcl The constexpr constructor being checked.\n/// \\param Field The field being checked. This may be a member of an anonymous\n///        struct or union nested within the class being checked.\n/// \\param Inits All declarations, including anonymous struct/union members and\n///        indirect members, for which any initialization was provided.\n/// \\param Diagnosed Whether we\'ve emitted the error message yet. Used to attach\n///        multiple notes for different members to the same error.\n/// \\param Kind Whether we\'re diagnosing a constructor as written or determining\n///        whether the formal requirements are satisfied.\n/// \\return \\c false if we\'re checking for validity and the constructor does\n///         not satisfy the requirements on a constexpr constructor.\nstatic bool CheckConstexprCtorInitializer(Sema &SemaRef, const FunctionDecl *Dcl, FieldDecl *Field, llvm::SmallSet<Decl *, 16> &Inits, bool &Diagnosed, Sema::CheckConstexprKind Kind) {\n  // ...\n  if (!Inits.count(Field)) {\n    if (Kind == Sema::CheckConstexprKind::Diagnose) {\n      if (!Diagnosed) {\n        SemaRef.Diag(Dcl->getLocation(), SemaRef.getLangOpts().CPlusPlus20 ? diag::warn_cxx17_compat_constexpr_ctor_missing_init : diag::ext_constexpr_ctor_missing_init);"}}
	},
	["warn_cxx17_compat_constexpr_function_try_block"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,X,T,o,n,n,G,S},
		[k]=G,
		[i]={{nil,v,"warn_cxx17_compat_constexpr_function_try_block"}},
		[h]={{nil,s,"function try block in constexpr %select{function|constructor}0 is incompatible with C++ standards before C++20"},{t,v,"function try block in constexpr %select{function|constructor}0 is incompatible with C++ standards before C++2a"}},
		[b]={{nil,s,{"function try block in constexpr ",{zb,kb}," is incompatible with C++ standards before C++20"}},{t,v,{"function try block in constexpr ",{zb,kb}," is incompatible with C++ standards before C++2a"}}},
		[f]=j,
		[g]="function try block in constexpr (?:function|constructor) is incompatible with C\\+\\+ standards before C\\+\\+20",
		[e]=Y,
		[a]={{nil,v,r}},
		[d]={"5c1399a58237",1544468592,"[constexpr][c++2a] Try-catch blocks in constexpr functions","[constexpr][c++2a] Try-catch blocks in constexpr functions\n\nImplement support for try-catch blocks in constexpr functions, as\nproposed in http://wg21.link/P1002 and voted in San Diego for c++20.\n\nThe idea is that we can still never throw inside constexpr, so the catch\nblock is never entered. A try-catch block like this:\n\ntry { f(); } catch (...) { }\n\nis then morally equivalent to just\n\n{ f(); }\n\nSame idea should apply for function/constructor try blocks.\n\nrdar://problem/45530773\n\nDifferential Revision: https://reviews.llvm.org/D55097\n\nllvm-svn: 348789"},
		[c]={{K,2259,"/// Check the body for the given constexpr function declaration only contains\n/// the permitted types of statement. C++11 [dcl.constexpr]p3,p4.\n///\n/// \\return true if the body is OK, false if we have found or diagnosed a\n/// problem.\nstatic bool CheckConstexprFunctionBody(Sema &SemaRef, const FunctionDecl *Dcl, Stmt *Body, Sema::CheckConstexprKind Kind) {\n  // ...\n  if (isa<CXXTryStmt>(Body)) {\n    // ...\n    case Sema::CheckConstexprKind::Diagnose:\n      SemaRef.Diag(Body->getBeginLoc(), !SemaRef.getLangOpts().CPlusPlus20 ? diag::ext_constexpr_function_try_block_cxx20 : diag::warn_cxx17_compat_constexpr_function_try_block) << isa<CXXConstructorDecl>(Dcl);"}}
	},
	["warn_cxx17_compat_constexpr_local_var_no_init"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,X,T,o,n,n,G,S},
		[k]=G,
		[i]={{nil,s,"warn_cxx17_compat_constexpr_local_var_no_init"}},
		[h]={{nil,s,"uninitialized variable in a constexpr %select{function|constructor}0 is incompatible with C++ standards before C++20"}},
		[b]={{nil,s,{"uninitialized variable in a constexpr ",{zb,kb}," is incompatible with C++ standards before C++20"}}},
		[f]=j,
		[g]="uninitialized variable in a constexpr (?:function|constructor) is incompatible with C\\+\\+ standards before C\\+\\+20",
		[e]=Y,
		[a]={{nil,s,r}},
		[d]={cc,1567434909,ac,Xb},
		[c]={{K,1959,"/// Check the given declaration statement is legal within a constexpr function\n/// body. C++11 [dcl.constexpr]p3,p4, and C++1y [dcl.constexpr]p3.\n///\n/// \\return true if the body is OK (maybe only as an extension), false if we\n///         have diagnosed a problem.\nstatic bool CheckConstexprDeclStmt(Sema &SemaRef, const FunctionDecl *Dcl, DeclStmt *DS, SourceLocation &Cxx1yLoc, Sema::CheckConstexprKind Kind) {\n  // C++11 [dcl.constexpr]p3 and p4:\n  //  The definition of a constexpr function(p3) or constructor(p4) [...] shall\n  //  contain only\n  for (const auto *DclIt : DS->decls()) {\n    // ...\n    case Decl::Var:\n    case Decl::Decomposition: {\n      // ...\n      if (VD->isThisDeclarationADefinition()) {\n        // ...\n        if (!VD->getType()->isDependentType() && !VD->hasInit() && !VD->isCXXForRangeDecl()) {\n          if (Kind == Sema::CheckConstexprKind::Diagnose) {\n            SemaRef.Diag(VD->getLocation(), SemaRef.getLangOpts().CPlusPlus20 ? diag::warn_cxx17_compat_constexpr_local_var_no_init : diag::ext_constexpr_local_var_no_init) << isa<CXXConstructorDecl>(Dcl);"}}
	},
	["warn_cxx17_compat_constexpr_union_ctor_no_init"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,X,T,o,n,n,G,S},
		[k]=G,
		[i]={{nil,s,"warn_cxx17_compat_constexpr_union_ctor_no_init"}},
		[h]={{nil,s,"constexpr union constructor that does not initialize any member is incompatible with C++ standards before C++20"}},
		[b]={{nil,s,"constexpr union constructor that does not initialize any member is incompatible with C++ standards before C++20"}},
		[f]=j,
		[g]="constexpr union constructor that does not initialize any member is incompatible with C\\+\\+ standards before C\\+\\+20",
		[e]=Y,
		[a]={{nil,s,r}},
		[d]={cc,1567434909,ac,Xb},
		[c]={{K,2321,"/// Check the body for the given constexpr function declaration only contains\n/// the permitted types of statement. C++11 [dcl.constexpr]p3,p4.\n///\n/// \\return true if the body is OK, false if we have found or diagnosed a\n/// problem.\nstatic bool CheckConstexprFunctionBody(Sema &SemaRef, const FunctionDecl *Dcl, Stmt *Body, Sema::CheckConstexprKind Kind) {\n  // ...\n  if (const CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(Dcl)) {\n    // ...\n    // DR1359:\n    // - every non-variant non-static data member and base class sub-object\n    //   shall be initialized;\n    // DR1460:\n    // - if the class is a union having variant members, exactly one of them\n    //   shall be initialized;\n    if (RD->isUnion()) {\n      if (Constructor->getNumCtorInitializers() == 0 && RD->hasVariantMembers()) {\n        if (Kind == Sema::CheckConstexprKind::Diagnose) {\n          SemaRef.Diag(Dcl->getLocation(), SemaRef.getLangOpts().CPlusPlus20 ? diag::warn_cxx17_compat_constexpr_union_ctor_no_init : diag::ext_constexpr_union_ctor_no_init);"}}
	},
	["warn_cxx17_compat_constexpr_virtual"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,X,T,o,n,n,G,S},
		[k]=G,
		[i]={{nil,t,"warn_cxx17_compat_constexpr_virtual"}},
		[h]={{nil,s,"virtual constexpr functions are incompatible with C++ standards before C++20"},{t,t,"virtual constexpr functions are incompatible with C++ standards before C++2a"}},
		[b]={{nil,s,"virtual constexpr functions are incompatible with C++ standards before C++20"},{t,t,"virtual constexpr functions are incompatible with C++ standards before C++2a"}},
		[f]=j,
		[g]="virtual constexpr functions are incompatible with C\\+\\+ standards before C\\+\\+20",
		[e]=Y,
		[a]={{nil,t,r}},
		[d]={"5c5be6b2f7fc",1557733330,"[c++20] P1064R0: Allow virtual function calls in constant expression","[c++20] P1064R0: Allow virtual function calls in constant expression\nevaluation.\n\nllvm-svn: 360559"},
		[c]={{K,1808,"// Check whether a function declaration satisfies the requirements of a\n// constexpr function definition or a constexpr constructor definition. If so,\n// return true. If not, produce appropriate diagnostics (unless asked not to by\n// Kind) and return false.\n//\n// This implements C++11 [dcl.constexpr]p3,4, as amended by DR1360.\nbool Sema::CheckConstexprFunctionDefinition(const FunctionDecl *NewFD, CheckConstexprKind Kind) {\n  // ...\n  if (!isa<CXXConstructorDecl>(NewFD)) {\n    // ...\n    if (Method && Method->isVirtual()) {\n      if (getLangOpts().CPlusPlus20) {\n        if (Kind == CheckConstexprKind::Diagnose)\n          Diag(Method->getLocation(), diag::warn_cxx17_compat_constexpr_virtual);"}},
		[m]={
			[Qb]={"clang/test/SemaCXX/cxx17-compat.cpp:68:26: warning: virtual constexpr functions are incompatible with C++ standards before C++20 [-Wpre-c++20-compat]"}
		}
	},
	["warn_cxx17_compat_decomp_decl_spec"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,X,T,o,n,n,G,S},
		[k]=G,
		[i]={{nil,t,"warn_cxx17_compat_decomp_decl_spec"}},
		[h]={{nil,s,"decomposition declaration declared %plural{1:\'%1\'|:with \'%1\' specifiers}0 is incompatible with C++ standards before C++20"},{t,t,"decomposition declaration declared %plural{1:\'%1\'|:with \'%1\' specifiers}0 is incompatible with C++ standards before C++2a"}},
		[b]={{nil,s,{"decomposition declaration declared ",{"\'B\'","with \'B\' specifiers"}," is incompatible with C++ standards before C++20"}},{t,t,{"decomposition declaration declared ",{"\'B\'","with \'B\' specifiers"}," is incompatible with C++ standards before C++2a"}}},
		[f]=j,
		[g]="decomposition declaration declared (?:\'(.*?)\'|with \'(.*?)\' specifiers) is incompatible with C\\+\\+ standards before C\\+\\+20",
		[e]=Y,
		[a]={{nil,t,r}},
		[d]={"13bf9892dc2a",1558554775,"Part of P1091R3: permit structured bindings to be declared \'static\' and","Part of P1091R3: permit structured bindings to be declared \'static\' and\n\'thread_local\' in C++20.\n\nllvm-svn: 361424"},
		[c]={{K,812,"NamedDecl *Sema::ActOnDecompositionDeclarator(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParamLists) {\n  // ...\n  {\n    // ...\n    if (!BadSpecifiers.empty()) {\n    // ...\n    } else if (!CPlusPlus20Specifiers.empty()) {\n      auto &&Warn = Diag(CPlusPlus20SpecifierLocs.front(), getLangOpts().CPlusPlus20 ? diag::warn_cxx17_compat_decomp_decl_spec : diag::ext_decomp_decl_spec);"}},
		[m]={
			[Qb]={"clang/test/SemaCXX/cxx17-compat.cpp:77:1: warning: decomposition declaration declared \'static\' is incompatible with C++ standards before C++20 [-Wpre-c++20-compat]","clang/test/SemaCXX/cxx17-compat.cpp:84:3: warning: decomposition declaration declared with \'static thread_local\' specifiers is incompatible with C++ standards before C++20 [-Wpre-c++20-compat]"}
		}
	},
	["warn_cxx17_compat_defaulted_comparison"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,X,T,o,n,n,G,S},
		[k]=G,
		[i]={{nil,s,"warn_cxx17_compat_defaulted_comparison"}},
		[h]={{nil,s,"defaulted comparison operators are incompatible with C++ standards before C++20"}},
		[b]={{nil,s,"defaulted comparison operators are incompatible with C++ standards before C++20"}},
		[f]=j,
		[g]="defaulted comparison operators are incompatible with C\\+\\+ standards before C\\+\\+20",
		[e]=Y,
		[a]={{nil,s,r}},
		[d]={cc,1567434909,ac,Xb},
		[c]={{K,17883,"void Sema::SetDeclDefaulted(Decl *Dcl, SourceLocation DefaultLoc) {\n  // ...\n  // Issue compatibility warning. We already warned if the operator is\n  // \'operator<=>\' when parsing the \'<=>\' token.\n  if (DefKind.isComparison() && DefKind.asComparison() != DefaultedComparisonKind::ThreeWay) {\n    Diag(DefaultLoc, getLangOpts().CPlusPlus20 ? diag::warn_cxx17_compat_defaulted_comparison : diag::ext_defaulted_comparison);"}},
		[m]={
			[Qb]={"clang/test/SemaCXX/cxx17-compat.cpp:93:56: warning: defaulted comparison operators are incompatible with C++ standards before C++20 [-Wpre-c++20-compat]","clang/test/SemaCXX/cxx17-compat.cpp:94:56: warning: defaulted comparison operators are incompatible with C++ standards before C++20 [-Wpre-c++20-compat]","clang/test/SemaCXX/cxx17-compat.cpp:108:55: warning: defaulted comparison operators are incompatible with C++ standards before C++20 [-Wpre-c++20-compat]","clang/test/SemaCXX/cxx17-compat.cpp:109:56: warning: defaulted comparison operators are incompatible with C++ standards before C++20 [-Wpre-c++20-compat]","clang/test/SemaCXX/cxx17-compat.cpp:110:55: warning: defaulted comparison operators are incompatible with C++ standards before C++20 [-Wpre-c++20-compat]","clang/test/SemaCXX/cxx17-compat.cpp:111:56: warning: defaulted comparison operators are incompatible with C++ standards before C++20 [-Wpre-c++20-compat]"}
		}
	},
	["warn_cxx17_compat_defaulted_method_type_mismatch"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,X,T,o,n,n,G,S},
		[k]=G,
		[i]={{nil,v,"warn_cxx17_compat_defaulted_method_type_mismatch"}},
		[h]={{nil,s,"explicitly defaulting this %select{default constructor|copy constructor|move constructor|copy assignment operator|move assignment operator|destructor}0 with a type different from the implicit type is incompatible with C++ standards before C++20"},{t,v,"explicitly defaulting this %select{default constructor|copy constructor|move constructor|copy assignment operator|move assignment operator|destructor}0 with a type different from the implicit type is incompatible with C++ standards before C++2a"}},
		[b]={{nil,s,{"explicitly defaulting this ",{"default constructor",vd,wd,xd,pd,nc}," with a type different from the implicit type is incompatible with C++ standards before C++20"}},{t,v,{"explicitly defaulting this ",{"default constructor",vd,wd,xd,pd,nc}," with a type different from the implicit type is incompatible with C++ standards before C++2a"}}},
		[f]=j,
		[g]="explicitly defaulting this (?:default constructor|copy constructor|move constructor|copy assignment operator|move assignment operator|destructor) with a type different from the implicit type is incompatible with C\\+\\+ standards before C\\+\\+20",
		[e]=Y,
		[a]={{nil,v,r}},
		[d]={"9b2c5e7c44fd",1538097403,"[cxx2a] P0641R2: (Some) type mismatches on defaulted functions only","[cxx2a] P0641R2: (Some) type mismatches on defaulted functions only\nrender the function deleted instead of rendering the program ill-formed.\n\nThis change also adds an enabled-by-default warning for the case where\nan explicitly-defaulted special member function of a non-template class\nis implicitly deleted by the type checking rules. (This fires either due\nto this language change or due to pre-C++20 reasons for the member being\nimplicitly deleted). I\'ve tested this on a large codebase and found only\nbugs (where the program means something that\'s clearly different from\nwhat the programmer intended), so this is enabled by default, but we\nshould revisit this if there are problems with this being enabled by\ndefault.\n\nllvm-svn: 343285"},
		[c]={{K,7784,"bool Sema::CheckExplicitlyDefaultedSpecialMember(CXXMethodDecl *MD, CXXSpecialMember CSM, SourceLocation DefaultLoc) {\n  // ...\n  if (ShouldDeleteForTypeMismatch || ShouldDeleteSpecialMember(MD, CSM)) {\n    if (First) {\n      // ...\n      if (ShouldDeleteForTypeMismatch && !HadError) {\n        Diag(MD->getLocation(), diag::warn_cxx17_compat_defaulted_method_type_mismatch) << CSM;"}},
		[m]={
			[Qb]={"clang/test/SemaCXX/cxx17-compat.cpp:50:3: warning: explicitly defaulting this copy constructor with a type different from the implicit type is incompatible with C++ standards before C++20 [-Wpre-c++20-compat]"}
		}
	},
	["warn_cxx17_compat_designated_init"]={
		[l]={p,q,u,T,n,S},
		[k]=S,
		[i]={{nil,s,"warn_cxx17_compat_designated_init"}},
		[h]={{nil,s,"designated initializers are incompatible with C++ standards before C++20"}},
		[b]={{nil,s,"designated initializers are incompatible with C++ standards before C++20"}},
		[f]=j,
		[g]="designated initializers are incompatible with C\\+\\+ standards before C\\+\\+20",
		[e]=" \\[(?:\\-Werror,)?\\-Wpre\\-c\\+\\+20\\-compat\\-pedantic[^\\]]*\\]",
		[a]={{nil,s,r}},
		[d]={"5030928d60a1",1567205575,"[c++20] Implement semantic restrictions for C++20 designated","[c++20] Implement semantic restrictions for C++20 designated\ninitializers.\n\nThis has some interesting interactions with our existing extensions to\nsupport C99 designated initializers as an extension in C++. Those are\nresolved as follows:\n\n * We continue to permit the full breadth of C99 designated initializers\n   in C++, with the exception that we disallow a partial overwrite of an\n   initializer with a non-trivially-destructible type. (Full overwrite\n   is OK, because we won\'t run the first initializer at all.)\n\n * The C99 extensions are disallowed in SFINAE contexts and during\n   overload resolution, where they could change the meaning of valid\n   programs.\n\n * C++20 disallows reordering of initializers. We only check for that for\n   the simple cases that the C++20 rules permit (designators of the form\n   \'.field_name =\' and continue to allow reordering in other cases).\n   It would be nice to improve this behavior in future.\n\n * All C99 designated initializer extensions produce a warning by\n   default in C++20 mode. People are going to learn the C++ rules based\n   on what Clang diagnoses, so it\'s important we diagnose these properly\n   by default.\n\n * In C++ <= 17, we apply the C++20 rules rather than the C99 rules, and\n   so still diagnose C99 extensions as described above. We continue to\n   accept designated C++20-compatible initializers in C++ <= 17 silently\n   by default (but naturally still reject under -pedantic-errors).\n\nThis is not a complete implementation of P0329R4. In particular, that\npaper introduces new non-C99-compatible syntax { .field { init } }, and\nwe do not support that yet.\n\nThis is based on a previous patch by Don Hinton, though I\'ve made\nsubstantial changes when addressing the above interactions.\n\nDifferential Revision: https://reviews.llvm.org/D59754\n\nllvm-svn: 370544"},
		[c]={{hb,7831,"ExprResult Sema::ActOnInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList, SourceLocation RBraceLoc) {\n  // ...\n  if (FirstDesignator.isValid()) {\n    // Only diagnose designated initiaization as a C++20 extension if we didn\'t\n    // already diagnose use of (non-C++20) C99 designator syntax.\n    if (getLangOpts().CPlusPlus && !DiagnosedArrayDesignator && !DiagnosedNestedDesignator && !DiagnosedMixedDesignator) {\n      Diag(FirstDesignator, getLangOpts().CPlusPlus20 ? diag::warn_cxx17_compat_designated_init : diag::ext_cxx_designated_init);"}}
	},
	["warn_cxx17_compat_equals_this_lambda_capture"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,X,T,o,n,n,G,S},
		[k]=G,
		[i]={{nil,H,"warn_cxx17_compat_equals_this_lambda_capture"}},
		[h]={{nil,s,"explicit capture of \'this\' with a capture default of \'=\' is incompatible with C++ standards before C++20"},{t,H,"explicit capture of \'this\' with a capture default of \'=\' is incompatible with C++ standards before C++2a"}},
		[b]={{nil,s,"explicit capture of \'this\' with a capture default of \'=\' is incompatible with C++ standards before C++20"},{t,H,"explicit capture of \'this\' with a capture default of \'=\' is incompatible with C++ standards before C++2a"}},
		[f]=j,
		[g]="explicit capture of \'this\' with a capture default of \'\\=\' is incompatible with C\\+\\+ standards before C\\+\\+20",
		[e]=Y,
		[a]={{nil,H,Dc}},
		[d]={"8194a3e975e5",1503114187,"[c++2a] Implement P0409R2 - Allow lambda capture [=,this] (by hamzasood)","[c++2a] Implement P0409R2 - Allow lambda capture [=,this] (by hamzasood)\n\nThis patch, by hamzasood, implements P0409R2, and allows [=, this] pre-C++2a as an extension (with appropriate warnings) for consistency.\n\nhttps://reviews.llvm.org/D36572\n\nThanks Hamza!\n\nllvm-svn: 311224"},
		[c]={{yd,1044,"void Sema::ActOnLambdaExpressionAfterIntroducer(LambdaIntroducer &Intro, Scope *CurrentScope) {\n  // ...\n  for (auto C = Intro.Captures.begin(), E = Intro.Captures.end(); C != E; PrevCaptureLoc = C->Loc, ++C) {\n    if (C->Kind == LCK_This || C->Kind == LCK_StarThis) {\n      // ...\n      // C++20 [expr.prim.lambda]p8:\n      //  If a lambda-capture includes a capture-default that is =,\n      //  each simple-capture of that lambda-capture shall be of the form\n      //  \"&identifier\", \"this\", or \"* this\". [ Note: The form [&,this] is\n      //  redundant but accepted for compatibility with ISO C++14. --end note ]\n      if (Intro.Default == LCD_ByCopy && C->Kind != LCK_StarThis)\n        Diag(C->Loc, !getLangOpts().CPlusPlus20 ? diag::ext_equals_this_lambda_capture_cxx20 : diag::warn_cxx17_compat_equals_this_lambda_capture);"}},
		[m]={
			[Qb]={"clang/test/SemaCXX/cxx17-compat.cpp:15:16: warning: explicit capture of \'this\' with a capture default of \'=\' is incompatible with C++ standards before C++20 [-Wpre-c++20-compat]"}
		}
	},
	["warn_cxx17_compat_exception_spec_in_signature"]={
		[l]={J,"c++17-compat-mangling",u,I,"c++1z-compat-mangling","noexcept-type"},
		[k]="c++17-compat-mangling",
		[i]={{nil,H,"warn_cxx17_compat_exception_spec_in_signature"}},
		[h]={{nil,H,"mangled name of %0 will change in C++17 due to non-throwing exception specification in function signature"}},
		[b]={{nil,H,"mangled name of A will change in C++17 due to non-throwing exception specification in function signature"}},
		[f]=j,
		[g]="mangled name of (.*?) will change in C\\+\\+17 due to non\\-throwing exception specification in function signature",
		[e]=" \\[(?:\\-Werror,)?\\-Wc\\+\\+17\\-compat\\-mangling[^\\]]*\\]",
		[a]={{nil,H,r}},
		[d]={"fda59e585121",1477443954,"Implement name mangling proposal for exception specifications from cxx-abi-dev 2016-10-11.","Implement name mangling proposal for exception specifications from cxx-abi-dev 2016-10-11.\n\nThis has the following ABI impact:\n\n 1) Functions whose parameter or return types are non-throwing function pointer\n    types have different manglings in c++1z mode from prior modes. This is\n    necessary because c++1z permits overloading on the noexceptness of function\n    pointer parameter types. A warning is issued for cases that will change\n    manglings in c++1z mode.\n\n 2) Functions whose parameter or return types contain instantiation-dependent\n    exception specifications change manglings in all modes. This is necessary\n    to support overloading on / SFINAE in these exception specifications, which\n    a careful reading of the standard indicates has essentially always been\n    permitted.\n\nNote that, in order to be affected by these changes, the code in question must\nspecify an exception specification on a function pointer/reference type that is\nwritten syntactically within the declaration of another function. Such\ndeclarations are very rare, and I have so far been unable to find any code\nthat would be affected by this. (Note that such things will probably become\nmore common in C++17, since it\'s a lot easier to get a noexcept function type\nas a function parameter / return type there.)\n\nThis change does not affect the set of symbols produced by a build of clang,\nlibc++, or libc++abi.\n\nllvm-svn: 285150"},
		[c]={{bb,12057,"/// Perform semantic checking of a new function declaration.\n///\n/// Performs semantic analysis of the new function declaration\n/// NewFD. This routine performs all semantic checking that does not\n/// require the actual declarator involved in the declaration, and is\n/// used both for the declaration of functions as they are parsed\n/// (called via ActOnDeclarator) and for the declaration of functions\n/// that have been instantiated via C++ template instantiation (called\n/// via InstantiateDecl).\n///\n/// \\param IsMemberSpecialization whether this new function declaration is\n/// a member specialization (that replaces any definition provided by the\n/// previous declaration).\n///\n/// This sets NewFD->isInvalidDecl() to true if there was an error.\n///\n/// \\returns true if the function declaration is a redeclaration.\nbool Sema::CheckFunctionDeclaration(Scope *S, FunctionDecl *NewFD, LookupResult &Previous, bool IsMemberSpecialization, bool DeclIsDefn) {\n  // ...\n  if (getLangOpts().CPlusPlus) {\n    // ...\n    // C++1z [dcl.fct]p6:\n    //   [...] whether the function has a non-throwing exception-specification\n    //   [is] part of the function type\n    //\n    // This results in an ABI break between C++14 and C++17 for functions whose\n    // declared type includes an exception-specification in a parameter or\n    // return type. (Exception specifications on the function itself are OK in\n    // most cases, and exception specifications are not permitted in most other\n    // contexts where they could make it into a mangling.)\n    if (!getLangOpts().CPlusPlus17 && !NewFD->getPrimaryTemplate()) {\n      // ...\n      if (AnyNoexcept)\n        Diag(NewFD->getLocation(), diag::warn_cxx17_compat_exception_spec_in_signature) << NewFD;"}},
		[m]={
			["clang/test/CodeGenCXX/mangle-exception-spec.cpp"]={"clang/test/CodeGenCXX/mangle-exception-spec.cpp:8:6: warning: mangled name of \'b\' will change in C++17 due to non-throwing exception specification in function signature [-Wc++17-compat-mangling]","clang/test/CodeGenCXX/mangle-exception-spec.cpp:11:6: warning: mangled name of \'c\' will change in C++17 due to non-throwing exception specification in function signature [-Wc++17-compat-mangling]","clang/test/CodeGenCXX/mangle-exception-spec.cpp:16:6: warning: mangled name of \'e\' will change in C++17 due to non-throwing exception specification in function signature [-Wc++17-compat-mangling]"}
		}
	},
	["warn_cxx17_compat_explicit_bool"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,X,T,o,n,n,G,S},
		[k]=G,
		[i]={{nil,s,"warn_cxx17_compat_explicit_bool"}},
		[h]={{nil,s,"explicit(bool) is incompatible with C++ standards before C++20"}},
		[b]={{nil,s,"explicit(bool) is incompatible with C++ standards before C++20"}},
		[f]=j,
		[g]="explicit\\(bool\\) is incompatible with C\\+\\+ standards before C\\+\\+20",
		[e]=Y,
		[a]={{nil,s,F}},
		[d]={"739b410f1ff5",1570627358,"Add a warning, flags and pragmas to limit the number of pre-processor tokens in a translation unit","Add a warning, flags and pragmas to limit the number of pre-processor tokens in a translation unit\n\nSee\nhttps://docs.google.com/document/d/1xMkTZMKx9llnMPgso0jrx3ankI4cv60xeZ0y4ksf4wc/preview\nfor background discussion.\n\nThis adds a warning, flags and pragmas to limit the number of\npre-processor tokens either at a certain point in a translation unit, or\noverall.\n\nThe idea is that this would allow projects to limit the size of certain\nwidely included headers, or for translation units overall, as a way to\ninsert backstops for header bloat and prevent compile-time regressions.\n\nDifferential revision: https://reviews.llvm.org/D72703"},
		[c]={{Vb,4047,"/// ParseDeclarationSpecifiers\n///       declaration-specifiers: [C99 6.7]\n///         storage-class-specifier declaration-specifiers[opt]\n///         type-specifier declaration-specifiers[opt]\n/// [C99]   function-specifier declaration-specifiers[opt]\n/// [C11]   alignment-specifier declaration-specifiers[opt]\n/// [GNU]   attributes declaration-specifiers[opt]\n/// [Clang] \'__module_private__\' declaration-specifiers[opt]\n/// [ObjC1] \'__kindof\' declaration-specifiers[opt]\n///\n///       storage-class-specifier: [C99 6.7.1]\n///         \'typedef\'\n///         \'extern\'\n///         \'static\'\n///         \'auto\'\n///         \'register\'\n/// [C++]   \'mutable\'\n/// [C++11] \'thread_local\'\n/// [C11]   \'_Thread_local\'\n/// [GNU]   \'__thread\'\n///       function-specifier: [C99 6.7.4]\n/// [C99]   \'inline\'\n/// [C++]   \'virtual\'\n/// [C++]   \'explicit\'\n/// [OpenCL] \'__kernel\'\n///       \'friend\': [C++ dcl.friend]\n///       \'constexpr\': [C++0x dcl.constexpr]\nvoid Parser::ParseDeclarationSpecifiers(DeclSpec &DS, const ParsedTemplateInfo &TemplateInfo, AccessSpecifier AS, DeclSpecContext DSContext, LateParsedAttrList *LateAttrs, ImplicitTypenameContext AllowImplicitTypename) {\n  // ...\n  while (true) {\n    // ...\n    case tok::kw_explicit: {\n      // ...\n      if (Tok.is(tok::l_paren)) {\n        if (getLangOpts().CPlusPlus20 || isExplicitBool() == TPResult::True) {\n          Diag(Tok.getLocation(), getLangOpts().CPlusPlus20 ? diag::warn_cxx17_compat_explicit_bool : diag::ext_explicit_bool);"}},
		[m]={
			["clang/test/Parser/explicit-bool.cpp"]={"clang/test/Parser/explicit-bool.cpp:12:22: warning: explicit(bool) is incompatible with C++ standards before C++20 [-Wpre-c++20-compat]","clang/test/Parser/explicit-bool.cpp:22:22: warning: explicit(bool) is incompatible with C++ standards before C++20 [-Wpre-c++20-compat]","clang/test/Parser/explicit-bool.cpp:27:12: warning: explicit(bool) is incompatible with C++ standards before C++20 [-Wpre-c++20-compat]","clang/test/Parser/explicit-bool.cpp:32:12: warning: explicit(bool) is incompatible with C++ standards before C++20 [-Wpre-c++20-compat]","clang/test/Parser/explicit-bool.cpp:47:12: warning: explicit(bool) is incompatible with C++ standards before C++20 [-Wpre-c++20-compat]","clang/test/Parser/explicit-bool.cpp:52:12: warning: explicit(bool) is incompatible with C++ standards before C++20 [-Wpre-c++20-compat]","clang/test/Parser/explicit-bool.cpp:56:12: warning: explicit(bool) is incompatible with C++ standards before C++20 [-Wpre-c++20-compat]"}
		}
	},
	["warn_cxx17_compat_for_range_init_stmt"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,X,T,o,n,n,G,S},
		[k]=G,
		[i]={{nil,v,"warn_cxx17_compat_for_range_init_stmt"}},
		[h]={{nil,s,"range-based for loop initialization statements are incompatible with C++ standards before C++20"},{t,v,"range-based for loop initialization statements are incompatible with C++ standards before C++2a"}},
		[b]={{nil,s,"range-based for loop initialization statements are incompatible with C++ standards before C++20"},{t,v,"range-based for loop initialization statements are incompatible with C++ standards before C++2a"}},
		[f]=j,
		[g]="range\\-based for loop initialization statements are incompatible with C\\+\\+ standards before C\\+\\+20",
		[e]=Y,
		[a]={{nil,v,F}},
		[d]={"8baa50013c86",1538160249,"[cxx2a] P0614R1: Support init-statements in range-based for loops.","[cxx2a] P0614R1: Support init-statements in range-based for loops.\n\nWe don\'t yet support this for the case where a range-based for loop is\nimplicitly rewritten to an ObjC for..in statement.\n\nllvm-svn: 343350"},
		[c]={{tc,2171,"/// ParseForStatement\n///       for-statement: [C99 6.8.5.3]\n///         \'for\' \'(\' expr[opt] \';\' expr[opt] \';\' expr[opt] \')\' statement\n///         \'for\' \'(\' declaration expr[opt] \';\' expr[opt] \')\' statement\n/// [C++]   \'for\' \'(\' for-init-statement condition[opt] \';\' expression[opt] \')\'\n/// [C++]       statement\n/// [C++0x] \'for\'\n///             \'co_await\'[opt]    [Coroutines]\n///             \'(\' for-range-declaration \':\' for-range-initializer \')\'\n///             statement\n/// [OBJC2] \'for\' \'(\' declaration \'in\' expr \')\' statement\n/// [OBJC2] \'for\' \'(\' expr \'in\' expr \')\' statement\n///\n/// [C++] for-init-statement:\n/// [C++]   expression-statement\n/// [C++]   simple-declaration\n/// [C++23] alias-declaration\n///\n/// [C++0x] for-range-declaration:\n/// [C++0x]   attribute-specifier-seq[opt] type-specifier-seq declarator\n/// [C++0x] for-range-initializer:\n/// [C++0x]   expression\n/// [C++0x]   braced-init-list            [TODO]\nStmtResult Parser::ParseForStatement(SourceLocation *TrailingElseLoc) {\n  // ...\n  // Parse the second part of the for specifier.\n  if (!ForEach && !ForRangeInfo.ParsedForRangeDecl() && !SecondPart.isInvalid()) {\n    // Parse the second part of the for specifier.\n    if (Tok.is(tok::semi)) { // for (...;;\n    // ...\n    } else if (Tok.is(tok::r_paren)) {\n    // ...\n    } else {\n      if (getLangOpts().CPlusPlus) {\n        // ...\n        if (ForRangeInfo.ParsedForRangeDecl()) {\n          Diag(FirstPart.get() ? FirstPart.get()->getBeginLoc() : ForRangeInfo.ColonLoc, getLangOpts().CPlusPlus20 ? diag::warn_cxx17_compat_for_range_init_stmt : diag::ext_for_range_init_stmt) << (FirstPart.get() ? FirstPart.get()->getSourceRange() : SourceRange());"}},
		[m]={
			[Qb]={"clang/test/SemaCXX/cxx17-compat.cpp:59:8: warning: range-based for loop initialization statements are incompatible with C++ standards before C++20 [-Wpre-c++20-compat]"}
		}
	},
	["warn_cxx17_compat_implicit_typename"]={
		[l]={P,N,db,M},
		[k]=P,
		[i]={{nil,U,"warn_cxx17_compat_implicit_typename"}},
		[h]={{nil,U,"use of implicit \'typename\' is incompatible with C++ standards before C++20"}},
		[b]={{nil,U,"use of implicit \'typename\' is incompatible with C++ standards before C++20"}},
		[f]=j,
		[g]="use of implicit \'typename\' is incompatible with C\\+\\+ standards before C\\+\\+20",
		[e]=gc,
		[a]={{nil,U,r}},
		[d]={Gb,1625925174,Fb,Kb},
		[c]={{bb,372,"/// If the identifier refers to a type name within this scope,\n/// return the declaration of that type.\n///\n/// This routine performs ordinary name lookup of the identifier II\n/// within the given scope, with optional C++ scope specifier SS, to\n/// determine whether the name refers to a type. If so, returns an\n/// opaque pointer (actually a QualType) corresponding to that\n/// type. Otherwise, returns NULL.\nParsedType Sema::getTypeName(const IdentifierInfo &II, SourceLocation NameLoc, Scope *S, CXXScopeSpec *SS, bool isClassName, bool HasTrailingDot, ParsedType ObjectTypePtr, bool IsCtorOrDtorName, bool WantNontrivialTypeSourceInfo, bool IsClassTemplateDeductionContext, ImplicitTypenameContext AllowImplicitTypename, IdentifierInfo **CorrectedII) {\n  // ...\n  if (ObjectTypePtr) {\n  // ...\n  } else if (SS && SS->isNotEmpty()) {\n    // ...\n    if (!LookupCtx) {\n      if (isDependentScopeSpecifier(*SS)) {\n        // ...\n        if (IsImplicitTypename) {\n          // ...\n          if (getLangOpts().CPlusPlus20)\n            Diag(QualifiedLoc, diag::warn_cxx17_compat_implicit_typename);"},{yb,4147,"TypeResult Sema::ActOnTemplateIdType(Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, TemplateTy TemplateD, IdentifierInfo *TemplateII, SourceLocation TemplateIILoc, SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgsIn, SourceLocation RAngleLoc, bool IsCtorOrDtorName, bool IsClassName, ImplicitTypenameContext AllowImplicitTypename) {\n  // ...\n  if (!IsCtorOrDtorName && !IsClassName && SS.isSet()) {\n    // ...\n    // C++ [temp.res]p3:\n    //   A qualified-id that refers to a type and in which the\n    //   nested-name-specifier depends on a template-parameter (14.6.2)\n    //   shall be prefixed by the keyword typename to indicate that the\n    //   qualified-id denotes a type, forming an\n    //   elaborated-type-specifier (7.1.5.3).\n    if (!LookupCtx && isDependentScopeSpecifier(SS)) {\n      // C++2a relaxes some of those restrictions in [temp.res]p5.\n      if (AllowImplicitTypename == ImplicitTypenameContext::Yes) {\n        if (getLangOpts().CPlusPlus20)\n          Diag(SS.getBeginLoc(), diag::warn_cxx17_compat_implicit_typename);"}}
	},
	["warn_cxx17_compat_init_capture_pack"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,X,T,o,n,n,G,S},
		[k]=G,
		[i]={{nil,t,"warn_cxx17_compat_init_capture_pack"}},
		[h]={{nil,s,"initialized lambda capture packs are incompatible with C++ standards before C++20"},{t,t,"initialized lambda capture packs are incompatible with C++ standards before C++2a"}},
		[b]={{nil,s,"initialized lambda capture packs are incompatible with C++ standards before C++20"},{t,t,"initialized lambda capture packs are incompatible with C++ standards before C++2a"}},
		[f]=j,
		[g]="initialized lambda capture packs are incompatible with C\\+\\+ standards before C\\+\\+20",
		[e]=Y,
		[a]={{nil,t,Dc}},
		[d]={"b2997f579a8b",1558469450,"[c++20] P0780R2: Support pack-expansion of init-captures.","[c++20] P0780R2: Support pack-expansion of init-captures.\n\nThis permits an init-capture to introduce a new pack:\n\n  template<typename ...T> auto x = [...a = T()] { /* a is a pack */ };\n\nTo support this, the mechanism for allowing ParmVarDecls to be packs has\nbeen extended to support arbitrary local VarDecls.\n\nllvm-svn: 361300"},
		[c]={{yd,728,"QualType Sema::buildLambdaInitCaptureInitialization(SourceLocation Loc, bool ByRef, SourceLocation EllipsisLoc, std::optional<unsigned> NumExpansions, IdentifierInfo *Id, bool IsDirectInit, Expr *&Init) {\n  // ...\n  if (EllipsisLoc.isValid()) {\n    if (Init->containsUnexpandedParameterPack()) {\n      Diag(EllipsisLoc, getLangOpts().CPlusPlus20 ? diag::warn_cxx17_compat_init_capture_pack : diag::ext_init_capture_pack);"}}
	},
	["warn_cxx17_compat_inline_nested_namespace_definition"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,X,T,o,n,n,G,S},
		[k]=G,
		[i]={{nil,v,"warn_cxx17_compat_inline_nested_namespace_definition"}},
		[h]={{nil,s,"inline nested namespace definition is incompatible with C++ standards before C++20"},{t,v,"inline nested namespace definition is incompatible with C++ standards before C++2a"}},
		[b]={{nil,s,"inline nested namespace definition is incompatible with C++ standards before C++20"},{t,v,"inline nested namespace definition is incompatible with C++ standards before C++2a"}},
		[f]=j,
		[g]="inline nested namespace definition is incompatible with C\\+\\+ standards before C\\+\\+20",
		[e]=Y,
		[a]={{nil,v,F}},
		[d]={"53f391dcb323",1542043188,"Implement P1094R2 (nested inline namespaces)","Implement P1094R2 (nested inline namespaces)\n\nAs approved for the Working Paper in San Diego, support annotating\ninline namespaces with \'inline\'.\n\nChange-Id: I51a654e11ffb475bf27cccb2458768151619e384\nllvm-svn: 346677"},
		[c]={{gb,178,"/// ParseNamespace - We know that the current token is a namespace keyword. This\n/// may either be a top level namespace or a block-level namespace alias. If\n/// there was an inline keyword, it has already been parsed.\n///\n///       namespace-definition: [C++: namespace.def]\n///         named-namespace-definition\n///         unnamed-namespace-definition\n///         nested-namespace-definition\n///\n///       named-namespace-definition:\n///         \'inline\'[opt] \'namespace\' attributes[opt] identifier \'{\'\n///         namespace-body \'}\'\n///\n///       unnamed-namespace-definition:\n///         \'inline\'[opt] \'namespace\' attributes[opt] \'{\' namespace-body \'}\'\n///\n///       nested-namespace-definition:\n///         \'namespace\' enclosing-namespace-specifier \'::\' \'inline\'[opt]\n///         identifier \'{\' namespace-body \'}\'\n///\n///       enclosing-namespace-specifier:\n///         identifier\n///         enclosing-namespace-specifier \'::\' \'inline\'[opt] identifier\n///\n///       namespace-alias-definition:  [C++ 7.3.2: namespace.alias]\n///         \'namespace\' identifier \'=\' qualified-namespace-specifier \';\'\n///\nParser::DeclGroupPtrTy Parser::ParseNamespace(DeclaratorContext Context, SourceLocation &DeclEnd, SourceLocation InlineLoc) {\n  // ...\n  if (ExtraNSs.empty()) {\n  // ...\n  } else if (InlineLoc.isValid()) {\n  // ...\n  } else if (getLangOpts().CPlusPlus20) {\n    // ...\n    if (FirstNestedInlineLoc.isValid())\n      Diag(FirstNestedInlineLoc, diag::warn_cxx17_compat_inline_nested_namespace_definition);"}},
		[m]={
			["clang/test/Parser/cxx2a-inline-nested-namespace-definition.cpp"]={"clang/test/Parser/cxx2a-inline-nested-namespace-definition.cpp:19:27: warning: inline nested namespace definition is incompatible with C++ standards before C++20 [-Wpre-c++20-compat]","clang/test/Parser/cxx2a-inline-nested-namespace-definition.cpp:36:27: warning: inline nested namespace definition is incompatible with C++ standards before C++20 [-Wpre-c++20-compat]"}
		}
	},
	["warn_cxx17_compat_lambda_def_ctor_assign"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,X,T,o,n,n,G,S},
		[k]=G,
		[i]={{nil,v,"warn_cxx17_compat_lambda_def_ctor_assign"}},
		[h]={{nil,s,"%select{default construction|assignment}0 of lambda is incompatible with C++ standards before C++20"},{t,v,"%select{default construction|assignment}0 of lambda is incompatible with C++ standards before C++2a"}},
		[b]={{nil,s,{{"default construction","assignment"}," of lambda is incompatible with C++ standards before C++20"}},{t,v,{{"default construction","assignment"}," of lambda is incompatible with C++ standards before C++2a"}}},
		[f]=j,
		[g]="(?:default construction|assignment) of lambda is incompatible with C\\+\\+ standards before C\\+\\+20",
		[e]=Y,
		[a]={{nil,v,Dc}},
		[d]={"864949bda1db",1538088424,"[cxx2a] P0624R2: Lambdas with no capture-default are","[cxx2a] P0624R2: Lambdas with no capture-default are\ndefault-constructible and assignable.\n\nllvm-svn: 343279"},
		[c]={{hb,321,"/// Determine whether the use of this declaration is valid, and\n/// emit any corresponding diagnostics.\n///\n/// This routine diagnoses various problems with referencing\n/// declarations that can occur when using a declaration. For example,\n/// it might warn if a deprecated or unavailable declaration is being\n/// used, or produce an error (and return true) if a C++0x deleted\n/// function is being used.\n///\n/// \\returns true if there was an error (this declaration cannot be\n/// referenced), false otherwise.\n///\nbool Sema::DiagnoseUseOfDecl(NamedDecl *D, ArrayRef<SourceLocation> Locs, const ObjCInterfaceDecl *UnknownObjCClass, bool ObjCPropertyAccess, bool AvoidPartialAvailabilityChecks, ObjCInterfaceDecl *ClassReceiver, bool SkipTrailingRequiresClause) {\n  // ...\n  if (auto *MD = dyn_cast<CXXMethodDecl>(D)) {\n    // Lambdas are only default-constructible or assignable in C++2a onwards.\n    if (MD->getParent()->isLambda() && ((isa<CXXConstructorDecl>(MD) && cast<CXXConstructorDecl>(MD)->isDefaultConstructor()) || MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator())) {\n      Diag(Loc, diag::warn_cxx17_compat_lambda_def_ctor_assign) << !isa<CXXConstructorDecl>(MD);"}},
		[m]={
			[Qb]={"clang/test/SemaCXX/cxx17-compat.cpp:32:18: warning: default construction of lambda is incompatible with C++ standards before C++20 [-Wpre-c++20-compat]","clang/test/SemaCXX/cxx17-compat.cpp:39:29: warning: assignment of lambda is incompatible with C++ standards before C++20 [-Wpre-c++20-compat]"}
		}
	},
	["warn_cxx17_compat_lambda_template_parameter_list"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,X,T,o,n,n,G,S},
		[k]=G,
		[i]={{nil,t,"warn_cxx17_compat_lambda_template_parameter_list"}},
		[h]={{nil,s,"explicit template parameter list for lambdas is incompatible with C++ standards before C++20"},{t,t,"explicit template parameter list for lambdas is incompatible with C++ standards before C++2a"}},
		[b]={{nil,s,"explicit template parameter list for lambdas is incompatible with C++ standards before C++20"},{t,t,"explicit template parameter list for lambdas is incompatible with C++ standards before C++2a"}},
		[f]=j,
		[g]="explicit template parameter list for lambdas is incompatible with C\\+\\+ standards before C\\+\\+20",
		[e]=Y,
		[a]={{nil,t,F}},
		[d]={"8205a814a691",1556966986,"[c++20] Implement P0428R2 - Familiar template syntax for generic lambdas","[c++20] Implement P0428R2 - Familiar template syntax for generic lambdas\n\nDifferential Revision: https://reviews.llvm.org/D36527\n\nllvm-svn: 359967"},
		[c]={{Lb,1330,"/// ParseLambdaExpressionAfterIntroducer - Parse the rest of a lambda\n/// expression.\nExprResult Parser::ParseLambdaExpressionAfterIntroducer(LambdaIntroducer &Intro) {\n  // ...\n  if (Tok.is(tok::less)) {\n    Diag(Tok, getLangOpts().CPlusPlus20 ? diag::warn_cxx17_compat_lambda_template_parameter_list : diag::ext_lambda_template_parameter_list);"}}
	},
	["warn_cxx17_compat_missing_varargs_arg"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,X,T,o,n,n,G,S},
		[k]=G,
		[i]={{nil,x,"warn_cxx17_compat_missing_varargs_arg"}},
		[h]={{nil,x,"passing no argument for the \'...\' parameter of a variadic macro is incompatible with C++ standards before C++20"}},
		[b]={{nil,x,"passing no argument for the \'...\' parameter of a variadic macro is incompatible with C++ standards before C++20"}},
		[f]=j,
		[g]="passing no argument for the \'\\.\\.\\.\' parameter of a variadic macro is incompatible with C\\+\\+ standards before C\\+\\+20",
		[e]=Y,
		[a]={{nil,x,Z}},
		[d]={Gb,1625925174,Fb,Kb},
		[c]={{"clang/lib/Lex/PPMacroExpansion.cpp",1000,"/// ReadFunctionLikeMacroArgs - After reading \"MACRO\" and knowing that the next\n/// token is the \'(\' of the macro, this method is invoked to read all of the\n/// actual arguments specified for the macro invocation.  This returns null on\n/// error.\nMacroArgs *Preprocessor::ReadMacroCallArgumentList(Token &MacroName, MacroInfo *MI, SourceLocation &MacroEnd) {\n  // ...\n  if (NumActuals < MinArgsExpected) {\n    // There are several cases where too few arguments is ok, handle them now.\n    if (NumActuals == 0 && MinArgsExpected == 1) {\n    // ...\n    } else if ((FoundElidedComma || MI->isVariadic()) && (NumActuals + 1 == MinArgsExpected ||          // A(x, ...) -> A(X)\n      // ...\n      // Varargs where the named vararg parameter is missing: OK as extension.\n      //   #define A(x, ...)\n      //   A(\"blah\")\n      //\n      // If the macro contains the comma pasting extension, the diagnostic\n      // is suppressed; we know we\'ll get another diagnostic later.\n      if (!MI->hasCommaPasting()) {\n        // ...\n        Diag(Tok, getLangOpts().CPlusPlus20 ? diag::warn_cxx17_compat_missing_varargs_arg : diag::ext_missing_varargs_arg);"}},
		[m]={
			["clang/test/Preprocessor/empty_va_arg.cpp"]={"clang/test/Preprocessor/empty_va_arg.cpp:9:9: warning: passing no argument for the \'...\' parameter of a variadic macro is incompatible with C++ standards before C++20 [-Wpre-c++20-compat]"}
		}
	},
	["warn_cxx17_compat_multi_using_declaration"]={
		[l]={y,w,p,p,E,q,q,xb,pb,o,n,n,Q,lb},
		[k]=Q,
		[i]={{nil,H,"warn_cxx17_compat_multi_using_declaration"}},
		[h]={{nil,H,"use of multiple declarators in a single using declaration is incompatible with C++ standards before C++17"}},
		[b]={{nil,H,"use of multiple declarators in a single using declaration is incompatible with C++ standards before C++17"}},
		[f]=j,
		[g]="use of multiple declarators in a single using declaration is incompatible with C\\+\\+ standards before C\\+\\+17",
		[e]=ub,
		[a]={{nil,H,F}},
		[d]={"6f1daa4660ed",1481849928,"[c++1z] P0195R2: Allow multiple using-declarators in a single using-declaration.","[c++1z] P0195R2: Allow multiple using-declarators in a single using-declaration.\n\nllvm-svn: 289905"},
		[c]={{gb,854,"/// ParseUsingDeclaration - Parse C++ using-declaration or alias-declaration.\n/// Assumes that \'using\' was already seen.\n///\n///     using-declaration: [C++ 7.3.p3: namespace.udecl]\n///       \'using\' using-declarator-list[opt] ;\n///\n///     using-declarator-list: [C++1z]\n///       using-declarator \'...\'[opt]\n///       using-declarator-list \',\' using-declarator \'...\'[opt]\n///\n///     using-declarator-list: [C++98-14]\n///       using-declarator\n///\n///     alias-declaration: C++11 [dcl.dcl]p1\n///       \'using\' identifier attribute-specifier-seq[opt] = type-id ;\n///\n///     using-enum-declaration: [C++20, dcl.enum]\n///       \'using\' elaborated-enum-specifier ;\n///       The terminal name of the elaborated-enum-specifier undergoes\n///       ordinary lookup\n///\n///     elaborated-enum-specifier:\n///       \'enum\' nested-name-specifier[opt] identifier\nParser::DeclGroupPtrTy Parser::ParseUsingDeclaration(DeclaratorContext Context, const ParsedTemplateInfo &TemplateInfo, SourceLocation UsingLoc, SourceLocation &DeclEnd, ParsedAttributes &PrefixAttrs, AccessSpecifier AS) {\n  // ...\n  if (DeclsInGroup.size() > 1)\n    Diag(Tok.getLocation(), getLangOpts().CPlusPlus17 ? diag::warn_cxx17_compat_multi_using_declaration : diag::ext_multi_using_declaration);"}}
	},
	["warn_cxx17_compat_pointer_to_const_ref_member_on_rvalue"]={
		[l]={p,q,u,T,n,S},
		[k]=S,
		[i]={{nil,H,"warn_cxx17_compat_pointer_to_const_ref_member_on_rvalue"}},
		[h]={{nil,s,"invoking a pointer to a \'const &\' member function on an rvalue is incompatible with C++ standards before C++20"},{t,H,"invoking a pointer to a \'const &\' member function on an rvalue is incompatible with C++ standards before C++2a"}},
		[b]={{nil,s,"invoking a pointer to a \'const &\' member function on an rvalue is incompatible with C++ standards before C++20"},{t,H,"invoking a pointer to a \'const &\' member function on an rvalue is incompatible with C++ standards before C++2a"}},
		[f]=j,
		[g]="invoking a pointer to a \'const &\' member function on an rvalue is incompatible with C\\+\\+ standards before C\\+\\+20",
		[e]=" \\[(?:\\-Werror,)?\\-Wpre\\-c\\+\\+20\\-compat\\-pedantic[^\\]]*\\]",
		[a]={{nil,H,r}},
		[d]={"2592327dae05",1503625675,"[c++2a] P0704R1: Allow pointers to const& member functions to be called on rvalues.","[c++2a] P0704R1: Allow pointers to const& member functions to be called on rvalues.\n\nPatch by Blitz Rakete!\n\nllvm-svn: 311744"},
		[c]={{dc,6091,"QualType Sema::CheckPointerToMemberOperands(ExprResult &LHS, ExprResult &RHS, ExprValueKind &VK, SourceLocation Loc, bool isIndirect) {\n  // ...\n  // C++0x [expr.mptr.oper]p6:\n  //   In a .* expression whose object expression is an rvalue, the program is\n  //   ill-formed if the second operand is a pointer to member function with\n  //   ref-qualifier &. In a ->* expression or in a .* expression whose object\n  //   expression is an lvalue, the program is ill-formed if the second operand\n  //   is a pointer to member function with ref-qualifier &&.\n  if (const FunctionProtoType *Proto = Result->getAs<FunctionProtoType>()) {\n    // ...\n    case RQ_LValue:\n      if (!isIndirect && !LHS.get()->Classify(Context).isLValue()) {\n        // C++2a allows functions with ref-qualifier & if their cv-qualifier-seq\n        // is (exactly) \'const\'.\n        if (Proto->isConst() && !Proto->isVolatile())\n          Diag(Loc, getLangOpts().CPlusPlus20 ? diag::warn_cxx17_compat_pointer_to_const_ref_member_on_rvalue : diag::ext_pointer_to_const_ref_member_on_rvalue);"}},
		[m]={
			[Qb]={"clang/test/SemaCXX/cxx17-compat.cpp:6:18: warning: invoking a pointer to a \'const &\' member function on an rvalue is incompatible with C++ standards before C++20 [-Wpre-c++20-compat-pedantic]"}
		}
	},
	["warn_cxx17_compat_spaceship"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,X,T,o,n,n,G,S},
		[k]=G,
		[i]={{nil,H,"warn_cxx17_compat_spaceship"}},
		[h]={{nil,s,"\'<=>\' operator is incompatible with C++ standards before C++20"},{t,H,"\'<=>\' operator is incompatible with C++ standards before C++2a"}},
		[b]={{nil,s,"\'<=>\' operator is incompatible with C++ standards before C++20"},{t,H,"\'<=>\' operator is incompatible with C++ standards before C++2a"}},
		[f]=j,
		[g]="\'\\<\\=\\>\' operator is incompatible with C\\+\\+ standards before C\\+\\+20",
		[e]=Y,
		[a]={{nil,H,Z}},
		[d]={"edbf5972a4c9",1512090430,"[c++2a] P0515R3: lexer support for new <=> token.","[c++2a] P0515R3: lexer support for new <=> token.\n\nllvm-svn: 319509"},
		[c]={{nb,4120,"LexStart:\n  // ...\n  case \'<\':\n    // ...\n    if (ParsingFilename) {\n    // ...\n    } else if (Char == \'<\') {\n    // ...\n    } else if (Char == \'=\') {\n      // ...\n      if (After == \'>\') {\n        if (LangOpts.CPlusPlus20) {\n          if (!isLexingRawMode())\n            Diag(BufferPtr, diag::warn_cxx17_compat_spaceship);"}},
		[m]={
			[Qb]={"clang/test/SemaCXX/cxx17-compat.cpp:102:16: warning: \'<=>\' operator is incompatible with C++ standards before C++20 [-Wpre-c++20-compat]"}
		}
	},
	["warn_cxx17_compat_template_nontype_parm_type"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,X,T,o,n,n,G,S},
		[k]=G,
		[i]={{nil,W,"warn_cxx17_compat_template_nontype_parm_type"}},
		[h]={{nil,W,"non-type template parameter of type %0 is incompatible with C++ standards before C++20"}},
		[b]={{nil,W,"non-type template parameter of type A is incompatible with C++ standards before C++20"}},
		[f]=j,
		[g]="non\\-type template parameter of type (.*?) is incompatible with C\\+\\+ standards before C\\+\\+20",
		[e]=Y,
		[a]={{nil,W,r}},
		[d]={"61d065e21ff3",1590001902,"Let clang atomic builtins fetch add/sub support floating point types","Let clang atomic builtins fetch add/sub support floating point types\n\nRecently atomicrmw started to support fadd/fsub:\n\nhttps://reviews.llvm.org/D53965\n\nHowever clang atomic builtins fetch add/sub still does not support\nemitting atomicrmw fadd/fsub.\n\nThis patch adds that.\n\nReviewed by: John McCall, Artem Belevich, Matt Arsenault, JF Bastien,\nJames Y Knight, Louis Dionne, Olivier Giroux\n\nDifferential Revision: https://reviews.llvm.org/D71726"},
		[c]={{yb,1488,"QualType Sema::CheckNonTypeTemplateParameterType(QualType T, SourceLocation Loc) {\n  // ...\n  Diag(Loc, diag::warn_cxx17_compat_template_nontype_parm_type) << T;"}},
		[m]={
			[Qb]={"clang/test/SemaCXX/cxx17-compat.cpp:127:13: warning: non-type template parameter of type \'A\' is incompatible with C++ standards before C++20 [-Wpre-c++20-compat]"}
		}
	},
	["warn_cxx17_compat_unicode_type"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,X,T,o,n,n,G,S},
		[k]=G,
		[i]={{nil,O,"warn_cxx17_compat_unicode_type"}},
		[h]={{nil,O,"\'char8_t\' type specifier is incompatible with C++ standards before C++20"}},
		[b]={{nil,O,"\'char8_t\' type specifier is incompatible with C++ standards before C++20"}},
		[f]=j,
		[g]="\'char8_t\' type specifier is incompatible with C\\+\\+ standards before C\\+\\+20",
		[e]=Y,
		[a]={{nil,O,r}},
		[d]={"3a8244df6fb8",1525150965,"Implement P0482R2, support for char8_t type.","Implement P0482R2, support for char8_t type.\n\nThis is not yet part of any C++ working draft, and so is controlled by the flag\n-fchar8_t rather than a -std= flag. (The GCC implementation is controlled by a\nflag with the same name.)\n\nThis implementation is experimental, and will be removed or revised\nsubstantially to match the proposal as it makes its way through the C++\ncommittee.\n\nllvm-svn: 331244"},
		[c]={{Yc,1375,"/// Finish - This does final analysis of the declspec, rejecting things like\n/// \"_Imaginary\" (lacking an FP type). After calling this method, DeclSpec is\n/// guaranteed to be self-consistent, even if an error occurred.\nvoid DeclSpec::Finish(Sema &S, const PrintingPolicy &Policy) {\n  // ...\n  if (TypeSpecType == TST_char8)\n    S.Diag(TSTLoc, diag::warn_cxx17_compat_unicode_type);"}}
	},
	["warn_cxx17_compat_using_decl_class_member_enumerator"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,X,T,o,n,n,G,S},
		[k]=G,
		[i]={{nil,z,"warn_cxx17_compat_using_decl_class_member_enumerator"}},
		[h]={{nil,z,"member using declaration naming a non-member enumerator is incompatible with C++ standards before C++20"}},
		[b]={{nil,z,"member using declaration naming a non-member enumerator is incompatible with C++ standards before C++20"}},
		[f]=j,
		[g]="member using declaration naming a non\\-member enumerator is incompatible with C\\+\\+ standards before C\\+\\+20",
		[e]=Y,
		[a]={{nil,z,r}},
		[d]={Sc,1615397021,Uc,Tc},
		[c]={{K,13056,"/// Checks that the given nested-name qualifier used in a using decl\n/// in the current context is appropriately related to the current\n/// scope.  If an error is found, diagnoses it and returns true.\n/// R is nullptr, if the caller has not (yet) done a lookup, otherwise it\'s the\n/// result of that lookup. UD is likewise nullptr, except when we have an\n/// already-populated UsingDecl whose shadow decls contain the same information\n/// (i.e. we\'re instantiating a UsingDecl with non-dependent scope).\nbool Sema::CheckUsingDeclQualifier(SourceLocation UsingLoc, bool HasTypename, const CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo, SourceLocation NameLoc, const LookupResult *R, const UsingDecl *UD) {\n  // ...\n  if (!CurContext->isRecord()) {\n    // ...\n    Diag(NameLoc, Cxx20Enumerator ? diag::warn_cxx17_compat_using_decl_class_member_enumerator : diag::err_using_decl_can_not_refer_to_class_member) << SS.getRange();"}}
	},
	["warn_cxx17_compat_using_decl_non_member_enumerator"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,X,T,o,n,n,G,S},
		[k]=G,
		[i]={{nil,z,"warn_cxx17_compat_using_decl_non_member_enumerator"}},
		[h]={{nil,z,"member using declaration naming non-class \'%0\' enumerator is incompatible with C++ standards before C++20"}},
		[b]={{nil,z,"member using declaration naming non-class \'A\' enumerator is incompatible with C++ standards before C++20"}},
		[f]=j,
		[g]="member using declaration naming non\\-class \'(.*?)\' enumerator is incompatible with C\\+\\+ standards before C\\+\\+20",
		[e]=Y,
		[a]={{nil,z,r}},
		[d]={Sc,1615397021,Uc,Tc},
		[c]={{K,13140,"/// Checks that the given nested-name qualifier used in a using decl\n/// in the current context is appropriately related to the current\n/// scope.  If an error is found, diagnoses it and returns true.\n/// R is nullptr, if the caller has not (yet) done a lookup, otherwise it\'s the\n/// result of that lookup. UD is likewise nullptr, except when we have an\n/// already-populated UsingDecl whose shadow decls contain the same information\n/// (i.e. we\'re instantiating a UsingDecl with non-dependent scope).\nbool Sema::CheckUsingDeclQualifier(SourceLocation UsingLoc, bool HasTypename, const CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo, SourceLocation NameLoc, const LookupResult *R, const UsingDecl *UD) {\n  // ...\n  // The current scope is a record.\n  if (!NamedContext->isRecord()) {\n    // ...\n    Diag(SS.getBeginLoc(), Cxx20Enumerator ? diag::warn_cxx17_compat_using_decl_non_member_enumerator : diag::err_using_decl_nested_name_specifier_is_not_class) << SS.getScopeRep() << SS.getRange();"},{K,13164,"/// Checks that the given nested-name qualifier used in a using decl\n/// in the current context is appropriately related to the current\n/// scope.  If an error is found, diagnoses it and returns true.\n/// R is nullptr, if the caller has not (yet) done a lookup, otherwise it\'s the\n/// result of that lookup. UD is likewise nullptr, except when we have an\n/// already-populated UsingDecl whose shadow decls contain the same information\n/// (i.e. we\'re instantiating a UsingDecl with non-dependent scope).\nbool Sema::CheckUsingDeclQualifier(SourceLocation UsingLoc, bool HasTypename, const CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo, SourceLocation NameLoc, const LookupResult *R, const UsingDecl *UD) {\n  // ...\n  if (getLangOpts().CPlusPlus11) {\n    // ...\n    if (cast<CXXRecordDecl>(CurContext)->isProvablyNotDerivedFrom(cast<CXXRecordDecl>(NamedContext))) {\n      if (Cxx20Enumerator) {\n        Diag(NameLoc, diag::warn_cxx17_compat_using_decl_non_member_enumerator) << SS.getRange();"}}
	},
	["warn_cxx17_compat_using_decl_scoped_enumerator"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,X,T,o,n,n,G,S},
		[k]=G,
		[i]={{nil,z,"warn_cxx17_compat_using_decl_scoped_enumerator"}},
		[h]={{nil,z,"using declaration naming a scoped enumerator is incompatible with C++ standards before C++20"}},
		[b]={{nil,z,"using declaration naming a scoped enumerator is incompatible with C++ standards before C++20"}},
		[f]=j,
		[g]="using declaration naming a scoped enumerator is incompatible with C\\+\\+ standards before C\\+\\+20",
		[e]=Y,
		[a]={{nil,z,r}},
		[d]={Sc,1615397021,Uc,Tc},
		[c]={{K,13031,"/// Checks that the given nested-name qualifier used in a using decl\n/// in the current context is appropriately related to the current\n/// scope.  If an error is found, diagnoses it and returns true.\n/// R is nullptr, if the caller has not (yet) done a lookup, otherwise it\'s the\n/// result of that lookup. UD is likewise nullptr, except when we have an\n/// already-populated UsingDecl whose shadow decls contain the same information\n/// (i.e. we\'re instantiating a UsingDecl with non-dependent scope).\nbool Sema::CheckUsingDeclQualifier(SourceLocation UsingLoc, bool HasTypename, const CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo, SourceLocation NameLoc, const LookupResult *R, const UsingDecl *UD) {\n  // ...\n  if (NamedContext) {\n    // ...\n    if (auto *ED = dyn_cast<EnumDecl>(NamedContext)) {\n      // C++14 [namespace.udecl]p7:\n      // A using-declaration shall not name a scoped enumerator.\n      // C++20 p1099 permits enumerators.\n      if (EC && R && ED->isScoped())\n        Diag(SS.getBeginLoc(), getLangOpts().CPlusPlus20 ? diag::warn_cxx17_compat_using_decl_scoped_enumerator : diag::ext_using_decl_scoped_enumerator) << SS.getRange();"}}
	},
	["warn_cxx17_compat_using_declaration_pack"]={
		[l]={y,w,p,p,E,q,q,xb,pb,o,n,n,Q,lb},
		[k]=Q,
		[i]={{nil,H,"warn_cxx17_compat_using_declaration_pack"}},
		[h]={{nil,H,"pack expansion using declaration is incompatible with C++ standards before C++17"}},
		[b]={{nil,H,"pack expansion using declaration is incompatible with C++ standards before C++17"}},
		[f]=j,
		[g]="pack expansion using declaration is incompatible with C\\+\\+ standards before C\\+\\+17",
		[e]=ub,
		[a]={{nil,H,F}},
		[d]={"22a250cd5d8e",1482120533,"[c++1z] P0195R2: Support pack-expansion of using-declarations.","[c++1z] P0195R2: Support pack-expansion of using-declarations.\n\nThis change introduces UsingPackDecl as a marker for the set of UsingDecls\nproduced by pack expansion of a single (unresolved) using declaration. This is\nnot strictly necessary (we just need to be able to map from the original using\ndeclaration to its expansions somehow), but it\'s useful to maintain the\ninvariant that each declaration reference instantiates to refer to one\ndeclaration.\n\nllvm-svn: 290080"},
		[c]={{gb,661,"/// Parse a using-declarator (or the identifier in a C++11 alias-declaration).\n///\n///     using-declarator:\n///       \'typename\'[opt] nested-name-specifier unqualified-id\n///\nbool Parser::ParseUsingDeclarator(DeclaratorContext Context, UsingDeclarator &D) {\n  // ...\n  if (TryConsumeToken(tok::ellipsis, D.EllipsisLoc))\n    Diag(Tok.getLocation(), getLangOpts().CPlusPlus17 ? diag::warn_cxx17_compat_using_declaration_pack : diag::ext_using_declaration_pack);"}}
	},
	["warn_cxx17_compat_using_enum_declaration"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,X,T,o,n,n,G,S},
		[k]=G,
		[i]={{nil,z,"warn_cxx17_compat_using_enum_declaration"}},
		[h]={{nil,z,"using enum declaration is incompatible with C++ standards before C++20"}},
		[b]={{nil,z,"using enum declaration is incompatible with C++ standards before C++20"}},
		[f]=j,
		[g]="using enum declaration is incompatible with C\\+\\+ standards before C\\+\\+20",
		[e]=Y,
		[a]={{nil,z,F}},
		[d]={td,1612659633,ed,Rc},
		[c]={{gb,701,"/// ParseUsingDeclaration - Parse C++ using-declaration or alias-declaration.\n/// Assumes that \'using\' was already seen.\n///\n///     using-declaration: [C++ 7.3.p3: namespace.udecl]\n///       \'using\' using-declarator-list[opt] ;\n///\n///     using-declarator-list: [C++1z]\n///       using-declarator \'...\'[opt]\n///       using-declarator-list \',\' using-declarator \'...\'[opt]\n///\n///     using-declarator-list: [C++98-14]\n///       using-declarator\n///\n///     alias-declaration: C++11 [dcl.dcl]p1\n///       \'using\' identifier attribute-specifier-seq[opt] = type-id ;\n///\n///     using-enum-declaration: [C++20, dcl.enum]\n///       \'using\' elaborated-enum-specifier ;\n///       The terminal name of the elaborated-enum-specifier undergoes\n///       ordinary lookup\n///\n///     elaborated-enum-specifier:\n///       \'enum\' nested-name-specifier[opt] identifier\nParser::DeclGroupPtrTy Parser::ParseUsingDeclaration(DeclaratorContext Context, const ParsedTemplateInfo &TemplateInfo, SourceLocation UsingLoc, SourceLocation &DeclEnd, ParsedAttributes &PrefixAttrs, AccessSpecifier AS) {\n  // ...\n  if (TryConsumeToken(tok::kw_enum, UELoc) && !InInitStatement) {\n    // ...\n    Diag(UELoc, getLangOpts().CPlusPlus20 ? diag::warn_cxx17_compat_using_enum_declaration : diag::ext_using_enum_declaration);"}}
	},
	["warn_cxx17_hex_literal"]={
		[l]={p,q,pb,n,lb},
		[k]=lb,
		[i]={{nil,H,"warn_cxx17_hex_literal"}},
		[h]={{nil,H,"hexadecimal floating literals are incompatible with C++ standards before C++17"}},
		[b]={{nil,H,"hexadecimal floating literals are incompatible with C++ standards before C++17"}},
		[f]=j,
		[g]="hexadecimal floating literals are incompatible with C\\+\\+ standards before C\\+\\+17",
		[e]=" \\[(?:\\-Werror,)?\\-Wpre\\-c\\+\\+17\\-compat\\-pedantic[^\\]]*\\]",
		[a]={{nil,H,Z}},
		[d]={"560a3579b29a",1457130726,"Update diagnostics now that hexadecimal literals look likely to be part of C++17.","Update diagnostics now that hexadecimal literals look likely to be part of C++17.\n\nllvm-svn: 262753"},
		[c]={{Ec,1332,"/// ParseNumberStartingWithZero - This method is called when the first character\n/// of the number is found to be a zero.  This means it is either an octal\n/// number (like \'04\') or a hex number (\'0x123a\') a binary number (\'0b1010\') or\n/// a floating point number (01239.123e4).  Eat the prefix, determining the\n/// radix etc.\nvoid NumericLiteralParser::ParseNumberStartingWithZero(SourceLocation TokLoc) {\n  // ...\n  // Handle a hex number like 0x1234.\n  if ((c1 == \'x\' || c1 == \'X\') && (isHexDigit(s[1]) || s[1] == \'.\')) {\n    // ...\n    // A binary exponent can appear with or with a \'.\'. If dotted, the\n    // binary exponent is required.\n    if (*s == \'p\' || *s == \'P\') {\n      // ...\n      if (!LangOpts.HexFloats)\n      // ...\n      else if (LangOpts.CPlusPlus17)\n        Diags.Report(TokLoc, diag::warn_cxx17_hex_literal);"}}
	},
	["warn_cxx20_alias_in_init_statement"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,P,N,N,db,M,M,o,n,n,V,Db},
		[k]=V,
		[i]={{nil,x,"warn_cxx20_alias_in_init_statement"}},
		[h]="alias declaration in this context is incompatible with C++ standards before C++23",
		[b]="alias declaration in this context is incompatible with C++ standards before C++23",
		[f]=j,
		[g]="alias declaration in this context is incompatible with C\\+\\+ standards before C\\+\\+23",
		[e]=Cb,
		[a]={{nil,x,F}},
		[d]={td,1612659633,ed,Rc},
		[c]={{Lb,2004,"Parser::DeclGroupPtrTy Parser::ParseAliasDeclarationInInitStatement(DeclaratorContext Context, ParsedAttributes &Attrs) {\n  // ...\n  Diag(DeclStart, !getLangOpts().CPlusPlus23 ? diag::ext_alias_in_init_statement : diag::warn_cxx20_alias_in_init_statement) << SourceRange(DeclStart, DeclEnd);"}}
	},
	["warn_cxx20_compat_aggregate_init_with_ctors"]={
		[l]={P,N,db,M},
		[k]=P,
		[i]={{nil,R,"warn_cxx20_compat_aggregate_init_with_ctors"}},
		[h]={{nil,R,"aggregate initialization of type %0 with user-declared constructors is incompatible with C++20"}},
		[b]={{nil,R,"aggregate initialization of type A with user-declared constructors is incompatible with C++20"}},
		[f]=j,
		[g]="aggregate initialization of type (.*?) with user\\-declared constructors is incompatible with C\\+\\+20",
		[e]=gc,
		[a]={{nil,R,r}},
		[d]={"79c88c31056f",1537988416,"P1008R1 Classes with user-declared constructors are never aggregates in","P1008R1 Classes with user-declared constructors are never aggregates in\nC++20.\n\nllvm-svn: 343131"},
		[c]={{ob,1163,"/// Check whether the range of the initializer \\p ParentIList from element\n/// \\p Index onwards can be used to initialize an object of type \\p T. Update\n/// \\p Index to indicate how many elements of the list were consumed.\n///\n/// This also fills in \\p StructuredList, from element \\p StructuredIndex\n/// onwards, with the fully-braced, desugared form of the initialization.\nvoid InitListChecker::CheckImplicitInitList(const InitializedEntity &Entity, InitListExpr *ParentIList, QualType T, unsigned &Index, InitListExpr *StructuredList, unsigned &StructuredIndex) {\n  // ...\n  if (StructuredSubobjectInitList) {\n    // ...\n    if (!VerifyOnly && CXXRD && CXXRD->hasUserDeclaredConstructor()) {\n      SemaRef.Diag(StructuredSubobjectInitList->getBeginLoc(), diag::warn_cxx20_compat_aggregate_init_with_ctors) << StructuredSubobjectInitList->getSourceRange() << T;"},{ob,1314,"/// Check whether the initializer \\p IList (that was written with explicit\n/// braces) can be used to initialize an object of type \\p T.\n///\n/// This also fills in \\p StructuredList with the fully-braced, desugared\n/// form of the initialization.\nvoid InitListChecker::CheckExplicitInitList(const InitializedEntity &Entity, InitListExpr *IList, QualType &T, InitListExpr *StructuredList, bool TopLevelObject) {\n  // ...\n  if (!VerifyOnly) {\n    // ...\n    if (CXXRD && CXXRD->hasUserDeclaredConstructor()) {\n      // ...\n      if (!HasEquivCtor) {\n        SemaRef.Diag(IList->getBeginLoc(), diag::warn_cxx20_compat_aggregate_init_with_ctors) << IList->getSourceRange() << T;"}},
		[m]={
			["clang/test/SemaCXX/cxx2a-compat.cpp"]={"clang/test/SemaCXX/cxx2a-compat.cpp:8:8: warning: aggregate initialization of type \'A\' with user-declared constructors is incompatible with C++20 [-Wc++20-compat]","clang/test/SemaCXX/cxx2a-compat.cpp:18:9: warning: aggregate initialization of type \'A\' with user-declared constructors is incompatible with C++20 [-Wc++20-compat]","clang/test/SemaCXX/cxx2a-compat.cpp:18:15: warning: aggregate initialization of type \'A\' with user-declared constructors is incompatible with C++20 [-Wc++20-compat]"}
		}
	},
	["warn_cxx20_compat_auto_expr"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,P,N,N,db,M,M,o,n,n,V,Db},
		[k]=V,
		[i]={{nil,D,"warn_cxx20_compat_auto_expr"}},
		[h]="\'auto\' as a functional-style cast is incompatible with C++ standards before C++23",
		[b]="\'auto\' as a functional-style cast is incompatible with C++ standards before C++23",
		[f]=j,
		[g]="\'auto\' as a functional\\-style cast is incompatible with C\\+\\+ standards before C\\+\\+23",
		[e]=Cb,
		[a]={{nil,D,r}},
		[d]={"f60dc3caa673",1620118562,"[C++20][Modules] Adjust handling of exports of namespaces and using-decls.","[C++20][Modules] Adjust handling of exports of namespaces and using-decls.\n\nThis adjusts the handling for:\n\nexport module  M;\n\nexport namespace {};\n\nexport namespace N {};\nexport using namespace N;\n\nIn the first case, we were allowing empty anonymous namespaces\nas part of an extension allowing empty top-level entities, but that seems\ninappropriate in this case, since the linkage would be internal for the\nanonymous namespace.  We now report an error for this.\n\nThe second case was producing a warning diagnostic that this was\naccepted as an extension - however the C++20 standard does allow this\nas well-formed.\n\nIn the third case we keep the current practice that this is accepted with a\nwarning (as an extension). The C++20 standard says it\'s an error.\n\nWe also ensure that using decls are only applied to items with external linkage.\n\nThis adjusts error messages for exports involving redeclarations in modules to\nbe more specific about the reason that the decl has been rejected.\n\nDifferential Revision: https://reviews.llvm.org/D122119"},
		[c]={{dc,1521,"ExprResult Sema::BuildCXXTypeConstructExpr(TypeSourceInfo *TInfo, SourceLocation LParenOrBraceLoc, MultiExprArg Exprs, SourceLocation RParenOrBraceLoc, bool ListInitialization) {\n  // ...\n  if (Deduced && !Deduced->isDeduced() && isa<DeducedTemplateSpecializationType>(Deduced)) {\n  // ...\n  } else if (Deduced && !Deduced->isDeduced()) {\n    // ...\n    if (getLangOpts().CPlusPlus23) {\n      if (Ty->getAs<AutoType>())\n        Diag(TyBeginLoc, diag::warn_cxx20_compat_auto_expr) << FullRange;"}},
		[m]={
			["clang/test/Parser/cxx2b-auto-x.cpp"]={"clang/test/Parser/cxx2b-auto-x.cpp:5:12: warning: \'auto\' as a functional-style cast is incompatible with C++ standards before C++23 [-Wpre-c++23-compat]","clang/test/Parser/cxx2b-auto-x.cpp:21:12: warning: \'auto\' as a functional-style cast is incompatible with C++ standards before C++23 [-Wpre-c++23-compat]","clang/test/Parser/cxx2b-auto-x.cpp:24:12: warning: \'auto\' as a functional-style cast is incompatible with C++ standards before C++23 [-Wpre-c++23-compat]","clang/test/Parser/cxx2b-auto-x.cpp:39:5: warning: \'auto\' as a functional-style cast is incompatible with C++ standards before C++23 [-Wpre-c++23-compat]","clang/test/Parser/cxx2b-auto-x.cpp:46:14: warning: \'auto\' as a functional-style cast is incompatible with C++ standards before C++23 [-Wpre-c++23-compat]","clang/test/Parser/cxx2b-auto-x.cpp:50:14: warning: \'auto\' as a functional-style cast is incompatible with C++ standards before C++23 [-Wpre-c++23-compat]"}
		}
	},
	["warn_cxx20_compat_consteval"]={
		[l]={P,N,db,M},
		[k]=P,
		[i]={{nil,t,"warn_cxx20_compat_consteval"}},
		[h]={{nil,s,"\'consteval\' specifier is incompatible with C++ standards before C++20"},{t,t,"consteval is incompatible with C++ standards before C++20"}},
		[b]={{nil,s,"\'consteval\' specifier is incompatible with C++ standards before C++20"},{t,t,"consteval is incompatible with C++ standards before C++20"}},
		[f]=j,
		[g]="\'consteval\' specifier is incompatible with C\\+\\+ standards before C\\+\\+20",
		[e]=gc,
		[a]={{nil,s,F},{t,t,A}},
		[d]={"796ed03b8412",1560502580,"[C++20] add Basic consteval specifier","[C++20] add Basic consteval specifier\n\nSummary:\nthis revision adds Lexing, Parsing and Basic Semantic for the consteval specifier as specified by http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1073r3.html\n\nwith this patch, the consteval specifier is treated as constexpr but can only be applied to function declaration.\n\nChanges:\n - add the consteval keyword.\n - add parsing of consteval specifier for normal declarations and lambdas expressions.\n - add the whether a declaration is constexpr is now represented by and enum everywhere except for variable because they can\'t be consteval.\n - adapt diagnostic about constexpr to print constexpr or consteval depending on the case.\n - add tests for basic semantic.\n\nReviewers: rsmith, martong, shafik\n\nReviewed By: rsmith\n\nSubscribers: eraman, efriedma, rnkovacs, cfe-commits\n\nTags: #clang\n\nDifferential Revision: https://reviews.llvm.org/D61790\n\nllvm-svn: 363362"},
		[c]={{Lb,1242,"static void addConstevalToLambdaDeclSpecifier(Parser &P, SourceLocation ConstevalLoc, DeclSpec &DS) {\n  if (ConstevalLoc.isValid()) {\n    P.Diag(ConstevalLoc, diag::warn_cxx20_compat_consteval);"},{Yc,1382,"/// Finish - This does final analysis of the declspec, rejecting things like\n/// \"_Imaginary\" (lacking an FP type). After calling this method, DeclSpec is\n/// guaranteed to be self-consistent, even if an error occurred.\nvoid DeclSpec::Finish(Sema &S, const PrintingPolicy &Policy) {\n  // ...\n  if (getConstexprSpecifier() == ConstexprSpecKind::Constexpr)\n  // ...\n  else if (getConstexprSpecifier() == ConstexprSpecKind::Consteval)\n    S.Diag(ConstexprLoc, diag::warn_cxx20_compat_consteval);"}}
	},
	["warn_cxx20_compat_consteval_if"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,P,N,N,db,M,M,o,n,n,V,Db},
		[k]=V,
		[i]={{nil,x,"warn_cxx20_compat_consteval_if"}},
		[h]="consteval if is incompatible with C++ standards before C++23",
		[b]="consteval if is incompatible with C++ standards before C++23",
		[f]=j,
		[g]="consteval if is incompatible with C\\+\\+ standards before C\\+\\+23",
		[e]=Cb,
		[a]={{nil,x,F}},
		[d]={td,1612659633,ed,Rc},
		[c]={{tc,1479,"/// ParseIfStatement\n///       if-statement: [C99 6.8.4.1]\n///         \'if\' \'(\' expression \')\' statement\n///         \'if\' \'(\' expression \')\' statement \'else\' statement\n/// [C++]   \'if\' \'(\' condition \')\' statement\n/// [C++]   \'if\' \'(\' condition \')\' statement \'else\' statement\n/// [C++23] \'if\' \'!\' [opt] consteval compound-statement\n/// [C++23] \'if\' \'!\' [opt] consteval compound-statement \'else\' statement\n///\nStmtResult Parser::ParseIfStatement(SourceLocation *TrailingElseLoc) {\n  // ...\n  if (Tok.is(tok::kw_constexpr)) {\n  // ...\n  } else {\n    // ...\n    if (Tok.is(tok::kw_consteval)) {\n      Diag(Tok, getLangOpts().CPlusPlus23 ? diag::warn_cxx20_compat_consteval_if : diag::ext_consteval_if);"}}
	},
	["warn_cxx20_compat_constexpr_body_invalid_stmt"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,P,N,N,db,M,M,o,n,n,V,Db},
		[k]=V,
		[i]={{nil,D,"warn_cxx20_compat_constexpr_body_invalid_stmt"}},
		[h]="use of this statement in a constexpr %select{function|constructor}0 is incompatible with C++ standards before C++23",
		[b]={{nil,nil,{hd,{zb,kb}," is incompatible with C++ standards before C++23"}},{U,D,{hd,{zb,kb}," is incompatible with C++ standards before C++2b"}}},
		[f]=j,
		[g]="use of this statement in a constexpr (?:function|constructor) is incompatible with C\\+\\+ standards before C\\+\\+23",
		[e]=Cb,
		[a]={{nil,D,r}},
		[d]={"f60dc3caa673",1620118562,"[C++20][Modules] Adjust handling of exports of namespaces and using-decls.","[C++20][Modules] Adjust handling of exports of namespaces and using-decls.\n\nThis adjusts the handling for:\n\nexport module  M;\n\nexport namespace {};\n\nexport namespace N {};\nexport using namespace N;\n\nIn the first case, we were allowing empty anonymous namespaces\nas part of an extension allowing empty top-level entities, but that seems\ninappropriate in this case, since the linkage would be internal for the\nanonymous namespace.  We now report an error for this.\n\nThe second case was producing a warning diagnostic that this was\naccepted as an extension - however the C++20 standard does allow this\nas well-formed.\n\nIn the third case we keep the current practice that this is accepted with a\nwarning (as an extension). The C++20 standard says it\'s an error.\n\nWe also ensure that using decls are only applied to items with external linkage.\n\nThis adjusts error messages for exports involving redeclarations in modules to\nbe more specific about the reason that the decl has been rejected.\n\nDifferential Revision: https://reviews.llvm.org/D122119"},
		[c]={{K,2288,"/// Check the body for the given constexpr function declaration only contains\n/// the permitted types of statement. C++11 [dcl.constexpr]p3,p4.\n///\n/// \\return true if the body is OK, false if we have found or diagnosed a\n/// problem.\nstatic bool CheckConstexprFunctionBody(Sema &SemaRef, const FunctionDecl *Dcl, Stmt *Body, Sema::CheckConstexprKind Kind) {\n  // ...\n  if (Kind == Sema::CheckConstexprKind::CheckValid) {\n  // ...\n  } else if (Cxx2bLoc.isValid()) {\n    SemaRef.Diag(Cxx2bLoc, SemaRef.getLangOpts().CPlusPlus23 ? diag::warn_cxx20_compat_constexpr_body_invalid_stmt : diag::ext_constexpr_body_invalid_stmt_cxx23) << isa<CXXConstructorDecl>(Dcl);"}},
		[m]={
			["clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p3-2b.cpp"]={"clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p3-2b.cpp:18:3: warning: use of this statement in a constexpr function is incompatible with C++ standards before C++23 [-Wpre-c++23-compat]","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p3-2b.cpp:25:1: warning: use of this statement in a constexpr function is incompatible with C++ standards before C++23 [-Wpre-c++23-compat]"}
		}
	},
	["warn_cxx20_compat_constexpr_var"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,P,N,N,db,M,M,o,n,n,V,Db},
		[k]=V,
		[i]={{nil,D,"warn_cxx20_compat_constexpr_var"}},
		[h]="definition of a %select{static variable|thread_local variable|variable of non-literal type}1 in a constexpr %select{function|constructor}0 is incompatible with C++ standards before C++23",
		[b]={{nil,nil,{"definition of a ",{"static variable","thread_local variable","variable of non-literal type"}," in a constexpr ",{zb,kb}," is incompatible with C++ standards before C++23"}},{U,D,{"definition of a ",{"static variable","thread_local variable","variable of non-literal type"}," in a constexpr ",{zb,kb}," is incompatible with C++ standards before C++2b"}}},
		[f]=j,
		[g]="definition of a (?:static variable|thread_local variable|variable of non\\-literal type) in a constexpr (?:function|constructor) is incompatible with C\\+\\+ standards before C\\+\\+23",
		[e]=Cb,
		[a]={{nil,D,r}},
		[d]={"f60dc3caa673",1620118562,"[C++20][Modules] Adjust handling of exports of namespaces and using-decls.","[C++20][Modules] Adjust handling of exports of namespaces and using-decls.\n\nThis adjusts the handling for:\n\nexport module  M;\n\nexport namespace {};\n\nexport namespace N {};\nexport using namespace N;\n\nIn the first case, we were allowing empty anonymous namespaces\nas part of an extension allowing empty top-level entities, but that seems\ninappropriate in this case, since the linkage would be internal for the\nanonymous namespace.  We now report an error for this.\n\nThe second case was producing a warning diagnostic that this was\naccepted as an extension - however the C++20 standard does allow this\nas well-formed.\n\nIn the third case we keep the current practice that this is accepted with a\nwarning (as an extension). The C++20 standard says it\'s an error.\n\nWe also ensure that using decls are only applied to items with external linkage.\n\nThis adjusts error messages for exports involving redeclarations in modules to\nbe more specific about the reason that the decl has been rejected.\n\nDifferential Revision: https://reviews.llvm.org/D122119"},
		[c]={{K,1934,"/// Check the given declaration statement is legal within a constexpr function\n/// body. C++11 [dcl.constexpr]p3,p4, and C++1y [dcl.constexpr]p3.\n///\n/// \\return true if the body is OK (maybe only as an extension), false if we\n///         have diagnosed a problem.\nstatic bool CheckConstexprDeclStmt(Sema &SemaRef, const FunctionDecl *Dcl, DeclStmt *DS, SourceLocation &Cxx1yLoc, Sema::CheckConstexprKind Kind) {\n  // C++11 [dcl.constexpr]p3 and p4:\n  //  The definition of a constexpr function(p3) or constructor(p4) [...] shall\n  //  contain only\n  for (const auto *DclIt : DS->decls()) {\n    // ...\n    case Decl::Var:\n    case Decl::Decomposition: {\n      // ...\n      if (VD->isThisDeclarationADefinition()) {\n        if (VD->isStaticLocal()) {\n          if (Kind == Sema::CheckConstexprKind::Diagnose) {\n            SemaRef.Diag(VD->getLocation(), SemaRef.getLangOpts().CPlusPlus23 ? diag::warn_cxx20_compat_constexpr_var : diag::ext_constexpr_static_var) << isa<CXXConstructorDecl>(Dcl) << (VD->getTLSKind() == VarDecl::TLS_Dynamic);"},{K,1944,"/// Check the given declaration statement is legal within a constexpr function\n/// body. C++11 [dcl.constexpr]p3,p4, and C++1y [dcl.constexpr]p3.\n///\n/// \\return true if the body is OK (maybe only as an extension), false if we\n///         have diagnosed a problem.\nstatic bool CheckConstexprDeclStmt(Sema &SemaRef, const FunctionDecl *Dcl, DeclStmt *DS, SourceLocation &Cxx1yLoc, Sema::CheckConstexprKind Kind) {\n  // C++11 [dcl.constexpr]p3 and p4:\n  //  The definition of a constexpr function(p3) or constructor(p4) [...] shall\n  //  contain only\n  for (const auto *DclIt : DS->decls()) {\n    // ...\n    case Decl::Var:\n    case Decl::Decomposition: {\n      // ...\n      if (VD->isThisDeclarationADefinition()) {\n        // ...\n        if (SemaRef.LangOpts.CPlusPlus23) {\n          CheckLiteralType(SemaRef, Kind, VD->getLocation(), VD->getType(), diag::warn_cxx20_compat_constexpr_var, isa<CXXConstructorDecl>(Dcl),"}},
		[m]={
			["clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p3-2b.cpp"]={"clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p3-2b.cpp:6:20: warning: definition of a static variable in a constexpr function is incompatible with C++ standards before C++23 [-Wpre-c++23-compat]","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p3-2b.cpp:13:26: warning: definition of a thread_local variable in a constexpr function is incompatible with C++ standards before C++23 [-Wpre-c++23-compat]","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p3-2b.cpp:33:14: warning: definition of a variable of non-literal type in a constexpr function is incompatible with C++ standards before C++23 [-Wpre-c++23-compat]","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p3-2b.cpp:39:16: warning: definition of a variable of non-literal type in a constexpr function is incompatible with C++ standards before C++23 [-Wpre-c++23-compat]","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p3-2b.cpp:45:28: warning: definition of a static variable in a constexpr function is incompatible with C++ standards before C++23 [-Wpre-c++23-compat]","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p3-2b.cpp:53:23: warning: definition of a static variable in a constexpr function is incompatible with C++ standards before C++23 [-Wpre-c++23-compat]"}
		}
	},
	["warn_cxx20_compat_constinit"]={
		[l]={P,N,db,M},
		[k]=P,
		[i]={{nil,s,"warn_cxx20_compat_constinit"}},
		[h]={{nil,s,"\'constinit\' specifier is incompatible with C++ standards before C++20"}},
		[b]={{nil,s,"\'constinit\' specifier is incompatible with C++ standards before C++20"}},
		[f]=j,
		[g]="\'constinit\' specifier is incompatible with C\\+\\+ standards before C\\+\\+20",
		[e]=gc,
		[a]={{nil,s,r}},
		[d]={cc,1567434909,ac,Xb},
		[c]={{Yc,1384,"/// Finish - This does final analysis of the declspec, rejecting things like\n/// \"_Imaginary\" (lacking an FP type). After calling this method, DeclSpec is\n/// guaranteed to be self-consistent, even if an error occurred.\nvoid DeclSpec::Finish(Sema &S, const PrintingPolicy &Policy) {\n  // ...\n  if (getConstexprSpecifier() == ConstexprSpecKind::Constexpr)\n  // ...\n  else if (getConstexprSpecifier() == ConstexprSpecKind::Consteval)\n  // ...\n  else if (getConstexprSpecifier() == ConstexprSpecKind::Constinit)\n    S.Diag(ConstexprLoc, diag::warn_cxx20_compat_constinit);"}}
	},
	["warn_cxx20_compat_decl_attrs_on_lambda"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,P,N,N,db,M,M,o,n,n,V,Db},
		[k]=V,
		[i]={{nil,z,"warn_cxx20_compat_decl_attrs_on_lambda"}},
		[h]="%select{an attribute specifier sequence|%1}0 in this position is incompatible with C++ standards before C++23",
		[b]={{nil,nil,{{"an attribute specifier sequence","B"}," in this position is incompatible with C++ standards before C++23"}},{U,z,"an attribute specifier sequence in this position is incompatible with C++ standards before C++2b"}},
		[f]=j,
		[g]="(?:an attribute specifier sequence|(.*?)) in this position is incompatible with C\\+\\+ standards before C\\+\\+23",
		[e]=Cb,
		[a]={{nil,z,F}},
		[d]={td,1612659633,ed,Rc},
		[c]={{Lb,1367,"/// ParseLambdaExpressionAfterIntroducer - Parse the rest of a lambda\n/// expression.\nExprResult Parser::ParseLambdaExpressionAfterIntroducer(LambdaIntroducer &Intro) {\n  // ...\n  // Implement WG21 P2173, which allows attributes immediately before the\n  // lambda declarator and applies them to the corresponding function operator\n  // or operator template declaration. We accept this as a conforming extension\n  // in all language modes that support lambdas.\n  if (isCXX11AttributeSpecifier()) {\n    Diag(Tok, getLangOpts().CPlusPlus23 ? diag::warn_cxx20_compat_decl_attrs_on_lambda : diag::ext_decl_attrs_on_lambda) << Tok.getIdentifierInfo() << Tok.isRegularKeywordAttribute();"}}
	},
	["warn_cxx20_compat_explicit_bool"]={
		[l]={P,N,db,M},
		[k]=P,
		[i]={{nil,R,"warn_cxx20_compat_explicit_bool"}},
		[h]={{nil,R,"this expression will be parsed as explicit(bool) in C++20"}},
		[b]={{nil,R,"this expression will be parsed as explicit(bool) in C++20"}},
		[f]=j,
		[g]="this expression will be parsed as explicit\\(bool\\) in C\\+\\+20",
		[e]=gc,
		[a]={{nil,R,F}},
		[d]={"5fe2ddbdf47d",1556928540,"[clang] adding explicit(bool) from c++2a","[clang] adding explicit(bool) from c++2a\n\nthis patch adds support for the explicit bool specifier.\n\nChanges:\n- The parsing for the explicit(bool) specifier was added in ParseDecl.cpp.\n- The storage of the explicit specifier was changed. the explicit specifier was stored as a boolean value in the FunctionDeclBitfields and in the DeclSpec class. now it is stored as a PointerIntPair<Expr*, 2> with a flag and a potential expression in CXXConstructorDecl, CXXDeductionGuideDecl, CXXConversionDecl and in the DeclSpec class.\n- Following the AST change, Serialization, ASTMatchers, ASTComparator and ASTPrinter were adapted.\n- Template instantiation was adapted to instantiate the potential expressions of the explicit(bool) specifier When instantiating their associated declaration.\n- The Add*Candidate functions were adapted, they now take a Boolean indicating if the context allowing explicit constructor or conversion function and this boolean is used to remove invalid overloads that required template instantiation to be detected.\n- Test for Semantic and Serialization were added.\n\nThis patch is not yet complete. I still need to check that interaction with CTAD and deduction guides is correct. and add more tests for AST operations. But I wanted first feedback.\nPerhaps this patch should be spited in smaller patches, but making each patch testable as a standalone may be tricky.\n\nPatch by Tyker\n\nDifferential Revision: https://reviews.llvm.org/D60934\n\nllvm-svn: 359949"},
		[c]={{Vb,4063,"/// ParseDeclarationSpecifiers\n///       declaration-specifiers: [C99 6.7]\n///         storage-class-specifier declaration-specifiers[opt]\n///         type-specifier declaration-specifiers[opt]\n/// [C99]   function-specifier declaration-specifiers[opt]\n/// [C11]   alignment-specifier declaration-specifiers[opt]\n/// [GNU]   attributes declaration-specifiers[opt]\n/// [Clang] \'__module_private__\' declaration-specifiers[opt]\n/// [ObjC1] \'__kindof\' declaration-specifiers[opt]\n///\n///       storage-class-specifier: [C99 6.7.1]\n///         \'typedef\'\n///         \'extern\'\n///         \'static\'\n///         \'auto\'\n///         \'register\'\n/// [C++]   \'mutable\'\n/// [C++11] \'thread_local\'\n/// [C11]   \'_Thread_local\'\n/// [GNU]   \'__thread\'\n///       function-specifier: [C99 6.7.4]\n/// [C99]   \'inline\'\n/// [C++]   \'virtual\'\n/// [C++]   \'explicit\'\n/// [OpenCL] \'__kernel\'\n///       \'friend\': [C++ dcl.friend]\n///       \'constexpr\': [C++0x dcl.constexpr]\nvoid Parser::ParseDeclarationSpecifiers(DeclSpec &DS, const ParsedTemplateInfo &TemplateInfo, AccessSpecifier AS, DeclSpecContext DSContext, LateParsedAttrList *LateAttrs, ImplicitTypenameContext AllowImplicitTypename) {\n  // ...\n  while (true) {\n    // ...\n    case tok::kw_explicit: {\n      // ...\n      if (Tok.is(tok::l_paren)) {\n        if (getLangOpts().CPlusPlus20 || isExplicitBool() == TPResult::True) {\n        // ...\n        } else {\n          Diag(Tok.getLocation(), diag::warn_cxx20_compat_explicit_bool);"}},
		[m]={
			["clang/test/Parser/explicit-bool.cpp"]={"clang/test/Parser/explicit-bool.cpp:12:22: warning: this expression will be parsed as explicit(bool) in C++20 [-Wc++20-compat]","clang/test/Parser/explicit-bool.cpp:22:22: warning: this expression will be parsed as explicit(bool) in C++20 [-Wc++20-compat]","clang/test/Parser/explicit-bool.cpp:27:12: warning: this expression will be parsed as explicit(bool) in C++20 [-Wc++20-compat]","clang/test/Parser/explicit-bool.cpp:32:12: warning: this expression will be parsed as explicit(bool) in C++20 [-Wc++20-compat]","clang/test/Parser/explicit-bool.cpp:56:12: warning: this expression will be parsed as explicit(bool) in C++20 [-Wc++20-compat]"}
		}
	},
	["warn_cxx20_compat_label_end_of_compound_statement"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,P,N,N,db,M,M,o,n,n,V,Db},
		[k]=V,
		[i]={{nil,U,"warn_cxx20_compat_label_end_of_compound_statement"}},
		[h]="label at end of compound statement is incompatible with C++ standards before C++23",
		[b]="label at end of compound statement is incompatible with C++ standards before C++23",
		[f]=j,
		[g]="label at end of compound statement is incompatible with C\\+\\+ standards before C\\+\\+23",
		[e]=Cb,
		[a]={{nil,U,F}},
		[d]={"782ac2182c2b",1657907157,"[HLSL] Support cbuffer/tbuffer for hlsl.","[HLSL] Support cbuffer/tbuffer for hlsl.\n\nThis is first part for support cbuffer/tbuffer.\n\nThe format for cbuffer/tbuffer is\nBufferType [Name] [: register(b#)] { VariableDeclaration [: packoffset(c#.xyzw)]; ... };\n\nMore details at https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-constants\n\nNew keyword \'cbuffer\' and \'tbuffer\' are added.\nNew AST node HLSLBufferDecl is added.\nBuild AST for simple cbuffer/tbuffer without attribute support.\n\nThe special thing is variables declared inside cbuffer is exposed into global scope.\nSo isTransparentContext should return true for HLSLBuffer.\n\nReviewed By: aaron.ballman\n\nDifferential Revision: https://reviews.llvm.org/D129883"},
		[c]={{tc,1076,"void Parser::DiagnoseLabelAtEndOfCompoundStatement() {\n  if (getLangOpts().CPlusPlus) {\n    Diag(Tok, getLangOpts().CPlusPlus23 ? diag::warn_cxx20_compat_label_end_of_compound_statement : diag::ext_cxx_label_end_of_compound_statement);"}},
		[m]={
			["clang/test/Parser/cxx2b-label.cpp"]={"clang/test/Parser/cxx2b-label.cpp:10:1: warning: label at end of compound statement is incompatible with C++ standards before C++23 [-Wpre-c++23-compat]","clang/test/Parser/cxx2b-label.cpp:20:5: warning: label at end of compound statement is incompatible with C++ standards before C++23 [-Wpre-c++23-compat]","clang/test/Parser/cxx2b-label.cpp:27:5: warning: label at end of compound statement is incompatible with C++ standards before C++23 [-Wpre-c++23-compat]"}
		}
	},
	["warn_cxx20_compat_operator_overload_static"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,P,N,N,db,M,M,o,n,n,V,Db},
		[k]=V,
		[i]={{nil,U,"warn_cxx20_compat_operator_overload_static"}},
		[h]="declaring overloaded %0 as \'static\' is incompatible with C++ standards before C++23",
		[b]="declaring overloaded A as \'static\' is incompatible with C++ standards before C++23",
		[f]=j,
		[g]="declaring overloaded (.*?) as \'static\' is incompatible with C\\+\\+ standards before C\\+\\+23",
		[e]=Cb,
		[a]={{nil,U,r}},
		[d]={Gb,1625925174,Fb,Kb},
		[c]={{K,16151,"/// CheckOverloadedOperatorDeclaration - Check whether the declaration\n/// of this overloaded operator is well-formed. If so, returns false;\n/// otherwise, emits appropriate diagnostics and returns true.\nbool Sema::CheckOverloadedOperatorDeclaration(FunctionDecl *FnDecl) {\n  // ...\n  // C++ [over.oper]p7:\n  //   An operator function shall either be a member function or\n  //   be a non-member function and have at least one parameter\n  //   whose type is a class, a reference to a class, an enumeration,\n  //   or a reference to an enumeration.\n  // Note: Before C++23, a member function could not be static. The only member\n  //       function allowed to be static is the call operator function.\n  if (CXXMethodDecl *MethodDecl = dyn_cast<CXXMethodDecl>(FnDecl)) {\n    if (MethodDecl->isStatic()) {\n      if (Op == OO_Call || Op == OO_Subscript)\n        Diag(FnDecl->getLocation(), (LangOpts.CPlusPlus23 ? diag::warn_cxx20_compat_operator_overload_static : diag::ext_operator_overload_static)) << FnDecl;"}},
		[m]={
			["clang/test/CXX/over/over.oper/p7.cpp"]={"clang/test/CXX/over/over.oper/p7.cpp:7:14: warning: declaring overloaded \'operator()\' as \'static\' is incompatible with C++ standards before C++23 [-Wpre-c++23-compat]","clang/test/CXX/over/over.oper/p7.cpp:8:14: warning: declaring overloaded \'operator[]\' as \'static\' is incompatible with C++ standards before C++23 [-Wpre-c++23-compat]"}
		}
	},
	["warn_cxx20_compat_size_t_suffix"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,P,N,N,db,M,M,o,n,n,V,Db},
		[k]=V,
		[i]={{nil,z,"warn_cxx20_compat_size_t_suffix"}},
		[h]="\'size_t\' suffix for literals is incompatible with C++ standards before C++23",
		[b]="\'size_t\' suffix for literals is incompatible with C++ standards before C++23",
		[f]=j,
		[g]="\'size_t\' suffix for literals is incompatible with C\\+\\+ standards before C\\+\\+23",
		[e]=Cb,
		[a]={{nil,z,A}},
		[d]={"dc7ebd2cb0cf",1616862441,"[C++2b] Support size_t literals","[C++2b] Support size_t literals\n\nThis adds support for C++2b\'s z/uz suffixes for size_t literals (P0330)."},
		[c]={{"clang/lib/Lex/PPExpressions.cpp",331,"/// EvaluateValue - Evaluate the token PeekTok (and any others needed) and\n/// return the computed value in Result.  Return true if there was an error\n/// parsing.  This function also returns information about the form of the\n/// expression in DT.  See above for information on what DT means.\n///\n/// If ValueLive is false, then this value is being evaluated in a context where\n/// the result is not used.  As such, avoid diagnostics that relate to\n/// evaluation.\nstatic bool EvaluateValue(PPValue &Result, Token &PeekTok, DefinedTracker &DT, bool ValueLive, Preprocessor &PP) {\n  // ...\n  case tok::numeric_constant: {\n    // ...\n    // \'z/uz\' literals are a C++23 feature.\n    if (Literal.isSizeT)\n      PP.Diag(PeekTok, PP.getLangOpts().CPlusPlus ? PP.getLangOpts().CPlusPlus23 ? diag::warn_cxx20_compat_size_t_suffix : diag::ext_cxx23_size_t_suffix : diag::err_cxx23_size_t_suffix);"},{hb,4058,"ExprResult Sema::ActOnNumericConstant(const Token &Tok, Scope *UDLScope) {\n  // ...\n  if (Literal.isFixedPointLiteral()) {\n  // ...\n  } else if (Literal.isFloatingLiteral()) {\n  // ...\n  } else if (!Literal.isIntegerLiteral()) {\n  // ...\n  } else {\n    // ...\n    // \'z/uz\' literals are a C++23 feature.\n    if (Literal.isSizeT)\n      Diag(Tok.getLocation(), getLangOpts().CPlusPlus ? getLangOpts().CPlusPlus23 ? diag::warn_cxx20_compat_size_t_suffix : diag::ext_cxx23_size_t_suffix : diag::err_cxx23_size_t_suffix);"}},
		[m]={
			["clang/test/SemaCXX/size_t-literal.cpp"]={"clang/test/SemaCXX/size_t-literal.cpp:19:13: warning: \'size_t\' suffix for literals is incompatible with C++ standards before C++23 [-Wpre-c++23-compat]","clang/test/SemaCXX/size_t-literal.cpp:24:13: warning: \'size_t\' suffix for literals is incompatible with C++ standards before C++23 [-Wpre-c++23-compat]","clang/test/SemaCXX/size_t-literal.cpp:31:13: warning: \'size_t\' suffix for literals is incompatible with C++ standards before C++23 [-Wpre-c++23-compat]","clang/test/SemaCXX/size_t-literal.cpp:36:13: warning: \'size_t\' suffix for literals is incompatible with C++ standards before C++23 [-Wpre-c++23-compat]","clang/test/SemaCXX/size_t-literal.cpp:41:13: warning: \'size_t\' suffix for literals is incompatible with C++ standards before C++23 [-Wpre-c++23-compat]","clang/test/SemaCXX/size_t-literal.cpp:46:13: warning: \'size_t\' suffix for literals is incompatible with C++ standards before C++23 [-Wpre-c++23-compat]","clang/test/SemaCXX/size_t-literal.cpp:51:13: warning: \'size_t\' suffix for literals is incompatible with C++ standards before C++23 [-Wpre-c++23-compat]","clang/test/SemaCXX/size_t-literal.cpp:56:13: warning: \'size_t\' suffix for literals is incompatible with C++ standards before C++23 [-Wpre-c++23-compat]","clang/test/SemaCXX/size_t-literal.cpp:61:13: warning: \'size_t\' suffix for literals is incompatible with C++ standards before C++23 [-Wpre-c++23-compat]","clang/test/SemaCXX/size_t-literal.cpp:66:13: warning: \'size_t\' suffix for literals is incompatible with C++ standards before C++23 [-Wpre-c++23-compat]"}
		}
	},
	["warn_cxx20_compat_spaceship"]={
		[l]={P,N,db,M},
		[k]=P,
		[i]={{nil,R,"warn_cxx20_compat_spaceship"}},
		[h]={{nil,R,"\'<=>\' is a single token in C++20; add a space to avoid a change in behavior"}},
		[b]={{nil,R,"\'<=>\' is a single token in C++20; add a space to avoid a change in behavior"}},
		[f]=j,
		[g]="\'\\<\\=\\>\' is a single token in C\\+\\+20; add a space to avoid a change in behavior",
		[e]=gc,
		[a]={{nil,R,Z}},
		[d]={"edbf5972a4c9",1512090430,"[c++2a] P0515R3: lexer support for new <=> token.","[c++2a] P0515R3: lexer support for new <=> token.\n\nllvm-svn: 319509"},
		[c]={{nb,4129,"LexStart:\n  // ...\n  case \'<\':\n    // ...\n    if (ParsingFilename) {\n    // ...\n    } else if (Char == \'<\') {\n    // ...\n    } else if (Char == \'=\') {\n      // ...\n      if (After == \'>\') {\n        // ...\n        // Suggest adding a space between the \'<=\' and the \'>\' to avoid a\n        // change in semantics if this turns up in C++ <=17 mode.\n        if (LangOpts.CPlusPlus && !isLexingRawMode()) {\n          Diag(BufferPtr, diag::warn_cxx20_compat_spaceship) << FixItHint::CreateInsertion(getSourceLocation(CurPtr + SizeTmp, SizeTmp2), \" \");"}},
		[m]={
			[Qb]={"clang/test/SemaCXX/cxx17-compat.cpp:102:16: warning: \'<=>\' is a single token in C++20; add a space to avoid a change in behavior [-Wc++20-compat]"}
		}
	},
	["warn_cxx20_compat_static_lambda"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,P,N,N,db,M,M,o,n,n,V,Db},
		[k]=V,
		[i]={{nil,U,"warn_cxx20_compat_static_lambda"}},
		[h]="static lambdas are incompatible with C++ standards before C++23",
		[b]="static lambdas are incompatible with C++ standards before C++23",
		[f]=j,
		[g]="static lambdas are incompatible with C\\+\\+ standards before C\\+\\+23",
		[e]=Cb,
		[a]={{nil,U,F}},
		[d]={"6523814c4e38",1664466303,"[Clang] P1169R4: static operator()","[Clang] P1169R4: static operator()\n\nImplements \'P1169R4: static operator()\' from C++2b.\n\nReviewed By: #clang-language-wg, aaron.ballman\n\nDifferential Revision: https://reviews.llvm.org/D133659"},
		[c]={{Lb,1211,"static void addStaticToLambdaDeclSpecifier(Parser &P, SourceLocation StaticLoc, DeclSpec &DS) {\n  if (StaticLoc.isValid()) {\n    P.Diag(StaticLoc, !P.getLangOpts().CPlusPlus23 ? diag::err_static_lambda : diag::warn_cxx20_compat_static_lambda);"}},
		[m]={
			["clang/test/Parser/cxx2b-lambdas-ext-warns.cpp"]={"clang/test/Parser/cxx2b-lambdas-ext-warns.cpp:10:16: warning: static lambdas are incompatible with C++ standards before C++23 [-Wpre-c++23-compat]","clang/test/Parser/cxx2b-lambdas-ext-warns.cpp:13:14: warning: static lambdas are incompatible with C++ standards before C++23 [-Wpre-c++23-compat]"}
		}
	},
	["warn_cxx20_compat_use_of_unaddressable_function"]={
		[l]={P,N,db,M},
		[k]=P,
		[i]={{nil,D,"warn_cxx20_compat_use_of_unaddressable_function"}},
		[h]={{nil,D,"taking address of non-addressable standard library function is incompatible with C++20"}},
		[b]={{nil,D,"taking address of non-addressable standard library function is incompatible with C++20"}},
		[f]=j,
		[g]="taking address of non\\-addressable standard library function is incompatible with C\\+\\+20",
		[e]=gc,
		[a]={{nil,D,r}},
		[d]={"cb08f4aa4467",1620530452,"Support warn_unused_result on typedefs","Support warn_unused_result on typedefs\n\nWhile it\'s not as robust as using the attribute on enums/classes (the\ntype information may be lost through a function pointer, a declaration\nor use of the underlying type without using the typedef, etc) but I\nthink there\'s still value in being able to attribute a typedef and have\nall return types written with that typedef pick up the\nwarn_unused_result behavior.\n\nSpecifically I\'d like to be able to annotate LLVMErrorRef (a wrapper for\nllvm::Error used in the C API - the underlying type is a raw pointer, so\nit can\'t be attributed itself) to reduce the chance of unhandled errors.\n\nDifferential Revision: https://reviews.llvm.org/D102122"},
		[c]={{hb,21621,"/// Check for operands with placeholder types and complain if found.\n/// Returns ExprError() if there was an error and no recovery was possible.\nExprResult Sema::CheckPlaceholderExpr(Expr *E) {\n  // ...\n  case BuiltinType::BuiltinFn: {\n    // ...\n    if (DRE) {\n      // ...\n      if (Context.BuiltinInfo.isInStdNamespace(BuiltinID)) {\n        // ...\n        Diag(E->getBeginLoc(), getLangOpts().CPlusPlus20 ? diag::err_use_of_unaddressable_function : diag::warn_cxx20_compat_use_of_unaddressable_function);"}},
		[m]={
			["clang/test/CodeGenCXX/builtin-std-move.cpp"]={"clang/test/CodeGenCXX/builtin-std-move.cpp:60:18: warning: taking address of non-addressable standard library function is incompatible with C++20 [-Wc++20-compat]"}
		}
	},
	["warn_cxx20_compat_utf8_string"]={
		[l]={P,N,db,M},
		[k]=P,
		[i]={{nil,R,"warn_cxx20_compat_utf8_string"}},
		[h]={{nil,R,"type of UTF-8 string literal will change from array of const char to array of const char8_t in C++20"}},
		[b]={{nil,R,"type of UTF-8 string literal will change from array of const char to array of const char8_t in C++20"}},
		[f]=j,
		[g]="type of UTF\\-8 string literal will change from array of const char to array of const char8_t in C\\+\\+20",
		[e]=gc,
		[a]={{nil,R,r}},
		[d]={"28ddb91decff",1542229474,"[c++20] Implement P0482R6: enable -fchar8_t by default in C++20 mode.","[c++20] Implement P0482R6: enable -fchar8_t by default in C++20 mode.\n\nThis unfortunately results in a substantial breaking change when\nswitching to C++20, but it\'s not yet clear what / how much we should\ndo about that. We may want to add a compatibility conversion from\nu8 string literals to const char*, similar to how C++98 provided a\ncompatibility conversion from string literals to non-const char*,\nbut that\'s not handled by this patch.\n\nThe feature can be disabled in C++20 mode with -fno-char8_t.\n\nllvm-svn: 346892"},
		[c]={{hb,1991,"/// ActOnStringLiteral - The specified tokens were lexed as pasted string\n/// fragments (e.g. \"foo\" \"bar\" L\"baz\").  The result string has to handle string\n/// concatenation ([C99 5.1.1.2, translation phase #6]), so it may come from\n/// multiple tokens.  However, the common case is that StringToks points to one\n/// string.\n///\nExprResult Sema::ActOnStringLiteral(ArrayRef<Token> StringToks, Scope *UDLScope) {\n  // ...\n  // Warn on initializing an array of char from a u8 string literal; this\n  // becomes ill-formed in C++2a.\n  if (getLangOpts().CPlusPlus && !getLangOpts().CPlusPlus20 && !getLangOpts().Char8 && Kind == StringLiteral::UTF8) {\n    Diag(StringTokLocs.front(), diag::warn_cxx20_compat_utf8_string);"}},
		[m]={
			["clang/test/SemaCXX/cxx2a-compat.cpp"]={"clang/test/SemaCXX/cxx2a-compat.cpp:28:16: warning: type of UTF-8 string literal will change from array of const char to array of const char8_t in C++20 [-Wc++20-compat]","clang/test/SemaCXX/cxx2a-compat.cpp:29:21: warning: type of UTF-8 string literal will change from array of const char to array of const char8_t in C++20 [-Wc++20-compat]","clang/test/SemaCXX/cxx2a-compat.cpp:30:16: warning: type of UTF-8 string literal will change from array of const char to array of const char8_t in C++20 [-Wc++20-compat]"}
		}
	},
	["warn_cxx20_keyword"]={
		[l]={P,N,db,M},
		[k]=P,
		[i]={{nil,R,"warn_cxx20_keyword"}},
		[h]={{nil,R,"\'%0\' is a keyword in C++20"}},
		[b]={{nil,R,"\'A\' is a keyword in C++20"}},
		[f]=j,
		[g]="\'(.*?)\' is a keyword in C\\+\\+20",
		[e]=gc,
		[a]={{nil,R,Z}},
		[d]={"6c74e32139ff",1502659953,"[c++2a] Treat \'concept\' and \'requires\' as keywords, add compat warning for C++17 and before.","[c++2a] Treat \'concept\' and \'requires\' as keywords, add compat warning for C++17 and before.\n\nllvm-svn: 310803"},
		[c]={{"clang/lib/Basic/IdentifierTable.cpp",914,"#include \"clang/Basic/TokenKinds.def\"\n  // ...\n  if (LangOpts.CPlusPlus) {\n    // ...\n    // char8_t is not modeled as a CXX20_KEYWORD because it\'s not\n    // unconditionally enabled in C++20 mode. (It can be disabled\n    // by -fno-char8_t.)\n    if (((Flags & KEYCXX20) == KEYCXX20) || ((Flags & CHAR8SUPPORT) == CHAR8SUPPORT))\n      return diag::warn_cxx20_keyword;"}},
		[m]={
			["clang/test/Lexer/cxx2a_keyword_as_cxx17.cpp"]={"clang/test/Lexer/cxx2a_keyword_as_cxx17.cpp:8:5: warning: \'co_await\' is a keyword in C++20 [-Wc++20-compat]","clang/test/Lexer/cxx2a_keyword_as_cxx17.cpp:9:5: warning: \'co_return\' is a keyword in C++20 [-Wc++20-compat]","clang/test/Lexer/cxx2a_keyword_as_cxx17.cpp:10:5: warning: \'co_yield\' is a keyword in C++20 [-Wc++20-compat]","clang/test/Lexer/cxx2a_keyword_as_cxx17.cpp:11:5: warning: \'char8_t\' is a keyword in C++20 [-Wc++20-compat]","clang/test/Lexer/cxx2a_keyword_as_cxx17.cpp:12:5: warning: \'concept\' is a keyword in C++20 [-Wc++20-compat]","clang/test/Lexer/cxx2a_keyword_as_cxx17.cpp:13:5: warning: \'requires\' is a keyword in C++20 [-Wc++20-compat]","clang/test/Lexer/cxx2a_keyword_as_cxx17.cpp:14:5: warning: \'consteval\' is a keyword in C++20 [-Wc++20-compat]","clang/test/Lexer/cxx2a_keyword_as_cxx17.cpp:15:5: warning: \'constinit\' is a keyword in C++20 [-Wc++20-compat]"}
		}
	},
	["warn_cxx23_compat_defaulted_comparison_constexpr_mismatch"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,P,N,N,db,M,M,o,n,n,V,Db},
		[k]=V,
		[i]="warn_cxx23_compat_defaulted_comparison_constexpr_mismatch",
		[h]="defaulted definition of %select{%select{<ERROR>|equality|three-way|equality|relational}1 comparison operator|three-way comparison operator}0 that is declared %select{constexpr|consteval}2 but%select{|for which the corresponding implicit \'operator==\' }0 invokes a non-constexpr comparison function is incompatible with C++ standards before C++23",
		[b]={{nil,nil,{"defaulted definition of ",{{{"equality","three-way","equality","relational"}," comparison operator"},"three-way comparison operator"}," that is declared ",{"constexpr","consteval"}," but",{vb,"for which the corresponding implicit \'operator==\' "}," invokes a non-constexpr comparison function is incompatible with C++ standards before C++23"}}},
		[f]=j,
		[g]="defaulted definition of (?:(?:equality|three\\-way|equality|relational) comparison operator|three\\-way comparison operator) that is declared (?:constexpr|consteval) but(?:|for which the corresponding implicit \'operator\\=\\=\' ) invokes a non\\-constexpr comparison function is incompatible with C\\+\\+ standards before C\\+\\+23",
		[e]=Cb,
		[a]=r,
		[d]={Gb,1625925174,Fb,Kb},
		[c]={{K,8967,"bool Sema::CheckExplicitlyDefaultedComparison(Scope *S, FunctionDecl *FD, DefaultedComparisonKind DCK) {\n  // ...\n  // C++2a [dcl.fct.def.default]p3 [P2002R0]:\n  //   An explicitly-defaulted function that is not defined as deleted may be\n  //   declared constexpr or consteval only if it is constexpr-compatible.\n  // C++2a [class.compare.default]p3 [P2002R0]:\n  //   A defaulted comparison function is constexpr-compatible if it satisfies\n  //   the requirements for a constexpr function [...]\n  // The only relevant requirements are that the parameter and return types are\n  // literal types. The remaining conditions are checked by the analyzer.\n  //\n  // We support P2448R2 in language modes earlier than C++23 as an extension.\n  // The concept of constexpr-compatible was removed.\n  // C++23 [dcl.fct.def.default]p3 [P2448R2]\n  //  A function explicitly defaulted on its first declaration is implicitly\n  //  inline, and is implicitly constexpr if it is constexpr-suitable.\n  // C++23 [dcl.constexpr]p3\n  //   A function is constexpr-suitable if\n  //    - it is not a coroutine, and\n  //    - if the function is a constructor or destructor, its class does not\n  //      have any virtual base classes.\n  if (FD->isConstexpr()) {\n    if (CheckConstexprReturnType(*this, FD, CheckConstexprKind::Diagnose) && CheckConstexprParameterTypes(*this, FD, CheckConstexprKind::Diagnose) && !Info.Constexpr) {\n      Diag(FD->getBeginLoc(), getLangOpts().CPlusPlus23 ? diag::warn_cxx23_compat_defaulted_comparison_constexpr_mismatch : diag::ext_defaulted_comparison_constexpr_mismatch) << FD->isImplicit() << (int)DCK << FD->isConsteval();"}}
	},
	["warn_cxx23_compat_pp_directive"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,P,N,N,db,M,M,o,n,n,V,Db},
		[k]=V,
		[i]="warn_cxx23_compat_pp_directive",
		[h]="use of a \'#%select{<BUG IF SEEN>|elifdef|elifndef}0\' directive is incompatible with C++ standards before C++23",
		[b]={{nil,nil,{"use of a \'#",{"elifdef","elifndef"},"\' directive is incompatible with C++ standards before C++23"}}},
		[f]=j,
		[g]="use of a \'\\#(?:elifdef|elifndef)\' directive is incompatible with C\\+\\+ standards before C\\+\\+23",
		[e]=Cb,
		[a]=Z,
		[d]={Gb,1625925174,Fb,Kb},
		[c]={{cd,768,"/// SkipExcludedConditionalBlock - We just read a \\#if or related directive and\n/// decided that the subsequent tokens are in the \\#if\'d out portion of the\n/// file.  Lex the rest of the file, until we see an \\#endif.  If\n/// FoundNonSkipPortion is true, then we have already emitted code for part of\n/// this \\#if directive, so \\#else/\\#elif blocks should never be entered.\n/// If ElseOk is true, then \\#else directives are ok, if not, then we have\n/// already seen one so a \\#else directive is a duplicate.  When this returns,\n/// the caller can lex the first valid token.\nvoid Preprocessor::SkipExcludedConditionalBlock(SourceLocation HashTokenLoc, SourceLocation IfTokenLoc, bool FoundNonSkipPortion, bool FoundElse, SourceLocation ElseLoc) {\n  // ...\n  while (true) {\n    // ...\n    if (Directive.startswith(\"if\")) {\n    // ...\n    } else if (Directive[0] == \'e\') {\n      // ...\n      if (Sub == \"ndif\") { // \"endif\"\n      // ...\n      } else if (Sub == \"lse\") { // \"else\".\n      // ...\n      } else if (Sub == \"lif\") { // \"elif\".\n      // ...\n      } else if (Sub == \"lifdef\" ||  // \"elifdef\"\n        // ...\n        if (LangOpts.CPlusPlus)\n          DiagID = LangOpts.CPlusPlus23 ? diag::warn_cxx23_compat_pp_directive : diag::ext_cxx23_pp_directive;"},{cd,3454,"/// Implements the \\#elif, \\#elifdef, and \\#elifndef directives.\nvoid Preprocessor::HandleElifFamilyDirective(Token &ElifToken, const Token &HashToken, tok::PPKeywordKind Kind) {\n  // ...\n  case PED_Elifdef:\n  case PED_Elifndef:\n    // ...\n    if (LangOpts.CPlusPlus)\n      DiagID = LangOpts.CPlusPlus23 ? diag::warn_cxx23_compat_pp_directive : diag::ext_cxx23_pp_directive;"}},
		[m]={
			["clang/test/Preprocessor/ext-pp-directive.c"]={"clang/test/Preprocessor/ext-pp-directive.c:18:2: warning: use of a \'#elifdef\' directive is incompatible with C++ standards before C++23 [-Wpre-c++23-compat]","clang/test/Preprocessor/ext-pp-directive.c:29:2: warning: use of a \'#elifndef\' directive is incompatible with C++ standards before C++23 [-Wpre-c++23-compat]","clang/test/Preprocessor/ext-pp-directive.c:40:2: warning: use of a \'#elifdef\' directive is incompatible with C++ standards before C++23 [-Wpre-c++23-compat]","clang/test/Preprocessor/ext-pp-directive.c:51:2: warning: use of a \'#elifndef\' directive is incompatible with C++ standards before C++23 [-Wpre-c++23-compat]"}
		}
	},
	["warn_cxx23_compat_warning_directive"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,P,N,N,db,M,M,o,n,n,V,Db},
		[k]=V,
		[i]="warn_cxx23_compat_warning_directive",
		[h]="#warning is incompatible with C++ standards before C++23",
		[b]="#warning is incompatible with C++ standards before C++23",
		[f]=j,
		[g]="\\#warning is incompatible with C\\+\\+ standards before C\\+\\+23",
		[e]=Cb,
		[a]=Z,
		[d]={Gb,1625925174,Fb,Kb},
		[c]={{cd,1277,"/// HandleDirective - This callback is invoked when the lexer sees a # token\n/// at the start of a line.  This consumes the directive, modifies the\n/// lexer/preprocessor state, and advances the lexer(s) so that the next token\n/// read is the correct one.\nvoid Preprocessor::HandleDirective(Token &Result) {\n  // ...\n  default:\n    // ...\n    case tok::pp_warning:\n      if (LangOpts.CPlusPlus)\n        Diag(Result, LangOpts.CPlusPlus23 ? diag::warn_cxx23_compat_warning_directive : diag::ext_pp_warning_directive) << /*C++23*/ 1;"}},
		[m]={
			["clang/test/Preprocessor/ext-pp-directive.c"]={"clang/test/Preprocessor/ext-pp-directive.c:61:2: warning: #warning is incompatible with C++ standards before C++23 [-Wpre-c++23-compat]"}
		}
	},
	["warn_cxx23_delimited_escape_sequence"]={
		[l]={y,w,p,p,E,q,q,J,u,u,I,P,N,N,db,M,M,o,n,n,V,Db},
		[k]=V,
		[i]="warn_cxx23_delimited_escape_sequence",
		[h]="%select{delimited|named}0 escape sequences are incompatible with C++ standards before C++23",
		[b]={{nil,nil,{{"delimited","named"}," escape sequences are incompatible with C++ standards before C++23"}}},
		[f]=j,
		[g]="(?:delimited|named) escape sequences are incompatible with C\\+\\+ standards before C\\+\\+23",
		[e]=Cb,
		[a]=Z,
		[d]={Gb,1625925174,Fb,Kb},
		[c]={{nb,3353,"std::optional<uint32_t> Lexer::tryReadNumericUCN(const char *&StartPtr, const char *SlashLoc, Token *Result) {\n  // ...\n  if (Delimited && PP) {\n    Diag(SlashLoc, PP->getLangOpts().CPlusPlus23 ? diag::warn_cxx23_delimited_escape_sequence : diag::ext_delimited_escape_sequence) << /*delimited*/ 0 << (PP->getLangOpts().CPlusPlus ? 1 : 0);"},{nb,3441,"std::optional<uint32_t> Lexer::tryReadNamedUCN(const char *&StartPtr, const char *SlashLoc, Token *Result) {\n  // ...\n  if (Diagnose && Match)\n    Diag(SlashLoc, PP->getLangOpts().CPlusPlus23 ? diag::warn_cxx23_delimited_escape_sequence : diag::ext_delimited_escape_sequence) << /*named*/ 1 << (PP->getLangOpts().CPlusPlus ? 1 : 0);"},{Ec,356,"/// ProcessCharEscape - Parse a standard C escape sequence, which can occur in\n/// either a character or a string literal.\nstatic unsigned ProcessCharEscape(const char *ThisTokBegin, const char *&ThisTokBuf, const char *ThisTokEnd, bool &HadError, FullSourceLoc Loc, unsigned CharWidth, DiagnosticsEngine *Diags, const LangOptions &Features, StringLiteralEvalMethod EvalMethod) {\n  // ...\n  if (Delimited && Diags) {\n    if (!EndDelimiterFound)\n    // ...\n    else if (!HadError) {\n      Diag(Diags, Features, Loc, ThisTokBegin, EscapeBegin, ThisTokBuf, Features.CPlusPlus23 ? diag::warn_cxx23_delimited_escape_sequence : diag::ext_delimited_escape_sequence) << /*delimited*/ 0 << (Features.CPlusPlus ? 1 : 0);"},{Ec,699,"/// ProcessUCNEscape - Read the Universal Character Name, check constraints and\n/// return the UTF32.\nstatic bool ProcessUCNEscape(const char *ThisTokBegin, const char *&ThisTokBuf, const char *ThisTokEnd, uint32_t &UcnVal, unsigned short &UcnLen, FullSourceLoc Loc, DiagnosticsEngine *Diags, const LangOptions &Features, bool in_char_string_literal = false) {\n  // ...\n  if ((IsDelimitedEscapeSequence || IsNamedEscapeSequence) && Diags)\n    Diag(Diags, Features, Loc, ThisTokBegin, UcnBegin, ThisTokBuf, Features.CPlusPlus23 ? diag::warn_cxx23_delimited_escape_sequence : diag::ext_delimited_escape_sequence) << (IsNamedEscapeSequence ? 1 : 0) << (Features.CPlusPlus ? 1 : 0);"}},
		[m]={
			["clang/test/Preprocessor/ucn-pp-identifier.c"]={"clang/test/Preprocessor/ucn-pp-identifier.c:22:6: warning: delimited escape sequences are incompatible with C++ standards before C++23 [-Wpre-c++23-compat]","clang/test/Preprocessor/ucn-pp-identifier.c:37:9: warning: delimited escape sequences are incompatible with C++ standards before C++23 [-Wpre-c++23-compat]","clang/test/Preprocessor/ucn-pp-identifier.c:39:9: warning: named escape sequences are incompatible with C++ standards before C++23 [-Wpre-c++23-compat]","clang/test/Preprocessor/ucn-pp-identifier.c:42:9: warning: named escape sequences are incompatible with C++ standards before C++23 [-Wpre-c++23-compat]","clang/test/Preprocessor/ucn-pp-identifier.c:144:5: warning: named escape sequences are incompatible with C++ standards before C++23 [-Wpre-c++23-compat]","clang/test/Preprocessor/ucn-pp-identifier.c:149:5: warning: named escape sequences are incompatible with C++ standards before C++23 [-Wpre-c++23-compat]"}
		}
	},
	["warn_cxx98_compat_alias_declaration"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_alias_declaration",
		[h]="alias declarations are incompatible with C++98",
		[b]="alias declarations are incompatible with C++98",
		[f]=j,
		[g]="alias declarations are incompatible with C\\+\\+98",
		[e]=B,
		[a]=F,
		[d]={wb,1318655374,sb,rb},
		[c]={{gb,878,"Decl *Parser::ParseAliasDeclarationAfterDeclarator(const ParsedTemplateInfo &TemplateInfo, SourceLocation UsingLoc, UsingDeclarator &D, SourceLocation &DeclEnd, AccessSpecifier AS, ParsedAttributes &Attrs, Decl **OwnedType) {\n  // ...\n  Diag(Tok.getLocation(), getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_alias_declaration : diag::ext_alias_declaration);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:7:18: warning: alias declarations are incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:137:19: warning: alias declarations are incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:138:44: warning: alias declarations are incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_alignas"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_alignas",
		[h]="\'alignas\' is incompatible with C++98",
		[b]="\'alignas\' is incompatible with C++98",
		[f]=j,
		[g]="\'alignas\' is incompatible with C\\+\\+98",
		[e]=B,
		[a]=F,
		[d]={"f679b5b6a6cb",1318625307,"-Wc++98-compat: warn on C++11 attributes and alignas.","-Wc++98-compat: warn on C++11 attributes and alignas.\n\nllvm-svn: 141999"},
		[c]={{gb,4506,"/// Parse a C++11 or C2x attribute-specifier.\n///\n/// [C++11] attribute-specifier:\n///         \'[\' \'[\' attribute-list \']\' \']\'\n///         alignment-specifier\n///\n/// [C++11] attribute-list:\n///         attribute[opt]\n///         attribute-list \',\' attribute[opt]\n///         attribute \'...\'\n///         attribute-list \',\' attribute \'...\'\n///\n/// [C++11] attribute:\n///         attribute-token attribute-argument-clause[opt]\n///\n/// [C++11] attribute-token:\n///         identifier\n///         attribute-scoped-token\n///\n/// [C++11] attribute-scoped-token:\n///         attribute-namespace \'::\' identifier\n///\n/// [C++11] attribute-namespace:\n///         identifier\nvoid Parser::ParseCXX11AttributeSpecifierInternal(ParsedAttributes &Attrs, CachedTokens &OpenMPTokens, SourceLocation *EndLoc) {\n  if (Tok.is(tok::kw_alignas)) {\n    if (getLangOpts().C2x)\n    // ...\n    else\n      Diag(Tok.getLocation(), diag::warn_cxx98_compat_alignas);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:26:1: warning: \'alignas\' is incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_alignof"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_alignof",
		[h]="alignof expressions are incompatible with C++98",
		[b]="alignof expressions are incompatible with C++98",
		[f]=j,
		[g]="alignof expressions are incompatible with C\\+\\+98",
		[e]=B,
		[a]=F,
		[d]={sc,1318892780,pc,oc},
		[c]={{jc,2495,"/// Parse a sizeof or alignof expression.\n///\n/// \\verbatim\n///       unary-expression:  [C99 6.5.3]\n///         \'sizeof\' unary-expression\n///         \'sizeof\' \'(\' type-name \')\'\n/// [C++11] \'sizeof\' \'...\' \'(\' identifier \')\'\n/// [GNU]   \'__alignof\' unary-expression\n/// [GNU]   \'__alignof\' \'(\' type-name \')\'\n/// [C11]   \'_Alignof\' \'(\' type-name \')\'\n/// [C++11] \'alignof\' \'(\' type-id \')\'\n/// \\endverbatim\nExprResult Parser::ParseUnaryExprOrTypeTraitExpression() {\n  // ...\n  if (getLangOpts().CPlusPlus && OpTok.isOneOf(tok::kw_alignof, tok::kw__Alignof))\n    Diag(OpTok, diag::warn_cxx98_compat_alignof);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:146:22: warning: alignof expressions are incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_array_size_conversion"]={
		[l]={n},
		[k]=n,
		[i]="warn_cxx98_compat_array_size_conversion",
		[h]="implicit conversion from array size expression of type %0 to %select{integral|enumeration}1 type %2 is incompatible with C++98",
		[b]={{nil,nil,{"implicit conversion from array size expression of type A to ",{"integral","enumeration"}," type C is incompatible with C++98"}}},
		[f]=j,
		[g]="implicit conversion from array size expression of type (.*?) to (?:integral|enumeration) type (.*?) is incompatible with C\\+\\+98",
		[e]=kc,
		[a]=r,
		[d]={Ib,1318970984,Jb,Eb},
		[c]={{dc,2135,"ExprResult Sema::BuildCXXNew(SourceRange Range, bool UseGlobal, SourceLocation PlacementLParen, MultiExprArg PlacementArgs, SourceLocation PlacementRParen, SourceRange TypeIdParens, QualType AllocType, TypeSourceInfo *AllocTypeInfo, std::optional<Expr *> ArraySize, SourceRange DirectInitRange, Expr *Initializer) {\n  // ...\n  if (ArraySize && *ArraySize && !(*ArraySize)->isTypeDependent()) {\n    // ...\n    if (getLangOpts().CPlusPlus14) {\n      // ...\n      if (!ConvertedSize.isInvalid() && (*ArraySize)->getType()->getAs<RecordType>())\n        // ...\n        Diag(StartLoc, diag::warn_cxx98_compat_array_size_conversion) << (*ArraySize)->getType() << 0 << \"\'size_t\'\";"},{dc,2186,"ExprResult Sema::BuildCXXNew(SourceRange Range, bool UseGlobal, SourceLocation PlacementLParen, MultiExprArg PlacementArgs, SourceLocation PlacementRParen, SourceRange TypeIdParens, QualType AllocType, TypeSourceInfo *AllocTypeInfo, std::optional<Expr *> ArraySize, SourceRange DirectInitRange, Expr *Initializer) {\n  // ...\n  if (ArraySize && *ArraySize && !(*ArraySize)->isTypeDependent()) {\n    // ...\n    if (getLangOpts().CPlusPlus14) {\n    // ...\n    } else {\n      class SizeConvertDiagnoser : public ICEConvertDiagnoser {\n        // ...\n        SemaDiagnosticBuilder diagnoseConversion(Sema &S, SourceLocation Loc, QualType T, QualType ConvTy) override { return S.Diag(Loc, S.getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_array_size_conversion : diag::ext_array_size_conversion) << T << ConvTy->isEnumeralType() << ConvTy; }"}},
		[m]={
			[uc]={"clang/test/SemaCXX/cxx98-compat-pedantic.cpp:32785:28: warning: implicit conversion from array size expression of type \'ConvertToInt\' to integral type \'size_t\' is incompatible with C++98 [-Wc++98-compat-pedantic]"}
		}
	},
	["warn_cxx98_compat_attribute"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_attribute",
		[h]="[[]] attributes are incompatible with C++ standards before C++11",
		[b]="[[]] attributes are incompatible with C++ standards before C++11",
		[f]=j,
		[g]="\\[\\[\\]\\] attributes are incompatible with C\\+\\+ standards before C\\+\\+11",
		[e]=B,
		[a]=F,
		[d]={"f679b5b6a6cb",1318625307,"-Wc++98-compat: warn on C++11 attributes and alignas.","-Wc++98-compat: warn on C++11 attributes and alignas.\n\nllvm-svn: 141999"},
		[c]={{gb,4524,"/// Parse a C++11 or C2x attribute-specifier.\n///\n/// [C++11] attribute-specifier:\n///         \'[\' \'[\' attribute-list \']\' \']\'\n///         alignment-specifier\n///\n/// [C++11] attribute-list:\n///         attribute[opt]\n///         attribute-list \',\' attribute[opt]\n///         attribute \'...\'\n///         attribute-list \',\' attribute \'...\'\n///\n/// [C++11] attribute:\n///         attribute-token attribute-argument-clause[opt]\n///\n/// [C++11] attribute-token:\n///         identifier\n///         attribute-scoped-token\n///\n/// [C++11] attribute-scoped-token:\n///         attribute-namespace \'::\' identifier\n///\n/// [C++11] attribute-namespace:\n///         identifier\nvoid Parser::ParseCXX11AttributeSpecifierInternal(ParsedAttributes &Attrs, CachedTokens &OpenMPTokens, SourceLocation *EndLoc) {\n  // ...\n  if (getLangOpts().CPlusPlus) {\n    Diag(OpenLoc, getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_attribute : diag::warn_ext_cxx11_attributes);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:27:20: warning: [[]] attributes are incompatible with C++ standards before C++11 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_auto_type_specifier"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_auto_type_specifier",
		[h]="\'auto\' type specifier is incompatible with C++98",
		[b]="\'auto\' type specifier is incompatible with C++98",
		[f]=j,
		[g]="\'auto\' type specifier is incompatible with C\\+\\+98",
		[e]=B,
		[a]=r,
		[d]={"e41fac231c9d",1318657321,"Add -Wc++98-compat warning for deduced \'auto\' type specifier.","Add -Wc++98-compat warning for deduced \'auto\' type specifier.\n\nllvm-svn: 142057"},
		[c]={{Pb,3751,"static QualType GetDeclSpecTypeForDeclarator(TypeProcessingState &state, TypeSourceInfo *&ReturnTypeInfo) {\n  // ...\n  // C++11 [dcl.spec.auto]p5: reject \'auto\' if it is not in an allowed context.\n  if (Deduced) {\n    // ...\n    if (Error != -1) {\n    // ...\n    } else if (Auto && D.getContext() != DeclaratorContext::LambdaExpr) {\n      // ...\n      SemaRef.Diag(AutoRange.getBegin(), D.getContext() == DeclaratorContext::LambdaExprParameter ? diag::warn_cxx11_compat_generic_lambda : IsDeducedReturnType ? diag::warn_cxx11_compat_deduced_return_type : diag::warn_cxx98_compat_auto_type_specifier) << AutoRange;"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:73:3: warning: \'auto\' type specifier is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:107:1: warning: \'auto\' type specifier is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:115:8: warning: \'auto\' type specifier is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:143:1: warning: \'auto\' type specifier is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:144:14: warning: \'auto\' type specifier is incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_cast_fn_obj"]={
		[l]={n},
		[k]=n,
		[i]="warn_cxx98_compat_cast_fn_obj",
		[h]="cast between pointer-to-function and pointer-to-object is incompatible with C++98",
		[b]="cast between pointer-to-function and pointer-to-object is incompatible with C++98",
		[f]=j,
		[g]="cast between pointer\\-to\\-function and pointer\\-to\\-object is incompatible with C\\+\\+98",
		[e]=kc,
		[a]=r,
		[d]={Ib,1318970984,Jb,Eb},
		[c]={{"clang/lib/Sema/SemaCast.cpp",2559,"static TryCastResult TryReinterpretCast(Sema &Self, ExprResult &SrcExpr, QualType DestType, bool CStyle, SourceRange OpRange, unsigned &msg, CastKind &Kind) {\n  // ...\n  if (SrcType->isFunctionPointerType()) {\n    // ...\n    Self.Diag(OpRange.getBegin(), Self.getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_cast_fn_obj : diag::ext_cast_fn_obj) << OpRange;"},{"clang/lib/Sema/SemaCast.cpp",2568,"static TryCastResult TryReinterpretCast(Sema &Self, ExprResult &SrcExpr, QualType DestType, bool CStyle, SourceRange OpRange, unsigned &msg, CastKind &Kind) {\n  // ...\n  if (DestType->isFunctionPointerType()) {\n    // ...\n    Self.Diag(OpRange.getBegin(), Self.getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_cast_fn_obj : diag::ext_cast_fn_obj) << OpRange;"}},
		[m]={
			[uc]={"clang/test/SemaCXX/cxx98-compat-pedantic.cpp:32779:19: warning: cast between pointer-to-function and pointer-to-object is incompatible with C++98 [-Wc++98-compat-pedantic]","clang/test/SemaCXX/cxx98-compat-pedantic.cpp:32780:19: warning: cast between pointer-to-function and pointer-to-object is incompatible with C++98 [-Wc++98-compat-pedantic]"}
		}
	},
	["warn_cxx98_compat_constexpr"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_constexpr",
		[h]="\'constexpr\' specifier is incompatible with C++98",
		[b]="\'constexpr\' specifier is incompatible with C++98",
		[f]=j,
		[g]="\'constexpr\' specifier is incompatible with C\\+\\+98",
		[e]=B,
		[a]=r,
		[d]={sc,1318892780,pc,oc},
		[c]={{Yc,1380,"/// Finish - This does final analysis of the declspec, rejecting things like\n/// \"_Imaginary\" (lacking an FP type). After calling this method, DeclSpec is\n/// guaranteed to be self-consistent, even if an error occurred.\nvoid DeclSpec::Finish(Sema &S, const PrintingPolicy &Policy) {\n  // ...\n  if (getConstexprSpecifier() == ConstexprSpecKind::Constexpr)\n    S.Diag(ConstexprLoc, diag::warn_cxx98_compat_constexpr);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:149:1: warning: \'constexpr\' specifier is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:262:12: warning: \'constexpr\' specifier is incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_ctor_list_init"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_ctor_list_init",
		[h]="constructor call from initializer list is incompatible with C++98",
		[b]="constructor call from initializer list is incompatible with C++98",
		[f]=j,
		[g]="constructor call from initializer list is incompatible with C\\+\\+98",
		[e]=B,
		[a]=r,
		[d]={"2b349aee5b6f",1334818680,"Add missing -Wc++98-compat warnings for initializer list initializations which","Add missing -Wc++98-compat warnings for initializer list initializations which\ninitialize references, create std::initializer_list objects, or call constructors.\n\nllvm-svn: 155105"},
		[c]={{ob,9060,"ExprResult InitializationSequence::Perform(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Args, QualType *ResultType) {\n  // ...\n  for (step_iterator Step = step_begin(), StepEnd = step_end(); Step != StepEnd; ++Step) {\n    // ...\n    case SK_ConstructorInitializationFromList: {\n      // ...\n      S.Diag(InitList->getExprLoc(), diag::warn_cxx98_compat_ctor_list_init) << InitList->getSourceRange();"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:75:13: warning: constructor call from initializer list is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:76:13: warning: constructor call from initializer list is incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_decltype"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_decltype",
		[h]="\'decltype\' type specifier is incompatible with C++98",
		[b]="\'decltype\' type specifier is incompatible with C++98",
		[f]=j,
		[g]="\'decltype\' type specifier is incompatible with C\\+\\+98",
		[e]=B,
		[a]=F,
		[d]={sc,1318892780,pc,oc},
		[c]={{gb,1086,"/// ParseDecltypeSpecifier - Parse a C++11 decltype specifier.\n///\n/// \'decltype\' ( expression )\n/// \'decltype\' ( \'auto\' )      [C++1y]\n///\nSourceLocation Parser::ParseDecltypeSpecifier(DeclSpec &DS) {\n  // ...\n  if (Tok.is(tok::annot_decltype)) {\n  // ...\n  } else {\n    if (Tok.getIdentifierInfo()->isStr(\"decltype\"))\n      Diag(Tok, diag::warn_cxx98_compat_decltype);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:7:18: warning: \'decltype\' type specifier is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:150:1: warning: \'decltype\' type specifier is incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_defaulted_deleted_function"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_defaulted_deleted_function",
		[h]="%select{defaulted|deleted}0 function definitions are incompatible with C++98",
		[b]={{nil,nil,{{"defaulted","deleted"}," function definitions are incompatible with C++98"}}},
		[f]=j,
		[g]="(?:defaulted|deleted) function definitions are incompatible with C\\+\\+98",
		[e]=B,
		[a]=F,
		[d]={"54a6a68c706b",1447524968,"Merge some similar diagnostics using %select.","Merge some similar diagnostics using %select.\n\nllvm-svn: 253136"},
		[c]={{"clang/lib/Parse/ParseCXXInlineMethods.cpp",71,"/// ParseCXXInlineMethodDef - We parsed and verified that the specified\n/// Declarator is a well formed C++ inline method definition. Now lex its body\n/// and store its tokens for parsing after the C++ class is complete.\nNamedDecl *Parser::ParseCXXInlineMethodDef(AccessSpecifier AS, const ParsedAttributesView &AccessAttrs, ParsingDeclarator &D, const ParsedTemplateInfo &TemplateInfo, const VirtSpecifiers &VS, SourceLocation PureSpecLoc) {\n  // ...\n  if (TryConsumeToken(tok::equal)) {\n    // ...\n    if (TryConsumeToken(tok::kw_delete, KWLoc)) {\n      Diag(KWLoc, getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_defaulted_deleted_function : diag::ext_defaulted_deleted_function) << 1 /* deleted */;"},{"clang/lib/Parse/ParseCXXInlineMethods.cpp",81,"/// ParseCXXInlineMethodDef - We parsed and verified that the specified\n/// Declarator is a well formed C++ inline method definition. Now lex its body\n/// and store its tokens for parsing after the C++ class is complete.\nNamedDecl *Parser::ParseCXXInlineMethodDef(AccessSpecifier AS, const ParsedAttributesView &AccessAttrs, ParsingDeclarator &D, const ParsedTemplateInfo &TemplateInfo, const VirtSpecifiers &VS, SourceLocation PureSpecLoc) {\n  // ...\n  if (TryConsumeToken(tok::equal)) {\n    // ...\n    if (TryConsumeToken(tok::kw_delete, KWLoc)) {\n    // ...\n    } else if (TryConsumeToken(tok::kw_default, KWLoc)) {\n      Diag(KWLoc, getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_defaulted_deleted_function : diag::ext_defaulted_deleted_function) << 0 /* defaulted */;"},{"clang/lib/Parse/Parser.cpp",1367,"/// ParseFunctionDefinition - We parsed and verified that the specified\n/// Declarator is well formed.  If this is a K&R-style function, read the\n/// parameters declaration-list, then start the compound-statement.\n///\n///       function-definition: [C99 6.9.1]\n///         decl-specs      declarator declaration-list[opt] compound-statement\n/// [C90] function-definition: [C99 6.7.1] - implicit int result\n/// [C90]   decl-specs[opt] declarator declaration-list[opt] compound-statement\n/// [C++] function-definition: [C++ 8.4]\n///         decl-specifier-seq[opt] declarator ctor-initializer[opt]\n///         function-body\n/// [C++] function-definition: [C++ 8.4]\n///         decl-specifier-seq[opt] declarator function-try-block\n///\nDecl *Parser::ParseFunctionDefinition(ParsingDeclarator &D, const ParsedTemplateInfo &TemplateInfo, LateParsedAttrList *LateParsedAttrs) {\n  // ...\n  if (TryConsumeToken(tok::equal)) {\n    // ...\n    if (TryConsumeToken(tok::kw_delete, KWLoc)) {\n      Diag(KWLoc, getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_defaulted_deleted_function : diag::ext_defaulted_deleted_function) << 1 /* deleted */;"},{"clang/lib/Parse/Parser.cpp",1373,"/// ParseFunctionDefinition - We parsed and verified that the specified\n/// Declarator is well formed.  If this is a K&R-style function, read the\n/// parameters declaration-list, then start the compound-statement.\n///\n///       function-definition: [C99 6.9.1]\n///         decl-specs      declarator declaration-list[opt] compound-statement\n/// [C90] function-definition: [C99 6.7.1] - implicit int result\n/// [C90]   decl-specs[opt] declarator declaration-list[opt] compound-statement\n/// [C++] function-definition: [C++ 8.4]\n///         decl-specifier-seq[opt] declarator ctor-initializer[opt]\n///         function-body\n/// [C++] function-definition: [C++ 8.4]\n///         decl-specifier-seq[opt] declarator function-try-block\n///\nDecl *Parser::ParseFunctionDefinition(ParsingDeclarator &D, const ParsedTemplateInfo &TemplateInfo, LateParsedAttrList *LateParsedAttrs) {\n  // ...\n  if (TryConsumeToken(tok::equal)) {\n    // ...\n    if (TryConsumeToken(tok::kw_delete, KWLoc)) {\n    // ...\n    } else if (TryConsumeToken(tok::kw_default, KWLoc)) {\n      Diag(KWLoc, getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_defaulted_deleted_function : diag::ext_defaulted_deleted_function) << 0 /* defaulted */;"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:95:18: warning: deleted function definitions are incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:97:17: warning: defaulted function definitions are incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:356:19: warning: deleted function definitions are incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_delegating_ctor"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_delegating_ctor",
		[h]="delegating constructors are incompatible with C++98",
		[b]="delegating constructors are incompatible with C++98",
		[f]=j,
		[g]="delegating constructors are incompatible with C\\+\\+98",
		[e]=B,
		[a]=r,
		[d]={Ib,1318970984,Jb,Eb},
		[c]={{K,4622,"MemInitResult Sema::BuildDelegatingInitializer(TypeSourceInfo *TInfo, Expr *Init, CXXRecordDecl *ClassDecl) {\n  // ...\n  Diag(NameLoc, diag::warn_cxx98_compat_delegating_ctor);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:170:20: warning: delegating constructors are incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_empty_fnmacro_arg"]={
		[l]={n},
		[k]=n,
		[i]="warn_cxx98_compat_empty_fnmacro_arg",
		[h]="empty macro arguments are incompatible with C++98",
		[b]="empty macro arguments are incompatible with C++98",
		[f]=j,
		[g]="empty macro arguments are incompatible with C\\+\\+98",
		[e]=kc,
		[a]=Z,
		[d]={Ac,1318641536,wc,xc},
		[c]={{"clang/lib/Lex/PPMacroExpansion.cpp",904,"/// ReadFunctionLikeMacroArgs - After reading \"MACRO\" and knowing that the next\n/// token is the \'(\' of the macro, this method is invoked to read all of the\n/// actual arguments specified for the macro invocation.  This returns null on\n/// error.\nMacroArgs *Preprocessor::ReadMacroCallArgumentList(Token &MacroName, MacroInfo *MI, SourceLocation &MacroEnd) {\n  // ...\n  while (Tok.isNot(tok::r_paren)) {\n    // ...\n    // Empty arguments are standard in C99 and C++0x, and are supported as an\n    // extension in other modes.\n    if (ArgTokens.size() == ArgTokenStart && !getLangOpts().C99)\n      Diag(Tok, getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_empty_fnmacro_arg : diag::ext_empty_fnmacro_arg);"}},
		[m]={
			[uc]={"clang/test/SemaCXX/cxx98-compat-pedantic.cpp:32770:10: warning: empty macro arguments are incompatible with C++98 [-Wc++98-compat-pedantic]"}
		}
	},
	["warn_cxx98_compat_empty_scalar_initializer"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_empty_scalar_initializer",
		[h]="scalar initialized from empty initializer list is incompatible with C++98",
		[b]="scalar initialized from empty initializer list is incompatible with C++98",
		[f]=j,
		[g]="scalar initialized from empty initializer list is incompatible with C\\+\\+98",
		[e]=B,
		[a]=r,
		[d]={"c82397332d13",1318973940,"-Wc++98-compat and -Wc++98-compat-pedantic warnings for Sema, part 2.","-Wc++98-compat and -Wc++98-compat-pedantic warnings for Sema, part 2.\n\nllvm-svn: 142426"},
		[c]={{ob,1638,"void InitListChecker::CheckScalarType(const InitializedEntity &Entity, InitListExpr *IList, QualType DeclType, unsigned &Index, InitListExpr *StructuredList, unsigned &StructuredIndex) {\n  if (Index >= IList->getNumInits()) {\n    if (!VerifyOnly) {\n      if (SemaRef.getLangOpts().CPlusPlus) {\n        if (DeclType->isSizelessBuiltinType())\n        // ...\n        else\n          SemaRef.Diag(IList->getBeginLoc(), SemaRef.getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_empty_scalar_initializer : diag::err_empty_scalar_initializer) << IList->getSourceRange();"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:63:22: warning: scalar initialized from empty initializer list is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:65:17: warning: scalar initialized from empty initializer list is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:67:12: warning: scalar initialized from empty initializer list is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:228:9: warning: scalar initialized from empty initializer list is incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_empty_sizeless_initializer"]={
		[l]={o,n},
		[k]=o,
		[i]={{nil,R,"warn_cxx98_compat_empty_sizeless_initializer"}},
		[h]={{nil,R,"initializing %0 from an empty initializer list is incompatible with C++98"}},
		[b]={{nil,R,"initializing A from an empty initializer list is incompatible with C++98"}},
		[f]=j,
		[g]="initializing (.*?) from an empty initializer list is incompatible with C\\+\\+98",
		[e]=B,
		[a]={{nil,R,r}},
		[d]={"931fcd3ba011",1576908663,"[WebAssembly] Improve clang diagnostics for wasm attributes","[WebAssembly] Improve clang diagnostics for wasm attributes\n\nThis patch addresses the review comments on r352930:\n\n - Removes redundant diagnostic checking code\n - Removes errnoneous use of diag::err_alias_is_definition, which\n   turned out to be ineffective anyway since functions can be defined later\n   in the translation unit and avoid detection.\n - Adds a test for various invalid cases for import_name and import_module.\n\nDifferential Revision: https://reviews.llvm.org/D59520"},
		[c]={{ob,1632,"void InitListChecker::CheckScalarType(const InitializedEntity &Entity, InitListExpr *IList, QualType DeclType, unsigned &Index, InitListExpr *StructuredList, unsigned &StructuredIndex) {\n  if (Index >= IList->getNumInits()) {\n    if (!VerifyOnly) {\n      if (SemaRef.getLangOpts().CPlusPlus) {\n        if (DeclType->isSizelessBuiltinType())\n          SemaRef.Diag(IList->getBeginLoc(), SemaRef.getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_empty_sizeless_initializer : diag::err_empty_sizeless_initializer) << DeclType << IList->getSourceRange();"}},
		[m]={
			["clang/test/SemaCXX/sizeless-1.cpp"]={"clang/test/SemaCXX/sizeless-1.cpp:577:63: warning: initializing \'svint8_t\' (aka \'__SVInt8_t\') from an empty initializer list is incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_enum_fixed_underlying_type"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_enum_fixed_underlying_type",
		[h]="enumeration types with a fixed underlying type are incompatible with C++98",
		[b]="enumeration types with a fixed underlying type are incompatible with C++98",
		[f]=j,
		[g]="enumeration types with a fixed underlying type are incompatible with C\\+\\+98",
		[e]=B,
		[a]=F,
		[d]={wb,1318655374,sb,rb},
		[c]={{Vb,4940,"/// ParseEnumSpecifier\n///       enum-specifier: [C99 6.7.2.2]\n///         \'enum\' identifier[opt] \'{\' enumerator-list \'}\'\n///[C99/C++]\'enum\' identifier[opt] \'{\' enumerator-list \',\' \'}\'\n/// [GNU]   \'enum\' attributes[opt] identifier[opt] \'{\' enumerator-list \',\' [opt]\n///                                                 \'}\' attributes[opt]\n/// [MS]    \'enum\' __declspec[opt] identifier[opt] \'{\' enumerator-list \',\' [opt]\n///                                                 \'}\'\n///         \'enum\' identifier\n/// [GNU]   \'enum\' attributes[opt] identifier\n///\n/// [C++11] enum-head \'{\' enumerator-list[opt] \'}\'\n/// [C++11] enum-head \'{\' enumerator-list \',\'  \'}\'\n///\n///       enum-head: [C++11]\n///         enum-key attribute-specifier-seq[opt] identifier[opt] enum-base[opt]\n///         enum-key attribute-specifier-seq[opt] nested-name-specifier\n///             identifier enum-base[opt]\n///\n///       enum-key: [C++11]\n///         \'enum\'\n///         \'enum\' \'class\'\n///         \'enum\' \'struct\'\n///\n///       enum-base: [C++11]\n///         \':\' type-specifier-seq\n///\n/// [C++] elaborated-type-specifier:\n/// [C++]   \'enum\' nested-name-specifier[opt] identifier\n///\nvoid Parser::ParseEnumSpecifier(SourceLocation StartLoc, DeclSpec &DS, const ParsedTemplateInfo &TemplateInfo, AccessSpecifier AS, DeclSpecContext DSC) {\n  // ...\n  // Parse the fixed underlying type.\n  if (Tok.is(tok::colon)) {\n    // ...\n    if (CanBeBitfield && !isEnumBase(CanBeOpaqueEnumDeclaration)) {\n    // ...\n    } else if (CanHaveEnumBase || !ColonIsSacred) {\n      // ...\n      if (!getLangOpts().ObjC) {\n        if (getLangOpts().CPlusPlus11)\n          Diag(ColonLoc, diag::warn_cxx98_compat_enum_fixed_underlying_type) << BaseRange;"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:89:16: warning: enumeration types with a fixed underlying type are incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_enum_friend"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_enum_friend",
		[h]="befriending enumeration type %0 is incompatible with C++98",
		[b]="befriending enumeration type A is incompatible with C++98",
		[f]=j,
		[g]="befriending enumeration type (.*?) is incompatible with C\\+\\+98",
		[e]=B,
		[a]=r,
		[d]={"c82397332d13",1318973940,"-Wc++98-compat and -Wc++98-compat-pedantic warnings for Sema, part 2.","-Wc++98-compat and -Wc++98-compat-pedantic warnings for Sema, part 2.\n\nllvm-svn: 142426"},
		[c]={{K,17228,"/// Perform semantic analysis of the given friend type declaration.\n///\n/// \\returns A friend declaration that.\nFriendDecl *Sema::CheckFriendTypeDecl(SourceLocation LocStart, SourceLocation FriendLoc, TypeSourceInfo *TSInfo) {\n  // ...\n  // C++03 [class.friend]p2:\n  //   An elaborated-type-specifier shall be used in a friend declaration\n  //   for a class.*\n  //\n  //   * The class-key of the elaborated-type-specifier is required.\n  if (!CodeSynthesisContexts.empty()) {\n  // ...\n  } else {\n    if (!T->isElaboratedTypeSpecifier()) {\n    // ...\n    } else if (T->getAs<EnumType>()) {\n      Diag(FriendLoc, getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_enum_friend : diag::ext_enum_friend) << T << TypeRange;"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:223:3: warning: befriending enumeration type \'enum ::Enum\' is incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_enum_nested_name_spec"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_enum_nested_name_spec",
		[h]="enumeration type in nested name specifier is incompatible with C++98",
		[b]="enumeration type in nested name specifier is incompatible with C++98",
		[f]=j,
		[g]="enumeration type in nested name specifier is incompatible with C\\+\\+98",
		[e]=B,
		[a]=r,
		[d]={"91c7bbde4b6d",1319081327,"Add -Wc++98-compat warning for enumerations in nested name specifiers.","Add -Wc++98-compat warning for enumerations in nested name specifiers.\n\nllvm-svn: 142568"},
		[c]={{"clang/lib/Sema/SemaCXXScopeSpec.cpp",718,"/// Build a new nested-name-specifier for \"identifier::\", as described\n/// by ActOnCXXNestedNameSpecifier.\n///\n/// \\param S Scope in which the nested-name-specifier occurs.\n/// \\param IdInfo Parser information about an identifier in the\n///        nested-name-spec.\n/// \\param EnteringContext If true, enter the context specified by the\n///        nested-name-specifier.\n/// \\param SS Optional nested name specifier preceding the identifier.\n/// \\param ScopeLookupResult Provides the result of name lookup within the\n///        scope of the nested-name-specifier that was computed at template\n///        definition time.\n/// \\param ErrorRecoveryLookup Specifies if the method is called to improve\n///        error recovery and what kind of recovery is performed.\n/// \\param IsCorrectedToColon If not null, suggestion of replace \'::\' -> \':\'\n///        are allowed.  The bool value pointed by this parameter is set to\n///       \'true\' if the identifier is treated as if it was followed by \':\',\n///        not \'::\'.\n/// \\param OnlyNamespace If true, only considers namespaces in lookup.\n///\n/// This routine differs only slightly from ActOnCXXNestedNameSpecifier, in\n/// that it contains an extra parameter \\p ScopeLookupResult, which provides\n/// the result of name lookup within the scope of the nested-name-specifier\n/// that was computed at template definition time.\n///\n/// If ErrorRecoveryLookup is true, then this call is used to improve error\n/// recovery.  This means that it should not emit diagnostics, it should\n/// just return true on failure.  It also means it should only return a valid\n/// scope if it *knows* that the result is correct.  It should not return in a\n/// dependent context, for example. Nor will it extend \\p SS with the scope\n/// specifier.\nbool Sema::BuildCXXNestedNameSpecifier(Scope *S, NestedNameSpecInfo &IdInfo, bool EnteringContext, CXXScopeSpec &SS, NamedDecl *ScopeLookupResult, bool ErrorRecoveryLookup, bool *IsCorrectedToColon, bool OnlyNamespace) {\n  // ...\n  if (AcceptSpec) {\n    // ...\n    if (T->isEnumeralType())\n      Diag(IdInfo.IdentifierLoc, diag::warn_cxx98_compat_enum_nested_name_spec);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:268:15: warning: enumeration type in nested name specifier is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:270:11: warning: enumeration type in nested name specifier is incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_enumerator_list_comma"]={
		[l]={n},
		[k]=n,
		[i]="warn_cxx98_compat_enumerator_list_comma",
		[h]="commas at the end of enumerator lists are incompatible with C++98",
		[b]="commas at the end of enumerator lists are incompatible with C++98",
		[f]=j,
		[g]="commas at the end of enumerator lists are incompatible with C\\+\\+98",
		[e]=kc,
		[a]=F,
		[d]={wb,1318655374,sb,rb},
		[c]={{Vb,5262,"/// ParseEnumBody - Parse a {} enclosed enumerator-list.\n///       enumerator-list:\n///         enumerator\n///         enumerator-list \',\' enumerator\n///       enumerator:\n///         enumeration-constant attributes[opt]\n///         enumeration-constant attributes[opt] \'=\' constant-expression\n///       enumeration-constant:\n///         identifier\n///\nvoid Parser::ParseEnumBody(SourceLocation StartLoc, Decl *EnumDecl) {\n  // ...\n  // Parse the enumerator-list.\n  while (Tok.isNot(tok::r_brace)) {\n    // ...\n    // If comma is followed by r_brace, emit appropriate warning.\n    if (Tok.is(tok::r_brace) && CommaLoc.isValid()) {\n      if (!getLangOpts().C99 && !getLangOpts().CPlusPlus11)\n      // ...\n      else if (getLangOpts().CPlusPlus11)\n        Diag(CommaLoc, diag::warn_cxx98_compat_enumerator_list_comma) << FixItHint::CreateRemoval(CommaLoc);"}},
		[m]={
			[uc]={"clang/test/SemaCXX/cxx98-compat-pedantic.cpp:32775:13: warning: commas at the end of enumerator lists are incompatible with C++98 [-Wc++98-compat-pedantic]"}
		}
	},
	["warn_cxx98_compat_explicit_conversion_functions"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_explicit_conversion_functions",
		[h]="explicit conversion functions are incompatible with C++98",
		[b]="explicit conversion functions are incompatible with C++98",
		[f]=j,
		[g]="explicit conversion functions are incompatible with C\\+\\+98",
		[e]=B,
		[a]=r,
		[d]={Ib,1318970984,Jb,Eb},
		[c]={{K,11140,"/// CheckConversionDeclarator - Called by ActOnDeclarator to check the\n/// well-formednes of the conversion function declarator @p D with\n/// type @p R. If there are any errors in the declarator, this routine\n/// will emit diagnostics and return true. Otherwise, it will return\n/// false. Either way, the type @p R will be updated to reflect a\n/// well-formed type for the conversion operator.\nvoid Sema::CheckConversionDeclarator(Declarator &D, QualType &R, StorageClass &SC) {\n  // ...\n  // C++0x explicit conversion operators.\n  if (DS.hasExplicitSpecifier() && !getLangOpts().CPlusPlus20)\n    Diag(DS.getExplicitSpecLoc(), getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_explicit_conversion_functions : diag::ext_explicit_conversion_functions) << SourceRange(DS.getExplicitSpecRange());"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:217:3: warning: explicit conversion functions are incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_extern_template"]={
		[l]={n},
		[k]=n,
		[i]="warn_cxx98_compat_extern_template",
		[h]="extern templates are incompatible with C++98",
		[b]="extern templates are incompatible with C++98",
		[f]=j,
		[g]="extern templates are incompatible with C\\+\\+98",
		[e]=kc,
		[a]=F,
		[d]={"f411196d15a9",1319135758,"\'extern template\' is a C++11 feature. Add an Extension for C++98 (this matches","\'extern template\' is a C++11 feature. Add an Extension for C++98 (this matches\ngcc\'s behaviour), and a -Wc++98-compat-pedantic warning for C++11.\n\nllvm-svn: 142597"},
		[c]={{"clang/lib/Parse/Parser.cpp",1011,"/// ParseExternalDeclaration:\n///\n/// The `Attrs` that are passed in are C++11 attributes and appertain to the\n/// declaration.\n///\n///       external-declaration: [C99 6.9], declaration: [C++ dcl.dcl]\n///         function-definition\n///         declaration\n/// [GNU]   asm-definition\n/// [GNU]   __extension__ external-declaration\n/// [OBJC]  objc-class-definition\n/// [OBJC]  objc-class-declaration\n/// [OBJC]  objc-alias-declaration\n/// [OBJC]  objc-protocol-definition\n/// [OBJC]  objc-method-definition\n/// [OBJC]  @end\n/// [C++]   linkage-specification\n/// [GNU] asm-definition:\n///         simple-asm-expr \';\'\n/// [C++11] empty-declaration\n/// [C++11] attribute-declaration\n///\n/// [C++11] empty-declaration:\n///           \';\'\n///\n/// [C++0x/GNU] \'extern\' \'template\' declaration\n///\n/// [C++20] module-import-declaration\n///\nParser::DeclGroupPtrTy Parser::ParseExternalDeclaration(ParsedAttributes &Attrs, ParsedAttributes &DeclSpecAttrs, ParsingDeclSpec *DS) {\n  // ...\n  case tok::kw_extern:\n    if (getLangOpts().CPlusPlus && NextToken().is(tok::kw_template)) {\n      // ...\n      Diag(ExternLoc, getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_extern_template : diag::ext_extern_template) << SourceRange(ExternLoc, TemplateLoc);"}},
		[m]={
			[uc]={"clang/test/SemaCXX/cxx98-compat-pedantic.cpp:32793:1: warning: extern templates are incompatible with C++98 [-Wc++98-compat-pedantic]"}
		}
	},
	["warn_cxx98_compat_for_range"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_for_range",
		[h]="range-based for loop is incompatible with C++98",
		[b]="range-based for loop is incompatible with C++98",
		[f]=j,
		[g]="range\\-based for loop is incompatible with C\\+\\+98",
		[e]=B,
		[a]=F,
		[d]={wb,1318655374,sb,rb},
		[c]={{tc,2074,"/// ParseForStatement\n///       for-statement: [C99 6.8.5.3]\n///         \'for\' \'(\' expr[opt] \';\' expr[opt] \';\' expr[opt] \')\' statement\n///         \'for\' \'(\' declaration expr[opt] \';\' expr[opt] \')\' statement\n/// [C++]   \'for\' \'(\' for-init-statement condition[opt] \';\' expression[opt] \')\'\n/// [C++]       statement\n/// [C++0x] \'for\'\n///             \'co_await\'[opt]    [Coroutines]\n///             \'(\' for-range-declaration \':\' for-range-initializer \')\'\n///             statement\n/// [OBJC2] \'for\' \'(\' declaration \'in\' expr \')\' statement\n/// [OBJC2] \'for\' \'(\' expr \'in\' expr \')\' statement\n///\n/// [C++] for-init-statement:\n/// [C++]   expression-statement\n/// [C++]   simple-declaration\n/// [C++23] alias-declaration\n///\n/// [C++0x] for-range-declaration:\n/// [C++0x]   attribute-specifier-seq[opt] type-specifier-seq declarator\n/// [C++0x] for-range-initializer:\n/// [C++0x]   expression\n/// [C++0x]   braced-init-list            [TODO]\nStmtResult Parser::ParseForStatement(SourceLocation *TrailingElseLoc) {\n  // ...\n  // Parse the first part of the for specifier.\n  if (Tok.is(tok::semi)) { // for (;\n  // ...\n  } else if (getLangOpts().CPlusPlus && Tok.is(tok::identifier) && isForRangeIdentifier()) {\n  // ...\n  } else if (isForInitDeclaration()) { // for (int X = 4;\n    // ...\n    if (Tok.is(tok::kw_using)) {\n    // ...\n    } else {\n      // ...\n      if (ForRangeInfo.ParsedForRangeDecl()) {\n        Diag(ForRangeInfo.ColonLoc, getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_for_range : diag::ext_for_range);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:113:15: warning: range-based for loop is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:115:16: warning: range-based for loop is incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_friend_is_member"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_friend_is_member",
		[h]="friend declaration naming a member of the declaring class is incompatible with C++98",
		[b]="friend declaration naming a member of the declaring class is incompatible with C++98",
		[f]=j,
		[g]="friend declaration naming a member of the declaring class is incompatible with C\\+\\+98",
		[e]=B,
		[a]=r,
		[d]={Ib,1318970984,Jb,Eb},
		[c]={{K,17644,"NamedDecl *Sema::ActOnFriendFunctionDecl(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParams) {\n  // ...\n  if ((SS.isInvalid() || !SS.isSet()) && (FunctionContainingLocalClass = cast<CXXRecordDecl>(CurContext)->isLocalClass())) {\n  // ...\n  } else if (SS.isInvalid() || !SS.isSet()) {\n  // ...\n  } else if (!SS.getScopeRep()->isDependent()) {\n    // ...\n    // C++ [class.friend]p1: A friend of a class is a function or\n    //   class that is not a member of the class . . .\n    if (DC->Equals(CurContext))\n      Diag(DS.getFriendSpecLoc(), getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_friend_is_member : diag::err_friend_is_member);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:166:3: warning: friend declaration naming a member of the declaring class is incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_generalized_initializer_lists"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_generalized_initializer_lists",
		[h]="generalized initializer lists are incompatible with C++98",
		[b]="generalized initializer lists are incompatible with C++98",
		[f]=j,
		[g]="generalized initializer lists are incompatible with C\\+\\+98",
		[e]=B,
		[a]=F,
		[d]={wb,1318655374,sb,rb},
		[c]={{"clang/lib/Parse/ParseCXXInlineMethods.cpp",395,"void Parser::ParseLexedMethodDeclaration(LateParsedMethodDeclaration &LM) {\n  // ...\n  for (unsigned I = 0, N = LM.DefaultArgs.size(); I != N; ++I) {\n    // ...\n    if (Toks) {\n      // ...\n      if (getLangOpts().CPlusPlus11 && Tok.is(tok::l_brace)) {\n        Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists);"},{Vb,2612,"Decl *Parser::ParseDeclarationAfterDeclaratorAndAttributes(Declarator &D, const ParsedTemplateInfo &TemplateInfo, ForRangeInit *FRI) {\n  // ...\n  case InitKind::CXXBraced: {\n    // ...\n    Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists);"},{Vb,7466,"/// ParseParameterDeclarationClause - Parse a (possibly empty) parameter-list\n/// after the opening parenthesis. This function will not parse a K&R-style\n/// identifier list.\n///\n/// DeclContext is the context of the declarator being parsed.  If FirstArgAttrs\n/// is non-null, then the caller parsed those attributes immediately after the\n/// open paren - they will be applied to the DeclSpec of the first parameter.\n///\n/// After returning, ParamInfo will hold the parsed parameters. EllipsisLoc will\n/// be the location of the ellipsis, if any was parsed.\n///\n///       parameter-type-list: [C99 6.7.5]\n///         parameter-list\n///         parameter-list \',\' \'...\'\n/// [C++]   parameter-list \'...\'\n///\n///       parameter-list: [C99 6.7.5]\n///         parameter-declaration\n///         parameter-list \',\' parameter-declaration\n///\n///       parameter-declaration: [C99 6.7.5]\n///         declaration-specifiers declarator\n/// [C++]   declaration-specifiers declarator \'=\' assignment-expression\n/// [C++11]                                       initializer-clause\n/// [GNU]   declaration-specifiers declarator attributes\n///         declaration-specifiers abstract-declarator[opt]\n/// [C++]   declaration-specifiers abstract-declarator[opt]\n///           \'=\' assignment-expression\n/// [GNU]   declaration-specifiers abstract-declarator[opt] attributes\n/// [C++11] attribute-specifier-seq parameter-declaration\n///\nvoid Parser::ParseParameterDeclarationClause(DeclaratorContext DeclaratorCtx, ParsedAttributes &FirstArgAttrs, SmallVectorImpl<DeclaratorChunk::ParamInfo> &ParamInfo, SourceLocation &EllipsisLoc, bool IsACXXFunctionDeclaration) {\n  // ...\n  do {\n    // ...\n    // If no parameter was specified, verify that *something* was specified,\n    // otherwise we have a missing type and identifier.\n    if (DS.isEmpty() && ParmDeclarator.getIdentifier() == nullptr && ParmDeclarator.getNumTypeObjects() == 0) {\n    // ...\n    } else {\n      // ...\n      // Parse the default argument, if any. We parse the default\n      // arguments in all dialects; the semantic analysis in\n      // ActOnParamDefaultArgument will reject the default argument in\n      // C.\n      if (Tok.is(tok::equal)) {\n        // ...\n        // Parse the default argument\n        if (DeclaratorCtx == DeclaratorContext::Member) {\n        // ...\n        } else {\n          // ...\n          if (getLangOpts().CPlusPlus11 && Tok.is(tok::l_brace)) {\n            Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists);"},{gb,3833,"/// ParseMemInitializer - Parse a C++ member initializer, which is\n/// part of a constructor initializer that explicitly initializes one\n/// member or base class (C++ [class.base.init]). See\n/// ParseConstructorInitializer for an example.\n///\n/// [C++] mem-initializer:\n///         mem-initializer-id \'(\' expression-list[opt] \')\'\n/// [C++0x] mem-initializer-id braced-init-list\n///\n/// [C++] mem-initializer-id:\n///         \'::\'[opt] nested-name-specifier[opt] class-name\n///         identifier\nMemInitResult Parser::ParseMemInitializer(Decl *ConstructorDecl) {\n  // ...\n  // Parse the \'(\'.\n  if (getLangOpts().CPlusPlus11 && Tok.is(tok::l_brace)) {\n    Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists);"},{jc,603,"/// Parse a binary expression that starts with \\p LHS and has a\n/// precedence of at least \\p MinPrec.\nExprResult Parser::ParseRHSOfBinaryExpression(ExprResult LHS, prec::Level MinPrec) {\n  // ...\n  while (true) {\n    // ...\n    if (!RHS.isInvalid() && RHSIsInitList) {\n      if (ThisPrec == prec::Assignment) {\n        Diag(OpToken, diag::warn_cxx98_compat_generalized_initializer_lists) << Actions.getExprRange(RHS.get());"},{jc,1593,"#include \"clang/Basic/OpenCLImageTypes.def\"\n  {\n    // ...\n    if (Tok.is(tok::l_brace))\n      Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists);"},{jc,1958,"/// Once the leading part of a postfix-expression is parsed, this\n/// method parses any suffixes that apply.\n///\n/// \\verbatim\n///       postfix-expression: [C99 6.5.2]\n///         primary-expression\n///         postfix-expression \'[\' expression \']\'\n///         postfix-expression \'[\' braced-init-list \']\'\n///         postfix-expression \'[\' expression-list [opt] \']\'  [C++23 12.4.5]\n///         postfix-expression \'(\' argument-expression-list[opt] \')\'\n///         postfix-expression \'.\' identifier\n///         postfix-expression \'->\' identifier\n///         postfix-expression \'++\'\n///         postfix-expression \'--\'\n///         \'(\' type-name \')\' \'{\' initializer-list \'}\'\n///         \'(\' type-name \')\' \'{\' initializer-list \',\' \'}\'\n///\n///       argument-expression-list: [C99 6.5.2]\n///         argument-expression ...[opt]\n///         argument-expression-list \',\' assignment-expression ...[opt]\n/// \\endverbatim\nExprResult Parser::ParsePostfixExpressionSuffix(ExprResult LHS) {\n  // ...\n  while (true) {\n    // ...\n    case tok::l_square: { // postfix-expression: p-e \'[\' expression \']\'\n      // ...\n      // We try to parse a list of indexes in all language mode first\n      // and, in we find 0 or one index, we try to parse an OpenMP array\n      // section. This allow us to support C++23 multi dimensional subscript and\n      // OpenMp sections in the same language mode.\n      if (!getLangOpts().OpenMP || Tok.isNot(tok::colon)) {\n        if (!getLangOpts().CPlusPlus23) {\n          // ...\n          if (getLangOpts().CPlusPlus11 && Tok.is(tok::l_brace)) {\n            Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists);"},{jc,3496,"/// ParseExpressionList - Used for C/C++ (argument-)expression-list.\n///\n/// \\verbatim\n///       argument-expression-list:\n///         assignment-expression\n///         argument-expression-list , assignment-expression\n///\n/// [C++] expression-list:\n/// [C++]   assignment-expression\n/// [C++]   expression-list , assignment-expression\n///\n/// [C++0x] expression-list:\n/// [C++0x]   initializer-list\n///\n/// [C++0x] initializer-list\n/// [C++0x]   initializer-clause ...[opt]\n/// [C++0x]   initializer-list , initializer-clause ...[opt]\n///\n/// [C++0x] initializer-clause:\n/// [C++0x]   assignment-expression\n/// [C++0x]   braced-init-list\n/// \\endverbatim\nbool Parser::ParseExpressionList(SmallVectorImpl<Expr *> &Exprs, llvm::function_ref<void()> ExpressionStarts, bool FailImmediatelyOnInvalidExpr, bool EarlyTypoCorrection) {\n  // ...\n  while (true) {\n    // ...\n    if (getLangOpts().CPlusPlus11 && Tok.is(tok::l_brace)) {\n      Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists);"},{Lb,2194,"/// ParseCXXCondition - if/switch/while condition expression.\n///\n///       condition:\n///         expression\n///         type-specifier-seq declarator \'=\' assignment-expression\n/// [C++11] type-specifier-seq declarator \'=\' initializer-clause\n/// [C++11] type-specifier-seq declarator braced-init-list\n/// [Clang] type-specifier-seq ref-qualifier[opt] \'[\' identifier-list \']\'\n///             brace-or-equal-initializer\n/// [GNU]   type-specifier-seq declarator simple-asm-expr[opt] attributes[opt]\n///             \'=\' assignment-expression\n///\n/// In C++1z, a condition may in some contexts be preceded by an\n/// optional init-statement. This function will parse that too.\n///\n/// \\param InitStmt If non-null, an init-statement is permitted, and if present\n/// will be parsed and stored here.\n///\n/// \\param Loc The location of the start of the statement that requires this\n/// condition, e.g., the \"for\" in a for loop.\n///\n/// \\param MissingOK Whether an empty condition is acceptable here. Otherwise\n/// it is considered an error to be recovered from.\n///\n/// \\param FRI If non-null, a for range declaration is permitted, and if\n/// present will be parsed and stored here, and a null result will be returned.\n///\n/// \\param EnterForConditionScope If true, enter a continue/break scope at the\n/// appropriate moment for a \'for\' loop.\n///\n/// \\returns The parsed condition.\nSema::ConditionResult Parser::ParseCXXCondition(StmtResult *InitStmt, SourceLocation Loc, Sema::ConditionKind CK, bool MissingOK, ForRangeInfo *FRI, bool EnterForConditionScope) {\n  // ...\n  if (getLangOpts().CPlusPlus11 && Tok.is(tok::l_brace)) {\n    Diag(Tok.getLocation(), diag::warn_cxx98_compat_generalized_initializer_lists);"},{Lb,3293,"/// ParseCXXNewExpression - Parse a C++ new-expression. New is used to allocate\n/// memory in a typesafe manner and call constructors.\n///\n/// This method is called to parse the new expression after the optional :: has\n/// been already parsed.  If the :: was present, \"UseGlobal\" is true and \"Start\"\n/// is its location.  Otherwise, \"Start\" is the location of the \'new\' token.\n///\n///        new-expression:\n///                   \'::\'[opt] \'new\' new-placement[opt] new-type-id\n///                                     new-initializer[opt]\n///                   \'::\'[opt] \'new\' new-placement[opt] \'(\' type-id \')\'\n///                                     new-initializer[opt]\n///\n///        new-placement:\n///                   \'(\' expression-list \')\'\n///\n///        new-type-id:\n///                   type-specifier-seq new-declarator[opt]\n/// [GNU]             attributes type-specifier-seq new-declarator[opt]\n///\n///        new-declarator:\n///                   ptr-operator new-declarator[opt]\n///                   direct-new-declarator\n///\n///        new-initializer:\n///                   \'(\' expression-list[opt] \')\'\n/// [C++0x]           braced-init-list\n///\nExprResult Parser::ParseCXXNewExpression(bool UseGlobal, SourceLocation Start) {\n  // ...\n  if (Tok.is(tok::l_paren)) {\n  // ...\n  } else if (Tok.is(tok::l_brace) && getLangOpts().CPlusPlus11) {\n    Diag(Tok.getLocation(), diag::warn_cxx98_compat_generalized_initializer_lists);"},{"clang/lib/Parse/ParseObjc.cpp",3278,"/// Parse the remainder of an Objective-C message following the\n/// \'[\' objc-receiver.\n///\n/// This routine handles sends to super, class messages (sent to a\n/// class name), and instance messages (sent to an object), and the\n/// target is represented by \\p SuperLoc, \\p ReceiverType, or \\p\n/// ReceiverExpr, respectively. Only one of these parameters may have\n/// a valid value.\n///\n/// \\param LBracLoc The location of the opening \'[\'.\n///\n/// \\param SuperLoc If this is a send to \'super\', the location of the\n/// \'super\' keyword that indicates a send to the superclass.\n///\n/// \\param ReceiverType If this is a class message, the type of the\n/// class we are sending a message to.\n///\n/// \\param ReceiverExpr If this is an instance message, the expression\n/// used to compute the receiver object.\n///\n///   objc-message-args:\n///     objc-selector\n///     objc-keywordarg-list\n///\n///   objc-keywordarg-list:\n///     objc-keywordarg\n///     objc-keywordarg-list objc-keywordarg\n///\n///   objc-keywordarg:\n///     selector-name[opt] \':\' objc-keywordexpr\n///\n///   objc-keywordexpr:\n///     nonempty-expr-list\n///\n///   nonempty-expr-list:\n///     assignment-expression\n///     nonempty-expr-list , assignment-expression\n///\nExprResult Parser::ParseObjCMessageExpressionBody(SourceLocation LBracLoc, SourceLocation SuperLoc, ParsedType ReceiverType, Expr *ReceiverExpr) {\n  // ...\n  if (Tok.is(tok::colon)) {\n    while (true) {\n      // ...\n      if (getLangOpts().CPlusPlus11 && Tok.is(tok::l_brace)) {\n        Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists);"},{"clang/lib/Parse/ParseOpenMP.cpp",511,"void Parser::ParseOpenMPReductionInitializerForDecl(VarDecl *OmpPrivParm) {\n  // Parse declarator \'=\' initializer.\n  // If a \'==\' or \'+=\' is found, suggest a fixit to \'=\'.\n  if (isTokenEqualOrEqualTypo()) {\n  // ...\n  } else if (Tok.is(tok::l_paren)) {\n  // ...\n  } else if (getLangOpts().CPlusPlus11 && Tok.is(tok::l_brace)) {\n    // ...\n    Diag(Tok, diag::warn_cxx98_compat_generalized_initializer_lists);"},{tc,2398,"/// ParseReturnStatement\n///       jump-statement:\n///         \'return\' expression[opt] \';\'\n///         \'return\' braced-init-list \';\'\n///         \'co_return\' expression[opt] \';\'\n///         \'co_return\' braced-init-list \';\'\nStmtResult Parser::ParseReturnStatement() {\n  // ...\n  if (Tok.isNot(tok::semi)) {\n    // ...\n    if (Tok.is(tok::l_brace) && getLangOpts().CPlusPlus) {\n      // ...\n      if (R.isUsable())\n        Diag(R.get()->getBeginLoc(), getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_generalized_initializer_lists : diag::ext_generalized_initializer_lists) << R.get()->getSourceRange();"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:63:22: warning: generalized initializer lists are incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:65:17: warning: generalized initializer lists are incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:67:12: warning: generalized initializer lists are incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:69:9: warning: generalized initializer lists are incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:71:5: warning: generalized initializer lists are incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:80:10: warning: generalized initializer lists are incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:83:18: warning: generalized initializer lists are incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_goto_into_protected_scope"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_goto_into_protected_scope",
		[h]="jump from this goto statement to its label is incompatible with C++98",
		[b]="jump from this goto statement to its label is incompatible with C++98",
		[f]=j,
		[g]="jump from this goto statement to its label is incompatible with C\\+\\+98",
		[e]=B,
		[a]=r,
		[d]={"fe2750db42c0",1319146932,"Add -Wc++98-compat diagnostics for jumps which bypass initialization of non-POD","Add -Wc++98-compat diagnostics for jumps which bypass initialization of non-POD\nbut trivially constructible and destructible variables in C++11 mode. Also\nincidentally improve the precision of the wording for jump diagnostics in C++98\nmode.\n\nllvm-svn: 142619"},
		[c]={{"clang/lib/Sema/JumpDiagnostics.cpp",668,"/// VerifyJumps - Verify each element of the Jumps array to see if they are\n/// valid, emitting diagnostics if not.\nvoid JumpScopeChecker::VerifyJumps() {\n  while (!Jumps.empty()) {\n    // ...\n    // With a goto,\n    if (GotoStmt *GS = dyn_cast<GotoStmt>(Jump)) {\n      // The label may not have a statement if it\'s coming from inline MS ASM.\n      if (GS->getLabel()->getStmt()) {\n        CheckJump(GS, GS->getLabel()->getStmt(), GS->getGotoLoc(), diag::err_goto_into_protected_scope, diag::ext_goto_into_protected_scope, diag::warn_cxx98_compat_goto_into_protected_scope);"},{"clang/lib/Sema/JumpDiagnostics.cpp",696,"/// VerifyJumps - Verify each element of the Jumps array to see if they are\n/// valid, emitting diagnostics if not.\nvoid JumpScopeChecker::VerifyJumps() {\n  while (!Jumps.empty()) {\n    // ...\n    // We only get indirect gotos here when they have a constant target.\n    if (IndirectGotoStmt *IGS = dyn_cast<IndirectGotoStmt>(Jump)) {\n      // ...\n      CheckJump(IGS, Target->getStmt(), IGS->getGotoLoc(), diag::err_goto_into_protected_scope, diag::ext_goto_into_protected_scope, diag::warn_cxx98_compat_goto_into_protected_scope);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:275:3: warning: jump from this goto statement to its label is incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_indirect_goto_in_protected_scope"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_indirect_goto_in_protected_scope",
		[h]={{nil,t,"jump from this %select{indirect|asm}0 goto statement to one of its possible targets is incompatible with C++98"},{v,nil,"jump from this indirect goto statement to one of its possible targets is incompatible with C++98"}},
		[b]={{nil,t,{"jump from this ",{"indirect","asm"}," goto statement to one of its possible targets is incompatible with C++98"}},{v,nil,"jump from this indirect goto statement to one of its possible targets is incompatible with C++98"}},
		[f]=j,
		[g]="jump from this (?:indirect|asm) goto statement to one of its possible targets is incompatible with C\\+\\+98",
		[e]=B,
		[a]=r,
		[d]={"fe2750db42c0",1319146932,"Add -Wc++98-compat diagnostics for jumps which bypass initialization of non-POD","Add -Wc++98-compat diagnostics for jumps which bypass initialization of non-POD\nbut trivially constructible and destructible variables in C++11 mode. Also\nincidentally improve the precision of the wording for jump diagnostics in C++98\nmode.\n\nllvm-svn: 142619"},
		[c]={{"clang/lib/Sema/JumpDiagnostics.cpp",911,"/// Diagnose an indirect jump which is known to cross scopes.\nvoid JumpScopeChecker::DiagnoseIndirectOrAsmJump(Stmt *Jump, unsigned JumpScope, LabelDecl *Target, unsigned TargetScope) {\n  // ...\n  // Diagnose this jump if it would be ill-formed in C++98.\n  if (!Diagnosed && !ToScopesCXX98Compat.empty()) {\n    // ...\n    S.Diag(Jump->getBeginLoc(), diag::warn_cxx98_compat_indirect_goto_in_protected_scope) << IsAsmGoto;"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:280:3: warning: jump from this indirect goto statement to one of its possible targets is incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_initializer_list_init"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_initializer_list_init",
		[h]="initialization of initializer_list object is incompatible with C++98",
		[b]="initialization of initializer_list object is incompatible with C++98",
		[f]=j,
		[g]="initialization of initializer_list object is incompatible with C\\+\\+98",
		[e]=B,
		[a]=r,
		[d]={"2b349aee5b6f",1334818680,"Add missing -Wc++98-compat warnings for initializer list initializations which","Add missing -Wc++98-compat warnings for initializer list initializations which\ninitialize references, create std::initializer_list objects, or call constructors.\n\nllvm-svn: 155105"},
		[c]={{ob,9269,"ExprResult InitializationSequence::Perform(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Args, QualType *ResultType) {\n  // ...\n  for (step_iterator Step = step_begin(), StepEnd = step_end(); Step != StepEnd; ++Step) {\n    // ...\n    case SK_StdInitializerList: {\n      S.Diag(CurInit.get()->getExprLoc(), diag::warn_cxx98_compat_initializer_list_init) << CurInit.get()->getSourceRange();"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:72:35: warning: initialization of initializer_list object is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:73:13: warning: initialization of initializer_list object is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:77:22: warning: initialization of initializer_list object is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:115:18: warning: initialization of initializer_list object is incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_inline_namespace"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_inline_namespace",
		[h]="inline namespaces are incompatible with C++98",
		[b]="inline namespaces are incompatible with C++98",
		[f]=j,
		[g]="inline namespaces are incompatible with C\\+\\+98",
		[e]=B,
		[a]=F,
		[d]={wb,1318655374,sb,rb},
		[c]={{gb,224,"/// ParseNamespace - We know that the current token is a namespace keyword. This\n/// may either be a top level namespace or a block-level namespace alias. If\n/// there was an inline keyword, it has already been parsed.\n///\n///       namespace-definition: [C++: namespace.def]\n///         named-namespace-definition\n///         unnamed-namespace-definition\n///         nested-namespace-definition\n///\n///       named-namespace-definition:\n///         \'inline\'[opt] \'namespace\' attributes[opt] identifier \'{\'\n///         namespace-body \'}\'\n///\n///       unnamed-namespace-definition:\n///         \'inline\'[opt] \'namespace\' attributes[opt] \'{\' namespace-body \'}\'\n///\n///       nested-namespace-definition:\n///         \'namespace\' enclosing-namespace-specifier \'::\' \'inline\'[opt]\n///         identifier \'{\' namespace-body \'}\'\n///\n///       enclosing-namespace-specifier:\n///         identifier\n///         enclosing-namespace-specifier \'::\' \'inline\'[opt] identifier\n///\n///       namespace-alias-definition:  [C++ 7.3.2: namespace.alias]\n///         \'namespace\' identifier \'=\' qualified-namespace-specifier \';\'\n///\nParser::DeclGroupPtrTy Parser::ParseNamespace(DeclaratorContext Context, SourceLocation &DeclEnd, SourceLocation InlineLoc) {\n  // ...\n  // If we\'re still good, complain about inline namespaces in non-C++0x now.\n  if (InlineLoc.isValid())\n    Diag(InlineLoc, getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_inline_namespace : diag::ext_inline_namespace);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:140:1: warning: inline namespaces are incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_lambda"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_lambda",
		[h]="lambda expressions are incompatible with C++98",
		[b]="lambda expressions are incompatible with C++98",
		[f]=j,
		[g]="lambda expressions are incompatible with C\\+\\+98",
		[e]=B,
		[a]=F,
		[d]={wb,1318655374,sb,rb},
		[c]={{Lb,1275,"/// ParseLambdaExpressionAfterIntroducer - Parse the rest of a lambda\n/// expression.\nExprResult Parser::ParseLambdaExpressionAfterIntroducer(LambdaIntroducer &Intro) {\n  // ...\n  Diag(LambdaBeginLoc, diag::warn_cxx98_compat_lambda);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:50:3: warning: lambda expressions are incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:52:3: warning: lambda expressions are incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_less_colon_colon"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_less_colon_colon",
		[h]="\'<::\' is treated as digraph \'<:\' (aka \'[\') followed by \':\' in C++98",
		[b]="\'<::\' is treated as digraph \'<:\' (aka \'[\') followed by \':\' in C++98",
		[f]=j,
		[g]="\'\\<\\:\\:\' is treated as digraph \'\\<\\:\' \\(aka \'\\[\'\\) followed by \'\\:\' in C\\+\\+98",
		[e]=B,
		[a]=Z,
		[d]={Ac,1318641536,wc,xc},
		[c]={{nb,4149,"LexStart:\n  // ...\n  case \'<\':\n    // ...\n    if (ParsingFilename) {\n    // ...\n    } else if (Char == \'<\') {\n    // ...\n    } else if (Char == \'=\') {\n    // ...\n    } else if (LangOpts.Digraphs && Char == \':\') { // \'<:\' -> \'[\'\n      if (LangOpts.CPlusPlus11 && getCharAndSize(CurPtr + SizeTmp, SizeTmp2) == \':\') {\n        // ...\n        if (After != \':\' && After != \'>\') {\n          // ...\n          if (!isLexingRawMode())\n            Diag(BufferPtr, diag::warn_cxx98_compat_less_colon_colon);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:45:4: warning: \'<::\' is treated as digraph \'<:\' (aka \'[\') followed by \':\' in C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_literal_operator"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_literal_operator",
		[h]="literal operators are incompatible with C++98",
		[b]="literal operators are incompatible with C++98",
		[f]=j,
		[g]="literal operators are incompatible with C\\+\\+98",
		[e]=B,
		[a]=F,
		[d]={wb,1318655374,sb,rb},
		[c]={{Lb,2726,"#include \"clang/Basic/OperatorKinds.def\"\n  // ...\n  if (getLangOpts().CPlusPlus11 && isTokenStringLiteral()) {\n    Diag(Tok.getLocation(), diag::warn_cxx98_compat_literal_operator);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:87:13: warning: literal operators are incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_literal_ucn_control_character"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_literal_ucn_control_character",
		[h]="universal character name referring to a control character is incompatible with C++98",
		[b]="universal character name referring to a control character is incompatible with C++98",
		[f]=j,
		[g]="universal character name referring to a control character is incompatible with C\\+\\+98",
		[e]=B,
		[a]=Z,
		[d]={"2a70e65436c7",1331332071,"Improve diagnostics for UCNs referring to control characters and members of the","Improve diagnostics for UCNs referring to control characters and members of the\nbasic source character set in C++98. Add -Wc++98-compat diagnostics for same in\nliterals in C++11. Extend such support to cover string literals as well as\ncharacter literals, and mark N2170 as done.\n\nThis seems too minor to warrant a release note to me. Let me know if you disagree.\n\nllvm-svn: 152444"},
		[c]={{Ec,686,"/// ProcessUCNEscape - Read the Universal Character Name, check constraints and\n/// return the UTF32.\nstatic bool ProcessUCNEscape(const char *ThisTokBegin, const char *&ThisTokBuf, const char *ThisTokEnd, uint32_t &UcnVal, unsigned short &UcnLen, FullSourceLoc Loc, DiagnosticsEngine *Diags, const LangOptions &Features, bool in_char_string_literal = false) {\n  // ...\n  // C2x and C++11 allow UCNs that refer to control characters\n  // and basic source characters inside character and string literals\n  if (UcnVal < 0xa0 &&\n    // ...\n    if (Diags) {\n      // ...\n      if (UcnVal >= 0x20 && UcnVal < 0x7f)\n      // ...\n      else\n        Diag(Diags, Features, Loc, ThisTokBegin, UcnBegin, ThisTokBuf, IsError ? diag::err_ucn_control_character : Features.CPlusPlus ? diag::warn_cxx98_compat_literal_ucn_control_character : diag::warn_c2x_compat_literal_ucn_control_character);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:301:14: warning: universal character name referring to a control character is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:304:28: warning: universal character name referring to a control character is incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_literal_ucn_escape_basic_scs"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_literal_ucn_escape_basic_scs",
		[h]="specifying character \'%0\' with a universal character name is incompatible with C++98",
		[b]="specifying character \'A\' with a universal character name is incompatible with C++98",
		[f]=j,
		[g]="specifying character \'(.*?)\' with a universal character name is incompatible with C\\+\\+98",
		[e]=B,
		[a]=Z,
		[d]={"2a70e65436c7",1331332071,"Improve diagnostics for UCNs referring to control characters and members of the","Improve diagnostics for UCNs referring to control characters and members of the\nbasic source character set in C++98. Add -Wc++98-compat diagnostics for same in\nliterals in C++11. Extend such support to cover string literals as well as\ncharacter literals, and mark N2170 as done.\n\nThis seems too minor to warrant a release note to me. Let me know if you disagree.\n\nllvm-svn: 152444"},
		[c]={{Ec,679,"/// ProcessUCNEscape - Read the Universal Character Name, check constraints and\n/// return the UTF32.\nstatic bool ProcessUCNEscape(const char *ThisTokBegin, const char *&ThisTokBuf, const char *ThisTokEnd, uint32_t &UcnVal, unsigned short &UcnLen, FullSourceLoc Loc, DiagnosticsEngine *Diags, const LangOptions &Features, bool in_char_string_literal = false) {\n  // ...\n  // C2x and C++11 allow UCNs that refer to control characters\n  // and basic source characters inside character and string literals\n  if (UcnVal < 0xa0 &&\n    // ...\n    if (Diags) {\n      // ...\n      if (UcnVal >= 0x20 && UcnVal < 0x7f)\n        Diag(Diags, Features, Loc, ThisTokBegin, UcnBegin, ThisTokBuf, IsError ? diag::err_ucn_escape_basic_scs : Features.CPlusPlus ? diag::warn_cxx98_compat_literal_ucn_escape_basic_scs : diag::warn_c2x_compat_literal_ucn_escape_basic_scs) << StringRef(&BasicSCSChar, 1);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:302:18: warning: specifying character \'A\' with a universal character name is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:303:24: warning: specifying character \'1\' with a universal character name is incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_longlong"]={
		[l]={n},
		[k]=n,
		[i]="warn_cxx98_compat_longlong",
		[h]="\'long long\' is incompatible with C++98",
		[b]="\'long long\' is incompatible with C++98",
		[f]=j,
		[g]="\'long long\' is incompatible with C\\+\\+98",
		[e]=kc,
		[a]=A,
		[d]={Ac,1318641536,wc,xc},
		[c]={{"clang/lib/Lex/PPExpressions.cpp",322,"/// EvaluateValue - Evaluate the token PeekTok (and any others needed) and\n/// return the computed value in Result.  Return true if there was an error\n/// parsing.  This function also returns information about the form of the\n/// expression in DT.  See above for information on what DT means.\n///\n/// If ValueLive is false, then this value is being evaluated in a context where\n/// the result is not used.  As such, avoid diagnostics that relate to\n/// evaluation.\nstatic bool EvaluateValue(PPValue &Result, Token &PeekTok, DefinedTracker &DT, bool ValueLive, Preprocessor &PP) {\n  // ...\n  case tok::numeric_constant: {\n    // ...\n    // \'long long\' is a C99 or C++11 feature.\n    if (!PP.getLangOpts().C99 && Literal.isLongLong) {\n      if (PP.getLangOpts().CPlusPlus)\n        PP.Diag(PeekTok, PP.getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_longlong : diag::ext_cxx11_longlong);"},{hb,4226,"ExprResult Sema::ActOnNumericConstant(const Token &Tok, Scope *UDLScope) {\n  // ...\n  if (Literal.isFixedPointLiteral()) {\n  // ...\n  } else if (Literal.isFloatingLiteral()) {\n  // ...\n  } else if (!Literal.isIntegerLiteral()) {\n  // ...\n  } else {\n    // ...\n    if (Literal.GetIntegerValue(ResultVal)) {\n    // ...\n    } else {\n      // ...\n      // Check long long if needed.\n      if (Ty.isNull() && !Literal.isSizeT) {\n        // ...\n        // Does it fit in a unsigned long long?\n        if (ResultVal.isIntN(LongLongSize)) {\n          // ...\n          // \'long long\' is a C99 or C++11 feature, whether the literal\n          // explicitly specified \'long long\' or we needed the extra width.\n          if (getLangOpts().CPlusPlus)\n            Diag(Tok.getLocation(), getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_longlong : diag::ext_cxx11_longlong);"},{Pb,1411,"/// Convert the specified declspec to the appropriate type\n/// object.\n/// \\param state Specifies the declarator containing the declaration specifier\n/// to be converted, along with other associated processing state.\n/// \\returns The type described by the declaration specifiers.  This function\n/// never returns null.\nstatic QualType ConvertDeclSpecToType(TypeProcessingState &state) {\n  // ...\n  case DeclSpec::TST_int: {\n    if (DS.getTypeSpecSign() != TypeSpecifierSign::Unsigned) {\n      // ...\n      case TypeSpecifierWidth::LongLong:\n        // ...\n        // \'long long\' is a C99 or C++11 feature.\n        if (!S.getLangOpts().C99) {\n          if (S.getLangOpts().CPlusPlus)\n            S.Diag(DS.getTypeSpecWidthLoc(), S.getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_longlong : diag::ext_cxx11_longlong);"},{Pb,1436,"/// Convert the specified declspec to the appropriate type\n/// object.\n/// \\param state Specifies the declarator containing the declaration specifier\n/// to be converted, along with other associated processing state.\n/// \\returns The type described by the declaration specifiers.  This function\n/// never returns null.\nstatic QualType ConvertDeclSpecToType(TypeProcessingState &state) {\n  // ...\n  case DeclSpec::TST_int: {\n    if (DS.getTypeSpecSign() != TypeSpecifierSign::Unsigned) {\n    // ...\n    } else {\n      // ...\n      case TypeSpecifierWidth::LongLong:\n        // ...\n        // \'long long\' is a C99 or C++11 feature.\n        if (!S.getLangOpts().C99) {\n          if (S.getLangOpts().CPlusPlus)\n            S.Diag(DS.getTypeSpecWidthLoc(), S.getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_longlong : diag::ext_cxx11_longlong);"}},
		[m]={
			["clang/test/Sema/vector-gcc-compat.cpp"]={"clang/test/Sema/vector-gcc-compat.cpp:7:9: warning: \'long long\' is incompatible with C++98 [-Wc++98-compat-pedantic]","clang/test/Sema/vector-gcc-compat.cpp:12:18: warning: \'long long\' is incompatible with C++98 [-Wc++98-compat-pedantic]","clang/test/Sema/vector-gcc-compat.cpp:25:50: warning: \'long long\' is incompatible with C++98 [-Wc++98-compat-pedantic]","clang/test/Sema/vector-gcc-compat.cpp:27:37: warning: \'long long\' is incompatible with C++98 [-Wc++98-compat-pedantic]","clang/test/Sema/vector-gcc-compat.cpp:29:42: warning: \'long long\' is incompatible with C++98 [-Wc++98-compat-pedantic]","clang/test/Sema/vector-gcc-compat.cpp:31:35: warning: \'long long\' is incompatible with C++98 [-Wc++98-compat-pedantic]","clang/test/Sema/vector-gcc-compat.cpp:32:43: warning: \'long long\' is incompatible with C++98 [-Wc++98-compat-pedantic]","clang/test/Sema/vector-gcc-compat.cpp:34:36: warning: \'long long\' is incompatible with C++98 [-Wc++98-compat-pedantic]","clang/test/Sema/vector-gcc-compat.cpp:123:25: warning: \'long long\' is incompatible with C++98 [-Wc++98-compat-pedantic]","clang/test/Sema/vector-gcc-compat.cpp:154:37: warning: \'long long\' is incompatible with C++98 [-Wc++98-compat-pedantic]","clang/test/Sema/vector-gcc-compat.cpp:169:50: warning: \'long long\' is incompatible with C++98 [-Wc++98-compat-pedantic]","clang/test/Sema/vector-gcc-compat.cpp:184:42: warning: \'long long\' is incompatible with C++98 [-Wc++98-compat-pedantic]","clang/test/Sema/vector-gcc-compat.cpp:212:35: warning: \'long long\' is incompatible with C++98 [-Wc++98-compat-pedantic]","clang/test/Sema/vector-gcc-compat.cpp:240:43: warning: \'long long\' is incompatible with C++98 [-Wc++98-compat-pedantic]","clang/test/Sema/vector-gcc-compat.cpp:268:36: warning: \'long long\' is incompatible with C++98 [-Wc++98-compat-pedantic]","clang/test/Sema/vector-gcc-compat.cpp:309:35: warning: \'long long\' is incompatible with C++98 [-Wc++98-compat-pedantic]"}
		}
	},
	["warn_cxx98_compat_no_newline_eof"]={
		[l]={n},
		[k]=n,
		[i]="warn_cxx98_compat_no_newline_eof",
		[h]="C++98 requires newline at end of file",
		[b]="C++98 requires newline at end of file",
		[f]=j,
		[g]="C\\+\\+98 requires newline at end of file",
		[e]=kc,
		[a]=Z,
		[d]={"e83c731cad30",1334288603,"Support -Wc++98-compat-pedantic as requested:","Support -Wc++98-compat-pedantic as requested:\n\nhttp://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20120409/056126.html\n\nllvm-svn: 154655"},
		[c]={{nb,3052,"/// LexEndOfFile - CurPtr points to the end of this file.  Handle this\n/// condition, reporting diagnostics and handling other edge cases as required.\n/// This returns true if Result contains a token, false if PP.Lex should be\n/// called again.\nbool Lexer::LexEndOfFile(Token &Result, const char *CurPtr) {\n  // ...\n  // C99 5.1.1.2p2: If the file is non-empty and didn\'t end in a newline, issue\n  // a pedwarn.\n  if (CurPtr != BufferStart && (CurPtr[-1] != \'\\n\' && CurPtr[-1] != \'\\r\')) {\n    // ...\n    if (LangOpts.CPlusPlus11) {\n      // ...\n      if (!Diags.isIgnored(diag::warn_cxx98_compat_no_newline_eof, EndLoc)) {"},{nb,3053,"/// LexEndOfFile - CurPtr points to the end of this file.  Handle this\n/// condition, reporting diagnostics and handling other edge cases as required.\n/// This returns true if Result contains a token, false if PP.Lex should be\n/// called again.\nbool Lexer::LexEndOfFile(Token &Result, const char *CurPtr) {\n  // ...\n  // C99 5.1.1.2p2: If the file is non-empty and didn\'t end in a newline, issue\n  // a pedwarn.\n  if (CurPtr != BufferStart && (CurPtr[-1] != \'\\n\' && CurPtr[-1] != \'\\r\')) {\n    // ...\n    if (LangOpts.CPlusPlus11) {\n      // C++11 [lex.phases] 2.2 p2\n      // Prefer the C++98 pedantic compatibility warning over the generic,\n      // non-extension, user-requested \"missing newline at EOF\" warning.\n      if (!Diags.isIgnored(diag::warn_cxx98_compat_no_newline_eof, EndLoc)) {\n        DiagID = diag::warn_cxx98_compat_no_newline_eof;"}},
		[m]={
			["clang/test/Lexer/newline-eof-c++98-compat.cpp"]={"clang/test/Lexer/newline-eof-c++98-compat.cpp:5:75: warning: C++98 requires newline at end of file [-Wc++98-compat-pedantic]"}
		}
	},
	["warn_cxx98_compat_noexcept_decl"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_noexcept_decl",
		[h]="noexcept specifications are incompatible with C++98",
		[b]="noexcept specifications are incompatible with C++98",
		[f]=j,
		[g]="noexcept specifications are incompatible with C\\+\\+98",
		[e]=B,
		[a]=F,
		[d]={sc,1318892780,pc,oc},
		[c]={{gb,3925,"/// Parse a C++ exception-specification if present (C++0x [except.spec]).\n///\n///       exception-specification:\n///         dynamic-exception-specification\n///         noexcept-specification\n///\n///       noexcept-specification:\n///         \'noexcept\'\n///         \'noexcept\' \'(\' constant-expression \')\'\nExceptionSpecificationType Parser::tryParseExceptionSpecification(bool Delayed, SourceRange &SpecificationRange, SmallVectorImpl<ParsedType> &DynamicExceptions, SmallVectorImpl<SourceRange> &DynamicExceptionRanges, ExprResult &NoexceptExpr, CachedTokens *&ExceptionSpecTokens) {\n  // ...\n  // Handle delayed parsing of exception-specifications.\n  if (Delayed) {\n    // ...\n    // Check for a \'(\'.\n    if (!Tok.is(tok::l_paren)) {\n      // If this is a bare \'noexcept\', we\'re done.\n      if (IsNoexcept) {\n        Diag(Tok, diag::warn_cxx98_compat_noexcept_decl);"},{gb,3960,"/// Parse a C++ exception-specification if present (C++0x [except.spec]).\n///\n///       exception-specification:\n///         dynamic-exception-specification\n///         noexcept-specification\n///\n///       noexcept-specification:\n///         \'noexcept\'\n///         \'noexcept\' \'(\' constant-expression \')\'\nExceptionSpecificationType Parser::tryParseExceptionSpecification(bool Delayed, SourceRange &SpecificationRange, SmallVectorImpl<ParsedType> &DynamicExceptions, SmallVectorImpl<SourceRange> &DynamicExceptionRanges, ExprResult &NoexceptExpr, CachedTokens *&ExceptionSpecTokens) {\n  // ...\n  Diag(Tok, diag::warn_cxx98_compat_noexcept_decl);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:152:18: warning: noexcept specifications are incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_noexcept_expr"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_noexcept_expr",
		[h]="noexcept expressions are incompatible with C++98",
		[b]="noexcept expressions are incompatible with C++98",
		[f]=j,
		[g]="noexcept expressions are incompatible with C\\+\\+98",
		[e]=B,
		[a]=F,
		[d]={sc,1318892780,pc,oc},
		[c]={{jc,1707,"#include \"clang/Basic/OpenCLImageTypes.def\"\n  // ...\n  case tok::kw_noexcept: { // [C++0x] \'noexcept\' \'(\' expression \')\'\n    // ...\n    Diag(Tok, diag::warn_cxx98_compat_noexcept_expr);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:153:23: warning: noexcept expressions are incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_non_static_member_use"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_non_static_member_use",
		[h]="use of non-static data member %0 in an unevaluated context is incompatible with C++98",
		[b]="use of non-static data member A in an unevaluated context is incompatible with C++98",
		[f]=j,
		[g]="use of non\\-static data member (.*?) in an unevaluated context is incompatible with C\\+\\+98",
		[e]=B,
		[a]=r,
		[d]={"2a986117e9ba",1330165259,"Fix r151443 to only apply C++11\'s exception for non-static data member access","Fix r151443 to only apply C++11\'s exception for non-static data member access\nin cases where we would otherwise disallow the access, and add a -Wc++98-compat\ndiagnostic for this C++11 feature.\n\nllvm-svn: 151444"},
		[c]={{"clang/lib/Sema/SemaExprMember.cpp",254,"/// Builds an expression which might be an implicit member expression.\nExprResult Sema::BuildPossibleImplicitMemberExpr(const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, LookupResult &R, const TemplateArgumentListInfo *TemplateArgs, const Scope *S, UnresolvedLookupExpr *AsULE) {\n  // ...\n  case IMA_Field_Uneval_Context:\n    Diag(R.getNameLoc(), diag::warn_cxx98_compat_non_static_member_use) << R.getLookupNameInfo().getName();"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:296:21: warning: use of non-static data member \'n\' in an unevaluated context is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:297:40: warning: use of non-static data member \'n\' in an unevaluated context is incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_nonclass_type_friend"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_nonclass_type_friend",
		[h]="non-class friend type %0 is incompatible with C++98",
		[b]="non-class friend type A is incompatible with C++98",
		[f]=j,
		[g]="non\\-class friend type (.*?) is incompatible with C\\+\\+98",
		[e]=B,
		[a]=r,
		[d]={"c82397332d13",1318973940,"-Wc++98-compat and -Wc++98-compat-pedantic warnings for Sema, part 2.","-Wc++98-compat and -Wc++98-compat-pedantic warnings for Sema, part 2.\n\nllvm-svn: 142426"},
		[c]={{K,17220,"/// Perform semantic analysis of the given friend type declaration.\n///\n/// \\returns A friend declaration that.\nFriendDecl *Sema::CheckFriendTypeDecl(SourceLocation LocStart, SourceLocation FriendLoc, TypeSourceInfo *TSInfo) {\n  // ...\n  // C++03 [class.friend]p2:\n  //   An elaborated-type-specifier shall be used in a friend declaration\n  //   for a class.*\n  //\n  //   * The class-key of the elaborated-type-specifier is required.\n  if (!CodeSynthesisContexts.empty()) {\n  // ...\n  } else {\n    if (!T->isElaboratedTypeSpecifier()) {\n      // If we evaluated the type to a record type, suggest putting\n      // a tag in front.\n      if (const RecordType *RT = T->getAs<RecordType>()) {\n      // ...\n      } else {\n        Diag(FriendLoc, getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_nonclass_type_friend : diag::ext_nonclass_type_friend) << T << TypeRange;"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:224:3: warning: non-class friend type \'int\' is incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_nonstatic_member_init"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_nonstatic_member_init",
		[h]={{nil,W,"default member initializer for non-static data members is incompatible with C++98"},{"11.1",nil,"in-class initialization of non-static data members is incompatible with C++98"}},
		[b]={{nil,W,"default member initializer for non-static data members is incompatible with C++98"},{"11.1",nil,"in-class initialization of non-static data members is incompatible with C++98"}},
		[f]=j,
		[g]="default member initializer for non\\-static data members is incompatible with C\\+\\+98",
		[e]=B,
		[a]=F,
		[d]={wb,1318655374,sb,rb},
		[c]={{gb,3102,"/// ParseCXXClassMemberDeclaration - Parse a C++ class member declaration.\n///\n///       member-declaration:\n///         decl-specifier-seq[opt] member-declarator-list[opt] \';\'\n///         function-definition \';\'[opt]\n///         ::[opt] nested-name-specifier template[opt] unqualified-id \';\'[TODO]\n///         using-declaration                                            [TODO]\n/// [C++0x] static_assert-declaration\n///         template-declaration\n/// [GNU]   \'__extension__\' member-declaration\n///\n///       member-declarator-list:\n///         member-declarator\n///         member-declarator-list \',\' member-declarator\n///\n///       member-declarator:\n///         declarator virt-specifier-seq[opt] pure-specifier[opt]\n/// [C++2a] declarator requires-clause\n///         declarator constant-initializer[opt]\n/// [C++11] declarator brace-or-equal-initializer[opt]\n///         identifier[opt] \':\' constant-expression\n///\n///       virt-specifier-seq:\n///         virt-specifier\n///         virt-specifier-seq virt-specifier\n///\n///       virt-specifier:\n///         override\n///         final\n/// [MS]    sealed\n///\n///       pure-specifier:\n///         \'= 0\'\n///\n///       constant-initializer:\n///         \'=\' constant-expression\n///\nParser::DeclGroupPtrTy Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS, ParsedAttributes &AccessAttrs, const ParsedTemplateInfo &TemplateInfo, ParsingDeclRAIIObject *TemplateDiags) {\n  // ...\n  while (true) {\n    // ...\n    // Handle the initializer.\n    if (HasInClassInit != ICIS_NoInit) {\n      // ...\n      Diag(Tok, getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_nonstatic_member_init : diag::ext_nonstatic_member_init);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:125:9: warning: default member initializer for non-static data members is incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_nontrivial_union_or_anon_struct_member"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_nontrivial_union_or_anon_struct_member",
		[h]={{nil,O,"%select{anonymous struct|union}0 member %1 with a non-trivial %select{default constructor|copy constructor|move constructor|copy assignment operator|move assignment operator|destructor}2 is incompatible with C++98"},{H,nil,"%select{anonymous struct|union}0 member %1 with a non-trivial %select{constructor|copy constructor|move constructor|copy assignment operator|move assignment operator|destructor}2 is incompatible with C++98"}},
		[b]={{nil,O,{{"anonymous struct",yc}," member B with a non-trivial ",{"default constructor",vd,wd,xd,pd,nc}," is incompatible with C++98"}},{H,nil,{{"anonymous struct",yc}," member B with a non-trivial ",{kb,vd,wd,xd,pd,nc}," is incompatible with C++98"}}},
		[f]=j,
		[g]="(?:anonymous struct|union) member (.*?) with a non\\-trivial (?:default constructor|copy constructor|move constructor|copy assignment operator|move assignment operator|destructor) is incompatible with C\\+\\+98",
		[e]=B,
		[a]=r,
		[d]={"f720df0ed64a",1319056911,"-Wc++98-compat: warn on nontrivial types used in unions and anonymous structs.","-Wc++98-compat: warn on nontrivial types used in unions and anonymous structs.\n\nllvm-svn: 142541"},
		[c]={{bb,18324,"bool Sema::CheckNontrivialField(FieldDecl *FD) {\n  // ...\n  if (const RecordType *RT = EltTy->getAs<RecordType>()) {\n    // ...\n    if (RDecl->getDefinition()) {\n      // ...\n      if (member != CXXInvalid) {\n        // ...\n        Diag(FD->getLocation(), getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_nontrivial_union_or_anon_struct_member : diag::err_illegal_union_or_anon_struct_member) << FD->getParent()->isUnion() << FD->getDeclName() << member;"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:250:17: warning: union member \'ntc\' with a non-trivial default constructor is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:251:17: warning: union member \'ntcp\' with a non-trivial copy constructor is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:252:17: warning: union member \'ntd\' with a non-trivial destructor is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:256:19: warning: anonymous struct member \'ntc\' with a non-trivial default constructor is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:257:19: warning: anonymous struct member \'ntcp\' with a non-trivial copy constructor is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:258:19: warning: anonymous struct member \'ntd\' with a non-trivial destructor is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:334:20: warning: union member \'it\' with a non-trivial copy constructor is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:349:7: warning: union member \'x\' with a non-trivial copy assignment operator is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:350:7: warning: union member \'y\' with a non-trivial copy assignment operator is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:361:7: warning: union member \'x\' with a non-trivial default constructor is incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_nullptr"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_nullptr",
		[h]="\'nullptr\' is incompatible with C++98",
		[b]="\'nullptr\' is incompatible with C++98",
		[f]=j,
		[g]="\'nullptr\' is incompatible with C\\+\\+98",
		[e]=B,
		[a]=F,
		[d]={sc,1318892780,pc,oc},
		[c]={{jc,1012,"/// Parse a cast-expression, or, if \\pisUnaryExpression is true, parse\n/// a unary-expression.\n///\n/// \\p isAddressOfOperand exists because an id-expression that is the operand\n/// of address-of gets special treatment due to member pointers. NotCastExpr\n/// is set to true if the token is not the start of a cast-expression, and no\n/// diagnostic is emitted in this case and no tokens are consumed.\n///\n/// \\verbatim\n///       cast-expression: [C99 6.5.4]\n///         unary-expression\n///         \'(\' type-name \')\' cast-expression\n///\n///       unary-expression:  [C99 6.5.3]\n///         postfix-expression\n///         \'++\' unary-expression\n///         \'--\' unary-expression\n/// [Coro]  \'co_await\' cast-expression\n///         unary-operator cast-expression\n///         \'sizeof\' unary-expression\n///         \'sizeof\' \'(\' type-name \')\'\n/// [C++11] \'sizeof\' \'...\' \'(\' identifier \')\'\n/// [GNU]   \'__alignof\' unary-expression\n/// [GNU]   \'__alignof\' \'(\' type-name \')\'\n/// [C11]   \'_Alignof\' \'(\' type-name \')\'\n/// [C++11] \'alignof\' \'(\' type-id \')\'\n/// [GNU]   \'&&\' identifier\n/// [C++11] \'noexcept\' \'(\' expression \')\' [C++11 5.3.7]\n/// [C++]   new-expression\n/// [C++]   delete-expression\n///\n///       unary-operator: one of\n///         \'&\'  \'*\'  \'+\'  \'-\'  \'~\'  \'!\'\n/// [GNU]   \'__extension__\'  \'__real\'  \'__imag\'\n///\n///       primary-expression: [C99 6.5.1]\n/// [C99]   identifier\n/// [C++]   id-expression\n///         constant\n///         string-literal\n/// [C++]   boolean-literal  [C++ 2.13.5]\n/// [C++11] \'nullptr\'        [C++11 2.14.7]\n/// [C++11] user-defined-literal\n///         \'(\' expression \')\'\n/// [C11]   generic-selection\n/// [C++2a] requires-expression\n///         \'__func__\'        [C99 6.4.2.2]\n/// [GNU]   \'__FUNCTION__\'\n/// [MS]    \'__FUNCDNAME__\'\n/// [MS]    \'L__FUNCTION__\'\n/// [MS]    \'__FUNCSIG__\'\n/// [MS]    \'L__FUNCSIG__\'\n/// [GNU]   \'__PRETTY_FUNCTION__\'\n/// [GNU]   \'(\' compound-statement \')\'\n/// [GNU]   \'__builtin_va_arg\' \'(\' assignment-expression \',\' type-name \')\'\n/// [GNU]   \'__builtin_offsetof\' \'(\' type-name \',\' offsetof-member-designator\')\'\n/// [GNU]   \'__builtin_choose_expr\' \'(\' assign-expr \',\' assign-expr \',\'\n///                                     assign-expr \')\'\n/// [GNU]   \'__builtin_FILE\' \'(\' \')\'\n/// [CLANG] \'__builtin_FILE_NAME\' \'(\' \')\'\n/// [GNU]   \'__builtin_FUNCTION\' \'(\' \')\'\n/// [MS]    \'__builtin_FUNCSIG\' \'(\' \')\'\n/// [GNU]   \'__builtin_LINE\' \'(\' \')\'\n/// [CLANG] \'__builtin_COLUMN\' \'(\' \')\'\n/// [GNU]   \'__builtin_source_location\' \'(\' \')\'\n/// [GNU]   \'__builtin_types_compatible_p\' \'(\' type-name \',\' type-name \')\'\n/// [GNU]   \'__null\'\n/// [OBJC]  \'[\' objc-message-expr \']\'\n/// [OBJC]  \'\\@selector\' \'(\' objc-selector-arg \')\'\n/// [OBJC]  \'\\@protocol\' \'(\' identifier \')\'\n/// [OBJC]  \'\\@encode\' \'(\' type-name \')\'\n/// [OBJC]  objc-string-literal\n/// [C++]   simple-type-specifier \'(\' expression-list[opt] \')\'      [C++ 5.2.3]\n/// [C++11] simple-type-specifier braced-init-list                  [C++11 5.2.3]\n/// [C++]   typename-specifier \'(\' expression-list[opt] \')\'         [C++ 5.2.3]\n/// [C++11] typename-specifier braced-init-list                     [C++11 5.2.3]\n/// [C++]   \'const_cast\' \'<\' type-name \'>\' \'(\' expression \')\'       [C++ 5.2p1]\n/// [C++]   \'dynamic_cast\' \'<\' type-name \'>\' \'(\' expression \')\'     [C++ 5.2p1]\n/// [C++]   \'reinterpret_cast\' \'<\' type-name \'>\' \'(\' expression \')\' [C++ 5.2p1]\n/// [C++]   \'static_cast\' \'<\' type-name \'>\' \'(\' expression \')\'      [C++ 5.2p1]\n/// [C++]   \'typeid\' \'(\' expression \')\'                             [C++ 5.2p1]\n/// [C++]   \'typeid\' \'(\' type-id \')\'                                [C++ 5.2p1]\n/// [C++]   \'this\'          [C++ 9.3.2]\n/// [G++]   unary-type-trait \'(\' type-id \')\'\n/// [G++]   binary-type-trait \'(\' type-id \',\' type-id \')\'           [TODO]\n/// [EMBT]  array-type-trait \'(\' type-id \',\' integer \')\'\n/// [clang] \'^\' block-literal\n///\n///       constant: [C99 6.4.4]\n///         integer-constant\n///         floating-constant\n///         enumeration-constant -> identifier\n///         character-constant\n///\n///       id-expression: [C++ 5.1]\n///                   unqualified-id\n///                   qualified-id\n///\n///       unqualified-id: [C++ 5.1]\n///                   identifier\n///                   operator-function-id\n///                   conversion-function-id\n///                   \'~\' class-name\n///                   template-id\n///\n///       new-expression: [C++ 5.3.4]\n///                   \'::\'[opt] \'new\' new-placement[opt] new-type-id\n///                                     new-initializer[opt]\n///                   \'::\'[opt] \'new\' new-placement[opt] \'(\' type-id \')\'\n///                                     new-initializer[opt]\n///\n///       delete-expression: [C++ 5.3.5]\n///                   \'::\'[opt] \'delete\' cast-expression\n///                   \'::\'[opt] \'delete\' \'[\' \']\' cast-expression\n///\n/// [GNU/Embarcadero] unary-type-trait:\n///                   \'__is_arithmetic\'\n///                   \'__is_floating_point\'\n///                   \'__is_integral\'\n///                   \'__is_lvalue_expr\'\n///                   \'__is_rvalue_expr\'\n///                   \'__is_complete_type\'\n///                   \'__is_void\'\n///                   \'__is_array\'\n///                   \'__is_function\'\n///                   \'__is_reference\'\n///                   \'__is_lvalue_reference\'\n///                   \'__is_rvalue_reference\'\n///                   \'__is_fundamental\'\n///                   \'__is_object\'\n///                   \'__is_scalar\'\n///                   \'__is_compound\'\n///                   \'__is_pointer\'\n///                   \'__is_member_object_pointer\'\n///                   \'__is_member_function_pointer\'\n///                   \'__is_member_pointer\'\n///                   \'__is_const\'\n///                   \'__is_volatile\'\n///                   \'__is_trivial\'\n///                   \'__is_standard_layout\'\n///                   \'__is_signed\'\n///                   \'__is_unsigned\'\n///\n/// [GNU] unary-type-trait:\n///                   \'__has_nothrow_assign\'\n///                   \'__has_nothrow_copy\'\n///                   \'__has_nothrow_constructor\'\n///                   \'__has_trivial_assign\'                  [TODO]\n///                   \'__has_trivial_copy\'                    [TODO]\n///                   \'__has_trivial_constructor\'\n///                   \'__has_trivial_destructor\'\n///                   \'__has_virtual_destructor\'\n///                   \'__is_abstract\'                         [TODO]\n///                   \'__is_class\'\n///                   \'__is_empty\'                            [TODO]\n///                   \'__is_enum\'\n///                   \'__is_final\'\n///                   \'__is_pod\'\n///                   \'__is_polymorphic\'\n///                   \'__is_sealed\'                           [MS]\n///                   \'__is_trivial\'\n///                   \'__is_union\'\n///                   \'__has_unique_object_representations\'\n///\n/// [Clang] unary-type-trait:\n///                   \'__is_aggregate\'\n///                   \'__trivially_copyable\'\n///\n///       binary-type-trait:\n/// [GNU]             \'__is_base_of\'\n/// [MS]              \'__is_convertible_to\'\n///                   \'__is_convertible\'\n///                   \'__is_same\'\n///\n/// [Embarcadero] array-type-trait:\n///                   \'__array_rank\'\n///                   \'__array_extent\'\n///\n/// [Embarcadero] expression-trait:\n///                   \'__is_lvalue_expr\'\n///                   \'__is_rvalue_expr\'\n/// \\endverbatim\n///\nExprResult Parser::ParseCastExpression(CastParseKind ParseKind, bool isAddressOfOperand, bool &NotCastExpr, TypeCastState isTypeCast, bool isVectorLiteral, bool *NotPrimaryExpression) {\n  // ...\n  case tok::kw_nullptr:\n    if (getLangOpts().CPlusPlus)\n      Diag(Tok, diag::warn_cxx98_compat_nullptr);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:154:14: warning: \'nullptr\' is incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_override_control_keyword"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_override_control_keyword",
		[h]="\'%0\' keyword is incompatible with C++98",
		[b]="\'A\' keyword is incompatible with C++98",
		[f]=j,
		[g]="\'(.*?)\' keyword is incompatible with C\\+\\+98",
		[e]=B,
		[a]=F,
		[d]={wb,1318655374,sb,rb},
		[c]={{gb,2473,"/// ParseOptionalCXX11VirtSpecifierSeq - Parse a virt-specifier-seq.\n///\n///       virt-specifier-seq:\n///         virt-specifier\n///         virt-specifier-seq virt-specifier\nvoid Parser::ParseOptionalCXX11VirtSpecifierSeq(VirtSpecifiers &VS, bool IsInterface, SourceLocation FriendLoc) {\n  while (true) {\n    // ...\n    if (IsInterface && (Specifier == VirtSpecifiers::VS_Final || Specifier == VirtSpecifiers::VS_Sealed)) {\n    // ...\n    } else if (Specifier == VirtSpecifiers::VS_Sealed) {\n    // ...\n    } else if (Specifier == VirtSpecifiers::VS_Abstract) {\n    // ...\n    } else if (Specifier == VirtSpecifiers::VS_GNU_Final) {\n    // ...\n    } else {\n      Diag(Tok.getLocation(), getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_override_control_keyword : diag::ext_override_control_keyword) << VirtSpecifiers::getSpecifierName(Specifier);"},{gb,3528,"/// ParseCXXMemberSpecification - Parse the class definition.\n///\n///       member-specification:\n///         member-declaration member-specification[opt]\n///         access-specifier \':\' member-specification[opt]\n///\nvoid Parser::ParseCXXMemberSpecification(SourceLocation RecordLoc, SourceLocation AttrFixitLoc, ParsedAttributes &Attrs, unsigned TagType, Decl *TagDecl) {\n  // ...\n  // Parse the optional \'final\' keyword.\n  if (getLangOpts().CPlusPlus && Tok.is(tok::identifier)) {\n    while (true) {\n      // ...\n      if (TagType == DeclSpec::TST_interface)\n      // ...\n      else if (Specifier == VirtSpecifiers::VS_Final)\n        Diag(FinalLoc, getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_override_control_keyword : diag::ext_override_control_keyword) << VirtSpecifiers::getSpecifierName(Specifier);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:132:24: warning: \'final\' keyword is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:133:20: warning: \'override\' keyword is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:134:20: warning: \'final\' keyword is incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_pass_non_pod_arg_to_vararg"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_pass_non_pod_arg_to_vararg",
		[h]="passing object of trivial but non-POD type %0 through variadic %select{function|block|method|constructor}1 is incompatible with C++98",
		[b]={{nil,nil,{"passing object of trivial but non-POD type A through variadic ",{zb,"block","method",kb}," is incompatible with C++98"}}},
		[f]=j,
		[g]="passing object of trivial but non\\-POD type (.*?) through variadic (?:function|block|method|constructor) is incompatible with C\\+\\+98",
		[e]=B,
		[a]=r,
		[d]={Ib,1318970984,Jb,Eb},
		[c]={{hb,998,"void Sema::checkVariadicArgument(const Expr *E, VariadicCallType CT) {\n  // ...\n  case VAK_ValidInCXX11:\n    DiagRuntimeBehavior(E->getBeginLoc(), nullptr, PDiag(diag::warn_cxx98_compat_pass_non_pod_arg_to_vararg) << Ty << CT);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:213:15: warning: passing object of trivial but non-POD type \'TrivialButNonPOD\' through variadic function is incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_pp_line_too_big"]={
		[l]={n},
		[k]=n,
		[i]="warn_cxx98_compat_pp_line_too_big",
		[h]="#line number greater than 32767 is incompatible with C++98",
		[b]="#line number greater than 32767 is incompatible with C++98",
		[f]=j,
		[g]="\\#line number greater than 32767 is incompatible with C\\+\\+98",
		[e]=kc,
		[a]=Z,
		[d]={Ac,1318641536,wc,xc},
		[c]={{cd,1425,"/// Handle a \\#line directive: C99 6.10.4.\n///\n/// The two acceptable forms are:\n/// \\verbatim\n///   # line digit-sequence\n///   # line digit-sequence \"s-char-sequence\"\n/// \\endverbatim\nvoid Preprocessor::HandleLineDirective() {\n  // ...\n  if (LineNo >= LineLimit)\n  // ...\n  else if (LangOpts.CPlusPlus11 && LineNo >= 32768U)\n    Diag(DigitTok, diag::warn_cxx98_compat_pp_line_too_big);"}},
		[m]={
			[uc]={"clang/test/SemaCXX/cxx98-compat-pedantic.cpp:32767:7: warning: #line number greater than 32767 is incompatible with C++98 [-Wc++98-compat-pedantic]"}
		}
	},
	["warn_cxx98_compat_raw_string_literal"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_raw_string_literal",
		[h]="raw string literals are incompatible with C++98",
		[b]="raw string literals are incompatible with C++98",
		[f]=j,
		[g]="raw string literals are incompatible with C\\+\\+98",
		[e]=B,
		[a]=Z,
		[d]={Ac,1318641536,wc,xc},
		[c]={{nb,2146,"/// LexRawStringLiteral - Lex the remainder of a raw string literal, after\n/// having lexed R\", LR\", u8R\", uR\", or UR\".\nbool Lexer::LexRawStringLiteral(Token &Result, const char *CurPtr, tok::TokenKind Kind) {\n  // ...\n  if (!isLexingRawMode())\n    Diag(BufferPtr, diag::warn_cxx98_compat_raw_string_literal);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:36:9: warning: raw string literals are incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:37:9: warning: raw string literals are incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:38:9: warning: raw string literals are incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:39:9: warning: raw string literals are incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:40:9: warning: raw string literals are incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_ref_qualifier"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_ref_qualifier",
		[h]="reference qualifiers on functions are incompatible with C++98",
		[b]="reference qualifiers on functions are incompatible with C++98",
		[f]=j,
		[g]="reference qualifiers on functions are incompatible with C\\+\\+98",
		[e]=B,
		[a]=F,
		[d]={wb,1318655374,sb,rb},
		[c]={{Vb,7159,"/// ParseRefQualifier - Parses a member function ref-qualifier. Returns\n/// true if a ref-qualifier is found.\nbool Parser::ParseRefQualifier(bool &RefQualifierIsLValueRef, SourceLocation &RefQualifierLoc) {\n  if (Tok.isOneOf(tok::amp, tok::ampamp)) {\n    Diag(Tok, getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_ref_qualifier : diag::ext_ref_qualifier);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:102:12: warning: reference qualifiers on functions are incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_reference_list_init"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_reference_list_init",
		[h]="reference initialized from initializer list is incompatible with C++98",
		[b]="reference initialized from initializer list is incompatible with C++98",
		[f]=j,
		[g]="reference initialized from initializer list is incompatible with C\\+\\+98",
		[e]=B,
		[a]=r,
		[d]={"2b349aee5b6f",1334818680,"Add missing -Wc++98-compat warnings for initializer list initializations which","Add missing -Wc++98-compat warnings for initializer list initializations which\ninitialize references, create std::initializer_list objects, or call constructors.\n\nllvm-svn: 155105"},
		[c]={{ob,8609,"ExprResult InitializationSequence::Perform(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Args, QualType *ResultType) {\n  // ...\n  if (S.getLangOpts().CPlusPlus11 && Entity.getType()->isReferenceType() && Args.size() == 1 && isa<InitListExpr>(Args[0]) && !Entity.isParamOrTemplateParamKind()) {\n    // ...\n    S.Diag(Init->getBeginLoc(), diag::warn_cxx98_compat_reference_list_init) << Init->getSourceRange();"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:78:18: warning: reference initialized from initializer list is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:79:45: warning: reference initialized from initializer list is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:115:18: warning: reference initialized from initializer list is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:121:41: warning: reference initialized from initializer list is incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_rvalue_reference"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_rvalue_reference",
		[h]="rvalue references are incompatible with C++98",
		[b]="rvalue references are incompatible with C++98",
		[f]=j,
		[g]="rvalue references are incompatible with C\\+\\+98",
		[e]=B,
		[a]=F,
		[d]={wb,1318655374,sb,rb},
		[c]={{Vb,6273,"/// ParseDeclaratorInternal - Parse a C or C++ declarator. The direct-declarator\n/// is parsed by the function passed to it. Pass null, and the direct-declarator\n/// isn\'t parsed at all, making this function effectively parse the C++\n/// ptr-operator production.\n///\n/// If the grammar of this construct is extended, matching changes must also be\n/// made to TryParseDeclarator and MightBeDeclarator, and possibly to\n/// isConstructorDeclarator.\n///\n///       declarator: [C99 6.7.5] [C++ 8p4, dcl.decl]\n/// [C]     pointer[opt] direct-declarator\n/// [C++]   direct-declarator\n/// [C++]   ptr-operator declarator\n///\n///       pointer: [C99 6.7.5]\n///         \'*\' type-qualifier-list[opt]\n///         \'*\' type-qualifier-list[opt] pointer\n///\n///       ptr-operator:\n///         \'*\' cv-qualifier-seq[opt]\n///         \'&\'\n/// [C++0x] \'&&\'\n/// [GNU]   \'&\' restrict[opt] attributes[opt]\n/// [GNU?]  \'&&\' restrict[opt] attributes[opt]\n///         \'::\'[opt] nested-name-specifier \'*\' cv-qualifier-seq[opt]\nvoid Parser::ParseDeclaratorInternal(Declarator &D, DirectDeclParseFunction DirectDeclParser) {\n  // ...\n  if (Kind == tok::star || Kind == tok::caret) {\n  // ...\n  } else {\n    // ...\n    // Complain about rvalue references in C++03, but then go on and build\n    // the declarator.\n    if (Kind == tok::ampamp)\n      Diag(Loc, getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_rvalue_reference : diag::ext_rvalue_reference);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:100:5: warning: rvalue references are incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_scoped_enum"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_scoped_enum",
		[h]="scoped enumerations are incompatible with C++98",
		[b]="scoped enumerations are incompatible with C++98",
		[f]=j,
		[g]="scoped enumerations are incompatible with C\\+\\+98",
		[e]=B,
		[a]=F,
		[d]={wb,1318655374,sb,rb},
		[c]={{Vb,4792,"/// ParseEnumSpecifier\n///       enum-specifier: [C99 6.7.2.2]\n///         \'enum\' identifier[opt] \'{\' enumerator-list \'}\'\n///[C99/C++]\'enum\' identifier[opt] \'{\' enumerator-list \',\' \'}\'\n/// [GNU]   \'enum\' attributes[opt] identifier[opt] \'{\' enumerator-list \',\' [opt]\n///                                                 \'}\' attributes[opt]\n/// [MS]    \'enum\' __declspec[opt] identifier[opt] \'{\' enumerator-list \',\' [opt]\n///                                                 \'}\'\n///         \'enum\' identifier\n/// [GNU]   \'enum\' attributes[opt] identifier\n///\n/// [C++11] enum-head \'{\' enumerator-list[opt] \'}\'\n/// [C++11] enum-head \'{\' enumerator-list \',\'  \'}\'\n///\n///       enum-head: [C++11]\n///         enum-key attribute-specifier-seq[opt] identifier[opt] enum-base[opt]\n///         enum-key attribute-specifier-seq[opt] nested-name-specifier\n///             identifier enum-base[opt]\n///\n///       enum-key: [C++11]\n///         \'enum\'\n///         \'enum\' \'class\'\n///         \'enum\' \'struct\'\n///\n///       enum-base: [C++11]\n///         \':\' type-specifier-seq\n///\n/// [C++] elaborated-type-specifier:\n/// [C++]   \'enum\' nested-name-specifier[opt] identifier\n///\nvoid Parser::ParseEnumSpecifier(SourceLocation StartLoc, DeclSpec &DS, const ParsedTemplateInfo &TemplateInfo, AccessSpecifier AS, DeclSpecContext DSC) {\n  // ...\n  // In C++11, recognize \'enum class\' and \'enum struct\'.\n  if (Tok.isOneOf(tok::kw_class, tok::kw_struct) && getLangOpts().CPlusPlus) {\n    Diag(Tok, getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_scoped_enum : diag::ext_scoped_enum);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:92:6: warning: scoped enumerations are incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_sfinae_access_control"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_sfinae_access_control",
		[h]="substitution failure due to access control is incompatible with C++98",
		[b]="substitution failure due to access control is incompatible with C++98",
		[f]=j,
		[g]="substitution failure due to access control is incompatible with C\\+\\+98",
		[e]=B,
		[a]=r,
		[d]={"38c0e0417ccb",1318982821,"-Wc++98-compat: warn if a SFINAE substitution in C++11 suppresses an access","-Wc++98-compat: warn if a SFINAE substitution in C++11 suppresses an access\ncontrol diagnostic.\n\nllvm-svn: 142463"},
		[c]={{"clang/lib/Sema/Sema.cpp",1559,"void Sema::EmitCurrentDiagnostic(unsigned DiagID) {\n  // FIXME: It doesn\'t make sense to me that DiagID is an incoming argument here\n  // and yet we also use the current diag ID on the DiagnosticsEngine. This has\n  // been made more painfully obvious by the refactor that introduced this\n  // function, but it is possible that the incoming argument can be\n  // eliminated. If it truly cannot be (for example, there is some reentrancy\n  // issue I am not seeing yet), then there should at least be a clarifying\n  // comment somewhere.\n  if (std::optional<TemplateDeductionInfo *> Info = isSFINAEContext()) {\n    // ...\n    case DiagnosticIDs::SFINAE_AccessControl: {\n      // ...\n      Diag(Loc, diag::warn_cxx98_compat_sfinae_access_control);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:233:34: warning: substitution failure due to access control is incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_static_assert"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_static_assert",
		[h]={{nil,D,"\'static_assert\' declarations are incompatible with C++98"},{x,nil,"static_assert declarations are incompatible with C++98"}},
		[b]={{nil,D,"\'static_assert\' declarations are incompatible with C++98"},{x,nil,"static_assert declarations are incompatible with C++98"}},
		[f]=j,
		[g]="\'static_assert\' declarations are incompatible with C\\+\\+98",
		[e]=B,
		[a]=F,
		[d]={sc,1318892780,pc,oc},
		[c]={{gb,981,"/// ParseStaticAssertDeclaration - Parse C++0x or C11 static_assert-declaration.\n///\n/// [C++0x] static_assert-declaration:\n///           static_assert ( constant-expression  ,  string-literal  ) ;\n///\n/// [C11]   static_assert-declaration:\n///           _Static_assert ( constant-expression  ,  string-literal  ) ;\n///\nDecl *Parser::ParseStaticAssertDeclaration(SourceLocation &DeclEnd) {\n  // ...\n  if (Tok.is(tok::kw_static_assert)) {\n    if (!getLangOpts().CPlusPlus) {\n    // ...\n    } else\n      Diag(Tok, diag::warn_cxx98_compat_static_assert);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:155:1: warning: \'static_assert\' declarations are incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_static_data_member_in_union"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_static_data_member_in_union",
		[h]="static data member %0 in union is incompatible with C++98",
		[b]="static data member A in union is incompatible with C++98",
		[f]=j,
		[g]="static data member (.*?) in union is incompatible with C\\+\\+98",
		[e]=B,
		[a]=r,
		[d]={"429737556135",1329424882,"C++11 allows unions to have static data members. Remove the corresponding","C++11 allows unions to have static data members. Remove the corresponding\nrestriction and add some tests.\n\nllvm-svn: 150721"},
		[c]={{bb,7606,"NamedDecl *Sema::ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope, ArrayRef<BindingDecl *> Bindings) {\n  // ...\n  if (!getLangOpts().CPlusPlus) {\n  // ...\n  } else {\n    // ...\n    if (SC == SC_Static && CurContext->isRecord()) {\n      if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(DC)) {\n        // ...\n        if (FunctionOrMethod) {\n        // ...\n        } else if (AnonStruct) {\n        // ...\n        } else if (RD->isUnion()) {\n          // ...\n          Diag(D.getIdentifierLoc(), getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_static_data_member_in_union : diag::ext_static_data_member_in_union) << Name;"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:262:29: warning: static data member \'d\' in union is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:263:22: warning: static data member \'n\' in union is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:264:16: warning: static data member \'k\' in union is incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_switch_into_protected_scope"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_switch_into_protected_scope",
		[h]="jump from switch statement to this case label is incompatible with C++98",
		[b]="jump from switch statement to this case label is incompatible with C++98",
		[f]=j,
		[g]="jump from switch statement to this case label is incompatible with C\\+\\+98",
		[e]=B,
		[a]=r,
		[d]={"fe2750db42c0",1319146932,"Add -Wc++98-compat diagnostics for jumps which bypass initialization of non-POD","Add -Wc++98-compat diagnostics for jumps which bypass initialization of non-POD\nbut trivially constructible and destructible variables in C++11 mode. Also\nincidentally improve the precision of the wording for jump diagnostics in C++98\nmode.\n\nllvm-svn: 142619"},
		[c]={{"clang/lib/Sema/JumpDiagnostics.cpp",713,"/// VerifyJumps - Verify each element of the Jumps array to see if they are\n/// valid, emitting diagnostics if not.\nvoid JumpScopeChecker::VerifyJumps() {\n  while (!Jumps.empty()) {\n    // ...\n    for (SwitchCase *SC = SS->getSwitchCaseList(); SC; SC = SC->getNextSwitchCase()) {\n      // ...\n      CheckJump(SS, SC, Loc, diag::err_switch_into_protected_scope, 0, diag::warn_cxx98_compat_switch_into_protected_scope);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:286:3: warning: jump from switch statement to this case label is incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_temp_copy"]={
		[l]={"bind-to-temporary-copy","c++98-compat-bind-to-temporary-copy",n},
		[k]="c++98-compat-bind-to-temporary-copy",
		[i]="warn_cxx98_compat_temp_copy",
		[h]={{nil,W,"%select{copying variable|copying parameter|initializing template parameter|returning object|initializing statement expression result|throwing object|copying member subobject|copying array element|allocating object|copying temporary|initializing base subobject|initializing vector element|capturing value}1 of type %2 when binding a reference to a temporary would %select{invoke an inaccessible constructor|find no viable constructor|find ambiguous constructors|invoke a deleted constructor}0 in C++98"},{"11.1",O,"%select{copying variable|copying parameter|returning object|initializing statement expression result|throwing object|copying member subobject|copying array element|allocating object|copying temporary|initializing base subobject|initializing vector element|capturing value}1 of type %2 when binding a reference to a temporary would %select{invoke an inaccessible constructor|find no viable constructor|find ambiguous constructors|invoke a deleted constructor}0 in C++98"},{H,nil,"%select{copying variable|copying parameter|returning object|throwing object|copying member subobject|copying array element|allocating object|copying temporary|initializing base subobject|initializing vector element}1 of type %2 when binding a reference to a temporary would %select{invoke an inaccessible constructor|find no viable constructor|find ambiguous constructors|invoke a deleted constructor}0 in C++98"}},
		[b]={{nil,W,{{"copying variable","copying parameter","initializing template parameter","returning object","initializing statement expression result","throwing object","copying member subobject","copying array element","allocating object","copying temporary","initializing base subobject","initializing vector element","capturing value"}," of type C when binding a reference to a temporary would ",{"invoke an inaccessible constructor","find no viable constructor","find ambiguous constructors","invoke a deleted constructor"}," in C++98"}},{"11.1",O,{{"copying variable","copying parameter","returning object","initializing statement expression result","throwing object","copying member subobject","copying array element","allocating object","copying temporary","initializing base subobject","initializing vector element","capturing value"}," of type C when binding a reference to a temporary would ",{"invoke an inaccessible constructor","find no viable constructor","find ambiguous constructors","invoke a deleted constructor"}," in C++98"}},{H,nil,{{"copying variable","copying parameter","returning object","throwing object","copying member subobject","copying array element","allocating object","copying temporary","initializing base subobject","initializing vector element"}," of type C when binding a reference to a temporary would ",{"invoke an inaccessible constructor","find no viable constructor","find ambiguous constructors","invoke a deleted constructor"}," in C++98"}}},
		[f]=j,
		[g]="(?:copying variable|copying parameter|initializing template parameter|returning object|initializing statement expression result|throwing object|copying member subobject|copying array element|allocating object|copying temporary|initializing base subobject|initializing vector element|capturing value) of type (.*?) when binding a reference to a temporary would (?:invoke an inaccessible constructor|find no viable constructor|find ambiguous constructors|invoke a deleted constructor) in C\\+\\+98",
		[e]=" \\[(?:\\-Werror,)?\\-Wc\\+\\+98\\-compat\\-bind\\-to\\-temporary\\-copy[^\\]]*\\]",
		[a]=r,
		[d]={"c620f554b9c4",1319043356,"-Wc++98-compat: diagnose if a reference is bound to a prvalue which does not","-Wc++98-compat: diagnose if a reference is bound to a prvalue which does not\nhave an unambiguous accessible copying constructor; this is ill-formed in C++98.\n\nllvm-svn: 142533"},
		[c]={{ob,6911,"/// Check whether elidable copy construction for binding a reference to\n/// a temporary would have succeeded if we were building in C++98 mode, for\n/// -Wc++98-compat.\nstatic void CheckCXX98CompatAccessibleCopy(Sema &S, const InitializedEntity &Entity, Expr *CurInitExpr) {\n  // ...\n  if (S.Diags.isIgnored(diag::warn_cxx98_compat_temp_copy, Loc))"},{ob,6927,"/// Check whether elidable copy construction for binding a reference to\n/// a temporary would have succeeded if we were building in C++98 mode, for\n/// -Wc++98-compat.\nstatic void CheckCXX98CompatAccessibleCopy(Sema &S, const InitializedEntity &Entity, Expr *CurInitExpr) {\n  // ...\n  PartialDiagnostic Diag = S.PDiag(diag::warn_cxx98_compat_temp_copy) << OR << (int)Entity.getKind() << CurInitExpr->getType() << CurInitExpr->getSourceRange();"}},
		[m]={
			["clang/test/SemaCXX/cxx98-compat-flags.cpp"]={"clang/test/SemaCXX/cxx98-compat-flags.cpp:31:18: warning: copying variable of type \'Private\' when binding a reference to a temporary would invoke an inaccessible constructor in C++98 [-Wc++98-compat-bind-to-temporary-copy]","clang/test/SemaCXX/cxx98-compat-flags.cpp:32:19: warning: copying variable of type \'NoViable\' when binding a reference to a temporary would find no viable constructor in C++98 [-Wc++98-compat-bind-to-temporary-copy]","clang/test/SemaCXX/cxx98-compat-flags.cpp:33:20: warning: copying variable of type \'Ambiguous\' when binding a reference to a temporary would find ambiguous constructors in C++98 [-Wc++98-compat-bind-to-temporary-copy]","clang/test/SemaCXX/cxx98-compat-flags.cpp:34:18: warning: copying variable of type \'Deleted\' when binding a reference to a temporary would invoke a deleted constructor in C++98 [-Wc++98-compat-bind-to-temporary-copy]"}
		}
	},
	["warn_cxx98_compat_template_arg_extra_parens"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_template_arg_extra_parens",
		[h]="redundant parentheses surrounding address non-type template argument are incompatible with C++98",
		[b]="redundant parentheses surrounding address non-type template argument are incompatible with C++98",
		[f]=j,
		[g]="redundant parentheses surrounding address non\\-type template argument are incompatible with C\\+\\+98",
		[e]=B,
		[a]=r,
		[d]={Ib,1318970984,Jb,Eb},
		[c]={{yb,6768,"/// Checks whether the given template argument is the address\n/// of an object or function according to C++ [temp.arg.nontype]p1.\nstatic bool CheckTemplateArgumentAddressOfObjectOrFunction(Sema &S, NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *ArgIn, TemplateArgument &SugaredConverted, TemplateArgument &CanonicalConverted) {\n  // ...\n  if (S.getLangOpts().MicrosoftExt) {\n  // ...\n  } else {\n    // ...\n    while (ParenExpr *Parens = dyn_cast<ParenExpr>(Arg)) {\n      if (!Invalid && !ExtraParens) {\n        S.Diag(Arg->getBeginLoc(), S.getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_template_arg_extra_parens : diag::ext_template_arg_extra_parens) << Arg->getSourceRange();"},{yb,6991,"/// Checks whether the given template argument is a pointer to\n/// member constant according to C++ [temp.arg.nontype]p1.\nstatic bool CheckTemplateArgumentPointerToMember(Sema &S, NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *&ResultArg, TemplateArgument &SugaredConverted, TemplateArgument &CanonicalConverted) {\n  // ...\n  while (ParenExpr *Parens = dyn_cast<ParenExpr>(Arg)) {\n    if (!Invalid && !ExtraParens) {\n      S.Diag(Arg->getBeginLoc(), S.getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_template_arg_extra_parens : diag::ext_template_arg_extra_parens) << Arg->getSourceRange();"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:190:5: warning: redundant parentheses surrounding address non-type template argument are incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:191:5: warning: redundant parentheses surrounding address non-type template argument are incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_template_arg_local_type"]={
		[l]={o,"c++98-compat-local-type-template-args",n,"local-type-template-args"},
		[k]="c++98-compat-local-type-template-args",
		[i]="warn_cxx98_compat_template_arg_local_type",
		[h]="local type %0 as template argument is incompatible with C++98",
		[b]="local type A as template argument is incompatible with C++98",
		[f]=j,
		[g]="local type (.*?) as template argument is incompatible with C\\+\\+98",
		[e]=" \\[(?:\\-Werror,)?\\-Wc\\+\\+98\\-compat\\-local\\-type\\-template\\-args[^\\]]*\\]",
		[a]=r,
		[d]={Ib,1318970984,Jb,Eb},
		[c]={{yb,6458,"bool UnnamedLocalNoLinkageFinder::VisitTagDecl(const TagDecl *Tag) {\n  if (Tag->getDeclContext()->isFunctionOrMethod()) {\n    S.Diag(SR.getBegin(), S.getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_template_arg_local_type : diag::ext_template_arg_local_type) << S.Context.getTypeDeclType(Tag) << SR;"}},
		[m]={
			["clang/test/SemaCXX/cxx98-compat-flags.cpp"]={"clang/test/SemaCXX/cxx98-compat-flags.cpp:7:3: warning: local type \'S\' as template argument is incompatible with C++98 [-Wc++98-compat-local-type-template-args]"}
		}
	},
	["warn_cxx98_compat_template_arg_null"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_template_arg_null",
		[h]="use of null pointer as non-type template argument is incompatible with C++98",
		[b]="use of null pointer as non-type template argument is incompatible with C++98",
		[f]=j,
		[g]="use of null pointer as non\\-type template argument is incompatible with C\\+\\+98",
		[e]=B,
		[a]=r,
		[d]={"bc8c5b5d6744",1335405063,"Two missing -Wc++98-compat warnings, for null pointers as non-type template","Two missing -Wc++98-compat warnings, for null pointers as non-type template\narguments, and \'this\' in exception-specifications.\n\nllvm-svn: 155606"},
		[c]={{yb,6805,"/// Checks whether the given template argument is the address\n/// of an object or function according to C++ [temp.arg.nontype]p1.\nstatic bool CheckTemplateArgumentAddressOfObjectOrFunction(Sema &S, NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *ArgIn, TemplateArgument &SugaredConverted, TemplateArgument &CanonicalConverted) {\n  // ...\n  // If our parameter has pointer type, check for a null template value.\n  if (ParamType->isPointerType() || ParamType->isNullPtrType()) {\n    // ...\n    case NPV_NullPointer:\n      S.Diag(Arg->getExprLoc(), diag::warn_cxx98_compat_template_arg_null);"},{yb,7042,"/// Checks whether the given template argument is a pointer to\n/// member constant according to C++ [temp.arg.nontype]p1.\nstatic bool CheckTemplateArgumentPointerToMember(Sema &S, NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *&ResultArg, TemplateArgument &SugaredConverted, TemplateArgument &CanonicalConverted) {\n  // ...\n  case NPV_NullPointer:\n    S.Diag(ResultArg->getExprLoc(), diag::warn_cxx98_compat_template_arg_null);"},{yb,7713,"/// Check a template argument against its corresponding\n/// non-type template parameter.\n///\n/// This routine implements the semantics of C++ [temp.arg.nontype].\n/// If an error occurred, it returns ExprError(); otherwise, it\n/// returns the converted template argument. \\p ParamType is the\n/// type of the non-type template parameter after it has been instantiated.\nExprResult Sema::CheckTemplateArgument(NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *Arg, TemplateArgument &SugaredConverted, TemplateArgument &CanonicalConverted, CheckTemplateArgumentKind CTAK) {\n  // ...\n  // Deal with parameters of type std::nullptr_t.\n  if (ParamType->isNullPtrType()) {\n    // ...\n    case NPV_NullPointer:\n      Diag(Arg->getExprLoc(), diag::warn_cxx98_compat_template_arg_null);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:322:5: warning: use of null pointer as non-type template argument is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:323:5: warning: use of null pointer as non-type template argument is incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_template_arg_object_internal"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_template_arg_object_internal",
		[h]="non-type template argument referring to %select{function|object}0 %1 with internal linkage is incompatible with C++98",
		[b]={{nil,nil,{"non-type template argument referring to ",{zb,"object"}," B with internal linkage is incompatible with C++98"}}},
		[f]=j,
		[g]="non\\-type template argument referring to (?:function|object) (.*?) with internal linkage is incompatible with C\\+\\+98",
		[e]=B,
		[a]=r,
		[d]={"9380e0ea236a",1333573890,"Implement C++11 [temp.arg.nontype]\'s permission to use the address of an object","Implement C++11 [temp.arg.nontype]\'s permission to use the address of an object\nor function with internal linkage as a non-type template argument.\n\nllvm-svn: 154053"},
		[c]={{yb,6872,"/// Checks whether the given template argument is the address\n/// of an object or function according to C++ [temp.arg.nontype]p1.\nstatic bool CheckTemplateArgumentAddressOfObjectOrFunction(Sema &S, NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *ArgIn, TemplateArgument &SugaredConverted, TemplateArgument &CanonicalConverted) {\n  // ...\n  // Address / reference template args must have external linkage in C++98.\n  if (Entity->getFormalLinkage() == InternalLinkage) {\n    S.Diag(Arg->getBeginLoc(), S.getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_template_arg_object_internal : diag::ext_template_arg_object_internal) << !Func << Entity << Arg->getSourceRange();"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:314:17: warning: non-type template argument referring to object \'k\' with internal linkage is incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:315:16: warning: non-type template argument referring to function \'f\' with internal linkage is incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_template_arg_unnamed_type"]={
		[l]={o,n,"c++98-compat-unnamed-type-template-args","unnamed-type-template-args"},
		[k]="c++98-compat-unnamed-type-template-args",
		[i]="warn_cxx98_compat_template_arg_unnamed_type",
		[h]="unnamed type as template argument is incompatible with C++98",
		[b]="unnamed type as template argument is incompatible with C++98",
		[f]=j,
		[g]="unnamed type as template argument is incompatible with C\\+\\+98",
		[e]=" \\[(?:\\-Werror,)?\\-Wc\\+\\+98\\-compat\\-unnamed\\-type\\-template\\-args[^\\]]*\\]",
		[a]=r,
		[d]={Ib,1318970984,Jb,Eb},
		[c]={{yb,6467,"bool UnnamedLocalNoLinkageFinder::VisitTagDecl(const TagDecl *Tag) {\n  // ...\n  if (!Tag->hasNameForLinkage()) {\n    S.Diag(SR.getBegin(), S.getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_template_arg_unnamed_type : diag::ext_template_arg_unnamed_type) << SR;"}},
		[m]={
			["clang/test/SemaCXX/cxx98-compat-flags.cpp"]={"clang/test/SemaCXX/cxx98-compat-flags.cpp:10:26: warning: unnamed type as template argument is incompatible with C++98 [-Wc++98-compat-unnamed-type-template-args]"}
		}
	},
	["warn_cxx98_compat_template_outside_of_template"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_template_outside_of_template",
		[h]="use of \'template\' keyword outside of a template is incompatible with C++98",
		[b]="use of \'template\' keyword outside of a template is incompatible with C++98",
		[f]=j,
		[g]="use of \'template\' keyword outside of a template is incompatible with C\\+\\+98",
		[e]=B,
		[a]=r,
		[d]={Ib,1318970984,Jb,Eb},
		[c]={{yb,5083,"/// Form a template name from a name that is syntactically required to name a\n/// template, either due to use of the \'template\' keyword or because a name in\n/// this syntactic context is assumed to name a template (C++ [temp.names]p2-4).\n///\n/// This action forms a template name given the name of the template and its\n/// optional scope specifier. This is used when the \'template\' keyword is used\n/// or when the parsing context unambiguously treats a following \'<\' as\n/// introducing a template argument list. Note that this may produce a\n/// non-dependent template name if we can perform the lookup now and identify\n/// the named template.\n///\n/// For example, given \"x.MetaFun::template apply\", the scope specifier\n/// \\p SS will be \"MetaFun::\", \\p TemplateKWLoc contains the location\n/// of the \"template\" keyword, and \"apply\" is the \\p Name.\nTemplateNameKind Sema::ActOnTemplateName(Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, const UnqualifiedId &Name, ParsedType ObjectType, bool EnteringContext, TemplateTy &Result, bool AllowInjectedClassName) {\n  if (TemplateKWLoc.isValid() && S && !S->getTemplateParamParent())\n    Diag(TemplateKWLoc, getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_template_outside_of_template : diag::ext_template_outside_of_template) << FixItHint::CreateRemoval(TemplateKWLoc);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:204:11: warning: use of \'template\' keyword outside of a template is incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_template_parameter_default_in_function_template"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_template_parameter_default_in_function_template",
		[h]="default template arguments for a function template are incompatible with C++98",
		[b]="default template arguments for a function template are incompatible with C++98",
		[f]=j,
		[g]="default template arguments for a function template are incompatible with C\\+\\+98",
		[e]=B,
		[a]=r,
		[d]={Ib,1318970984,Jb,Eb},
		[c]={{yb,2723,"/// Diagnose the presence of a default template argument on a\n/// template parameter, which is ill-formed in certain contexts.\n///\n/// \\returns true if the default template argument should be dropped.\nstatic bool DiagnoseDefaultTemplateArgument(Sema &S, Sema::TemplateParamListContext TPC, SourceLocation ParamLoc, SourceRange DefArgRange) {\n  // ...\n  case Sema::TPC_FunctionTemplate:\n  case Sema::TPC_FriendFunctionTemplateDefinition:\n    // ...\n    S.Diag(ParamLoc, S.getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_template_parameter_default_in_function_template : diag::ext_template_parameter_default_in_function_template) << DefArgRange;"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:174:14: warning: default template arguments for a function template are incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_top_level_semi"]={
		[l]={"c++98-compat-extra-semi",n,"extra-semi"},
		[k]="c++98-compat-extra-semi",
		[i]="warn_cxx98_compat_top_level_semi",
		[h]="extra \';\' outside of a function is incompatible with C++98",
		[b]="extra \';\' outside of a function is incompatible with C++98",
		[f]=j,
		[g]="extra \';\' outside of a function is incompatible with C\\+\\+98",
		[e]=" \\[(?:\\-Werror,)?\\-Wc\\+\\+98\\-compat\\-extra\\-semi[^\\]]*\\]",
		[a]=F,
		[d]={wb,1318655374,sb,rb},
		[c]={{"clang/lib/Parse/Parser.cpp",198,"void Parser::ConsumeExtraSemi(ExtraSemiKind Kind, DeclSpec::TST TST) {\n  // ...\n  // C++11 allows extra semicolons at namespace scope, but not in any of the\n  // other contexts.\n  if (Kind == OutsideFunction && getLangOpts().CPlusPlus) {\n    if (getLangOpts().CPlusPlus11)\n      Diag(StartLoc, diag::warn_cxx98_compat_top_level_semi) << FixItHint::CreateRemoval(SourceRange(StartLoc, EndLoc));"}},
		[m]={
			["clang/test/Parser/cxx-extra-semi.cpp"]={"clang/test/Parser/cxx-extra-semi.cpp:36:1: warning: extra \';\' outside of a function is incompatible with C++98 [-Wc++98-compat-extra-semi]","clang/test/Parser/cxx-extra-semi.cpp:37:1: warning: extra \';\' outside of a function is incompatible with C++98 [-Wc++98-compat-extra-semi]"}
		}
	},
	["warn_cxx98_compat_trailing_return_type"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_trailing_return_type",
		[h]="trailing return types are incompatible with C++98",
		[b]="trailing return types are incompatible with C++98",
		[f]=j,
		[g]="trailing return types are incompatible with C\\+\\+98",
		[e]=B,
		[a]=F,
		[d]={wb,1318655374,sb,rb},
		[c]={{Vb,7100,"/// ParseFunctionDeclarator - We are after the identifier and have parsed the\n/// declarator D up to a paren, which indicates that we are parsing function\n/// arguments.\n///\n/// If FirstArgAttrs is non-null, then the caller parsed those attributes\n/// immediately after the open paren - they will be applied to the DeclSpec\n/// of the first parameter.\n///\n/// If RequiresArg is true, then the first argument of the function is required\n/// to be present and required to not be an identifier list.\n///\n/// For C++, after the parameter-list, it also parses the cv-qualifier-seq[opt],\n/// (C++11) ref-qualifier[opt], exception-specification[opt],\n/// (C++11) attribute-specifier-seq[opt], (C++11) trailing-return-type[opt] and\n/// (C++2a) the trailing requires-clause.\n///\n/// [C++11] exception-specification:\n///           dynamic-exception-specification\n///           noexcept-specification\n///\nvoid Parser::ParseFunctionDeclarator(Declarator &D, ParsedAttributes &FirstArgAttrs, BalancedDelimiterTracker &Tracker, bool IsAmbiguous, bool RequiresArg) {\n  // ...\n  if (isFunctionDeclaratorIdentifierList()) {\n  // ...\n  } else {\n    // ...\n    if (getLangOpts().CPlusPlus) {\n      // ...\n      if (getLangOpts().CPlusPlus11 && Tok.is(tok::arrow)) {\n        Diag(Tok, diag::warn_cxx98_compat_trailing_return_type);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:105:10: warning: trailing return types are incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_two_right_angle_brackets"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_two_right_angle_brackets",
		[h]="consecutive right angle brackets are incompatible with C++98 (use \'> >\')",
		[b]="consecutive right angle brackets are incompatible with C++98 (use \'> >\')",
		[f]=j,
		[g]="consecutive right angle brackets are incompatible with C\\+\\+98 \\(use \'\\> \\>\'\\)",
		[e]=B,
		[a]=F,
		[d]={wb,1318655374,sb,rb},
		[c]={{"clang/lib/Parse/ParseTemplate.cpp",1207,"/// Parses a \'>\' at the end of a template list.\n///\n/// If this function encounters \'>>\', \'>>>\', \'>=\', or \'>>=\', it tries\n/// to determine if these tokens were supposed to be a \'>\' followed by\n/// \'>\', \'>>\', \'>=\', or \'>=\'. It emits an appropriate diagnostic if necessary.\n///\n/// \\param RAngleLoc the location of the consumed \'>\'.\n///\n/// \\param ConsumeLastToken if true, the \'>\' is consumed.\n///\n/// \\param ObjCGenericList if true, this is the \'>\' closing an Objective-C\n/// type parameter or type argument list, rather than a C++ template parameter\n/// or argument list.\n///\n/// \\returns true, if current token does not start with \'>\', false otherwise.\nbool Parser::ParseGreaterThanInTemplateList(SourceLocation LAngleLoc, SourceLocation &RAngleLoc, bool ConsumeLastToken, bool ObjCGenericList) {\n  // ...\n  // Diagnose this situation as appropriate.\n  if (!ObjCGenericList) {\n    // ...\n    if (getLangOpts().CPlusPlus11 && (Tok.is(tok::greatergreater) || Tok.is(tok::greatergreatergreater)))\n      DiagId = diag::warn_cxx98_compat_two_right_angle_brackets;"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:46:14: warning: consecutive right angle brackets are incompatible with C++98 (use \'> >\') [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_typename_outside_of_template"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_typename_outside_of_template",
		[h]="use of \'typename\' outside of a template is incompatible with C++98",
		[b]="use of \'typename\' outside of a template is incompatible with C++98",
		[f]=j,
		[g]="use of \'typename\' outside of a template is incompatible with C\\+\\+98",
		[e]=B,
		[a]=r,
		[d]={Ib,1318970984,Jb,Eb},
		[c]={{yb,10810,"TypeResult Sema::ActOnTypenameType(Scope *S, SourceLocation TypenameLoc, const CXXScopeSpec &SS, const IdentifierInfo &II, SourceLocation IdLoc, ImplicitTypenameContext IsImplicitTypename) {\n  // ...\n  if (TypenameLoc.isValid() && S && !S->getTemplateParamParent())\n    Diag(TypenameLoc, getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_typename_outside_of_template : diag::ext_typename_outside_of_template) << FixItHint::CreateRemoval(TypenameLoc);"},{yb,10842,"TypeResult Sema::ActOnTypenameType(Scope *S, SourceLocation TypenameLoc, const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, TemplateTy TemplateIn, IdentifierInfo *TemplateII, SourceLocation TemplateIILoc, SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgsIn, SourceLocation RAngleLoc) {\n  if (TypenameLoc.isValid() && S && !S->getTemplateParamParent())\n    Diag(TypenameLoc, getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_typename_outside_of_template : diag::ext_typename_outside_of_template) << FixItHint::CreateRemoval(TypenameLoc);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:203:1: warning: use of \'typename\' outside of a template is incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_unelaborated_friend_type"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_unelaborated_friend_type",
		[h]="befriending %1 without \'%select{struct|interface|union|class|enum}0\' keyword is incompatible with C++98",
		[b]={{nil,nil,{"befriending B without \'",{kd,md,yc,zc,"enum"},"\' keyword is incompatible with C++98"}}},
		[f]=j,
		[g]="befriending (.*?) without \'(?:struct|interface|union|class|enum)\' keyword is incompatible with C\\+\\+98",
		[e]=B,
		[a]=r,
		[d]={"c82397332d13",1318973940,"-Wc++98-compat and -Wc++98-compat-pedantic warnings for Sema, part 2.","-Wc++98-compat and -Wc++98-compat-pedantic warnings for Sema, part 2.\n\nllvm-svn: 142426"},
		[c]={{K,17211,"/// Perform semantic analysis of the given friend type declaration.\n///\n/// \\returns A friend declaration that.\nFriendDecl *Sema::CheckFriendTypeDecl(SourceLocation LocStart, SourceLocation FriendLoc, TypeSourceInfo *TSInfo) {\n  // ...\n  // C++03 [class.friend]p2:\n  //   An elaborated-type-specifier shall be used in a friend declaration\n  //   for a class.*\n  //\n  //   * The class-key of the elaborated-type-specifier is required.\n  if (!CodeSynthesisContexts.empty()) {\n  // ...\n  } else {\n    if (!T->isElaboratedTypeSpecifier()) {\n      // If we evaluated the type to a record type, suggest putting\n      // a tag in front.\n      if (const RecordType *RT = T->getAs<RecordType>()) {\n        // ...\n        Diag(TypeRange.getBegin(), getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_unelaborated_friend_type : diag::ext_unelaborated_friend_type) << (unsigned)RD->getTagKind() << T << FixItHint::CreateInsertion(getLocForEndOfToken(FriendLoc), InsertionText);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:225:10: warning: befriending \'Struct\' without \'struct\' keyword is incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_unicode_literal"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_unicode_literal",
		[h]="unicode literals are incompatible with C++98",
		[b]="unicode literals are incompatible with C++98",
		[f]=j,
		[g]="unicode literals are incompatible with C\\+\\+98",
		[e]=B,
		[a]=Z,
		[d]={Ac,1318641536,wc,xc},
		[c]={{nb,2087,"/// LexStringLiteral - Lex the remainder of a string literal, after having lexed\n/// either \" or L\" or u8\" or u\" or U\".\nbool Lexer::LexStringLiteral(Token &Result, const char *CurPtr, tok::TokenKind Kind) {\n  // ...\n  if (!isLexingRawMode() && (Kind == tok::utf8_string_literal || Kind == tok::utf16_string_literal || Kind == tok::utf32_string_literal))\n    Diag(BufferPtr, LangOpts.CPlusPlus ? diag::warn_cxx98_compat_unicode_literal : diag::warn_c99_compat_unicode_literal);"},{nb,2303,"/// LexCharConstant - Lex the remainder of a character constant, after having\n/// lexed either \' or L\' or u8\' or u\' or U\'.\nbool Lexer::LexCharConstant(Token &Result, const char *CurPtr, tok::TokenKind Kind) {\n  // ...\n  if (!isLexingRawMode()) {\n    if (Kind == tok::utf16_char_constant || Kind == tok::utf32_char_constant)\n      Diag(BufferPtr, LangOpts.CPlusPlus ? diag::warn_cxx98_compat_unicode_literal : diag::warn_c99_compat_unicode_literal);"}},
		[m]={
			["clang/test/Lexer/unicode-strings.c"]={"clang/test/Lexer/unicode-strings.c:16:17: warning: unicode literals are incompatible with C++98 [-Wc++98-compat]","clang/test/Lexer/unicode-strings.c:17:21: warning: unicode literals are incompatible with C++98 [-Wc++98-compat]","clang/test/Lexer/unicode-strings.c:18:21: warning: unicode literals are incompatible with C++98 [-Wc++98-compat]","clang/test/Lexer/unicode-strings.c:20:14: warning: unicode literals are incompatible with C++98 [-Wc++98-compat]","clang/test/Lexer/unicode-strings.c:21:14: warning: unicode literals are incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_unicode_type"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_unicode_type",
		[h]="\'%0\' type specifier is incompatible with C++98",
		[b]="\'A\' type specifier is incompatible with C++98",
		[f]=j,
		[g]="\'(.*?)\' type specifier is incompatible with C\\+\\+98",
		[e]=B,
		[a]=r,
		[d]={sc,1318892780,pc,oc},
		[c]={{Yc,1377,"/// Finish - This does final analysis of the declspec, rejecting things like\n/// \"_Imaginary\" (lacking an FP type). After calling this method, DeclSpec is\n/// guaranteed to be self-consistent, even if an error occurred.\nvoid DeclSpec::Finish(Sema &S, const PrintingPolicy &Policy) {\n  // ...\n  if (TypeSpecType == TST_char8)\n  // ...\n  else if (TypeSpecType == TST_char16 || TypeSpecType == TST_char32)\n    S.Diag(TSTLoc, diag::warn_cxx98_compat_unicode_type) << (TypeSpecType == TST_char16 ? \"char16_t\" : \"char32_t\");"}},
		[m]={
			["clang/test/Lexer/unicode-strings.c"]={"clang/test/Lexer/unicode-strings.c:17:7: warning: \'char16_t\' type specifier is incompatible with C++98 [-Wc++98-compat]","clang/test/Lexer/unicode-strings.c:18:7: warning: \'char32_t\' type specifier is incompatible with C++98 [-Wc++98-compat]","clang/test/Lexer/unicode-strings.c:20:1: warning: \'char16_t\' type specifier is incompatible with C++98 [-Wc++98-compat]","clang/test/Lexer/unicode-strings.c:21:1: warning: \'char32_t\' type specifier is incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_using_decl_constructor"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_using_decl_constructor",
		[h]="inheriting constructors are incompatible with C++98",
		[b]="inheriting constructors are incompatible with C++98",
		[f]=j,
		[g]="inheriting constructors are incompatible with C\\+\\+98",
		[e]=B,
		[a]=r,
		[d]={Ib,1318970984,Jb,Eb},
		[c]={{K,12039,"Decl *Sema::ActOnUsingDeclaration(Scope *S, AccessSpecifier AS, SourceLocation UsingLoc, SourceLocation TypenameLoc, CXXScopeSpec &SS, UnqualifiedId &Name, SourceLocation EllipsisLoc, const ParsedAttributesView &AttrList) {\n  // ...\n  case UnqualifiedIdKind::IK_ConstructorName:\n  case UnqualifiedIdKind::IK_ConstructorTemplateId:\n    // ...\n    Diag(Name.getBeginLoc(), getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_using_decl_constructor : diag::err_using_decl_constructor) << SS.getRange();"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:161:22: warning: inheriting constructors are incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx98_compat_variadic_macro"]={
		[l]={n},
		[k]=n,
		[i]="warn_cxx98_compat_variadic_macro",
		[h]="variadic macros are incompatible with C++98",
		[b]="variadic macros are incompatible with C++98",
		[f]=j,
		[g]="variadic macros are incompatible with C\\+\\+98",
		[e]=kc,
		[a]=Z,
		[d]={Ac,1318641536,wc,xc},
		[c]={{cd,2679,"/// ReadMacroParameterList - The ( starting a parameter list of a macro\n/// definition has just been read.  Lex the rest of the parameters and the\n/// closing ), updating MI with what we learn.  Return true if an error occurs\n/// parsing the param list.\nbool Preprocessor::ReadMacroParameterList(MacroInfo *MI, Token &Tok) {\n  // ...\n  while (true) {\n    // ...\n    case tok::ellipsis: // #define X(... -> C99 varargs\n      if (!LangOpts.C99)\n        Diag(Tok, LangOpts.CPlusPlus11 ? diag::warn_cxx98_compat_variadic_macro : diag::ext_variadic_macro);"}},
		[m]={
			[uc]={"clang/test/SemaCXX/cxx98-compat-pedantic.cpp:32769:21: warning: variadic macros are incompatible with C++98 [-Wc++98-compat-pedantic]"}
		}
	},
	["warn_cxx98_compat_variadic_templates"]={
		[l]={o,n},
		[k]=o,
		[i]="warn_cxx98_compat_variadic_templates",
		[h]="variadic templates are incompatible with C++98",
		[b]="variadic templates are incompatible with C++98",
		[f]=j,
		[g]="variadic templates are incompatible with C\\+\\+98",
		[e]=B,
		[a]=F,
		[d]={"a722170eb95d",1318544285,"Implement the first piece of a -Wc++98-compat flag so that people can build in","Implement the first piece of a -Wc++98-compat flag so that people can build in\nC++11 mode but keep their sources compatible with C++98.  This patch implements\nthe -Wc++98-compat-variadic-templates sub-flag and -Wc++98-compat to include\nit.\n\nllvm-svn: 141898"},
		[c]={{"clang/lib/Parse/ParseTemplate.cpp",827,"/// ParseTypeParameter - Parse a template type parameter (C++ [temp.param]).\n/// Other kinds of template parameters are parsed in\n/// ParseTemplateTemplateParameter and ParseNonTypeTemplateParameter.\n///\n///       type-parameter:     [C++ temp.param]\n///         \'class\' ...[opt][C++0x] identifier[opt]\n///         \'class\' identifier[opt] \'=\' type-id\n///         \'typename\' ...[opt][C++0x] identifier[opt]\n///         \'typename\' identifier[opt] \'=\' type-id\nNamedDecl *Parser::ParseTypeParameter(unsigned Depth, unsigned Position) {\n  // ...\n  if (TryConsumeToken(tok::ellipsis, EllipsisLoc)) {\n    Diag(EllipsisLoc, getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_variadic_templates : diag::ext_variadic_templates);"},{"clang/lib/Parse/ParseTemplate.cpp",959,"/// ParseTemplateTemplateParameter - Handle the parsing of template\n/// template parameters.\n///\n///       type-parameter:    [C++ temp.param]\n///         template-head type-parameter-key ...[opt] identifier[opt]\n///         template-head type-parameter-key identifier[opt] = id-expression\n///       type-parameter-key:\n///         \'class\'\n///         \'typename\'       [C++1z]\n///       template-head:     [C++2a]\n///         \'template\' \'<\' template-parameter-list \'>\'\n///             requires-clause[opt]\nNamedDecl *Parser::ParseTemplateTemplateParameter(unsigned Depth, unsigned Position) {\n  // ...\n  if (TryConsumeToken(tok::ellipsis, EllipsisLoc))\n    Diag(EllipsisLoc, getLangOpts().CPlusPlus11 ? diag::warn_cxx98_compat_variadic_templates : diag::ext_variadic_templates);"},{Pb,5945,"static TypeSourceInfo *GetFullTypeForDeclarator(TypeProcessingState &state, QualType declSpecType, TypeSourceInfo *TInfo) {\n  // ...\n  // If there was an ellipsis in the declarator, the declaration declares a\n  // parameter pack whose type may be a pack expansion type.\n  if (D.hasEllipsis()) {\n    // ...\n    case DeclaratorContext::TemplateParam:\n      // C++0x [temp.param]p15:\n      //   If a template-parameter is a [...] is a parameter-declaration that\n      //   declares a parameter pack (8.3.5), then the template-parameter is a\n      //   template parameter pack (14.5.3).\n      //\n      // Note: core issue 778 clarifies that, if there are any unexpanded\n      // parameter packs in the type of the non-type template parameter, then\n      // it expands those parameter packs.\n      if (T->containsUnexpandedParameterPack())\n      // ...\n      else\n        S.Diag(D.getEllipsisLoc(), LangOpts.CPlusPlus11 ? diag::warn_cxx98_compat_variadic_templates : diag::ext_variadic_templates);"}},
		[m]={
			[C]={"clang/test/SemaCXX/cxx98-compat.cpp:17:19: warning: variadic templates are incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:20:35: warning: variadic templates are incompatible with C++98 [-Wc++98-compat]","clang/test/SemaCXX/cxx98-compat.cpp:23:14: warning: variadic templates are incompatible with C++98 [-Wc++98-compat]"}
		}
	},
	["warn_cxx_ms_struct"]={
		[l]={"incompatible-ms-struct"},
		[k]="incompatible-ms-struct",
		[i]="warn_cxx_ms_struct",
		[h]="ms_struct may not produce Microsoft-compatible layouts for classes with base classes or virtual functions",
		[b]="ms_struct may not produce Microsoft-compatible layouts for classes with base classes or virtual functions",
		[f]="(?:error|warning|fatal error)\\: ",
		[g]="ms_struct may not produce Microsoft\\-compatible layouts for classes with base classes or virtual functions",
		[e]=" \\[[^\\]]*\\-Wincompatible\\-ms\\-struct[^\\]]*\\]",
		[a]=r,
		[d]={"95833f33bda6",1393533049,"Diagnose attempts to apply ms_struct to records with base classes","Diagnose attempts to apply ms_struct to records with base classes\nor virtual functions, but permit that error to be downgraded to\na warning (with -Wno-error=incompatible-ms-struct), and officially\nsupport this kind of dual, ABI-mixing layout.\n\nThe basic problem here is that projects which use ms_struct are often\nnot very circumspect about what types they annotate; for example,\nsome projects enable the pragma in a prefix header and then only\nselectively disable it around system header inclusions.  They may\nonly care about binary compatibility with MSVC for a subset of\nthose structs, but that doesn\'t mean they have no binary\ncompatibility concerns at all for the rest; thus we are essentially\nforced into supporting this hybrid ABI.  But it\'s reasonable for\nus to at least point out the places where we\'re not making\nany guarantees.\n\nThe original diagnostic was for dynamic classes, i.e. those with\nvirtual functions or virtual bases; I\'ve extended it to include\nall classes with bases, because we are not actually making any\nattempt to duplicate MSVC\'s base subobject layout in ms_struct\n(and it is indeed quite different from Itanium, even for\nnon-virtual bases).\n\nrdar://16178895\n\nllvm-svn: 202427"},
		[c]={{K,7186,"/// Perform semantic checks on a class definition that has been\n/// completing, introducing implicitly-declared members, checking for\n/// abstract types, etc.\n///\n/// \\param S The scope in which the class was parsed. Null if we didn\'t just\n///        parse a class definition.\n/// \\param Record The completed class.\nvoid Sema::CheckCompletedCXXClass(Scope *S, CXXRecordDecl *Record) {\n  // ...\n  // ms_struct is a request to use the same ABI rules as MSVC.  Check\n  // whether this class uses any C++ features that are implemented\n  // completely differently in MSVC, and if so, emit a diagnostic.\n  // That diagnostic defaults to an error, but we allow projects to\n  // map it down to a warning (or ignore it).  It\'s a fairly common\n  // practice among users of the ms_struct pragma to mass-annotate\n  // headers, sweeping up a bunch of types that the project doesn\'t\n  // really rely on MSVC-compatible layout for.  We must therefore\n  // support \"ms_struct except for C++ stuff\" as a secondary ABI.\n  // Don\'t emit this diagnostic if the feature was enabled as a\n  // language option (as opposed to via a pragma or attribute), as\n  // the option -mms-bitfields otherwise essentially makes it impossible\n  // to build C++ code, unless this diagnostic is turned off.\n  if (Record->isMsStruct(Context) && !Context.getLangOpts().MSBitfields && (Record->isPolymorphic() || Record->getNumBases())) {\n    Diag(Record->getLocation(), diag::warn_cxx_ms_struct);"}},
		[m]={
			["clang/test/SemaCXX/ms_struct.cpp"]={"clang/test/SemaCXX/ms_struct.cpp:15:8: error: ms_struct may not produce Microsoft-compatible layouts for classes with base classes or virtual functions [-Wincompatible-ms-struct]","clang/test/SemaCXX/ms_struct.cpp:30:8: error: ms_struct may not produce Microsoft-compatible layouts for classes with base classes or virtual functions [-Wincompatible-ms-struct]"}
		}
	},
	["warn_dangling_else"]={
		[l]={vc,"all","dangling-else","parentheses"},
		[k]="dangling-else",
		[i]="warn_dangling_else",
		[h]="add explicit braces to avoid dangling else",
		[b]="add explicit braces to avoid dangling else",
		[f]=j,
		[g]="add explicit braces to avoid dangling else",
		[e]=" \\[(?:\\-Werror,)?\\-Wdangling\\-else[^\\]]*\\]",
		[a]=F,
		[d]={"3cef10814aed",1324596377,"Add -Wdangling-else.","Add -Wdangling-else.\n\nThis works like described in  http://drdobbs.com/blogs/cpp/231602010\nFixes http://llvm.org/PR11609\n\nllvm-svn: 147202"},
		[c]={{tc,1623,"/// ParseIfStatement\n///       if-statement: [C99 6.8.4.1]\n///         \'if\' \'(\' expression \')\' statement\n///         \'if\' \'(\' expression \')\' statement \'else\' statement\n/// [C++]   \'if\' \'(\' condition \')\' statement\n/// [C++]   \'if\' \'(\' condition \')\' statement \'else\' statement\n/// [C++23] \'if\' \'!\' [opt] consteval compound-statement\n/// [C++23] \'if\' \'!\' [opt] consteval compound-statement \'else\' statement\n///\nStmtResult Parser::ParseIfStatement(SourceLocation *TrailingElseLoc) {\n  // ...\n  if (Tok.is(tok::kw_else)) {\n  // ...\n  } else if (Tok.is(tok::code_completion)) {\n  // ...\n  } else if (InnerStatementTrailingElseLoc.isValid()) {\n    Diag(InnerStatementTrailingElseLoc, diag::warn_dangling_else);"}},
		[m]={
			["clang/test/Parser/warn-dangling-else.cpp"]={"clang/test/Parser/warn-dangling-else.cpp:6:24: warning: add explicit braces to avoid dangling else [-Wdangling-else]","clang/test/Parser/warn-dangling-else.cpp:7:34: warning: add explicit braces to avoid dangling else [-Wdangling-else]","clang/test/Parser/warn-dangling-else.cpp:8:35: warning: add explicit braces to avoid dangling else [-Wdangling-else]","clang/test/Parser/warn-dangling-else.cpp:9:33: warning: add explicit braces to avoid dangling else [-Wdangling-else]","clang/test/Parser/warn-dangling-else.cpp:10:41: warning: add explicit braces to avoid dangling else [-Wdangling-else]","clang/test/Parser/warn-dangling-else.cpp:15:7: warning: add explicit braces to avoid dangling else [-Wdangling-else]"}
		}
	},
	["warn_dangling_lifetime_pointer"]={
		[l]={sd,"dangling-gsl"},
		[k]="dangling-gsl",
		[i]={{nil,s,"warn_dangling_lifetime_pointer"}},
		[h]={{nil,s,"object backing the pointer will be destroyed at the end of the full-expression"}},
		[b]={{nil,s,"object backing the pointer will be destroyed at the end of the full-expression"}},
		[f]=j,
		[g]="object backing the pointer will be destroyed at the end of the full\\-expression",
		[e]=" \\[(?:\\-Werror,)?\\-Wdangling\\-gsl[^\\]]*\\]",
		[a]={{nil,s,r}},
		[d]={"e5e10b526f2f",1565118809,"Teach some warnings to respect gsl::Pointer and gsl::Owner attributes","Teach some warnings to respect gsl::Pointer and gsl::Owner attributes\n\nThis patch extends some existing warnings to utilize the knowledge about the gsl::Pointer and gsl::Owner attributes.\n\nDifferential Revision: https://reviews.llvm.org/D64256\n\nllvm-svn: 368072"},
		[c]={{ob,8123,"void Sema::checkInitializerLifetime(const InitializedEntity &Entity, Expr *Init) {\n  // ...\n  auto TemporaryVisitor = [&](IndirectLocalPath &Path, Local L, ReferenceKind RK) -> bool {\n    // ...\n    case LK_Extended: {\n      // ...\n      if (IsGslPtrInitWithGslTempOwner && DiagLoc.isValid()) {\n        Diag(DiagLoc, diag::warn_dangling_lifetime_pointer) << DiagRange;"},{ob,8239,"void Sema::checkInitializerLifetime(const InitializedEntity &Entity, Expr *Init) {\n  // ...\n  auto TemporaryVisitor = [&](IndirectLocalPath &Path, Local L, ReferenceKind RK) -> bool {\n    // ...\n    case LK_New:\n      if (isa<MaterializeTemporaryExpr>(L)) {\n        if (IsGslPtrInitWithGslTempOwner)\n          Diag(DiagLoc, diag::warn_dangling_lifetime_pointer) << DiagRange;"},{ob,8329,"void Sema::checkInitializerLifetime(const InitializedEntity &Entity, Expr *Init) {\n  // ...\n  bool EnableLifetimeWarnings = !getDiagnostics().isIgnored(diag::warn_dangling_lifetime_pointer, SourceLocation());"}},
		[m]={
			["clang/test/Sema/warn-lifetime-analysis-nocfg.cpp"]={"clang/test/Sema/warn-lifetime-analysis-nocfg.cpp:39:35: warning: object backing the pointer will be destroyed at the end of the full-expression [-Wdangling-gsl]","clang/test/Sema/warn-lifetime-analysis-nocfg.cpp:40:20: warning: object backing the pointer will be destroyed at the end of the full-expression [-Wdangling-gsl]","clang/test/Sema/warn-lifetime-analysis-nocfg.cpp:122:20: warning: object backing the pointer will be destroyed at the end of the full-expression [-Wdangling-gsl]","clang/test/Sema/warn-lifetime-analysis-nocfg.cpp:125:36: warning: object backing the pointer will be destroyed at the end of the full-expression [-Wdangling-gsl]","clang/test/Sema/warn-lifetime-analysis-nocfg.cpp:236:35: warning: object backing the pointer will be destroyed at the end of the full-expression [-Wdangling-gsl]","clang/test/Sema/warn-lifetime-analysis-nocfg.cpp:290:14: warning: object backing the pointer will be destroyed at the end of the full-expression [-Wdangling-gsl]","clang/test/Sema/warn-lifetime-analysis-nocfg.cpp:291:15: warning: object backing the pointer will be destroyed at the end of the full-expression [-Wdangling-gsl]","clang/test/Sema/warn-lifetime-analysis-nocfg.cpp:292:14: warning: object backing the pointer will be destroyed at the end of the full-expression [-Wdangling-gsl]","clang/test/Sema/warn-lifetime-analysis-nocfg.cpp:293:13: warning: object backing the pointer will be destroyed at the end of the full-expression [-Wdangling-gsl]","clang/test/Sema/warn-lifetime-analysis-nocfg.cpp:302:18: warning: object backing the pointer will be destroyed at the end of the full-expression [-Wdangling-gsl]","clang/test/Sema/warn-lifetime-analysis-nocfg.cpp:346:38: warning: object backing the pointer will be destroyed at the end of the full-expression [-Wdangling-gsl]"}
		}
	},
	["warn_dangling_lifetime_pointer_member"]={
		[l]={sd,"dangling-gsl"},
		[k]="dangling-gsl",
		[i]={{nil,s,"warn_dangling_lifetime_pointer_member"}},
		[h]={{nil,s,"initializing pointer member %0 to point to a temporary object whose lifetime is shorter than the lifetime of the constructed object"}},
		[b]={{nil,s,"initializing pointer member A to point to a temporary object whose lifetime is shorter than the lifetime of the constructed object"}},
		[f]=j,
		[g]="initializing pointer member (.*?) to point to a temporary object whose lifetime is shorter than the lifetime of the constructed object",
		[e]=" \\[(?:\\-Werror,)?\\-Wdangling\\-gsl[^\\]]*\\]",
		[a]={{nil,s,r}},
		[d]={"e5e10b526f2f",1565118809,"Teach some warnings to respect gsl::Pointer and gsl::Owner attributes","Teach some warnings to respect gsl::Pointer and gsl::Owner attributes\n\nThis patch extends some existing warnings to utilize the knowledge about the gsl::Pointer and gsl::Owner attributes.\n\nDifferential Revision: https://reviews.llvm.org/D64256\n\nllvm-svn: 368072"},
		[c]={{ob,8171,"void Sema::checkInitializerLifetime(const InitializedEntity &Entity, Expr *Init) {\n  // ...\n  auto TemporaryVisitor = [&](IndirectLocalPath &Path, Local L, ReferenceKind RK) -> bool {\n    // ...\n    case LK_MemInitializer: {\n      if (isa<MaterializeTemporaryExpr>(L)) {\n        // Under C++ DR1696, if a mem-initializer (or a default member\n        // initializer used by the absence of one) would lifetime-extend a\n        // temporary, the program is ill-formed.\n        if (auto *ExtendingDecl = ExtendingEntity ? ExtendingEntity->getDecl() : nullptr) {\n          if (IsGslPtrInitWithGslTempOwner) {\n            Diag(DiagLoc, diag::warn_dangling_lifetime_pointer_member) << ExtendingDecl << DiagRange;"}},
		[m]={
			["clang/test/Sema/warn-lifetime-analysis-nocfg.cpp"]={"clang/test/Sema/warn-lifetime-analysis-nocfg.cpp:75:30: warning: initializing pointer member \'p2\' to point to a temporary object whose lifetime is shorter than the lifetime of the constructed object [-Wdangling-gsl]","clang/test/Sema/warn-lifetime-analysis-nocfg.cpp:76:35: warning: initializing pointer member \'p\' to point to a temporary object whose lifetime is shorter than the lifetime of the constructed object [-Wdangling-gsl]"}
		}
	},
	["warn_dangling_member"]={
		[l]={sd,"dangling-field"},
		[k]="dangling-field",
		[i]={{nil,O,"warn_dangling_member"}},
		[h]={{nil,O,"%select{reference|backing array for \'std::initializer_list\'}2 %select{|subobject of }1member %0 %select{binds to|is}2 a temporary object whose lifetime is shorter than the lifetime of the constructed object"}},
		[b]={{nil,O,{{"reference","backing array for \'std::initializer_list\'"}," ",{vb,"subobject of "},"member A ",{"binds to","is"}," a temporary object whose lifetime is shorter than the lifetime of the constructed object"}}},
		[f]=j,
		[g]="(?:reference|backing array for \'std\\:\\:initializer_list\') (?:|subobject of )member (.*?) (?:binds to|is) a temporary object whose lifetime is shorter than the lifetime of the constructed object",
		[e]=" \\[(?:\\-Werror,)?\\-Wdangling\\-field[^\\]]*\\]",
		[a]={{nil,O,r}},
		[d]={"0e3102d1dc04",1532393708,"Warn if a local variable\'s initializer retains a pointer/reference to a","Warn if a local variable\'s initializer retains a pointer/reference to a\nnon-lifetime-extended temporary object.\n\nllvm-svn: 337790"},
		[c]={{ob,8182,"void Sema::checkInitializerLifetime(const InitializedEntity &Entity, Expr *Init) {\n  // ...\n  auto TemporaryVisitor = [&](IndirectLocalPath &Path, Local L, ReferenceKind RK) -> bool {\n    // ...\n    case LK_MemInitializer: {\n      if (isa<MaterializeTemporaryExpr>(L)) {\n        // Under C++ DR1696, if a mem-initializer (or a default member\n        // initializer used by the absence of one) would lifetime-extend a\n        // temporary, the program is ill-formed.\n        if (auto *ExtendingDecl = ExtendingEntity ? ExtendingEntity->getDecl() : nullptr) {\n          // ...\n          Diag(DiagLoc, shouldLifetimeExtendThroughPath(Path) != PathLifetimeKind::NoExtend ? diag::err_dangling_member : diag::warn_dangling_member) << ExtendingDecl << IsSubobjectMember << RK << DiagRange;"}}
	},
	["warn_dangling_variable"]={
		[l]={sd},
		[k]=sd,
		[i]={{nil,O,"warn_dangling_variable"}},
		[h]={{nil,O,"%select{temporary %select{whose address is used as value of|%select{|implicitly }2bound to}4 %select{%select{|reference }4member of local variable|local %select{variable|reference}4}1|array backing %select{initializer list subobject of local variable|local initializer list}1}0 %select{%3 |}2will be destroyed at the end of the full-expression"}},
		[b]={{nil,O,{{{"temporary ",{"whose address is used as value of",{{vb,"implicitly "},"bound to"}}," ",{{{vb,"reference "},"member of local variable"},{"local ",{"variable","reference"}}}},{"array backing ",{"initializer list subobject of local variable","local initializer list"}}}," ",{"D ",vb},"will be destroyed at the end of the full-expression"}}},
		[f]=j,
		[g]="(?:temporary (?:whose address is used as value of|(?:|implicitly )bound to) (?:(?:|reference )member of local variable|local (?:variable|reference))|array backing (?:initializer list subobject of local variable|local initializer list)) (?:(.*?) |)will be destroyed at the end of the full\\-expression",
		[e]=" \\[(?:\\-Werror,)?\\-Wdangling[^\\]]*\\]",
		[a]={{nil,O,r}},
		[d]={"0e3102d1dc04",1532393708,"Warn if a local variable\'s initializer retains a pointer/reference to a","Warn if a local variable\'s initializer retains a pointer/reference to a\nnon-lifetime-extended temporary object.\n\nllvm-svn: 337790"},
		[c]={{ob,8154,"void Sema::checkInitializerLifetime(const InitializedEntity &Entity, Expr *Init) {\n  // ...\n  auto TemporaryVisitor = [&](IndirectLocalPath &Path, Local L, ReferenceKind RK) -> bool {\n    // ...\n    case LK_Extended: {\n      // ...\n      case PathLifetimeKind::NoExtend:\n        // ...\n        Diag(DiagLoc, diag::warn_dangling_variable) << RK << !Entity.getParent() << ExtendingEntity->getDecl()->isImplicit() << ExtendingEntity->getDecl() << Init->isGLValue() << DiagRange;"}},
		[m]={
			["clang/test/SemaCXX/address-of-temporary.cpp"]={"clang/test/SemaCXX/address-of-temporary.cpp:29:24: warning: temporary whose address is used as value of local variable \'p\' will be destroyed at the end of the full-expression [-Wdangling]","clang/test/SemaCXX/address-of-temporary.cpp:30:24: warning: temporary whose address is used as value of local variable \'p\' will be destroyed at the end of the full-expression [-Wdangling]","clang/test/SemaCXX/address-of-temporary.cpp:31:24: warning: temporary whose address is used as value of local variable \'p\' will be destroyed at the end of the full-expression [-Wdangling]","clang/test/SemaCXX/address-of-temporary.cpp:32:24: warning: temporary whose address is used as value of local variable \'p\' will be destroyed at the end of the full-expression [-Wdangling]","clang/test/SemaCXX/address-of-temporary.cpp:33:22: warning: temporary whose address is used as value of local variable \'p\' will be destroyed at the end of the full-expression [-Wdangling]","clang/test/SemaCXX/address-of-temporary.cpp:34:28: warning: temporary whose address is used as value of local variable \'p\' will be destroyed at the end of the full-expression [-Wdangling]","clang/test/SemaCXX/address-of-temporary.cpp:42:23: warning: temporary whose address is used as value of member of local variable \'s\' will be destroyed at the end of the full-expression [-Wdangling]","clang/test/SemaCXX/address-of-temporary.cpp:43:23: warning: temporary whose address is used as value of member of local variable \'s\' will be destroyed at the end of the full-expression [-Wdangling]","clang/test/SemaCXX/address-of-temporary.cpp:44:23: warning: temporary whose address is used as value of member of local variable \'s\' will be destroyed at the end of the full-expression [-Wdangling]","clang/test/SemaCXX/address-of-temporary.cpp:45:23: warning: temporary whose address is used as value of member of local variable \'s\' will be destroyed at the end of the full-expression [-Wdangling]"}
		}
	},
	["warn_dealloc_in_category"]={
		[l]={"dealloc-in-category"},
		[k]="dealloc-in-category",
		[i]="warn_dealloc_in_category",
		[h]="-dealloc is being overridden in a category",
		[b]="-dealloc is being overridden in a category",
		[f]=j,
		[g]="\\-dealloc is being overridden in a category",
		[e]=" \\[(?:\\-Werror,)?\\-Wdealloc\\-in\\-category[^\\]]*\\]",
		[a]=r,
		[d]={"7e350d23b215",1387320268,"Objctive-C. warn if dealloc is being overridden in","Objctive-C. warn if dealloc is being overridden in\na category implementation. // rdar://15397430\n\nllvm-svn: 197534"},
		[c]={{"clang/lib/Sema/SemaDeclObjC.cpp",4950,"Decl *Sema::ActOnMethodDeclaration(Scope *S, SourceLocation MethodLoc, SourceLocation EndLoc, tok::TokenKind MethodType, ObjCDeclSpec &ReturnQT, ParsedType ReturnType, ArrayRef<SourceLocation> SelectorLocs, Selector Sel,\n  // ...\n  if (ObjCImplDecl *ImpDecl = dyn_cast<ObjCImplDecl>(ClassDecl)) {\n    // ...\n    // Merge information from the @interface declaration into the\n    // @implementation.\n    if (ObjCInterfaceDecl *IDecl = ImpDecl->getClassInterface()) {\n      if (auto *IMD = IDecl->lookupMethod(ObjCMethod->getSelector(), ObjCMethod->isInstanceMethod())) {\n        // ...\n        // Warn about defining -dealloc in a category.\n        if (isa<ObjCCategoryImplDecl>(ImpDecl) && IMD->isOverriding() && ObjCMethod->getSelector().getMethodFamily() == OMF_dealloc) {\n          Diag(ObjCMethod->getLocation(), diag::warn_dealloc_in_category) << ObjCMethod->getDeclName();"}},
		[m]={
			["clang/test/SemaObjC/dealloc.m"]={"clang/test/SemaObjC/dealloc.m:39:1: warning: -dealloc is being overridden in a category [-Wdealloc-in-category]"}
		}
	},
	["warn_debug_compression_unavailable"]={
		[l]={"debug-compression-unavailable"},
		[k]="debug-compression-unavailable",
		[i]="warn_debug_compression_unavailable",
		[h]={{nil,U,"cannot compress debug sections (%0 not enabled)"},{D,D,"cannot compress debug sections (zlib not enabled)"},{x,nil,"cannot compress debug sections (zlib not installed)"}},
		[b]={{nil,U,"cannot compress debug sections (A not enabled)"},{D,D,"cannot compress debug sections (zlib not enabled)"},{x,nil,"cannot compress debug sections (zlib not installed)"}},
		[f]=j,
		[g]="cannot compress debug sections \\((.*?) not enabled\\)",
		[e]=" \\[(?:\\-Werror,)?\\-Wdebug\\-compression\\-unavailable[^\\]]*\\]",
		[a]=A,
		[d]={"24bbfed22185",1396308578,"Warn when requesting compress-debug-sections and zlib is not available","Warn when requesting compress-debug-sections and zlib is not available\n\nAnother shot in the dark, since I do have zlib installed. Will be\nwatching the bots for fallout.\n\nllvm-svn: 205265"},
		[c]={{cb,1033,"static void RenderDebugInfoCompressionArgs(const ArgList &Args, ArgStringList &CmdArgs, const Driver &D, const ToolChain &TC) {\n  // ...\n  if (checkDebugInfoOption(A, Args, D, TC)) {\n    // ...\n    if (Value == \"none\") {\n    // ...\n    } else if (Value == \"zlib\") {\n      if (llvm::compression::zlib::isAvailable()) {\n      // ...\n      } else {\n        D.Diag(diag::warn_debug_compression_unavailable) << \"zlib\";"},{cb,1040,"static void RenderDebugInfoCompressionArgs(const ArgList &Args, ArgStringList &CmdArgs, const Driver &D, const ToolChain &TC) {\n  // ...\n  if (checkDebugInfoOption(A, Args, D, TC)) {\n    // ...\n    if (Value == \"none\") {\n    // ...\n    } else if (Value == \"zlib\") {\n    // ...\n    } else if (Value == \"zstd\") {\n      if (llvm::compression::zstd::isAvailable()) {\n      // ...\n      } else {\n        D.Diag(diag::warn_debug_compression_unavailable) << \"zstd\";"}}
	},
	["warn_decl_in_param_list"]={
		[l]={"visibility"},
		[k]="visibility",
		[i]="warn_decl_in_param_list",
		[h]="declaration of %0 will not be visible outside of this function",
		[b]="declaration of A will not be visible outside of this function",
		[f]=j,
		[g]="declaration of (.*?) will not be visible outside of this function",
		[e]=" \\[(?:\\-Werror,)?\\-Wvisibility[^\\]]*\\]",
		[a]=r,
		[d]={"b1c4d5507fad",1236199783,"The basic representation of diagnostics information in tablegen format, plus (uncommented and incomp...","The basic representation of diagnostics information in tablegen format, plus (uncommented and incomplete) test conversions of the existing def files to this format.\n\nllvm-svn: 66064"},
		[c]={{bb,17634,"CreateNewDecl:\n  // ...\n  // If we\'re declaring or defining a tag in function prototype scope in C,\n  // note that this type can only be used within the function and add it to\n  // the list of decls to inject into the function definition scope.\n  if ((Name || Kind == TTK_Enum) && getNonFieldDeclScope(S)->isFunctionPrototypeScope()) {\n    if (getLangOpts().CPlusPlus) {\n    // ...\n    } else if (!PrevDecl) {\n      Diag(Loc, diag::warn_decl_in_param_list) << Context.getTagDeclType(New);"}},
		[m]={
			["clang/test/Sema/type-spec-struct-union.c"]={"clang/test/Sema/type-spec-struct-union.c:31:32: warning: declaration of \'struct S4\' will not be visible outside of this function [-Wvisibility]","clang/test/Sema/type-spec-struct-union.c:37:15: warning: declaration of \'struct S5\' will not be visible outside of this function [-Wvisibility]"}
		}
	},
	["warn_decl_shadow"]={
		[l]={"shadow","shadow-all"},
		[k]="shadow",
		[i]="warn_decl_shadow",
		[h]="declaration shadows a %select{local variable|variable in %2|static data member of %2|field of %2}1",
		[b]={{nil,z,{Jc,{Ic,Lc,Mc,Nc,"typedef in C","type alias in C","structured binding"}}},{W,tb,{Jc,{Ic,Lc,Mc,Nc,"typedef in C","type alias in C"}}},{nil,nil,{Jc,{Ic,Lc,Mc,Nc}}}},
		[f]=j,
		[g]="declaration shadows a (?:local variable|variable in (.*?)|static data member of (.*?)|field of (.*?)|typedef in (.*?)|type alias in (.*?)|structured binding)",
		[e]=" \\[(?:\\-Werror,)?\\-Wshadow[^\\]]*\\]",
		[a]=r,
		[d]={"a2a3f7dc115d",1268776098,"Implement -Wshadow.  Based on a patch by Mike M.!","Implement -Wshadow.  Based on a patch by Mike M.!\n\nllvm-svn: 98684"},
		[c]={{bb,8138,"/// Enum describing the %select options in diag::warn_decl_shadow."},{bb,8182,"static bool shouldWarnIfShadowedDecl(const DiagnosticsEngine &Diags, const LookupResult &R) {\n  // ...\n  return !Diags.isIgnored(diag::warn_decl_shadow, R.getNameLoc());"},{bb,8271,"/// Diagnose variable or built-in function shadowing.  Implements\n/// -Wshadow.\n///\n/// This method is called whenever a VarDecl is added to a \"useful\"\n/// scope.\n///\n/// \\param ShadowedDecl the declaration that is shadowed by the given variable\n/// \\param R the lookup of the name\n///\nvoid Sema::CheckShadow(NamedDecl *D, NamedDecl *ShadowedDecl, const LookupResult &R) {\n  // ...\n  unsigned WarningDiag = diag::warn_decl_shadow;"},{bb,8347,"/// Diagnose shadowing for variables shadowed in the lambda record \\p LambdaRD\n/// when these variables are captured by the lambda.\nvoid Sema::DiagnoseShadowingLambdaDecls(const LambdaScopeInfo *LSI) {\n  for (const auto &Shadow : LSI->ShadowingDecls) {\n    // ...\n    Diag(Shadow.VD->getLocation(), CaptureLoc.isInvalid() ? diag::warn_decl_shadow_uncaptured_local : diag::warn_decl_shadow) << Shadow.VD->getDeclName() << computeShadowedDeclKind(ShadowedDecl, OldDC) << OldDC;"},{bb,8359,"/// Check -Wshadow without the advantage of a previous lookup.\nvoid Sema::CheckShadow(Scope *S, VarDecl *D) {\n  if (Diags.isIgnored(diag::warn_decl_shadow, D->getLocation()))"}},
		[m]={
			["clang/test/Sema/warn-shadow.c"]={"clang/test/Sema/warn-shadow.c:8:7: warning: declaration shadows a variable in the global scope [-Wshadow]","clang/test/Sema/warn-shadow.c:10:7: warning: declaration shadows a variable in the global scope [-Wshadow]","clang/test/Sema/warn-shadow.c:14:9: warning: declaration shadows a local variable [-Wshadow]","clang/test/Sema/warn-shadow.c:16:9: warning: declaration shadows a local variable [-Wshadow]","clang/test/Sema/warn-shadow.c:20:11: warning: declaration shadows a local variable [-Wshadow]","clang/test/Sema/warn-shadow.c:21:11: warning: declaration shadows a local variable [-Wshadow]","clang/test/Sema/warn-shadow.c:29:28: warning: declaration shadows a variable in the global scope [-Wshadow]","clang/test/Sema/warn-shadow.c:32:9: warning: declaration shadows a local variable [-Wshadow]","clang/test/Sema/warn-shadow.c:35:12: warning: declaration shadows a local variable [-Wshadow]","clang/test/Sema/warn-shadow.c:50:16: warning: declaration shadows a variable in the global scope [-Wshadow]","clang/test/Sema/warn-shadow.c:66:7: warning: declaration shadows a variable in the global scope [-Wshadow]","clang/test/Sema/warn-shadow.c:71:18: warning: declaration shadows a variable in the global scope [-Wshadow]","clang/test/Sema/warn-shadow.c:82:14: warning: declaration shadows a variable in the global scope [-Wshadow]","clang/test/Sema/warn-shadow.c:88:7: warning: declaration shadows a variable in the global scope [-Wshadow]","clang/test/Sema/warn-shadow.c:90:16: warning: declaration shadows a local variable [-Wshadow]","clang/test/Sema/warn-shadow.c:92:16: warning: declaration shadows a local variable [-Wshadow]","clang/test/Sema/warn-shadow.c:94:9: warning: declaration shadows a local variable [-Wshadow]","clang/test/Sema/warn-shadow.c:96:18: warning: declaration shadows a local variable [-Wshadow]","clang/test/Sema/warn-shadow.c:97:11: warning: declaration shadows a local variable [-Wshadow]"}
		}
	},
	["warn_decl_shadow_uncaptured_local"]={
		[l]={"shadow-all","shadow-uncaptured-local"},
		[k]="shadow-uncaptured-local",
		[i]="warn_decl_shadow_uncaptured_local",
		[h]="declaration shadows a %select{local variable|variable in %2|static data member of %2|field of %2}1",
		[b]={{nil,z,{Jc,{Ic,Lc,Mc,Nc,"typedef in C","type alias in C","structured binding"}}},{W,tb,{Jc,{Ic,Lc,Mc,Nc,"typedef in C","type alias in C"}}},{nil,nil,{Jc,{Ic,Lc,Mc,Nc}}}},
		[f]=j,
		[g]="declaration shadows a (?:local variable|variable in (.*?)|static data member of (.*?)|field of (.*?)|typedef in (.*?)|type alias in (.*?)|structured binding)",
		[e]=" \\[(?:\\-Werror,)?\\-Wshadow\\-uncaptured\\-local[^\\]]*\\]",
		[a]=r,
		[d]={"175388c00d0a",1478687937,"[Sema] Avoid -Wshadow warnings for shadowed variables that aren\'t captured","[Sema] Avoid -Wshadow warnings for shadowed variables that aren\'t captured\nby lambdas with an explicit capture list\n\nThis commit avoids the -Wshadow warning for variables which shadow variables\nthat aren\'t captured by lambdas with an explicit capture list. It provides an\nadditional note that points to location of the explicit capture.\n\nThe old behaviour is preserved with -Wshadow-all or -Wshadow-uncaptured-local.\n\nrdar://17135966\n\nDifferential Revision: https://reviews.llvm.org/D26278\n\nllvm-svn: 286354"},
		[c]={{bb,8283,"/// Diagnose variable or built-in function shadowing.  Implements\n/// -Wshadow.\n///\n/// This method is called whenever a VarDecl is added to a \"useful\"\n/// scope.\n///\n/// \\param ShadowedDecl the declaration that is shadowed by the given variable\n/// \\param R the lookup of the name\n///\nvoid Sema::CheckShadow(NamedDecl *D, NamedDecl *ShadowedDecl, const LookupResult &R) {\n  // ...\n  if (isa<VarDecl>(D) && isa<VarDecl>(ShadowedDecl) && NewDC && isa<CXXMethodDecl>(NewDC)) {\n    if (const auto *RD = dyn_cast<CXXRecordDecl>(NewDC->getParent())) {\n      if (RD->isLambda() && OldDC->Encloses(NewDC->getLexicalParent())) {\n        if (RD->getLambdaCaptureDefault() == LCD_None) {\n          // ...\n          if (CaptureLoc.isInvalid())\n            WarningDiag = diag::warn_decl_shadow_uncaptured_local;"},{bb,8346,"/// Diagnose shadowing for variables shadowed in the lambda record \\p LambdaRD\n/// when these variables are captured by the lambda.\nvoid Sema::DiagnoseShadowingLambdaDecls(const LambdaScopeInfo *LSI) {\n  for (const auto &Shadow : LSI->ShadowingDecls) {\n    // ...\n    Diag(Shadow.VD->getLocation(), CaptureLoc.isInvalid() ? diag::warn_decl_shadow_uncaptured_local : diag::warn_decl_shadow) << Shadow.VD->getDeclName() << computeShadowedDeclKind(ShadowedDecl, OldDC) << OldDC;"}}
	},
	["warn_declspec_allocator_nonpointer"]={
		[l]={Oc,Ob},
		[k]=Ob,
		[i]={{nil,t,"warn_declspec_allocator_nonpointer"}},
		[h]={{nil,t,"ignoring __declspec(allocator) because the function return type %0 is not a pointer or reference type"}},
		[b]={{nil,t,"ignoring __declspec(allocator) because the function return type A is not a pointer or reference type"}},
		[f]=j,
		[g]="ignoring __declspec\\(allocator\\) because the function return type (.*?) is not a pointer or reference type",
		[e]=Bc,
		[a]={{nil,t,r}},
		[d]={"1181c9f45db1",1553556018,"[MS] Add frontend support for __declspec(allocator)","[MS] Add frontend support for __declspec(allocator)\n\nThe intention is to add metadata to direct call sites of functions\nmarked with __declspec(allocator), which will ultimately result in some\nS_HEAPALLOCSITE debug info records when emitting codeview.\n\nThis is a piece of PR38491\n\nllvm-svn: 356964"},
		[c]={{rd,8549,"static void handleMSAllocatorAttr(Sema &S, Decl *D, const ParsedAttr &AL) {\n  // Warn if the return type is not a pointer or reference type.\n  if (auto *FD = dyn_cast<FunctionDecl>(D)) {\n    // ...\n    if (!RetTy->isPointerType() && !RetTy->isReferenceType()) {\n      S.Diag(AL.getLoc(), diag::warn_declspec_allocator_nonpointer) << AL.getRange() << RetTy;"}},
		[m]={
			["clang/test/SemaCXX/declspec-allocator.cpp"]={"clang/test/SemaCXX/declspec-allocator.cpp:6:12: warning: ignoring __declspec(allocator) because the function return type \'void\' is not a pointer or reference type [-Wignored-attributes]","clang/test/SemaCXX/declspec-allocator.cpp:7:12: warning: ignoring __declspec(allocator) because the function return type \'int\' is not a pointer or reference type [-Wignored-attributes]"}
		}
	},
	["warn_declspec_attribute_ignored"]={
		[l]={Oc,Ob},
		[k]=Ob,
		[i]="warn_declspec_attribute_ignored",
		[h]="attribute %0 is ignored, place it after \"%select{class|struct|interface|union|enum|enum class|enum struct}1\" to apply attribute to type declaration",
		[b]={{nil,nil,{"attribute A is ignored, place it after \"",{zc,kd,md,yc,"enum","enum class","enum struct"},"\" to apply attribute to type declaration"}},{U,nil,{"attribute A is ignored, place it after \"",{zc,kd,md,yc,"enum"},"\" to apply attribute to type declaration"}}},
		[f]=j,
		[g]="attribute (.*?) is ignored, place it after \"(?:class|struct|interface|union|enum|enum class|enum struct)\" to apply attribute to type declaration",
		[e]=Bc,
		[a]=r,
		[d]={"e321795c60c5",1324082169,"Remove a non-gcc-compatible extension that would apply attributes on declarations without a declarat...","Remove a non-gcc-compatible extension that would apply attributes on declarations without a declarator to structs.  Add a warning for ignored attributes.  Patch by Michael Han.\n\nllvm-svn: 146796"},
		[c]={{bb,5324,"/// ParsedFreeStandingDeclSpec - This method is invoked when a declspec with\n/// no declarator (e.g. \"struct foo;\") is parsed. It also accepts template\n/// parameters to cope with template friend declarations.\nDecl *Sema::ParsedFreeStandingDeclSpec(Scope *S, AccessSpecifier AS, DeclSpec &DS, const ParsedAttributesView &DeclAttrs, MultiTemplateParamsArg TemplateParams, bool IsExplicitInstantiation, RecordDecl *&AnonRecord) {\n  // ...\n  // Warn about ignored type attributes, for example:\n  // __attribute__((aligned)) struct A;\n  // Attributes should be placed after tag to apply to type declaration.\n  if (!DS.getAttributes().empty() || !DeclAttrs.empty()) {\n    // ...\n    if (TypeSpecType == DeclSpec::TST_class || TypeSpecType == DeclSpec::TST_struct || TypeSpecType == DeclSpec::TST_interface || TypeSpecType == DeclSpec::TST_union || TypeSpecType == DeclSpec::TST_enum) {\n      for (const ParsedAttr &AL : DS.getAttributes())\n        Diag(AL.getLoc(), AL.isRegularKeywordAttribute() ? diag::err_declspec_keyword_has_no_effect : diag::warn_declspec_attribute_ignored) << AL << GetDiagnosticTypeSpecifierID(DS);"},{bb,5329,"/// ParsedFreeStandingDeclSpec - This method is invoked when a declspec with\n/// no declarator (e.g. \"struct foo;\") is parsed. It also accepts template\n/// parameters to cope with template friend declarations.\nDecl *Sema::ParsedFreeStandingDeclSpec(Scope *S, AccessSpecifier AS, DeclSpec &DS, const ParsedAttributesView &DeclAttrs, MultiTemplateParamsArg TemplateParams, bool IsExplicitInstantiation, RecordDecl *&AnonRecord) {\n  // ...\n  // Warn about ignored type attributes, for example:\n  // __attribute__((aligned)) struct A;\n  // Attributes should be placed after tag to apply to type declaration.\n  if (!DS.getAttributes().empty() || !DeclAttrs.empty()) {\n    // ...\n    if (TypeSpecType == DeclSpec::TST_class || TypeSpecType == DeclSpec::TST_struct || TypeSpecType == DeclSpec::TST_interface || TypeSpecType == DeclSpec::TST_union || TypeSpecType == DeclSpec::TST_enum) {\n      // ...\n      for (const ParsedAttr &AL : DeclAttrs)\n        Diag(AL.getLoc(), AL.isRegularKeywordAttribute() ? diag::err_declspec_keyword_has_no_effect : diag::warn_declspec_attribute_ignored) << AL << GetDiagnosticTypeSpecifierID(DS);"}},
		[m]={
			["clang/test/SemaCXX/attr-declspec-ignored.cpp"]={"clang/test/SemaCXX/attr-declspec-ignored.cpp:4:18: warning: attribute \'visibility\' is ignored, place it after \"class\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:4:57: warning: attribute \'aligned\' is ignored, place it after \"class\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:6:18: warning: attribute \'visibility\' is ignored, place it after \"struct\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:6:57: warning: attribute \'aligned\' is ignored, place it after \"struct\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:8:18: warning: attribute \'visibility\' is ignored, place it after \"union\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:8:57: warning: attribute \'aligned\' is ignored, place it after \"union\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:10:18: warning: attribute \'visibility\' is ignored, place it after \"enum\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:10:57: warning: attribute \'aligned\' is ignored, place it after \"enum\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:12:18: warning: attribute \'visibility\' is ignored, place it after \"enum class\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:12:57: warning: attribute \'aligned\' is ignored, place it after \"enum class\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:14:18: warning: attribute \'visibility\' is ignored, place it after \"enum struct\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:14:57: warning: attribute \'aligned\' is ignored, place it after \"enum struct\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:19:20: warning: attribute \'visibility\' is ignored, place it after \"class\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:19:59: warning: attribute \'aligned\' is ignored, place it after \"class\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:21:20: warning: attribute \'visibility\' is ignored, place it after \"struct\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:21:59: warning: attribute \'aligned\' is ignored, place it after \"struct\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:23:20: warning: attribute \'visibility\' is ignored, place it after \"union\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:23:59: warning: attribute \'aligned\' is ignored, place it after \"union\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:25:20: warning: attribute \'visibility\' is ignored, place it after \"enum\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:25:59: warning: attribute \'aligned\' is ignored, place it after \"enum\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:27:20: warning: attribute \'visibility\' is ignored, place it after \"enum class\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:27:59: warning: attribute \'aligned\' is ignored, place it after \"enum class\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:29:20: warning: attribute \'visibility\' is ignored, place it after \"enum struct\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:29:59: warning: attribute \'aligned\' is ignored, place it after \"enum struct\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:35:7: warning: attribute \'visibility\' is ignored, place it after \"class\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:35:38: warning: attribute \'aligned\' is ignored, place it after \"class\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:37:7: warning: attribute \'visibility\' is ignored, place it after \"struct\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:37:38: warning: attribute \'aligned\' is ignored, place it after \"struct\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:39:7: warning: attribute \'visibility\' is ignored, place it after \"union\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:39:38: warning: attribute \'aligned\' is ignored, place it after \"union\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:41:7: warning: attribute \'visibility\' is ignored, place it after \"enum\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:41:38: warning: attribute \'aligned\' is ignored, place it after \"enum\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:43:7: warning: attribute \'visibility\' is ignored, place it after \"enum class\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:43:38: warning: attribute \'aligned\' is ignored, place it after \"enum class\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:45:7: warning: attribute \'visibility\' is ignored, place it after \"enum struct\" to apply attribute to type declaration [-Wignored-attributes]","clang/test/SemaCXX/attr-declspec-ignored.cpp:45:38: warning: attribute \'aligned\' is ignored, place it after \"enum struct\" to apply attribute to type declaration [-Wignored-attributes]"}
		}
	},
	["warn_deep_exception_specs_differ"]={
		[l]={"incompatible-exception-spec"},
		[k]="incompatible-exception-spec",
		[i]="warn_deep_exception_specs_differ",
		[h]="exception specifications of %select{return|argument}0 types differ",
		[b]={{nil,nil,{"exception specifications of ",{"return","argument"}," types differ"}}},
		[f]=j,
		[g]="exception specifications of (?:return|argument) types differ",
		[e]=" \\[(?:\\-Werror,)?\\-Wincompatible\\-exception\\-spec[^\\]]*\\]",
		[a]=r,
		[d]={"1be59c510612",1477099939,"[c++1z] P0012R1: Implement a few remaining pieces: downgrade diagnostic for","[c++1z] P0012R1: Implement a few remaining pieces: downgrade diagnostic for\nmismatched dynamic exception specifications in expressions from an error to a\nwarning, since this is no longer ill-formed in C++1z.\n\nAllow reference binding of a reference-to-non-noexcept function to a noexcept\nfunction lvalue. As defect resolutions, also allow a conditional between\nnoexcept and non-noexcept function lvalues to produce a non-noexcept function\nlvalue (rather than decaying to a function pointer), and allow function\ntemplate argument deduction to deduce a reference to non-noexcept function when\nbinding to a noexcept function type.\n\nllvm-svn: 284905"},
		[c]={{"clang/lib/Sema/SemaExceptionSpec.cpp",947,"bool Sema::CheckExceptionSpecCompatibility(Expr *From, QualType ToType) {\n  // ...\n  // This is not an error in C++17 onwards, unless the noexceptness doesn\'t\n  // match, but in that case we have a full-on type mismatch, not just a\n  // type sugar mismatch.\n  if (getLangOpts().CPlusPlus17) {\n    // ...\n    NestedDiagID = diag::warn_deep_exception_specs_differ;"}}
	},
	["warn_def_missing_case"]={
		[l]={"switch-enum"},
		[k]="switch-enum",
		[i]="warn_def_missing_case",
		[h]="%plural{1:enumeration value %1 not explicitly handled in switch|2:enumeration values %1 and %2 not explicitly handled in switch|3:enumeration values %1, %2, and %3 not explicitly handled in switch|:%0 enumeration values not explicitly handled in switch: %1, %2, %3...}0",
		[b]={{nil,nil,{{"enumeration value B not explicitly handled in switch","enumeration values B and C not explicitly handled in switch","enumeration values B, C, and D not explicitly handled in switch","A enumeration values not explicitly handled in switch: B, C, D..."}}}},
		[f]=j,
		[g]="(?:enumeration value (.*?) not explicitly handled in switch|enumeration values (.*?) and (.*?) not explicitly handled in switch|enumeration values (.*?), (.*?), and (.*?) not explicitly handled in switch|(.*?) enumeration values not explicitly handled in switch\\: (.*?), (.*?), (.*?)\\.\\.\\.)",
		[e]=" \\[(?:\\-Werror,)?\\-Wswitch\\-enum[^\\]]*\\]",
		[a]=r,
		[d]={"3a8650af779c",1427476994,"[Sema] Factor diags with %plural. No functionality change intended.","[Sema] Factor diags with %plural. No functionality change intended.\n\nllvm-svn: 233387"},
		[c]={{"clang/lib/Sema/SemaStmt.cpp",1604,"StmtResult Sema::ActOnFinishSwitchStmt(SourceLocation SwitchLoc, Stmt *Switch, Stmt *BodyStmt) {\n  // ...\n  if (!HasDependentValue) {\n    // ...\n    // If switch has default case, then ignore it.\n    if (!CaseListIsErroneous && !CaseListIsIncomplete && !HasConstantCond && ET && ET->getDecl()->isCompleteDefinition() && !ET->getDecl()->enumerators().empty()) {\n      // ...\n      // Produce a nice diagnostic if multiple values aren\'t handled.\n      if (!UnhandledNames.empty()) {\n        auto DB = Diag(CondExpr->getExprLoc(), TheDefaultStmt ? diag::warn_def_missing_case : diag::warn_missing_case) << CondExpr->getSourceRange() << (int)UnhandledNames.size();"}},
		[m]={
			["clang/test/Sema/switch.c"]={"clang/test/Sema/switch.c:211:10: warning: enumeration value \'A\' not explicitly handled in switch [-Wswitch-enum]"}
		}
	},
	["warn_default_atomic_custom_getter_setter"]={
		[l]={"atomic-properties","custom-atomic-properties"},
		[k]="custom-atomic-properties",
		[i]="warn_default_atomic_custom_getter_setter",
		[h]="atomic by default property %0 has a user defined %select{getter|setter}1 (property should be marked \'atomic\' if this is intended)",
		[b]={{nil,nil,{"atomic by default property A has a user defined ",{"getter","setter"}," (property should be marked \'atomic\' if this is intended)"}}},
		[f]=j,
		[g]="atomic by default property (.*?) has a user defined (?:getter|setter) \\(property should be marked \'atomic\' if this is intended\\)",
		[e]=" \\[(?:\\-Werror,)?\\-Wcustom\\-atomic\\-properties[^\\]]*\\]",
		[a]=r,
		[d]={"dd88dbf9d2b3",1296509651,"Add -Wcustom-atomic-properties which warns if an atomic-by-default property has custom getter or set...","Add -Wcustom-atomic-properties which warns if an atomic-by-default property has custom getter or setter.\n\nThe rationale is that it is highly likely that the user\'s getter/setter isn\'t atomically implemented. Off by default.\nAddresses rdar://8782645.\n\n-Wcustom-atomic-properties and -Wimplicit-atomic-properties are under the -Watomic-properties group.\n\nllvm-svn: 124609"},
		[c]={{"clang/lib/Sema/SemaObjCProperty.cpp",2198,"void Sema::AtomicPropertySetterGetterRules(ObjCImplDecl *IMPDecl, ObjCInterfaceDecl *IDecl) {\n  // ...\n  for (ObjCContainerDecl::PropertyMap::iterator I = PM.begin(), E = PM.end(); I != E; ++I) {\n    // ...\n    if (!(AttributesAsWritten & ObjCPropertyAttribute::kind_atomic) && !(AttributesAsWritten & ObjCPropertyAttribute::kind_nonatomic)) {\n      // ...\n      if (GetterMethod) {\n        Diag(GetterMethod->getLocation(), diag::warn_default_atomic_custom_getter_setter) << Property->getIdentifier() << 0;"},{"clang/lib/Sema/SemaObjCProperty.cpp",2204,"void Sema::AtomicPropertySetterGetterRules(ObjCImplDecl *IMPDecl, ObjCInterfaceDecl *IDecl) {\n  // ...\n  for (ObjCContainerDecl::PropertyMap::iterator I = PM.begin(), E = PM.end(); I != E; ++I) {\n    // ...\n    if (!(AttributesAsWritten & ObjCPropertyAttribute::kind_atomic) && !(AttributesAsWritten & ObjCPropertyAttribute::kind_nonatomic)) {\n      // ...\n      if (SetterMethod) {\n        Diag(SetterMethod->getLocation(), diag::warn_default_atomic_custom_getter_setter) << Property->getIdentifier() << 1;"}},
		[m]={
			["clang/test/SemaObjC/custom-atomic-property.m"]={"clang/test/SemaObjC/custom-atomic-property.m:8:2: warning: atomic by default property \'myProp\' has a user defined getter (property should be marked \'atomic\' if this is intended) [-Wcustom-atomic-properties]","clang/test/SemaObjC/custom-atomic-property.m:9:2: warning: atomic by default property \'myProp\' has a user defined setter (property should be marked \'atomic\' if this is intended) [-Wcustom-atomic-properties]"}
		}
	},
	["warn_defaulted_comparison_deleted"]={
		[l]={"defaulted-function-deleted"},
		[k]="defaulted-function-deleted",
		[i]={{nil,s,"warn_defaulted_comparison_deleted"}},
		[h]={{nil,s,"explicitly defaulted %select{<ERROR>|equality|three-way|equality|relational}0 comparison operator is implicitly deleted"}},
		[b]={{nil,s,{"explicitly defaulted ",{"equality","three-way","equality","relational"}," comparison operator is implicitly deleted"}}},
		[f]=j,
		[g]="explicitly defaulted (?:equality|three\\-way|equality|relational) comparison operator is implicitly deleted",
		[e]=" \\[(?:\\-Werror,)?\\-Wdefaulted\\-function\\-deleted[^\\]]*\\]",
		[a]={{nil,s,r}},
		[d]={"5253d9138eb3",1573070592,"[c++20] Determine whether a defaulted comparison should be deleted or","[c++20] Determine whether a defaulted comparison should be deleted or\nconstexpr."},
		[c]={{K,8913,"bool Sema::CheckExplicitlyDefaultedComparison(Scope *S, FunctionDecl *FD, DefaultedComparisonKind DCK) {\n  // ...\n  // If we want to delete the function, then do so; there\'s nothing else to\n  // check in that case.\n  if (Info.Deleted) {\n    // ...\n    if (!inTemplateInstantiation() && !FD->isImplicit()) {\n      Diag(FD->getLocation(), diag::warn_defaulted_comparison_deleted) << (int)DCK;"}},
		[m]={
			["clang/test/CXX/class/class.compare/class.compare.default/p2.cpp"]={"clang/test/CXX/class/class.compare/class.compare.default/p2.cpp:7:8: warning: explicitly defaulted equality comparison operator is implicitly deleted [-Wdefaulted-function-deleted]","clang/test/CXX/class/class.compare/class.compare.default/p2.cpp:8:8: warning: explicitly defaulted three-way comparison operator is implicitly deleted [-Wdefaulted-function-deleted]","clang/test/CXX/class/class.compare/class.compare.default/p2.cpp:45:8: warning: explicitly defaulted equality comparison operator is implicitly deleted [-Wdefaulted-function-deleted]","clang/test/CXX/class/class.compare/class.compare.default/p2.cpp:46:8: warning: explicitly defaulted relational comparison operator is implicitly deleted [-Wdefaulted-function-deleted]","clang/test/CXX/class/class.compare/class.compare.default/p2.cpp:56:8: warning: explicitly defaulted equality comparison operator is implicitly deleted [-Wdefaulted-function-deleted]","clang/test/CXX/class/class.compare/class.compare.default/p2.cpp:57:8: warning: explicitly defaulted three-way comparison operator is implicitly deleted [-Wdefaulted-function-deleted]","clang/test/CXX/class/class.compare/class.compare.default/p2.cpp:79:8: warning: explicitly defaulted equality comparison operator is implicitly deleted [-Wdefaulted-function-deleted]","clang/test/CXX/class/class.compare/class.compare.default/p2.cpp:80:8: warning: explicitly defaulted three-way comparison operator is implicitly deleted [-Wdefaulted-function-deleted]","clang/test/CXX/class/class.compare/class.compare.default/p2.cpp:101:8: warning: explicitly defaulted equality comparison operator is implicitly deleted [-Wdefaulted-function-deleted]","clang/test/CXX/class/class.compare/class.compare.default/p2.cpp:102:8: warning: explicitly defaulted three-way comparison operator is implicitly deleted [-Wdefaulted-function-deleted]"}
		}
	},
	["warn_defaulted_method_deleted"]={
		[l]={"defaulted-function-deleted"},
		[k]="defaulted-function-deleted",
		[i]={{nil,v,"warn_defaulted_method_deleted"}},
		[h]={{nil,v,"explicitly defaulted %select{default constructor|copy constructor|move constructor|copy assignment operator|move assignment operator|destructor}0 is implicitly deleted"}},
		[b]={{nil,v,{"explicitly defaulted ",{"default constructor",vd,wd,xd,pd,nc}," is implicitly deleted"}}},
		[f]=j,
		[g]="explicitly defaulted (?:default constructor|copy constructor|move constructor|copy assignment operator|move assignment operator|destructor) is implicitly deleted",
		[e]=" \\[(?:\\-Werror,)?\\-Wdefaulted\\-function\\-deleted[^\\]]*\\]",
		[a]={{nil,v,r}},
		[d]={"9b2c5e7c44fd",1538097403,"[cxx2a] P0641R2: (Some) type mismatches on defaulted functions only","[cxx2a] P0641R2: (Some) type mismatches on defaulted functions only\nrender the function deleted instead of rendering the program ill-formed.\n\nThis change also adds an enabled-by-default warning for the case where\nan explicitly-defaulted special member function of a non-template class\nis implicitly deleted by the type checking rules. (This fires either due\nto this language change or due to pre-C++20 reasons for the member being\nimplicitly deleted). I\'ve tested this on a large codebase and found only\nbugs (where the program means something that\'s clearly different from\nwhat the programmer intended), so this is enabled by default, but we\nshould revisit this if there are problems with this being enabled by\ndefault.\n\nllvm-svn: 343285"},
		[c]={{K,7772,"bool Sema::CheckExplicitlyDefaultedSpecialMember(CXXMethodDecl *MD, CXXSpecialMember CSM, SourceLocation DefaultLoc) {\n  // ...\n  if (ShouldDeleteForTypeMismatch || ShouldDeleteSpecialMember(MD, CSM)) {\n    if (First) {\n      // ...\n      if (!inTemplateInstantiation() && !HadError) {\n        Diag(MD->getLocation(), diag::warn_defaulted_method_deleted) << CSM;"}},
		[m]={
			["clang/test/CXX/class.derived/class.abstract/p16.cpp"]={"clang/test/CXX/class.derived/class.abstract/p16.cpp:46:6: warning: explicitly defaulted move assignment operator is implicitly deleted [-Wdefaulted-function-deleted]"}
		}
	},
	["warn_defined_in_function_type_macro"]={
		[l]={"expansion-to-defined","pedantic"},
		[k]="expansion-to-defined",
		[i]="warn_defined_in_function_type_macro",
		[h]=Kc,
		[b]=Kc,
		[f]=j,
		[g]=Kc,
		[e]=" \\[(?:\\-Werror,)?\\-Wexpansion\\-to\\-defined[^\\]]*\\]",
		[a]=Z,
		[d]={"b2348f4ced63",1453216531,"Add -Wexpansion-to-undefined: warn when using `defined` in a macro definition.","Add -Wexpansion-to-undefined: warn when using `defined` in a macro definition.\n\n[cpp.cond]p4:\n  Prior to evaluation, macro invocations in the list of preprocessing\n  tokens that will become the controlling constant expression are replaced\n  (except for those macro names modified by the \'defined\' unary operator),\n  just as in normal text. If the token \'defined\' is generated as a result\n  of this replacement process or use of the \'defined\' unary operator does\n  not match one of the two specified forms prior to macro replacement, the\n  behavior is undefined.\n\nThis isn\'t an idle threat, consider this program:\n  #define FOO\n  #define BAR defined(FOO)\n  #if BAR\n  ...\n  #else\n  ...\n  #endif\nclang and gcc will pick the #if branch while Visual Studio will take the\n#else branch.  Emit a warning about this undefined behavior.\n\nOne problem is that this also applies to function-like macros. While the\nexample above can be written like\n\n    #if defined(FOO) && defined(BAR)\n    #defined HAVE_FOO 1\n    #else\n    #define HAVE_FOO 0\n    #endif\n\nthere is no easy way to rewrite a function-like macro like `#define FOO(x)\n(defined __foo_##x && __foo_##x)`.  Function-like macros like this are used in\npractice, and compilers seem to not have differing behavior in that case. So\nthis a default-on warning only for object-like macros. For function-like\nmacros, it is an extension warning that only shows up with `-pedantic`.\n(But it\'s undefined behavior in both cases.)\n\nllvm-svn: 258128"},
		[c]={{"clang/lib/Lex/PPExpressions.cpp",207,"/// EvaluateDefined - Process a \'defined(sym)\' expression.\nstatic bool EvaluateDefined(PPValue &Result, Token &PeekTok, DefinedTracker &DT, bool ValueLive, Preprocessor &PP) {\n  // ...\n  // [cpp.cond]p4:\n  //   Prior to evaluation, macro invocations in the list of preprocessing\n  //   tokens that will become the controlling constant expression are replaced\n  //   (except for those macro names modified by the \'defined\' unary operator),\n  //   just as in normal text. If the token \'defined\' is generated as a result\n  //   of this replacement process or use of the \'defined\' unary operator does\n  //   not match one of the two specified forms prior to macro replacement, the\n  //   behavior is undefined.\n  // This isn\'t an idle threat, consider this program:\n  //   #define FOO\n  //   #define BAR defined(FOO)\n  //   #if BAR\n  //   ...\n  //   #else\n  //   ...\n  //   #endif\n  // clang and gcc will pick the #if branch while Visual Studio will take the\n  // #else branch.  Emit a warning about this undefined behavior.\n  if (beginLoc.isMacroID()) {\n    // ...\n    // For object-type macros, it\'s easy to replace\n    //   #define FOO defined(BAR)\n    // with\n    //   #if defined(BAR)\n    //   #define FOO 1\n    //   #else\n    //   #define FOO 0\n    //   #endif\n    // and doing so makes sense since compilers handle this differently in\n    // practice (see example further up).  But for function-type macros,\n    // there is no good way to write\n    //   # define FOO(x) (defined(M_ ## x) && M_ ## x)\n    // in a different way, and compilers seem to agree on how to behave here.\n    // So warn by default on object-type macros, but only warn in -pedantic\n    // mode on function-type macros.\n    if (IsFunctionTypeMacro)\n      PP.Diag(beginLoc, diag::warn_defined_in_function_type_macro);"}},
		[m]={
			["clang/test/Preprocessor/expr_define_expansion.c"]={"clang/test/Preprocessor/expr_define_expansion.c:10:5: warning: macro expansion producing \'defined\' has undefined behavior [-Wexpansion-to-defined]","clang/test/Preprocessor/expr_define_expansion.c:21:5: warning: macro expansion producing \'defined\' has undefined behavior [-Wexpansion-to-defined]"}
		}
	},
	["warn_defined_in_object_type_macro"]={
		[l]={"expansion-to-defined"},
		[k]="expansion-to-defined",
		[i]="warn_defined_in_object_type_macro",
		[h]=Kc,
		[b]=Kc,
		[f]=j,
		[g]=Kc,
		[e]=" \\[(?:\\-Werror,)?\\-Wexpansion\\-to\\-defined[^\\]]*\\]",
		[a]=Z,
		[d]={"b2348f4ced63",1453216531,"Add -Wexpansion-to-undefined: warn when using `defined` in a macro definition.","Add -Wexpansion-to-undefined: warn when using `defined` in a macro definition.\n\n[cpp.cond]p4:\n  Prior to evaluation, macro invocations in the list of preprocessing\n  tokens that will become the controlling constant expression are replaced\n  (except for those macro names modified by the \'defined\' unary operator),\n  just as in normal text. If the token \'defined\' is generated as a result\n  of this replacement process or use of the \'defined\' unary operator does\n  not match one of the two specified forms prior to macro replacement, the\n  behavior is undefined.\n\nThis isn\'t an idle threat, consider this program:\n  #define FOO\n  #define BAR defined(FOO)\n  #if BAR\n  ...\n  #else\n  ...\n  #endif\nclang and gcc will pick the #if branch while Visual Studio will take the\n#else branch.  Emit a warning about this undefined behavior.\n\nOne problem is that this also applies to function-like macros. While the\nexample above can be written like\n\n    #if defined(FOO) && defined(BAR)\n    #defined HAVE_FOO 1\n    #else\n    #define HAVE_FOO 0\n    #endif\n\nthere is no easy way to rewrite a function-like macro like `#define FOO(x)\n(defined __foo_##x && __foo_##x)`.  Function-like macros like this are used in\npractice, and compilers seem to not have differing behavior in that case. So\nthis a default-on warning only for object-like macros. For function-like\nmacros, it is an extension warning that only shows up with `-pedantic`.\n(But it\'s undefined behavior in both cases.)\n\nllvm-svn: 258128"},
		[c]={{"clang/lib/Lex/PPExpressions.cpp",209,"/// EvaluateDefined - Process a \'defined(sym)\' expression.\nstatic bool EvaluateDefined(PPValue &Result, Token &PeekTok, DefinedTracker &DT, bool ValueLive, Preprocessor &PP) {\n  // ...\n  // [cpp.cond]p4:\n  //   Prior to evaluation, macro invocations in the list of preprocessing\n  //   tokens that will become the controlling constant expression are replaced\n  //   (except for those macro names modified by the \'defined\' unary operator),\n  //   just as in normal text. If the token \'defined\' is generated as a result\n  //   of this replacement process or use of the \'defined\' unary operator does\n  //   not match one of the two specified forms prior to macro replacement, the\n  //   behavior is undefined.\n  // This isn\'t an idle threat, consider this program:\n  //   #define FOO\n  //   #define BAR defined(FOO)\n  //   #if BAR\n  //   ...\n  //   #else\n  //   ...\n  //   #endif\n  // clang and gcc will pick the #if branch while Visual Studio will take the\n  // #else branch.  Emit a warning about this undefined behavior.\n  if (beginLoc.isMacroID()) {\n    // ...\n    // For object-type macros, it\'s easy to replace\n    //   #define FOO defined(BAR)\n    // with\n    //   #if defined(BAR)\n    //   #define FOO 1\n    //   #else\n    //   #define FOO 0\n    //   #endif\n    // and doing so makes sense since compilers handle this differently in\n    // practice (see example further up).  But for function-type macros,\n    // there is no good way to write\n    //   # define FOO(x) (defined(M_ ## x) && M_ ## x)\n    // in a different way, and compilers seem to agree on how to behave here.\n    // So warn by default on object-type macros, but only warn in -pedantic\n    // mode on function-type macros.\n    if (IsFunctionTypeMacro)\n    // ...\n    else\n      PP.Diag(beginLoc, diag::warn_defined_in_object_type_macro);"}}
	},
	["warn_delegating_ctor_cycle"]={
		[l]={"delegating-ctor-cycles"},
		[k]="delegating-ctor-cycles",
		[i]="warn_delegating_ctor_cycle",
		[h]="constructor for %0 creates a delegation cycle",
		[b]="constructor for A creates a delegation cycle",
		[f]="(?:error|warning|fatal error)\\: ",
		[g]="constructor for (.*?) creates a delegation cycle",
		[e]=" \\[[^\\]]*\\-Wdelegating\\-ctor\\-cycles[^\\]]*\\]",
		[a]=r,
		[d]={"e262299b72ea",1304553947,"Change cycle detection to be based off of a warning flag.","Change cycle detection to be based off of a warning flag.\n\nllvm-svn: 130898"},
		[c]={{"clang/lib/Sema/Sema.cpp",1195,"/// ActOnEndOfTranslationUnit - This is called at the very end of the\n/// translation unit when EOF is reached and all but the top-level scope is\n/// popped.\nvoid Sema::ActOnEndOfTranslationUnit() {\n  // ...\n  if (LangOpts.CPlusPlus11 && !Diags.isIgnored(diag::warn_delegating_ctor_cycle, SourceLocation()))"},{K,18539,"static void DelegatingCycleHelper(CXXConstructorDecl *Ctor, llvm::SmallPtrSet<CXXConstructorDecl *, 4> &Valid, llvm::SmallPtrSet<CXXConstructorDecl *, 4> &Invalid, llvm::SmallPtrSet<CXXConstructorDecl *, 4> &Current, Sema &S) {\n  // ...\n  // We know that beyond here, we aren\'t chaining into a cycle.\n  if (!Target || !Target->isDelegatingConstructor() || Target->isInvalidDecl() || Valid.count(TCanonical)) {\n  // ...\n  } else if (TCanonical == Canonical || Invalid.count(TCanonical) || Current.count(TCanonical)) {\n    // If we haven\'t diagnosed this cycle yet, do so now.\n    if (!Invalid.count(TCanonical)) {\n      S.Diag((*Ctor->init_begin())->getSourceLocation(), diag::warn_delegating_ctor_cycle) << Ctor;"}},
		[m]={
			["clang/test/SemaCXX/cxx0x-delegating-ctors.cpp"]={"clang/test/SemaCXX/cxx0x-delegating-ctors.cpp:25:19: error: constructor for \'foo\' creates a delegation cycle [-Wdelegating-ctor-cycles]","clang/test/SemaCXX/cxx0x-delegating-ctors.cpp:32:29: error: constructor for \'foo\' creates a delegation cycle [-Wdelegating-ctor-cycles]"}
		}
	},
	["warn_delete_abstract_non_virtual_dtor"]={
		[l]={vc,"all","delete-abstract-non-virtual-dtor","delete-non-virtual-dtor","most"},
		[k]="delete-abstract-non-virtual-dtor",
		[i]="warn_delete_abstract_non_virtual_dtor",
		[h]="%select{delete|destructor}0 called on %1 that is abstract but has non-virtual destructor",
		[b]={{nil,nil,{{"delete",nc}," called on B that is abstract but has non-virtual destructor"}}},
		[f]=j,
		[g]="(?:delete|destructor) called on (.*?) that is abstract but has non\\-virtual destructor",
		[e]=" \\[(?:\\-Werror,)?\\-Wdelete\\-abstract\\-non\\-virtual\\-dtor[^\\]]*\\]",
		[a]=r,
		[d]={"1b71a22b2832",1311722844,"Re-fix r136172 so it isn\'t an error; apparently, some people are fond of their undefined behavior.","Re-fix r136172 so it isn\'t an error; apparently, some people are fond of their undefined behavior.\n\nllvm-svn: 136183"},
		[c]={{dc,3968,"void Sema::CheckVirtualDtorCall(CXXDestructorDecl *dtor, SourceLocation Loc, bool IsDelete, bool CallCanBeVirtual, bool WarnOnNonAbstractTypes, SourceLocation DtorLoc) {\n  // ...\n  if (PointeeRD->isAbstract()) {\n    // ...\n    Diag(Loc, diag::warn_delete_abstract_non_virtual_dtor) << (IsDelete ? 0 : 1) << ClassType;"}},
		[m]={
			["clang/test/SemaCXX/delete-non-virtual-dtor.cpp"]={"clang/test/SemaCXX/delete-non-virtual-dtor.cpp:18:19: warning: delete called on \'S1\' that is abstract but has non-virtual destructor [-Wdelete-abstract-non-virtual-dtor]"}
		}
	},
	["warn_delete_array_type"]={
		[i]="warn_delete_array_type",
		[h]="\'delete\' applied to a pointer-to-array type %0 treated as \'delete[]\'",
		[b]="\'delete\' applied to a pointer-to-array type A treated as \'delete[]\'",
		[f]=j,
		[g]="\'delete\' applied to a pointer\\-to\\-array type (.*?) treated as \'delete\\[\\]\'",
		[e]=Xc,
		[a]=r,
		[d]={"14ec9f674a56",1284408954,"When applying \'delete\' on a pointer-to-array type match GCC and EDG behavior and treat it as \'delete...","When applying \'delete\' on a pointer-to-array type match GCC and EDG behavior and treat it as \'delete[]\'.\nAlso offer a fix-it hint adding \'[]\'.\n\nllvm-svn: 113778"},
		[c]={{dc,3703,"/// ActOnCXXDelete - Parsed a C++ \'delete\' expression (C++ 5.3.5), as in:\n/// @code ::delete ptr; @endcode\n/// or\n/// @code delete [] ptr; @endcode\nExprResult Sema::ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal, bool ArrayForm, Expr *ExE) {\n  // ...\n  if (!Ex.get()->isTypeDependent()) {\n    // ...\n    if (Pointee->isArrayType() && !ArrayForm) {\n      Diag(StartLoc, diag::warn_delete_array_type) << Type << Ex.get()->getSourceRange() << FixItHint::CreateInsertion(getLocForEndOfToken(StartLoc), \"[]\");"}},
		[m]={
			["clang/test/CodeGenCXX/delete.cpp"]={"clang/test/CodeGenCXX/delete.cpp:113:5: warning: \'delete\' applied to a pointer-to-array type \'int (*)[20]\' treated as \'delete[]\'"}
		}
	},
	["warn_delete_incomplete"]={
		[l]={"delete-incomplete"},
		[k]="delete-incomplete",
		[i]="warn_delete_incomplete",
		[h]="deleting pointer to incomplete type %0 may cause undefined behavior",
		[b]="deleting pointer to incomplete type A may cause undefined behavior",
		[f]=j,
		[g]="deleting pointer to incomplete type (.*?) may cause undefined behavior",
		[e]=" \\[(?:\\-Werror,)?\\-Wdelete\\-incomplete[^\\]]*\\]",
		[a]=r,
		[d]={"5a8987ca5113",1237025389,"Update tablegen diagnostic files to be in sync with the def files.","Update tablegen diagnostic files to be in sync with the def files.\n\nllvm-svn: 67004"},
		[c]={{dc,3696,"/// ActOnCXXDelete - Parsed a C++ \'delete\' expression (C++ 5.3.5), as in:\n/// @code ::delete ptr; @endcode\n/// or\n/// @code delete [] ptr; @endcode\nExprResult Sema::ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal, bool ArrayForm, Expr *ExE) {\n  // ...\n  if (!Ex.get()->isTypeDependent()) {\n    // ...\n    if (Pointee->isVoidType() && !isSFINAEContext()) {\n    // ...\n    } else if (Pointee->isFunctionType() || Pointee->isVoidType() || Pointee->isSizelessType()) {\n    // ...\n    } else if (!Pointee->isDependentType()) {\n      // ...\n      if (!RequireCompleteType(StartLoc, Pointee, diag::warn_delete_incomplete, Ex.get())) {"}},
		[m]={
			["clang/test/CXX/expr/expr.unary/expr.delete/p5.cpp"]={"clang/test/CXX/expr/expr.unary/expr.delete/p5.cpp:9:18: warning: deleting pointer to incomplete type \'T0\' may cause undefined behavior [-Wdelete-incomplete]","clang/test/CXX/expr/expr.unary/expr.delete/p5.cpp:14:31: warning: deleting pointer to incomplete type \'T1_B\' may cause undefined behavior [-Wdelete-incomplete]"}
		}
	},
	["warn_delete_non_virtual_dtor"]={
		[l]={vc,"all","delete-non-abstract-non-virtual-dtor","delete-non-virtual-dtor","most"},
		[k]="delete-non-abstract-non-virtual-dtor",
		[i]="warn_delete_non_virtual_dtor",
		[h]="%select{delete|destructor}0 called on non-final %1 that has virtual functions but non-virtual destructor",
		[b]={{nil,nil,{{"delete",nc}," called on non-final B that has virtual functions but non-virtual destructor"}}},
		[f]=j,
		[g]="(?:delete|destructor) called on non\\-final (.*?) that has virtual functions but non\\-virtual destructor",
		[e]=" \\[(?:\\-Werror,)?\\-Wdelete\\-non\\-abstract\\-non\\-virtual\\-dtor[^\\]]*\\]",
		[a]=r,
		[d]={"8bd428574c71",1306266806,"Add new warning that warns when invoking \'delete\' on a polymorphic, non-final, class without a virtu...","Add new warning that warns when invoking \'delete\' on a polymorphic, non-final, class without a virtual destructor.\n\nPatch by Matthieu Monrocq!\n\nllvm-svn: 131989"},
		[c]={{dc,3973,"void Sema::CheckVirtualDtorCall(CXXDestructorDecl *dtor, SourceLocation Loc, bool IsDelete, bool CallCanBeVirtual, bool WarnOnNonAbstractTypes, SourceLocation DtorLoc) {\n  // ...\n  if (PointeeRD->isAbstract()) {\n  // ...\n  } else if (WarnOnNonAbstractTypes) {\n    // ...\n    Diag(Loc, diag::warn_delete_non_virtual_dtor) << (IsDelete ? 0 : 1) << ClassType;"}},
		[m]={
			["clang/test/SemaCXX/delete-non-virtual-dtor.cpp"]={"clang/test/SemaCXX/delete-non-virtual-dtor.cpp:27:19: warning: delete called on non-final \'S2\' that has virtual functions but non-virtual destructor [-Wdelete-non-abstract-non-virtual-dtor]"}
		}
	},
	["warn_delimited_ucn_empty"]={
		[l]={"unicode"},
		[k]="unicode",
		[i]={{nil,x,"warn_delimited_ucn_empty"}},
		[h]={{nil,D,"empty delimited universal character name; treating as \'\\\' \'%0\' \'{\' \'}\'"},{x,x,"empty delimited universal character name; treating as \'\\\' \'u\' \'{\' \'}\'"}},
		[b]={{nil,D,"empty delimited universal character name; treating as \'\\\' \'A\' \'{\' \'}\'"},{x,x,"empty delimited universal character name; treating as \'\\\' \'u\' \'{\' \'}\'"}},
		[f]=j,
		[g]="empty delimited universal character name; treating as \'\\\\\' \'(.*?)\' \'\\{\' \'\\}\'",
		[e]=" \\[(?:\\-Werror,)?\\-Wunicode[^\\]]*\\]",
		[a]={{nil,x,Z}},
		[d]={Gb,1625925174,Fb,Kb},
		[c]={{nb,3326,"std::optional<uint32_t> Lexer::tryReadNumericUCN(const char *&StartPtr, const char *SlashLoc, Token *Result) {\n  // ...\n  if (Count == 0) {\n    if (Diagnose)\n      Diag(SlashLoc, FoundEndDelimiter ? diag::warn_delimited_ucn_empty : diag::warn_ucn_escape_no_digits) << StringRef(KindLoc, 1);"},{nb,3411,"std::optional<uint32_t> Lexer::tryReadNamedUCN(const char *&StartPtr, const char *SlashLoc, Token *Result) {\n  // ...\n  if (!FoundEndDelimiter || Buffer.empty()) {\n    if (Diagnose)\n      Diag(SlashLoc, FoundEndDelimiter ? diag::warn_delimited_ucn_empty : diag::warn_delimited_ucn_incomplete) << StringRef(KindLoc, 1);"}},
		[m]={
			["clang/test/Preprocessor/ucn-pp-identifier.c"]={"clang/test/Preprocessor/ucn-pp-identifier.c:121:9: warning: empty delimited universal character name; treating as \'\\\' \'u\' \'{\' \'}\' [-Wunicode]","clang/test/Preprocessor/ucn-pp-identifier.c:129:9: warning: empty delimited universal character name; treating as \'\\\' \'N\' \'{\' \'}\' [-Wunicode]"}
		}
	},
	["warn_delimited_ucn_incomplete"]={
		[l]={"unicode"},
		[k]="unicode",
		[i]={{nil,x,"warn_delimited_ucn_incomplete"}},
		[h]={{nil,D,"incomplete delimited universal character name; treating as \'\\\' \'%0\' \'{\' identifier"},{x,x,"incomplete delimited universal character name; treating as \'\\\' \'u\' \'{\' identifier"}},
		[b]={{nil,D,"incomplete delimited universal character name; treating as \'\\\' \'A\' \'{\' identifier"},{x,x,"incomplete delimited universal character name; treating as \'\\\' \'u\' \'{\' identifier"}},
		[f]=j,
		[g]="incomplete delimited universal character name; treating as \'\\\\\' \'(.*?)\' \'\\{\' identifier",
		[e]=" \\[(?:\\-Werror,)?\\-Wunicode[^\\]]*\\]",
		[a]={{nil,x,Z}},
		[d]={Gb,1625925174,Fb,Kb},
		[c]={{nb,3307,"std::optional<uint32_t> Lexer::tryReadNumericUCN(const char *&StartPtr, const char *SlashLoc, Token *Result) {\n  // ...\n  while (Count != NumHexDigits || Delimited) {\n    // ...\n    if (Value == -1U) {\n      // ...\n      if (Diagnose)\n        Diag(SlashLoc, diag::warn_delimited_ucn_incomplete) << StringRef(KindLoc, 1);"},{nb,3412,"std::optional<uint32_t> Lexer::tryReadNamedUCN(const char *&StartPtr, const char *SlashLoc, Token *Result) {\n  // ...\n  if (!FoundEndDelimiter || Buffer.empty()) {\n    if (Diagnose)\n      Diag(SlashLoc, FoundEndDelimiter ? diag::warn_delimited_ucn_empty : diag::warn_delimited_ucn_incomplete) << StringRef(KindLoc, 1);"}},
		[m]={
			["clang/test/Preprocessor/ucn-pp-identifier.c"]={"clang/test/Preprocessor/ucn-pp-identifier.c:124:9: warning: incomplete delimited universal character name; treating as \'\\\' \'u\' \'{\' identifier [-Wunicode]","clang/test/Preprocessor/ucn-pp-identifier.c:125:9: warning: incomplete delimited universal character name; treating as \'\\\' \'u\' \'{\' identifier [-Wunicode]","clang/test/Preprocessor/ucn-pp-identifier.c:126:9: warning: incomplete delimited universal character name; treating as \'\\\' \'N\' \'{\' identifier [-Wunicode]","clang/test/Preprocessor/ucn-pp-identifier.c:139:12: warning: incomplete delimited universal character name; treating as \'\\\' \'N\' \'{\' identifier [-Wunicode]"}
		}
	},
	["warn_depr_array_comparison"]={
		[l]={ab,"deprecated-array-compare"},
		[k]="deprecated-array-compare",
		[i]={{nil,s,"warn_depr_array_comparison"}},
		[h]={{nil,s,"comparison between two arrays is deprecated; to compare array addresses, use unary \'+\' to decay operands to pointers"}},
		[b]={{nil,s,"comparison between two arrays is deprecated; to compare array addresses, use unary \'+\' to decay operands to pointers"}},
		[f]=j,
		[g]="comparison between two arrays is deprecated; to compare array addresses, use unary \'\\+\' to decay operands to pointers",
		[e]=" \\[(?:\\-Werror,)?\\-Wdeprecated\\-array\\-compare[^\\]]*\\]",
		[a]={{nil,s,fb}},
		[d]={"fe17b30a7957",1575504770,"[attributes][analyzer] Add annotations for handles.","[attributes][analyzer] Add annotations for handles.\n\nThese annotations will be used in an upcomming static analyzer check\nthat finds handle leaks, use after releases, and double releases.\n\nDifferential Revision: https://reviews.llvm.org/D70469"},
		[c]={{hb,12654,"/// Diagnose some forms of syntactically-obvious tautological comparison.\nstatic void diagnoseTautologicalComparison(Sema &S, SourceLocation Loc, Expr *LHS, Expr *RHS, BinaryOperatorKind Opc) {\n  // ...\n  // C++2a [depr.array.comp]:\n  //   Equality and relational comparisons ([expr.eq], [expr.rel]) between two\n  //   operands of array type are deprecated.\n  if (S.getLangOpts().CPlusPlus20 && LHSStripped->getType()->isArrayType() && RHSStripped->getType()->isArrayType()) {\n    S.Diag(Loc, diag::warn_depr_array_comparison) << LHS->getSourceRange() << RHS->getSourceRange() << LHSStripped->getType() << RHSStripped->getType();"}},
		[m]={
			["clang/test/SemaCXX/self-comparison.cpp"]={"clang/test/SemaCXX/self-comparison.cpp:18:23: warning: comparison between two arrays is deprecated; to compare array addresses, use unary \'+\' to decay operands to pointers [-Wdeprecated-array-compare]","clang/test/SemaCXX/self-comparison.cpp:21:14: warning: comparison between two arrays is deprecated; to compare array addresses, use unary \'+\' to decay operands to pointers [-Wdeprecated-array-compare]","clang/test/SemaCXX/self-comparison.cpp:27:16: warning: comparison between two arrays is deprecated; to compare array addresses, use unary \'+\' to decay operands to pointers [-Wdeprecated-array-compare]","clang/test/SemaCXX/self-comparison.cpp:84:19: warning: comparison between two arrays is deprecated; to compare array addresses, use unary \'+\' to decay operands to pointers [-Wdeprecated-array-compare]","clang/test/SemaCXX/self-comparison.cpp:105:19: warning: comparison between two arrays is deprecated; to compare array addresses, use unary \'+\' to decay operands to pointers [-Wdeprecated-array-compare]"}
		}
	},
	["warn_deprecated"]={
		[l]={ab,Cc},
		[k]=Cc,
		[i]="warn_deprecated",
		[h]="%0 is deprecated",
		[b]="A is deprecated",
		[f]=j,
		[g]="(.*?) is deprecated",
		[e]=" \\[(?:\\-Werror,)?\\-Wdeprecated\\-declarations[^\\]]*\\]",
		[a]=fb,
		[d]={"5a8987ca5113",1237025389,"Update tablegen diagnostic files to be in sync with the def files.","Update tablegen diagnostic files to be in sync with the def files.\n\nllvm-svn: 67004"},
		[c]={{"clang/lib/Sema/SemaAvailability.cpp",436,"/// Actually emit an availability diagnostic for a reference to an unavailable\n/// decl.\n///\n/// \\param Ctx The context that the reference occurred in\n/// \\param ReferringDecl The exact declaration that was referenced.\n/// \\param OffendingDecl A related decl to \\c ReferringDecl that has an\n/// availability attribute corresponding to \\c K attached to it. Note that this\n/// may not be the same as ReferringDecl, i.e. if an EnumDecl is annotated and\n/// we refer to a member EnumConstantDecl, ReferringDecl is the EnumConstantDecl\n/// and OffendingDecl is the EnumDecl.\nstatic void DoEmitAvailabilityWarning(Sema &S, AvailabilityResult K, Decl *Ctx, const NamedDecl *ReferringDecl, const NamedDecl *OffendingDecl, StringRef Message, ArrayRef<SourceLocation> Locs, const ObjCInterfaceDecl *UnknownObjCClass, const ObjCPropertyDecl *ObjCProperty, bool ObjCPropertyAccess) {\n  // ...\n  case AR_Deprecated:\n    diag = !ObjCPropertyAccess ? diag::warn_deprecated : diag::warn_property_method_deprecated;"}},
		[m]={
			["clang/test/Sema/pragma-warning.cpp"]={"clang/test/Sema/pragma-warning.cpp:12:3: warning: \'f\' is deprecated [-Wdeprecated-declarations]","clang/test/Sema/pragma-warning.cpp:21:3: warning: \'f\' is deprecated [-Wdeprecated-declarations]"}
		}
	},
	["warn_deprecated_altivec_src_compat"]={
		[l]={"deprecated-altivec-src-compat"},
		[k]="deprecated-altivec-src-compat",
		[i]={{nil,z,"warn_deprecated_altivec_src_compat"}},
		[h]={{nil,z,"Current handling of vector bool and vector pixel types in this context are deprecated. The default behaviour will soon change to that implied by the \'-altivec-compat=xl\' option"}},
		[b]={{nil,z,"Current handling of vector bool and vector pixel types in this context are deprecated. The default behaviour will soon change to that implied by the \'-altivec-compat=xl\' option"}},
		[f]=j,
		[g]="Current handling of vector bool and vector pixel types in this context are deprecated\\. The default behaviour will soon change to that implied by the \'\\-altivec\\-compat\\=xl\' option",
		[e]=" \\[(?:\\-Werror,)?\\-Wdeprecated\\-altivec\\-src\\-compat[^\\]]*\\]",
		[a]={{nil,z,r}},
		[d]={Sc,1615397021,Uc,Tc},
		[c]={{hb,13541,"/// CheckVectorCompareOperands - vector comparisons are a clang extension that\n/// operates on extended vector types.  Instead of producing an IntTy result,\n/// like a scalar comparison, a vector comparison produces a vector of integer\n/// types.\nQualType Sema::CheckVectorCompareOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc) {\n  // ...\n  // Determine the return type of a vector compare. By default clang will return\n  // a scalar for all vector compares except vector bool and vector pixel.\n  // With the gcc compiler we will always return a vector type and with the xl\n  // compiler we will always return a scalar type. This switch allows choosing\n  // which behavior is prefered.\n  if (getLangOpts().AltiVec) {\n    // ...\n    case LangOptions::AltivecSrcCompatKind::Mixed:\n      // If AltiVec, the comparison results in a numeric type, i.e.\n      // bool for C++, int for C\n      if (vType->castAs<VectorType>()->getVectorKind() == VectorType::AltiVecVector)\n      // ...\n      else\n        Diag(Loc, diag::warn_deprecated_altivec_src_compat);"}},
		[m]={
			["clang/test/CodeGen/PowerPC/vector-compat-pixel-bool.c"]={"clang/test/CodeGen/PowerPC/vector-compat-pixel-bool.c:23:12: warning: Current handling of vector bool and vector pixel types in this context are deprecated. The default behaviour will soon change to that implied by the \'-altivec-compat=xl\' option [-Wdeprecated-altivec-src-compat]","clang/test/CodeGen/PowerPC/vector-compat-pixel-bool.c:39:12: warning: Current handling of vector bool and vector pixel types in this context are deprecated. The default behaviour will soon change to that implied by the \'-altivec-compat=xl\' option [-Wdeprecated-altivec-src-compat]","clang/test/CodeGen/PowerPC/vector-compat-pixel-bool.c:55:12: warning: Current handling of vector bool and vector pixel types in this context are deprecated. The default behaviour will soon change to that implied by the \'-altivec-compat=xl\' option [-Wdeprecated-altivec-src-compat]","clang/test/CodeGen/PowerPC/vector-compat-pixel-bool.c:71:12: warning: Current handling of vector bool and vector pixel types in this context are deprecated. The default behaviour will soon change to that implied by the \'-altivec-compat=xl\' option [-Wdeprecated-altivec-src-compat]","clang/test/CodeGen/PowerPC/vector-compat-pixel-bool.c:87:12: warning: Current handling of vector bool and vector pixel types in this context are deprecated. The default behaviour will soon change to that implied by the \'-altivec-compat=xl\' option [-Wdeprecated-altivec-src-compat]"}
		}
	},
	["warn_deprecated_anonymous_namespace"]={
		[l]={Oc,Ob},
		[k]=Ob,
		[i]="warn_deprecated_anonymous_namespace",
		[h]="\'deprecated\' attribute on anonymous namespace ignored",
		[b]="\'deprecated\' attribute on anonymous namespace ignored",
		[f]=j,
		[g]="\'deprecated\' attribute on anonymous namespace ignored",
		[e]=Bc,
		[a]=r,
		[d]={"43f40103f045",1416004496,"[c++1z] Support [[deprecated]] attributes on namespaces. Note that it only applies to situations whe...","[c++1z] Support [[deprecated]] attributes on namespaces. Note that it only applies to situations where the namespace is mentioned. Thus, use on anonymous namespaces is diagnosed.\n\nllvm-svn: 222054"},
		[c]={{rd,8173,"static void handleDeprecatedAttr(Sema &S, Decl *D, const ParsedAttr &AL) {\n  if (const auto *NSD = dyn_cast<NamespaceDecl>(D)) {\n    if (NSD->isAnonymousNamespace()) {\n      S.Diag(AL.getLoc(), diag::warn_deprecated_anonymous_namespace);"}},
		[m]={
			["clang/test/SemaCXX/cxx-deprecated.cpp"]={"clang/test/SemaCXX/cxx-deprecated.cpp:3:13: warning: \'deprecated\' attribute on anonymous namespace ignored [-Wignored-attributes]"}
		}
	},
	["warn_deprecated_builtin"]={
		[l]={ab,"deprecated-builtins"},
		[k]="deprecated-builtins",
		[i]={{nil,D,"warn_deprecated_builtin"}},
		[h]={{nil,D,"builtin %0 is deprecated; use %1 instead"}},
		[b]={{nil,D,"builtin A is deprecated; use B instead"}},
		[f]=j,
		[g]="builtin (.*?) is deprecated; use (.*?) instead",
		[e]=" \\[(?:\\-Werror,)?\\-Wdeprecated\\-builtins[^\\]]*\\]",
		[a]={{nil,D,fb}},
		[d]={Gb,1625925174,Fb,Kb},
		[c]={{dc,5558,"void DiagnoseBuiltinDeprecation(Sema &S, TypeTrait Kind, SourceLocation KWLoc) {\n  // ...\n  S.Diag(KWLoc, diag::warn_deprecated_builtin) << getTraitSpelling(Kind) << getTraitSpelling(Replacement);"}},
		[m]={
			["clang/test/SemaCXX/deprecated-builtins.cpp"]={"clang/test/SemaCXX/deprecated-builtins.cpp:8:9: warning: builtin __has_nothrow_assign is deprecated; use __is_nothrow_assignable instead [-Wdeprecated-builtins]","clang/test/SemaCXX/deprecated-builtins.cpp:9:9: warning: builtin __has_nothrow_move_assign is deprecated; use __is_nothrow_assignable instead [-Wdeprecated-builtins]","clang/test/SemaCXX/deprecated-builtins.cpp:10:9: warning: builtin __has_nothrow_copy is deprecated; use __is_nothrow_constructible instead [-Wdeprecated-builtins]","clang/test/SemaCXX/deprecated-builtins.cpp:11:9: warning: builtin __has_nothrow_constructor is deprecated; use __is_nothrow_constructible instead [-Wdeprecated-builtins]","clang/test/SemaCXX/deprecated-builtins.cpp:12:9: warning: builtin __has_trivial_assign is deprecated; use __is_trivially_assignable instead [-Wdeprecated-builtins]","clang/test/SemaCXX/deprecated-builtins.cpp:13:9: warning: builtin __has_trivial_move_assign is deprecated; use __is_trivially_assignable instead [-Wdeprecated-builtins]","clang/test/SemaCXX/deprecated-builtins.cpp:14:9: warning: builtin __has_trivial_copy is deprecated; use __is_trivially_copyable instead [-Wdeprecated-builtins]","clang/test/SemaCXX/deprecated-builtins.cpp:15:9: warning: builtin __has_trivial_constructor is deprecated; use __is_trivially_constructible instead [-Wdeprecated-builtins]","clang/test/SemaCXX/deprecated-builtins.cpp:16:9: warning: builtin __has_trivial_move_constructor is deprecated; use __is_trivially_constructible instead [-Wdeprecated-builtins]","clang/test/SemaCXX/deprecated-builtins.cpp:17:9: warning: builtin __has_trivial_destructor is deprecated; use __is_trivially_destructible instead [-Wdeprecated-builtins]"}
		}
	},
	["warn_deprecated_comma_subscript"]={
		[l]={ab,"deprecated-comma-subscript"},
		[k]="deprecated-comma-subscript",
		[i]={{nil,s,"warn_deprecated_comma_subscript"}},
		[h]="top-level comma expression in array subscript is deprecated in C++20 and unsupported in C++23",
		[b]="top-level comma expression in array subscript is deprecated in C++20 and unsupported in C++23",
		[f]=j,
		[g]="top\\-level comma expression in array subscript is deprecated in C\\+\\+20 and unsupported in C\\+\\+23",
		[e]=" \\[(?:\\-Werror,)?\\-Wdeprecated\\-comma\\-subscript[^\\]]*\\]",
		[a]={{nil,s,fb}},
		[d]={"6a3820503910",1563615147,"[c++20] P1161R3: a[b,c] is deprecated.","[c++20] P1161R3: a[b,c] is deprecated.\n\nllvm-svn: 366630"},
		[c]={{hb,5163,"ExprResult Sema::ActOnArraySubscriptExpr(Scope *S, Expr *base, SourceLocation lbLoc, MultiExprArg ArgExprs, SourceLocation rbLoc) {\n  // ...\n  if (ArgExprs.size() == 1 && getLangOpts().CPlusPlus20) {\n    // ...\n    if ((isa<BinaryOperator>(idx) && cast<BinaryOperator>(idx)->isCommaOp()) || (isa<CXXOperatorCallExpr>(idx) && cast<CXXOperatorCallExpr>(idx)->getOperator() == OO_Comma)) {\n      Diag(idx->getExprLoc(), diag::warn_deprecated_comma_subscript) << SourceRange(base->getBeginLoc(), rbLoc);"}},
		[m]={
			["clang/test/Parser/cxx2b-subscript.cpp"]={"clang/test/Parser/cxx2b-subscript.cpp:45:12: warning: top-level comma expression in array subscript is deprecated in C++20 and unsupported in C++23 [-Wdeprecated-comma-subscript]","clang/test/Parser/cxx2b-subscript.cpp:51:21: warning: top-level comma expression in array subscript is deprecated in C++20 and unsupported in C++23 [-Wdeprecated-comma-subscript]","clang/test/Parser/cxx2b-subscript.cpp:56:15: warning: top-level comma expression in array subscript is deprecated in C++20 and unsupported in C++23 [-Wdeprecated-comma-subscript]"}
		}
	},
	["warn_deprecated_copy"]={
		[l]={vb,vc,ab,"deprecated-copy","extra"},
		[k]="deprecated-copy",
		[i]={{nil,z,"warn_deprecated_copy"}},
		[h]={{nil,z,"definition of implicit copy %select{constructor|assignment operator}1 for %0 is deprecated because it has a user-declared copy %select{assignment operator|constructor}1"}},
		[b]={{nil,z,{"definition of implicit copy ",{kb,Hc}," for A is deprecated because it has a user-declared copy ",{Hc,kb}}}},
		[f]=j,
		[g]="definition of implicit copy (?:constructor|assignment operator) for (.*?) is deprecated because it has a user\\-declared copy (?:assignment operator|constructor)",
		[e]=" \\[(?:\\-Werror,)?\\-Wdeprecated\\-copy[^\\]]*\\]",
		[a]={{nil,z,fb}},
		[d]={"b83b23275b74",1607502387,"Introduce -Wreserved-identifier","Introduce -Wreserved-identifier\n\nWarn when a declaration uses an identifier that doesn\'t obey the reserved\nidentifier rule from C and/or C++.\n\nDifferential Revision: https://reviews.llvm.org/D93095"},
		[c]={{K,14733,"/// Diagnose an implicit copy operation for a class which is odr-used, but\n/// which is deprecated because the class has a user-declared copy constructor,\n/// copy assignment operator, or destructor.\nstatic void diagnoseDeprecatedCopyOperation(Sema &S, CXXMethodDecl *CopyOp) {\n  // ...\n  if (UserDeclaredOperation) {\n    // ...\n    unsigned DiagID = (UDOIsUserProvided && UDOIsDestructor) ? diag::warn_deprecated_copy_with_user_provided_dtor : (UDOIsUserProvided && !UDOIsDestructor) ? diag::warn_deprecated_copy_with_user_provided_copy : (!UDOIsUserProvided && UDOIsDestructor) ? diag::warn_deprecated_copy_with_dtor : diag::warn_deprecated_copy;"}},
		[m]={
			["clang/test/SemaCXX/deprecated-copy.cpp"]={"clang/test/SemaCXX/deprecated-copy.cpp:7:8: warning: definition of implicit copy constructor for \'A\' is deprecated because it has a user-declared copy assignment operator [-Wdeprecated-copy]","clang/test/SemaCXX/deprecated-copy.cpp:11:8: warning: definition of implicit copy constructor for \'B\' is deprecated because it has a user-declared copy assignment operator [-Wdeprecated-copy]","clang/test/SemaCXX/deprecated-copy.cpp:25:8: warning: definition of implicit copy constructor for \'S\' is deprecated because it has a user-declared copy assignment operator [-Wdeprecated-copy]"}
		}
	},
	["warn_deprecated_copy_with_dtor"]={
		[l]={ab,"deprecated-copy-dtor","deprecated-copy-with-dtor"},
		[k]="deprecated-copy-with-dtor",
		[i]={{nil,z,"warn_deprecated_copy_with_dtor"}},
		[h]={{nil,z,"definition of implicit copy %select{constructor|assignment operator}1 for %0 is deprecated because it has a user-declared destructor"}},
		[b]={{nil,z,{"definition of implicit copy ",{kb,Hc}," for A is deprecated because it has a user-declared destructor"}}},
		[f]=j,
		[g]="definition of implicit copy (?:constructor|assignment operator) for (.*?) is deprecated because it has a user\\-declared destructor",
		[e]=" \\[(?:\\-Werror,)?\\-Wdeprecated\\-copy\\-with\\-dtor[^\\]]*\\]",
		[a]={{nil,z,fb}},
		[d]={"b83b23275b74",1607502387,"Introduce -Wreserved-identifier","Introduce -Wreserved-identifier\n\nWarn when a declaration uses an identifier that doesn\'t obey the reserved\nidentifier rule from C and/or C++.\n\nDifferential Revision: https://reviews.llvm.org/D93095"},
		[c]={{K,14732,"/// Diagnose an implicit copy operation for a class which is odr-used, but\n/// which is deprecated because the class has a user-declared copy constructor,\n/// copy assignment operator, or destructor.\nstatic void diagnoseDeprecatedCopyOperation(Sema &S, CXXMethodDecl *CopyOp) {\n  // ...\n  if (UserDeclaredOperation) {\n    // ...\n    unsigned DiagID = (UDOIsUserProvided && UDOIsDestructor) ? diag::warn_deprecated_copy_with_user_provided_dtor : (UDOIsUserProvided && !UDOIsDestructor) ? diag::warn_deprecated_copy_with_user_provided_copy : (!UDOIsUserProvided && UDOIsDestructor) ? diag::warn_deprecated_copy_with_dtor : diag::warn_deprecated_copy;"}},
		[m]={
			["clang/test/SemaCXX/deprecated-copy-with-dtor.cpp"]={"clang/test/SemaCXX/deprecated-copy-with-dtor.cpp:10:4: warning: definition of implicit copy constructor for \'A\' is deprecated because it has a user-declared destructor [-Wdeprecated-copy-with-dtor]"}
		}
	},
	["warn_deprecated_copy_with_user_provided_copy"]={
		[l]={vb,vc,ab,"deprecated-copy","deprecated-copy-with-user-provided-copy","extra"},
		[k]="deprecated-copy-with-user-provided-copy",
		[i]={{nil,z,"warn_deprecated_copy_with_user_provided_copy"}},
		[h]={{nil,z,"definition of implicit copy %select{constructor|assignment operator}1 for %0 is deprecated because it has a user-provided copy %select{assignment operator|constructor}1"}},
		[b]={{nil,z,{"definition of implicit copy ",{kb,Hc}," for A is deprecated because it has a user-provided copy ",{Hc,kb}}}},
		[f]=j,
		[g]="definition of implicit copy (?:constructor|assignment operator) for (.*?) is deprecated because it has a user\\-provided copy (?:assignment operator|constructor)",
		[e]=" \\[(?:\\-Werror,)?\\-Wdeprecated\\-copy\\-with\\-user\\-provided\\-copy[^\\]]*\\]",
		[a]={{nil,z,fb}},
		[d]={"b83b23275b74",1607502387,"Introduce -Wreserved-identifier","Introduce -Wreserved-identifier\n\nWarn when a declaration uses an identifier that doesn\'t obey the reserved\nidentifier rule from C and/or C++.\n\nDifferential Revision: https://reviews.llvm.org/D93095"},
		[c]={{K,14730,"/// Diagnose an implicit copy operation for a class which is odr-used, but\n/// which is deprecated because the class has a user-declared copy constructor,\n/// copy assignment operator, or destructor.\nstatic void diagnoseDeprecatedCopyOperation(Sema &S, CXXMethodDecl *CopyOp) {\n  // ...\n  if (UserDeclaredOperation) {\n    // ...\n    unsigned DiagID = (UDOIsUserProvided && UDOIsDestructor) ? diag::warn_deprecated_copy_with_user_provided_dtor : (UDOIsUserProvided && !UDOIsDestructor) ? diag::warn_deprecated_copy_with_user_provided_copy : (!UDOIsUserProvided && UDOIsDestructor) ? diag::warn_deprecated_copy_with_dtor : diag::warn_deprecated_copy;"}},
		[m]={
			["clang/test/SemaCXX/deprecated-copy-with-user-provided-copy.cpp"]={"clang/test/SemaCXX/deprecated-copy-with-user-provided-copy.cpp:7:6: warning: definition of implicit copy constructor for \'A\' is deprecated because it has a user-provided copy assignment operator [-Wdeprecated-copy-with-user-provided-copy]"}
		}
	},
	["warn_deprecated_copy_with_user_provided_dtor"]={
		[l]={ab,"deprecated-copy-dtor","deprecated-copy-with-dtor","deprecated-copy-with-user-provided-dtor"},
		[k]="deprecated-copy-with-user-provided-dtor",
		[i]={{nil,z,"warn_deprecated_copy_with_user_provided_dtor"}},
		[h]={{nil,z,"definition of implicit copy %select{constructor|assignment operator}1 for %0 is deprecated because it has a user-provided destructor"}},
		[b]={{nil,z,{"definition of implicit copy ",{kb,Hc}," for A is deprecated because it has a user-provided destructor"}}},
		[f]=j,
		[g]="definition of implicit copy (?:constructor|assignment operator) for (.*?) is deprecated because it has a user\\-provided destructor",
		[e]=" \\[(?:\\-Werror,)?\\-Wdeprecated\\-copy\\-with\\-user\\-provided\\-dtor[^\\]]*\\]",
		[a]={{nil,z,fb}},
		[d]={"b83b23275b74",1607502387,"Introduce -Wreserved-identifier","Introduce -Wreserved-identifier\n\nWarn when a declaration uses an identifier that doesn\'t obey the reserved\nidentifier rule from C and/or C++.\n\nDifferential Revision: https://reviews.llvm.org/D93095"},
		[c]={{K,14728,"/// Diagnose an implicit copy operation for a class which is odr-used, but\n/// which is deprecated because the class has a user-declared copy constructor,\n/// copy assignment operator, or destructor.\nstatic void diagnoseDeprecatedCopyOperation(Sema &S, CXXMethodDecl *CopyOp) {\n  // ...\n  if (UserDeclaredOperation) {\n    // ...\n    unsigned DiagID = (UDOIsUserProvided && UDOIsDestructor) ? diag::warn_deprecated_copy_with_user_provided_dtor : (UDOIsUserProvided && !UDOIsDestructor) ? diag::warn_deprecated_copy_with_user_provided_copy : (!UDOIsUserProvided && UDOIsDestructor) ? diag::warn_deprecated_copy_with_dtor : diag::warn_deprecated_copy;"}},
		[m]={
			["clang/test/SemaCXX/deprecated-copy-with-user-provided-dtor.cpp"]={"clang/test/SemaCXX/deprecated-copy-with-user-provided-dtor.cpp:7:3: warning: definition of implicit copy constructor for \'A\' is deprecated because it has a user-provided destructor [-Wdeprecated-copy-with-user-provided-dtor]"}
		}
	},
	["warn_deprecated_def"]={
		[l]={"deprecated-implementations"},
		[k]="deprecated-implementations",
		[i]="warn_deprecated_def",
		[h]="Implementing deprecated %select{method|class|category}0",
		[b]={{nil,tb,{"implementing deprecated ",{"method",zc,"category"}}},{nil,nil,{"Implementing deprecated ",{"method",zc,"category"}}}},
		[f]=j,
		[g]="implementing deprecated (?:method|class|category)",
		[e]=" \\[(?:\\-Werror,)?\\-Wdeprecated\\-implementations[^\\]]*\\]",
		[a]=r,
		[d]={"0c87d36d9d93",1297815251,"Fix typo (per Chris\'s comment).","Fix typo (per Chris\'s comment).\n\nllvm-svn: 125619"},
		[c]={{"clang/lib/Sema/SemaDeclObjC.cpp",315,"static void DiagnoseObjCImplementedDeprecations(Sema &S, const NamedDecl *ND, SourceLocation ImplLoc) {\n  // ...\n  S.Diag(ImplLoc, diag::warn_deprecated_def) << (isa<ObjCMethodDecl>(ND) ? /*Method*/ 0 : isa<ObjCCategoryDecl>(ND) || IsCategory ? /*Category*/ 2 : /*Class*/ 1);"}},
		[m]={
			["clang/test/SemaObjC/warn-deprecated-implementations.m"]={"clang/test/SemaObjC/warn-deprecated-implementations.m:21:1: warning: implementing deprecated method [-Wdeprecated-implementations]","clang/test/SemaObjC/warn-deprecated-implementations.m:39:17: warning: implementing deprecated class [-Wdeprecated-implementations]","clang/test/SemaObjC/warn-deprecated-implementations.m:42:17: warning: implementing deprecated category [-Wdeprecated-implementations]","clang/test/SemaObjC/warn-deprecated-implementations.m:58:1: warning: implementing deprecated method [-Wdeprecated-implementations]","clang/test/SemaObjC/warn-deprecated-implementations.m:79:17: warning: implementing deprecated category [-Wdeprecated-implementations]"}
		}
	},
	["warn_deprecated_for_co_await"]={
		[l]={"coroutine","deprecated-coroutine"},
		[k]="deprecated-coroutine",
		[i]={{nil,x,"warn_deprecated_for_co_await"}},
		[h]={{nil,x,"\'for co_await\' belongs to CoroutineTS instead of C++20, which is deprecated"}},
		[b]={{nil,x,"\'for co_await\' belongs to CoroutineTS instead of C++20, which is deprecated"}},
		[f]=j,
		[g]="\'for co_await\' belongs to CoroutineTS instead of C\\+\\+20, which is deprecated",
		[e]=" \\[(?:\\-Werror,)?\\-Wdeprecated\\-coroutine[^\\]]*\\]",
		[a]={{nil,x,"Coroutines Issue"}},
		[d]={td,1612659633,ed,Rc},
		[c]={{tc,2231,"/// ParseForStatement\n///       for-statement: [C99 6.8.5.3]\n///         \'for\' \'(\' expr[opt] \';\' expr[opt] \';\' expr[opt] \')\' statement\n///         \'for\' \'(\' declaration expr[opt] \';\' expr[opt] \')\' statement\n/// [C++]   \'for\' \'(\' for-init-statement condition[opt] \';\' expression[opt] \')\'\n/// [C++]       statement\n/// [C++0x] \'for\'\n///             \'co_await\'[opt]    [Coroutines]\n///             \'(\' for-range-declaration \':\' for-range-initializer \')\'\n///             statement\n/// [OBJC2] \'for\' \'(\' declaration \'in\' expr \')\' statement\n/// [OBJC2] \'for\' \'(\' expr \'in\' expr \')\' statement\n///\n/// [C++] for-init-statement:\n/// [C++]   expression-statement\n/// [C++]   simple-declaration\n/// [C++23] alias-declaration\n///\n/// [C++0x] for-range-declaration:\n/// [C++0x]   attribute-specifier-seq[opt] type-specifier-seq declarator\n/// [C++0x] for-range-initializer:\n/// [C++0x]   expression\n/// [C++0x]   braced-init-list            [TODO]\nStmtResult Parser::ParseForStatement(SourceLocation *TrailingElseLoc) {\n  // ...\n  if (CoawaitLoc.isValid() && getLangOpts().CPlusPlus20)\n    Diag(CoawaitLoc, diag::warn_deprecated_for_co_await);"}},
		[m]={
			["clang/test/Parser/cxx20-coroutines.cpp"]={"clang/test/Parser/cxx20-coroutines.cpp:14:7: warning: \'for co_await\' belongs to CoroutineTS instead of C++20, which is deprecated [-Wdeprecated-coroutine]"}
		}
	},
	["warn_deprecated_fwdclass_message"]={
		[l]={ab,Cc},
		[k]=Cc,
		[i]="warn_deprecated_fwdclass_message",
		[h]="%0 may be deprecated because the receiver type is unknown",
		[b]="A may be deprecated because the receiver type is unknown",
		[f]=j,
		[g]="(.*?) may be deprecated because the receiver type is unknown",
		[e]=" \\[(?:\\-Werror,)?\\-Wdeprecated\\-declarations[^\\]]*\\]",
		[a]=fb,
		[d]={"7d6e11a1923a",1292892241,"Warn when message is sent to receiver of","Warn when message is sent to receiver of\nunknown type and there is a possibility that\nat runtime method is resolved to a deprecated or \nunavailable method.  Addreses // rdar://8769853\n\nllvm-svn: 122294"},
		[c]={{"clang/lib/Sema/SemaAvailability.cpp",439,"/// Actually emit an availability diagnostic for a reference to an unavailable\n/// decl.\n///\n/// \\param Ctx The context that the reference occurred in\n/// \\param ReferringDecl The exact declaration that was referenced.\n/// \\param OffendingDecl A related decl to \\c ReferringDecl that has an\n/// availability attribute corresponding to \\c K attached to it. Note that this\n/// may not be the same as ReferringDecl, i.e. if an EnumDecl is annotated and\n/// we refer to a member EnumConstantDecl, ReferringDecl is the EnumConstantDecl\n/// and OffendingDecl is the EnumDecl.\nstatic void DoEmitAvailabilityWarning(Sema &S, AvailabilityResult K, Decl *Ctx, const NamedDecl *ReferringDecl, const NamedDecl *OffendingDecl, StringRef Message, ArrayRef<SourceLocation> Locs, const ObjCInterfaceDecl *UnknownObjCClass, const ObjCPropertyDecl *ObjCProperty, bool ObjCPropertyAccess) {\n  // ...\n  case AR_Deprecated:\n    // ...\n    diag_fwdclass_message = diag::warn_deprecated_fwdclass_message;"}},
		[m]={
			["clang/test/SemaObjC/warn-forward-class-attr-deprecated.m"]={"clang/test/SemaObjC/warn-forward-class-attr-deprecated.m:19:55: warning: \'filenames\' may be deprecated because the receiver type is unknown [-Wdeprecated-declarations]"}
		}
	},
	["warn_deprecated_ignored_on_using"]={
		[l]={Oc,Ob},
		[k]=Ob,
		[i]={{nil,z,"warn_deprecated_ignored_on_using"}},
		[h]={{nil,z,"%0 currently has no effect on a using declaration"}},
		[b]={{nil,z,"A currently has no effect on a using declaration"}},
		[f]=j,
		[g]="(.*?) currently has no effect on a using declaration",
		[e]=Bc,
		[a]={{nil,z,r}},
		[d]={Sc,1615397021,Uc,Tc},
		[c]={{rd,2608,"static void handleAvailabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL) {\n  if (isa<UsingDecl, UnresolvedUsingTypenameDecl, UnresolvedUsingValueDecl>(D)) {\n    S.Diag(AL.getRange().getBegin(), diag::warn_deprecated_ignored_on_using) << AL;"},{rd,8181,"static void handleDeprecatedAttr(Sema &S, Decl *D, const ParsedAttr &AL) {\n  if (const auto *NSD = dyn_cast<NamespaceDecl>(D)) {\n  // ...\n  } else if (isa<UsingDecl, UnresolvedUsingTypenameDecl, UnresolvedUsingValueDecl>(D)) {\n    S.Diag(AL.getRange().getBegin(), diag::warn_deprecated_ignored_on_using) << AL;"}},
		[m]={
			["clang/test/SemaCXX/cxx11-attributes-on-using-declaration.cpp"]={"clang/test/SemaCXX/cxx11-attributes-on-using-declaration.cpp:10:3: warning: \'deprecated\' currently has no effect on a using declaration [-Wignored-attributes]","clang/test/SemaCXX/cxx11-attributes-on-using-declaration.cpp:11:15: warning: \'deprecated\' currently has no effect on a using declaration [-Wignored-attributes]","clang/test/SemaCXX/cxx11-attributes-on-using-declaration.cpp:12:28: warning: \'deprecated\' currently has no effect on a using declaration [-Wignored-attributes]","clang/test/SemaCXX/cxx11-attributes-on-using-declaration.cpp:13:28: warning: \'availability\' currently has no effect on a using declaration [-Wignored-attributes]","clang/test/SemaCXX/cxx11-attributes-on-using-declaration.cpp:15:10: warning: \'availability\' currently has no effect on a using declaration [-Wignored-attributes]","clang/test/SemaCXX/cxx11-attributes-on-using-declaration.cpp:22:5: warning: \'deprecated\' currently has no effect on a using declaration [-Wignored-attributes]","clang/test/SemaCXX/cxx11-attributes-on-using-declaration.cpp:23:5: warning: \'deprecated\' currently has no effect on a using declaration [-Wignored-attributes]","clang/test/SemaCXX/cxx11-attributes-on-using-declaration.cpp:25:25: warning: \'deprecated\' currently has no effect on a using declaration [-Wignored-attributes]","clang/test/SemaCXX/cxx11-attributes-on-using-declaration.cpp:26:16: warning: \'deprecated\' currently has no effect on a using declaration [-Wignored-attributes]"}
		}
	},
	["warn_deprecated_increment_decrement_volatile"]={
		[l]={ab,ec},
		[k]=ec,
		[i]={{nil,s,"warn_deprecated_increment_decrement_volatile"}},
		[h]={{nil,s,"%select{decrement|increment}0 of object of volatile-qualified type %1 is deprecated"}},
		[b]={{nil,s,{{"decrement","increment"}," of object of volatile-qualified type B is deprecated"}}},
		[f]=j,
		[g]="(?:decrement|increment) of object of volatile\\-qualified type (.*?) is deprecated",
		[e]=ud,
		[a]={{nil,s,fb}},
		[d]={cc,1567434909,ac,Xb},
		[c]={{hb,14845,"/// CheckIncrementDecrementOperand - unlike most \"Check\" methods, this routine\n/// doesn\'t need to call UsualUnaryConversions or UsualArithmeticConversions.\nstatic QualType CheckIncrementDecrementOperand(Sema &S, Expr *Op, ExprValueKind &VK, ExprObjectKind &OK, SourceLocation OpLoc, bool IsInc, bool IsPrefix) {\n  // ...\n  if (S.getLangOpts().CPlusPlus20 && ResType.isVolatileQualified()) {\n    // ...\n    S.Diag(OpLoc, diag::warn_deprecated_increment_decrement_volatile) << IsInc << ResType;"}},
		[m]={
			["clang/test/SemaCXX/constant-expression-cxx14.cpp"]={"clang/test/SemaCXX/constant-expression-cxx14.cpp:347:23: warning: decrement of object of volatile-qualified type \'volatile int\' is deprecated [-Wdeprecated-volatile]"}
		}
	},
	["warn_deprecated_lax_vec_conv_all"]={
		[l]={"deprecate-lax-vec-conv-all"},
		[k]="deprecate-lax-vec-conv-all",
		[i]={{nil,D,"warn_deprecated_lax_vec_conv_all"}},
		[h]={{nil,D,"Implicit conversion between vector types (\'%0\' and \'%1\') is deprecated. In the future, the behavior implied by \'-fno-lax-vector-conversions\' will be the default."}},
		[b]={{nil,D,"Implicit conversion between vector types (\'A\' and \'B\') is deprecated. In the future, the behavior implied by \'-fno-lax-vector-conversions\' will be the default."}},
		[f]=j,
		[g]="Implicit conversion between vector types \\(\'(.*?)\' and \'(.*?)\'\\) is deprecated\\. In the future, the behavior implied by \'\\-fno\\-lax\\-vector\\-conversions\' will be the default\\.",
		[e]=" \\[(?:\\-Werror,)?\\-Wdeprecate\\-lax\\-vec\\-conv\\-all[^\\]]*\\]",
		[a]={{nil,D,r}},
		[d]={Gb,1625925174,Fb,Kb},
		[c]={{hb,10087,"/// CheckAssignmentConstraints (C99 6.5.16) - This routine currently\n/// has code to accommodate several GCC extensions when type checking\n/// pointers. Here are some objectionable examples that GCC considers warnings:\n///\n///  int a, *pint;\n///  short *pshort;\n///  struct foo *pfoo;\n///\n///  pint = pshort; // warning: assignment from incompatible pointer type\n///  a = pint; // warning: assignment makes integer from pointer without a cast\n///  pint = a; // warning: assignment makes pointer from integer without a cast\n///  pint = pfoo; // warning: assignment from incompatible pointer type\n///\n/// As a result, the code for dealing with pointers is more complex than the\n/// C99 spec dictates.\n///\n/// Sets \'Kind\' for any result kind except Incompatible.\nSema::AssignConvertType Sema::CheckAssignmentConstraints(QualType LHSType, ExprResult &RHS, CastKind &Kind, bool ConvertRHS) {\n  // ...\n  // Conversions to or from vector type.\n  if (LHSType->isVectorType() || RHSType->isVectorType()) {\n    if (LHSType->isVectorType() && RHSType->isVectorType()) {\n      // ...\n      // If we are allowing lax vector conversions, and LHS and RHS are both\n      // vectors, the total size only needs to be the same. This is a bitcast;\n      // no bits are changed but the result type is different.\n      if (isLaxVectorConversion(RHSType, LHSType)) {\n        // The default for lax vector conversions with Altivec vectors will\n        // change, so if we are converting between vector types where\n        // at least one is an Altivec vector, emit a warning.\n        if (Context.getTargetInfo().getTriple().isPPC() && anyAltivecTypes(RHSType, LHSType) && !Context.areCompatibleVectorTypes(RHSType, LHSType))\n          Diag(RHS.get()->getExprLoc(), diag::warn_deprecated_lax_vec_conv_all) << RHSType << LHSType;"},{hb,10435,"/// CheckAssignmentConstraints (C99 6.5.16) - This routine currently\n/// has code to accommodate several GCC extensions when type checking\n/// pointers. Here are some objectionable examples that GCC considers warnings:\n///\n///  int a, *pint;\n///  short *pshort;\n///  struct foo *pfoo;\n///\n///  pint = pshort; // warning: assignment from incompatible pointer type\n///  a = pint; // warning: assignment makes integer from pointer without a cast\n///  pint = a; // warning: assignment makes pointer from integer without a cast\n///  pint = pfoo; // warning: assignment from incompatible pointer type\n///\n/// As a result, the code for dealing with pointers is more complex than the\n/// C99 spec dictates.\n///\n/// Sets \'Kind\' for any result kind except Incompatible.\nSema::AssignConvertType Sema::CheckAssignmentConstraints(QualType LHSType, ExprResult &RHS, CastKind &Kind, bool ConvertRHS) {\n  // ...\n  // Conversions to or from vector type.\n  if (LHSType->isVectorType() || RHSType->isVectorType()) {\n    // ...\n    // When the RHS comes from another lax conversion (e.g. binops between\n    // scalars and vectors) the result is canonicalized as a vector. When the\n    // LHS is also a vector, the lax is allowed by the condition above. Handle\n    // the case where LHS is a scalar.\n    if (LHSType->isScalarType()) {\n      // ...\n      if (VecType && VecType->getNumElements() == 1 && isLaxVectorConversion(RHSType, LHSType)) {\n        if (Context.getTargetInfo().getTriple().isPPC() && (VecType->getVectorKind() == VectorType::AltiVecVector || VecType->getVectorKind() == VectorType::AltiVecBool || VecType->getVectorKind() == VectorType::AltiVecPixel))\n          Diag(RHS.get()->getExprLoc(), diag::warn_deprecated_lax_vec_conv_all) << RHSType << LHSType;"},{hb,11134,"QualType Sema::CheckVectorOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign, bool AllowBothBool, bool AllowBoolConversions, bool AllowBoolOperation, bool ReportInvalid) {\n  // ...\n  if (isLaxVectorConversion(OtherType, VecType)) {\n    if (Context.getTargetInfo().getTriple().isPPC() && anyAltivecTypes(RHSType, LHSType) && !Context.areCompatibleVectorTypes(RHSType, LHSType))\n      Diag(Loc, diag::warn_deprecated_lax_vec_conv_all) << RHSType << LHSType;"},{"clang/lib/Sema/SemaOverload.cpp",1788,"/// Determine whether the conversion from FromType to ToType is a valid\n/// vector conversion.\n///\n/// \\param ICK Will be set to the vector conversion kind, if this is a vector\n/// conversion.\nstatic bool IsVectorConversion(Sema &S, QualType FromType, QualType ToType, ImplicitConversionKind &ICK, Expr *From, bool InOverloadResolution, bool CStyle) {\n  // ...\n  // We can perform the conversion between vector types in the following cases:\n  // 1)vector types are equivalent AltiVec and GCC vector types\n  // 2)lax vector conversions are permitted and the vector types are of the\n  //   same size\n  // 3)the destination type does not have the ARM MVE strict-polymorphism\n  //   attribute, which inhibits lax vector conversion for overload resolution\n  //   only\n  if (ToType->isVectorType() && FromType->isVectorType()) {\n    if (S.Context.areCompatibleVectorTypes(FromType, ToType) || (S.isLaxVectorConversion(FromType, ToType) && !ToType->hasAttr(attr::ArmMveStrictPolymorphism))) {\n      if (S.getASTContext().getTargetInfo().getTriple().isPPC() && S.isLaxVectorConversion(FromType, ToType) && S.anyAltivecTypes(FromType, ToType) && !S.Context.areCompatibleVectorTypes(FromType, ToType) && !InOverloadResolution && !CStyle) {\n        S.Diag(From->getBeginLoc(), diag::warn_deprecated_lax_vec_conv_all) << FromType << ToType;"}},
		[m]={
			["clang/test/Parser/lax-conv.cpp"]={"clang/test/Parser/lax-conv.cpp:24:10: warning: Implicit conversion between vector types (\'\'__vector unsigned char\' (vector of 16 \'unsigned char\' values)\' and \'\'__vector unsigned int\' (vector of 4 \'unsigned int\' values)\') is deprecated. In the future, the behavior implied by \'-fno-lax-vector-conversions\' will be the default. [-Wdeprecate-lax-vec-conv-all]","clang/test/Parser/lax-conv.cpp:27:10: warning: Implicit conversion between vector types (\'\'__vector unsigned char\' (vector of 16 \'unsigned char\' values)\' and \'\'__vector unsigned int\' (vector of 4 \'unsigned int\' values)\') is deprecated. In the future, the behavior implied by \'-fno-lax-vector-conversions\' will be the default. [-Wdeprecate-lax-vec-conv-all]","clang/test/Parser/lax-conv.cpp:37:10: warning: Implicit conversion between vector types (\'\'__vector unsigned char\' (vector of 16 \'unsigned char\' values)\' and \'\'__vector unsigned int\' (vector of 4 \'unsigned int\' values)\') is deprecated. In the future, the behavior implied by \'-fno-lax-vector-conversions\' will be the default. [-Wdeprecate-lax-vec-conv-all]","clang/test/Parser/lax-conv.cpp:57:16: warning: Implicit conversion between vector types (\'\'__vector unsigned char\' (vector of 16 \'unsigned char\' values)\' and \'\'__vector unsigned int\' (vector of 4 \'unsigned int\' values)\') is deprecated. In the future, the behavior implied by \'-fno-lax-vector-conversions\' will be the default. [-Wdeprecate-lax-vec-conv-all]","clang/test/Parser/lax-conv.cpp:60:16: warning: Implicit conversion between vector types (\'\'__vector unsigned char\' (vector of 16 \'unsigned char\' values)\' and \'\'__vector unsigned int\' (vector of 4 \'unsigned int\' values)\') is deprecated. In the future, the behavior implied by \'-fno-lax-vector-conversions\' will be the default. [-Wdeprecate-lax-vec-conv-all]","clang/test/Parser/lax-conv.cpp:70:16: warning: Implicit conversion between vector types (\'\'__vector unsigned char\' (vector of 16 \'unsigned char\' values)\' and \'\'__vector unsigned int\' (vector of 4 \'unsigned int\' values)\') is deprecated. In the future, the behavior implied by \'-fno-lax-vector-conversions\' will be the default. [-Wdeprecate-lax-vec-conv-all]","clang/test/Parser/lax-conv.cpp:83:9: warning: Implicit conversion between vector types (\'\'__vector short\' (vector of 8 \'short\' values)\' and \'\'__vector __bool unsigned short\' (vector of 8 \'unsigned short\' values)\') is deprecated. In the future, the behavior implied by \'-fno-lax-vector-conversions\' will be the default. [-Wdeprecate-lax-vec-conv-all]","clang/test/Parser/lax-conv.cpp:84:9: warning: Implicit conversion between vector types (\'\'__vector unsigned short\' (vector of 8 \'unsigned short\' values)\' and \'\'__vector __bool unsigned short\' (vector of 8 \'unsigned short\' values)\') is deprecated. In the future, the behavior implied by \'-fno-lax-vector-conversions\' will be the default. [-Wdeprecate-lax-vec-conv-all]","clang/test/Parser/lax-conv.cpp:86:9: warning: Implicit conversion between vector types (\'\'__vector int\' (vector of 4 \'int\' values)\' and \'\'__vector __bool unsigned int\' (vector of 4 \'unsigned int\' values)\') is deprecated. In the future, the behavior implied by \'-fno-lax-vector-conversions\' will be the default. [-Wdeprecate-lax-vec-conv-all]","clang/test/Parser/lax-conv.cpp:87:9: warning: Implicit conversion between vector types (\'\'__vector unsigned int\' (vector of 4 \'unsigned int\' values)\' and \'\'__vector __bool unsigned int\' (vector of 4 \'unsigned int\' values)\') is deprecated. In the future, the behavior implied by \'-fno-lax-vector-conversions\' will be the default. [-Wdeprecate-lax-vec-conv-all]","clang/test/Parser/lax-conv.cpp:89:9: warning: Implicit conversion between vector types (\'\'__vector long long\' (vector of 2 \'long long\' values)\' and \'\'__vector __bool unsigned long long\' (vector of 2 \'unsigned long long\' values)\') is deprecated. In the future, the behavior implied by \'-fno-lax-vector-conversions\' will be the default. [-Wdeprecate-lax-vec-conv-all]","clang/test/Parser/lax-conv.cpp:90:9: warning: Implicit conversion between vector types (\'\'__vector unsigned long long\' (vector of 2 \'unsigned long long\' values)\' and \'\'__vector __bool unsigned long long\' (vector of 2 \'unsigned long long\' values)\') is deprecated. In the future, the behavior implied by \'-fno-lax-vector-conversions\' will be the default. [-Wdeprecate-lax-vec-conv-all]","clang/test/Parser/lax-conv.cpp:92:9: warning: Implicit conversion between vector types (\'\'__vector signed char\' (vector of 16 \'signed char\' values)\' and \'\'__vector __bool unsigned char\' (vector of 16 \'unsigned char\' values)\') is deprecated. In the future, the behavior implied by \'-fno-lax-vector-conversions\' will be the default. [-Wdeprecate-lax-vec-conv-all]","clang/test/Parser/lax-conv.cpp:93:9: warning: Implicit conversion between vector types (\'\'__vector unsigned char\' (vector of 16 \'unsigned char\' values)\' and \'\'__vector __bool unsigned char\' (vector of 16 \'unsigned char\' values)\') is deprecated. In the future, the behavior implied by \'-fno-lax-vector-conversions\' will be the default. [-Wdeprecate-lax-vec-conv-all]","clang/test/Parser/lax-conv.cpp:97:8: warning: Implicit conversion between vector types (\'\'__vector __bool unsigned short\' (vector of 8 \'unsigned short\' values)\' and \'\'__vector __pixel \' (vector of 8 \'unsigned short\' values)\') is deprecated. In the future, the behavior implied by \'-fno-lax-vector-conversions\' will be the default. [-Wdeprecate-lax-vec-conv-all]","clang/test/Parser/lax-conv.cpp:98:8: warning: Implicit conversion between vector types (\'\'__vector short\' (vector of 8 \'short\' values)\' and \'\'__vector __pixel \' (vector of 8 \'unsigned short\' values)\') is deprecated. In the future, the behavior implied by \'-fno-lax-vector-conversions\' will be the default. [-Wdeprecate-lax-vec-conv-all]","clang/test/Parser/lax-conv.cpp:99:8: warning: Implicit conversion between vector types (\'\'__vector unsigned short\' (vector of 8 \'unsigned short\' values)\' and \'\'__vector __pixel \' (vector of 8 \'unsigned short\' values)\') is deprecated. In the future, the behavior implied by \'-fno-lax-vector-conversions\' will be the default. [-Wdeprecate-lax-vec-conv-all]","clang/test/Parser/lax-conv.cpp:101:8: warning: Implicit conversion between vector types (\'\'__vector __bool unsigned int\' (vector of 4 \'unsigned int\' values)\' and \'\'__vector __pixel \' (vector of 8 \'unsigned short\' values)\') is deprecated. In the future, the behavior implied by \'-fno-lax-vector-conversions\' will be the default. [-Wdeprecate-lax-vec-conv-all]","clang/test/Parser/lax-conv.cpp:102:8: warning: Implicit conversion between vector types (\'\'__vector int\' (vector of 4 \'int\' values)\' and \'\'__vector __pixel \' (vector of 8 \'unsigned short\' values)\') is deprecated. In the future, the behavior implied by \'-fno-lax-vector-conversions\' will be the default. [-Wdeprecate-lax-vec-conv-all]","clang/test/Parser/lax-conv.cpp:103:8: warning: Implicit conversion between vector types (\'\'__vector unsigned int\' (vector of 4 \'unsigned int\' values)\' and \'\'__vector __pixel \' (vector of 8 \'unsigned short\' values)\') is deprecated. In the future, the behavior implied by \'-fno-lax-vector-conversions\' will be the default. [-Wdeprecate-lax-vec-conv-all]","clang/test/Parser/lax-conv.cpp:105:8: warning: Implicit conversion between vector types (\'\'__vector __bool unsigned long long\' (vector of 2 \'unsigned long long\' values)\' and \'\'__vector __pixel \' (vector of 8 \'unsigned short\' values)\') is deprecated. In the future, the behavior implied by \'-fno-lax-vector-conversions\' will be the default. [-Wdeprecate-lax-vec-conv-all]","clang/test/Parser/lax-conv.cpp:106:8: warning: Implicit conversion between vector types (\'\'__vector long long\' (vector of 2 \'long long\' values)\' and \'\'__vector __pixel \' (vector of 8 \'unsigned short\' values)\') is deprecated. In the future, the behavior implied by \'-fno-lax-vector-conversions\' will be the default. [-Wdeprecate-lax-vec-conv-all]","clang/test/Parser/lax-conv.cpp:107:8: warning: Implicit conversion between vector types (\'\'__vector unsigned long long\' (vector of 2 \'unsigned long long\' values)\' and \'\'__vector __pixel \' (vector of 8 \'unsigned short\' values)\') is deprecated. In the future, the behavior implied by \'-fno-lax-vector-conversions\' will be the default. [-Wdeprecate-lax-vec-conv-all]","clang/test/Parser/lax-conv.cpp:109:8: warning: Implicit conversion between vector types (\'\'__vector __bool unsigned char\' (vector of 16 \'unsigned char\' values)\' and \'\'__vector __pixel \' (vector of 8 \'unsigned short\' values)\') is deprecated. In the future, the behavior implied by \'-fno-lax-vector-conversions\' will be the default. [-Wdeprecate-lax-vec-conv-all]","clang/test/Parser/lax-conv.cpp:110:8: warning: Implicit conversion between vector types (\'\'__vector signed char\' (vector of 16 \'signed char\' values)\' and \'\'__vector __pixel \' (vector of 8 \'unsigned short\' values)\') is deprecated. In the future, the behavior implied by \'-fno-lax-vector-conversions\' will be the default. [-Wdeprecate-lax-vec-conv-all]","clang/test/Parser/lax-conv.cpp:111:8: warning: Implicit conversion between vector types (\'\'__vector unsigned char\' (vector of 16 \'unsigned char\' values)\' and \'\'__vector __pixel \' (vector of 8 \'unsigned short\' values)\') is deprecated. In the future, the behavior implied by \'-fno-lax-vector-conversions\' will be the default. [-Wdeprecate-lax-vec-conv-all]"}
		}
	},
	["warn_deprecated_literal_operator_id"]={
		[l]={ab,"deprecated-literal-operator"},
		[k]="deprecated-literal-operator",
		[i]="warn_deprecated_literal_operator_id",
		[h]="identifier %0 preceded by whitespace in a literal operator declaration is deprecated",
		[b]="identifier A preceded by whitespace in a literal operator declaration is deprecated",
		[f]=j,
		[g]="identifier (.*?) preceded by whitespace in a literal operator declaration is deprecated",
		[e]=" \\[(?:\\-Werror,)?\\-Wdeprecated\\-literal\\-operator[^\\]]*\\]",
		[a]=fb,
		[d]={"47ccfd7a89e2",1667306232,"[Clang] Implement P2741R3 - user-generated static_assert messages","[Clang] Implement P2741R3 - user-generated static_assert messages\n\nReviewed By: #clang-language-wg, aaron.ballman\n\nDifferential Revision: https://reviews.llvm.org/D154290"},
		[c]={{dc,515,"bool Sema::checkLiteralOperatorId(const CXXScopeSpec &SS, const UnqualifiedId &Name, bool IsUDSuffix) {\n  // ...\n  if (!IsUDSuffix) {\n    // ...\n    if (!PP.getSourceManager().isInSystemHeader(Loc)) {\n      if (auto Hint = FixItHint::CreateReplacement(Name.getSourceRange(), (StringRef(\"operator\\\"\\\"\") + II->getName()).str()); isReservedInAllContexts(Status)) {\n      // ...\n      } else {\n        Diag(Loc, diag::warn_deprecated_literal_operator_id) << II << Hint;"}},
		[m]={
			["clang/test/CXX/drs/dr25xx.cpp"]={"clang/test/CXX/drs/dr25xx.cpp:69:29: warning: identifier \'_π___\' preceded by whitespace in a literal operator declaration is deprecated [-Wdeprecated-literal-operator]","clang/test/CXX/drs/dr25xx.cpp:74:13: warning: identifier \'_div\' preceded by whitespace in a literal operator declaration is deprecated [-Wdeprecated-literal-operator]","clang/test/CXX/drs/dr25xx.cpp:77:28: warning: identifier \'_π___\' preceded by whitespace in a literal operator declaration is deprecated [-Wdeprecated-literal-operator]"}
		}
	},
	["warn_deprecated_message"]={
		[l]={ab,Cc},
		[k]=Cc,
		[i]="warn_deprecated_message",
		[h]="%0 is deprecated: %1",
		[b]="A is deprecated: B",
		[f]=j,
		[g]="(.*?) is deprecated\\: (.*?)",
		[e]=" \\[(?:\\-Werror,)?\\-Wdeprecated\\-declarations[^\\]]*\\]",
		[a]=fb,
		[d]={"55106310aeaf",1286399924,"Add message to attribute(deprecated).","Add message to attribute(deprecated).\nattribute(unavailable) to do next.\n// rdar:// 6734520.\n\nllvm-svn: 115842"},
		[c]={{"clang/lib/Sema/SemaAvailability.cpp",438,"/// Actually emit an availability diagnostic for a reference to an unavailable\n/// decl.\n///\n/// \\param Ctx The context that the reference occurred in\n/// \\param ReferringDecl The exact declaration that was referenced.\n/// \\param OffendingDecl A related decl to \\c ReferringDecl that has an\n/// availability attribute corresponding to \\c K attached to it. Note that this\n/// may not be the same as ReferringDecl, i.e. if an EnumDecl is annotated and\n/// we refer to a member EnumConstantDecl, ReferringDecl is the EnumConstantDecl\n/// and OffendingDecl is the EnumDecl.\nstatic void DoEmitAvailabilityWarning(Sema &S, AvailabilityResult K, Decl *Ctx, const NamedDecl *ReferringDecl, const NamedDecl *OffendingDecl, StringRef Message, ArrayRef<SourceLocation> Locs, const ObjCInterfaceDecl *UnknownObjCClass, const ObjCPropertyDecl *ObjCProperty, bool ObjCPropertyAccess) {\n  // ...\n  case AR_Deprecated:\n    // ...\n    diag_message = diag::warn_deprecated_message;"}},
		[m]={
			["clang/test/Sema/attr-availability-macosx.c"]={"clang/test/Sema/attr-availability-macosx.c:18:3: warning: \'f2\' is deprecated: first deprecated in macOS 10.5 [-Wdeprecated-declarations]"}
		}
	},
	["warn_deprecated_noreturn_spelling"]={
		[l]={ab,"deprecated-attributes"},
		[k]="deprecated-attributes",
		[i]={{nil,D,"warn_deprecated_noreturn_spelling"}},
		[h]={{nil,D,"the \'[[_Noreturn]]\' attribute spelling is deprecated in C2x; use \'[[noreturn]]\' instead"}},
		[b]={{nil,D,"the \'[[_Noreturn]]\' attribute spelling is deprecated in C2x; use \'[[noreturn]]\' instead"}},
		[f]=j,
		[g]="the \'\\[\\[_Noreturn\\]\\]\' attribute spelling is deprecated in C2x; use \'\\[\\[noreturn\\]\\]\' instead",
		[e]=" \\[(?:\\-Werror,)?\\-Wdeprecated\\-attributes[^\\]]*\\]",
		[a]={{nil,D,fb}},
		[d]={"f9c3310d32c6",1616787805,"[OPENMP]Fix PR49366: crash on VLAs in task untied regions.","[OPENMP]Fix PR49366: crash on VLAs in task untied regions.\n\nWe need to capture the local variables into a record in task untied\nregions but clang does not support record with VLA data members.\n\nDifferential Revision: https://reviews.llvm.org/D99436"},
		[c]={{rd,2205,"static void handleStandardNoReturnAttr(Sema &S, Decl *D, const ParsedAttr &A) {\n  // The [[_Noreturn]] spelling is deprecated in C2x, so if that was used,\n  // issue an appropriate diagnostic. However, don\'t issue a diagnostic if the\n  // attribute name comes from a macro expansion. We don\'t want to punish users\n  // who write [[noreturn]] after including <stdnoreturn.h> (where \'noreturn\'\n  // is defined as a macro which expands to \'_Noreturn\').\n  if (!S.getLangOpts().CPlusPlus && A.getSemanticSpelling() == CXX11NoReturnAttr::C2x_Noreturn && !(A.getLoc().isMacroID() && S.getSourceManager().isInSystemMacro(A.getLoc())))\n    S.Diag(A.getLoc(), diag::warn_deprecated_noreturn_spelling) << A.getRange();"}},
		[m]={
			["clang/test/Sema/c2x-noreturn.c"]={"clang/test/Sema/c2x-noreturn.c:36:3: warning: the \'[[_Noreturn]]\' attribute spelling is deprecated in C2x; use \'[[noreturn]]\' instead [-Wdeprecated-attributes]","clang/test/Sema/c2x-noreturn.c:51:3: warning: the \'[[_Noreturn]]\' attribute spelling is deprecated in C2x; use \'[[noreturn]]\' instead [-Wdeprecated-attributes]","clang/test/Sema/c2x-noreturn.c:65:3: warning: the \'[[_Noreturn]]\' attribute spelling is deprecated in C2x; use \'[[noreturn]]\' instead [-Wdeprecated-attributes]"}
		}
	},
	["warn_deprecated_redundant_constexpr_static_def"]={
		[l]={ab,"deprecated-redundant-constexpr-static-def"},
		[k]="deprecated-redundant-constexpr-static-def",
		[i]="warn_deprecated_redundant_constexpr_static_def",
		[h]="out-of-line definition of constexpr static data member is redundant in C++17 and is deprecated",
		[b]="out-of-line definition of constexpr static data member is redundant in C++17 and is deprecated",
		[f]=j,
		[g]="out\\-of\\-line definition of constexpr static data member is redundant in C\\+\\+17 and is deprecated",
		[e]=" \\[(?:\\-Werror,)?\\-Wdeprecated\\-redundant\\-constexpr\\-static\\-def[^\\]]*\\]",
		[a]=fb,
		[d]={"62f19e700d31",1466813756,"Implement C++17 P0386R2, inline variables. (The \'inline\' specifier gives a","Implement C++17 P0386R2, inline variables. (The \'inline\' specifier gives a\nvariable weak discardable linkage and partially-ordered initialization, and is\nimplied for constexpr static data members.)\n\nllvm-svn: 273754"},
		[c]={{bb,4729,"/// MergeVarDecl - We just parsed a variable \'New\' which has the same name\n/// and scope as a previous declaration \'Old\'.  Figure out how to resolve this\n/// situation, merging decls or emitting diagnostics as appropriate.\n///\n/// Tentative definition rules (C99 6.9.2p2) are checked by\n/// FinalizeDeclaratorGroup. Unfortunately, we can\'t analyze tentative\n/// definitions here, since the initializer hasn\'t been attached.\n///\nvoid Sema::MergeVarDecl(VarDecl *New, LookupResult &Previous) {\n  // ...\n  // C++ doesn\'t have tentative definitions, so go right ahead and check here.\n  if (getLangOpts().CPlusPlus) {\n    if (Old->isStaticDataMember() && Old->getCanonicalDecl()->isInline() && Old->getCanonicalDecl()->isConstexpr()) {\n      // ...\n      Diag(New->getLocation(), diag::warn_deprecated_redundant_constexpr_static_def);"}},
		[m]={
			["clang/test/SemaCXX/redundant-out-of-line-static-constexpr-member-def-diag.cpp"]={"clang/test/SemaCXX/redundant-out-of-line-static-constexpr-member-def-diag.cpp:8:20: warning: out-of-line definition of constexpr static data member is redundant in C++17 and is deprecated [-Wdeprecated-redundant-constexpr-static-def]","clang/test/SemaCXX/redundant-out-of-line-static-constexpr-member-def-diag.cpp:9:16: warning: out-of-line definition of constexpr static data member is redundant in C++17 and is deprecated [-Wdeprecated-redundant-constexpr-static-def]"}
		}
	},
	["warn_deprecated_register"]={
		[l]={J,u,I,ab,"deprecated-register","register"},
		[k]="deprecated-register",
		[i]="warn_deprecated_register",
		[h]="\'register\' storage class specifier is deprecated and incompatible with C++1z",
		[b]="\'register\' storage class specifier is deprecated and incompatible with C++1z",
		[f]=j,
		[g]="\'register\' storage class specifier is deprecated and incompatible with C\\+\\+17",
		[e]=" \\[(?:\\-Werror,)?\\-Wdeprecated\\-register[^\\]]*\\]",
		[a]=fb,
		[d]={"8ca78a16f4a5",1371088971,"Add -Wdeprecated warnings and fixits for things deprecated in C++11:","Add -Wdeprecated warnings and fixits for things deprecated in C++11:\n - \'register\' storage class\n - dynamic exception specifications\n\nOnly the former check is enabled by default for now (the latter might be quite noisy).\n\nllvm-svn: 183881"},
		[c]={{bb,7497,"NamedDecl *Sema::ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope, ArrayRef<BindingDecl *> Bindings) {\n  // ...\n  if (getLangOpts().CPlusPlus11 && SCSpec == DeclSpec::SCS_register && !D.getAsmLabel() && !getSourceManager().isInSystemMacro(D.getDeclSpec().getStorageClassSpecLoc())) {\n    // ...\n    Diag(D.getDeclSpec().getStorageClassSpecLoc(), getLangOpts().CPlusPlus17 ? diag::ext_register_storage_class : diag::warn_deprecated_register) << FixItHint::CreateRemoval(D.getDeclSpec().getStorageClassSpecLoc());"},{bb,14739,"/// ActOnParamDeclarator - Called from Parser::ParseFunctionDeclarator()\n/// to introduce parameters into function prototype scope.\nDecl *Sema::ActOnParamDeclarator(Scope *S, Declarator &D) {\n  // ...\n  if (DS.getStorageClassSpec() == DeclSpec::SCS_register) {\n    // ...\n    // In C++11, the \'register\' storage class specifier is deprecated.\n    // In C++17, it is not allowed, but we tolerate it as an extension.\n    if (getLangOpts().CPlusPlus11) {\n      Diag(DS.getStorageClassSpecLoc(), getLangOpts().CPlusPlus17 ? diag::ext_register_storage_class : diag::warn_deprecated_register) << FixItHint::CreateRemoval(DS.getStorageClassSpecLoc());"}},
		[m]={
			["clang/test/SemaCXX/attr-cxx0x.cpp"]={"clang/test/SemaCXX/attr-cxx0x.cpp:15:14: warning: \'register\' storage class specifier is deprecated and incompatible with C++17 [-Wdeprecated-register]"}
		}
	},
	["warn_deprecated_simple_assign_volatile"]={
		[l]={ab,ec},
		[k]=ec,
		[i]={{nil,s,"warn_deprecated_simple_assign_volatile"}},
		[h]={{nil,s,"use of result of assignment to object of volatile-qualified type %0 is deprecated"}},
		[b]={{nil,s,"use of result of assignment to object of volatile-qualified type A is deprecated"}},
		[f]=j,
		[g]="use of result of assignment to object of volatile\\-qualified type (.*?) is deprecated",
		[e]=ud,
		[a]={{nil,s,fb}},
		[d]={cc,1567434909,ac,Xb},
		[c]={{hb,18642,"void Sema::PopExpressionEvaluationContext() {\n  // ...\n  // Warn on any volatile-qualified simple-assignments that are not discarded-\n  // value expressions nor unevaluated operands (those cases get removed from\n  // this list by CheckUnusedVolatileAssignment).\n  for (auto *BO : Rec.VolatileAssignmentLHSs)\n    Diag(BO->getBeginLoc(), diag::warn_deprecated_simple_assign_volatile) << BO->getType();"}},
		[m]={
			["clang/test/SemaCXX/deprecated.cpp"]={"clang/test/SemaCXX/deprecated.cpp:161:18: warning: use of result of assignment to object of volatile-qualified type \'volatile int\' is deprecated [-Wdeprecated-volatile]","clang/test/SemaCXX/deprecated.cpp:162:24: warning: use of result of assignment to object of volatile-qualified type \'volatile int\' is deprecated [-Wdeprecated-volatile]","clang/test/SemaCXX/deprecated.cpp:164:22: warning: use of result of assignment to object of volatile-qualified type \'volatile int\' is deprecated [-Wdeprecated-volatile]","clang/test/SemaCXX/deprecated.cpp:165:22: warning: use of result of assignment to object of volatile-qualified type \'volatile int\' is deprecated [-Wdeprecated-volatile]","clang/test/SemaCXX/deprecated.cpp:166:23: warning: use of result of assignment to object of volatile-qualified type \'volatile int\' is deprecated [-Wdeprecated-volatile]","clang/test/SemaCXX/deprecated.cpp:157:9: warning: use of result of assignment to object of volatile-qualified type \'volatile int\' is deprecated [-Wdeprecated-volatile]","clang/test/SemaCXX/deprecated.cpp:158:13: warning: use of result of assignment to object of volatile-qualified type \'volatile int\' is deprecated [-Wdeprecated-volatile]","clang/test/SemaCXX/deprecated.cpp:159:9: warning: use of result of assignment to object of volatile-qualified type \'volatile int\' is deprecated [-Wdeprecated-volatile]","clang/test/SemaCXX/deprecated.cpp:176:9: warning: use of result of assignment to object of volatile-qualified type \'volatile bool\' is deprecated [-Wdeprecated-volatile]","clang/test/SemaCXX/deprecated.cpp:178:10: warning: use of result of assignment to object of volatile-qualified type \'volatile bool\' is deprecated [-Wdeprecated-volatile]"}
		}
	},
	["warn_deprecated_string_literal_conversion"]={
		[l]={y,w,"c++11-compat-deprecated-writable-strings",p,ab,"deprecated-writable-strings","writable-strings","write-strings"},
		[k]="c++11-compat-deprecated-writable-strings",
		[i]="warn_deprecated_string_literal_conversion",
		[h]="conversion from string literal to %0 is deprecated",
		[b]="conversion from string literal to A is deprecated",
		[f]=j,
		[g]="conversion from string literal to (.*?) is deprecated",
		[e]=" \\[(?:\\-Werror,)?\\-Wc\\+\\+11\\-compat\\-deprecated\\-writable\\-strings[^\\]]*\\]",
		[a]=fb,
		[d]={"e489a7d3d397",1267381825,"Warn about the deprecated string literal -> char* conversion. Fixes PR6428.","Warn about the deprecated string literal -> char* conversion. Fixes PR6428.\n\nllvm-svn: 97404"},
		[c]={{dc,4753,"/// PerformImplicitConversion - Perform an implicit conversion of the\n/// expression From to the type ToType by following the standard\n/// conversion sequence SCS. Returns the converted\n/// expression. Flavor is the context in which we\'re performing this\n/// conversion, for use in error messages.\nExprResult Sema::PerformImplicitConversion(Expr *From, QualType ToType, const StandardConversionSequence &SCS, AssignmentAction Action, CheckedConversionKind CCK) {\n  // ...\n  case ICK_Qualification: {\n    // ...\n    if (SCS.DeprecatedStringLiteralToCharPtr && !getLangOpts().WritableStrings) {\n      Diag(From->getBeginLoc(), getLangOpts().CPlusPlus11 ? diag::ext_deprecated_string_literal_conversion : diag::warn_deprecated_string_literal_conversion) << ToType.getNonReferenceType();"}},
		[m]={
			["clang/test/SemaCXX/type-convert-construct.cpp"]={"clang/test/SemaCXX/type-convert-construct.cpp:29:9: warning: conversion from string literal to \'char *\' is deprecated [-Wc++11-compat-deprecated-writable-strings]","clang/test/SemaCXX/type-convert-construct.cpp:36:10: warning: conversion from string literal to \'wchar_t *\' is deprecated [-Wc++11-compat-deprecated-writable-strings]"}
		}
	},
	["warn_deprecated_this_capture"]={
		[l]={ab,"deprecated-this-capture"},
		[k]="deprecated-this-capture",
		[i]={{nil,O,"warn_deprecated_this_capture"}},
		[h]={{nil,O,"implicit capture of \'this\' with a capture default of \'=\' is deprecated"}},
		[b]={{nil,O,"implicit capture of \'this\' with a capture default of \'=\' is deprecated"}},
		[f]=j,
		[g]="implicit capture of \'this\' with a capture default of \'\\=\' is deprecated",
		[e]=" \\[(?:\\-Werror,)?\\-Wdeprecated\\-this\\-capture[^\\]]*\\]",
		[a]={{nil,O,fb}},
		[d]={"d82201e7c66b",1530943128,"P0806R2 Implicit capture of this with a capture-default of [=] is","P0806R2 Implicit capture of this with a capture-default of [=] is\ndeprecated.\n\nAdd a -Wdeprecated warning for this in C++2a onwards. (In C++17 and\nbefore, there isn\'t a reasonable alternative because [=,this] is\nill-formed.)\n\nllvm-svn: 336480"},
		[c]={{yd,2037,"ExprResult Sema::BuildLambdaExpr(SourceLocation StartLoc, SourceLocation EndLoc, LambdaScopeInfo *LSI) {\n  // ...\n  {\n    // ...\n    for (unsigned I = 0, N = LSI->Captures.size(); I != N; ++I) {\n      // ...\n      // Map the capture to our AST representation.\n      LambdaCapture Capture = [&] {\n        if (From.isThisCapture()) {\n          // Capturing \'this\' implicitly with a default of \'[=]\' is deprecated,\n          // because it results in a reference capture. Don\'t warn prior to\n          // C++2a; there\'s nothing that can be done about it before then.\n          if (getLangOpts().CPlusPlus20 && IsImplicit && CaptureDefault == LCD_ByCopy) {\n            Diag(From.getLocation(), diag::warn_deprecated_this_capture);"}},
		[m]={
			["clang/test/SemaCXX/lambda-implicit-this-capture.cpp"]={"clang/test/SemaCXX/lambda-implicit-this-capture.cpp:11:14: warning: implicit capture of \'this\' with a capture default of \'=\' is deprecated [-Wdeprecated-this-capture]"}
		}
	},
	["warn_deprecated_volatile_param"]={
		[l]={ab,ec},
		[k]=ec,
		[i]={{nil,s,"warn_deprecated_volatile_param"}},
		[h]={{nil,s,"volatile-qualified parameter type %0 is deprecated"}},
		[b]={{nil,s,"volatile-qualified parameter type A is deprecated"}},
		[f]=j,
		[g]="volatile\\-qualified parameter type (.*?) is deprecated",
		[e]=ud,
		[a]={{nil,s,fb}},
		[d]={cc,1567434909,ac,Xb},
		[c]={{Pb,3041,"QualType Sema::BuildFunctionType(QualType T, MutableArrayRef<QualType> ParamTypes, SourceLocation Loc, DeclarationName Entity, const FunctionProtoType::ExtProtoInfo &EPI) {\n  // ...\n  for (unsigned Idx = 0, Cnt = ParamTypes.size(); Idx < Cnt; ++Idx) {\n    // ...\n    // C++2a [dcl.fct]p4:\n    //   A parameter with volatile-qualified type is deprecated\n    if (ParamType.isVolatileQualified() && getLangOpts().CPlusPlus20)\n      Diag(Loc, diag::warn_deprecated_volatile_param) << ParamType;"},{Pb,5898,"static TypeSourceInfo *GetFullTypeForDeclarator(TypeProcessingState &state, QualType declSpecType, TypeSourceInfo *TInfo) {\n  // ...\n  // C++2a [dcl.fct]p4:\n  //   A parameter with volatile-qualified type is deprecated\n  if (T.isVolatileQualified() && S.getLangOpts().CPlusPlus20 && (D.getContext() == DeclaratorContext::Prototype || D.getContext() == DeclaratorContext::LambdaExprParameter))\n    S.Diag(D.getIdentifierLoc(), diag::warn_deprecated_volatile_param) << T;"}},
		[m]={
			["clang/test/SemaCXX/coroutines.cpp"]={"clang/test/SemaCXX/coroutines.cpp:1143:73: warning: volatile-qualified parameter type \'volatile void *volatile\' is deprecated [-Wdeprecated-volatile]","clang/test/SemaCXX/coroutines.cpp:1242:73: warning: volatile-qualified parameter type \'volatile void *volatile\' is deprecated [-Wdeprecated-volatile]"}
		}
	},
	["warn_deprecated_volatile_return"]={
		[l]={ab,ec},
		[k]=ec,
		[i]={{nil,s,"warn_deprecated_volatile_return"}},
		[h]={{nil,s,"volatile-qualified return type %0 is deprecated"}},
		[b]={{nil,s,"volatile-qualified return type A is deprecated"}},
		[f]=j,
		[g]="volatile\\-qualified return type (.*?) is deprecated",
		[e]=ud,
		[a]={{nil,s,fb}},
		[d]={cc,1567434909,ac,Xb},
		[c]={{Pb,2941,"bool Sema::CheckFunctionReturnType(QualType T, SourceLocation Loc) {\n  // ...\n  // C++2a [dcl.fct]p12:\n  //   A volatile-qualified return type is deprecated\n  if (T.isVolatileQualified() && getLangOpts().CPlusPlus20)\n    Diag(Loc, diag::warn_deprecated_volatile_return) << T;"},{Pb,5368,"static TypeSourceInfo *GetFullTypeForDeclarator(TypeProcessingState &state, QualType declSpecType, TypeSourceInfo *TInfo) {\n  // ...\n  for (unsigned i = 0, e = D.getNumTypeObjects(); i != e; ++i) {\n    // ...\n    case DeclaratorChunk::Function: {\n      // ...\n      // cv-qualifiers on return types are pointless except when the type is a\n      // class type in C++.\n      if ((T.getCVRQualifiers() || T->isAtomicType()) && !(S.getLangOpts().CPlusPlus && (T->isDependentType() || T->isRecordType()))) {\n        // ...\n        // C++2a [dcl.fct]p12:\n        //   A volatile-qualified return type is deprecated\n        if (T.isVolatileQualified() && S.getLangOpts().CPlusPlus20)\n          S.Diag(DeclType.Loc, diag::warn_deprecated_volatile_return) << T;"}},
		[m]={
			["clang/test/SemaCXX/coroutines.cpp"]={"clang/test/SemaCXX/coroutines.cpp:1033:3: warning: volatile-qualified return type \'const volatile bool\' is deprecated [-Wdeprecated-volatile]"}
		}
	},
	["warn_deprecated_volatile_structured_binding"]={
		[l]={ab,ec},
		[k]=ec,
		[i]={{nil,s,"warn_deprecated_volatile_structured_binding"}},
		[h]={{nil,s,"volatile qualifier in structured binding declaration is deprecated"}},
		[b]={{nil,s,"volatile qualifier in structured binding declaration is deprecated"}},
		[f]=j,
		[g]="volatile qualifier in structured binding declaration is deprecated",
		[e]=ud,
		[a]={{nil,s,fb}},
		[d]={cc,1567434909,ac,Xb},
		[c]={{K,830,"NamedDecl *Sema::ActOnDecompositionDeclarator(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParamLists) {\n  // ...\n  // C++2a [dcl.struct.bind]p1:\n  //   A cv that includes volatile is deprecated\n  if ((DS.getTypeQualifiers() & DeclSpec::TQ_volatile) && getLangOpts().CPlusPlus20)\n    Diag(DS.getVolatileSpecLoc(), diag::warn_deprecated_volatile_structured_binding);"}},
		[m]={
			["clang/test/Parser/cxx1z-decomposition.cpp"]={"clang/test/Parser/cxx1z-decomposition.cpp:61:11: warning: volatile qualifier in structured binding declaration is deprecated [-Wdeprecated-volatile]"}
		}
	},
	["warn_dereference_of_noderef_type"]={
		[l]={"noderef"},
		[k]="noderef",
		[i]={{nil,v,"warn_dereference_of_noderef_type"}},
		[h]={{nil,v,"dereferencing %0; was declared with a \'noderef\' type"}},
		[b]={{nil,v,"dereferencing A; was declared with a \'noderef\' type"}},
		[f]=j,
		[g]="dereferencing (.*?); was declared with a \'noderef\' type",
		[e]=" \\[(?:\\-Werror,)?\\-Wnoderef[^\\]]*\\]",
		[a]={{nil,v,A}},
		[d]={"ad7ac964e5cf",1544058354,"[Sema/Attribute] Check for noderef attribute","[Sema/Attribute] Check for noderef attribute\n\nThis patch adds the noderef attribute in clang and checks for dereferences of\ntypes that have this attribute. This attribute is currently used by sparse and\nwould like to be ported to clang.\n\nDifferential Revision: https://reviews.llvm.org/D49511\n\nllvm-svn: 348442"},
		[c]={{hb,18116,"void Sema::WarnOnPendingNoDerefs(ExpressionEvaluationContextRecord &Rec) {\n  for (const Expr *E : Rec.PossibleDerefs) {\n    // ...\n    if (DeclRef) {\n      // ...\n      Diag(E->getExprLoc(), diag::warn_dereference_of_noderef_type) << Decl->getName() << E->getSourceRange();"}},
		[m]={
			["clang/test/Frontend/noderef.cpp"]={"clang/test/Frontend/noderef.cpp:31:12: warning: dereferencing i_ptr; was declared with a \'noderef\' type [-Wnoderef]","clang/test/Frontend/noderef.cpp:32:13: warning: dereferencing i_ptr; was declared with a \'noderef\' type [-Wnoderef]","clang/test/Frontend/noderef.cpp:103:13: warning: dereferencing a; was declared with a \'noderef\' type [-Wnoderef]","clang/test/Frontend/noderef.cpp:107:17: warning: dereferencing child; was declared with a \'noderef\' type [-Wnoderef]","clang/test/Frontend/noderef.cpp:111:17: warning: dereferencing a; was declared with a \'noderef\' type [-Wnoderef]","clang/test/Frontend/noderef.cpp:130:12: warning: dereferencing x; was declared with a \'noderef\' type [-Wnoderef]","clang/test/Frontend/noderef.cpp:135:16: warning: dereferencing glob_ptr; was declared with a \'noderef\' type [-Wnoderef]"}
		}
	},
	["warn_dereference_of_noderef_type_no_decl"]={
		[l]={"noderef"},
		[k]="noderef",
		[i]={{nil,v,"warn_dereference_of_noderef_type_no_decl"}},
		[h]={{nil,v,"dereferencing expression marked as \'noderef\'"}},
		[b]={{nil,v,"dereferencing expression marked as \'noderef\'"}},
		[f]=j,
		[g]="dereferencing expression marked as \'noderef\'",
		[e]=" \\[(?:\\-Werror,)?\\-Wnoderef[^\\]]*\\]",
		[a]={{nil,v,A}},
		[d]={"ad7ac964e5cf",1544058354,"[Sema/Attribute] Check for noderef attribute","[Sema/Attribute] Check for noderef attribute\n\nThis patch adds the noderef attribute in clang and checks for dereferences of\ntypes that have this attribute. This attribute is currently used by sparse and\nwould like to be ported to clang.\n\nDifferential Revision: https://reviews.llvm.org/D49511\n\nllvm-svn: 348442"},
		[c]={{hb,18262,"void Sema::WarnOnPendingNoDerefs(ExpressionEvaluationContextRecord &Rec) {\n  for (const Expr *E : Rec.PossibleDerefs) {\n    // ...\n    if (DeclRef) {\n    // ...\n    } else {\n      Diag(E->getExprLoc(), diag::warn_dereference_of_noderef_type_no_decl) << E->getSourceRange();"}},
		[m]={
			["clang/test/Frontend/noderef.c"]={"clang/test/Frontend/noderef.c:53:3: warning: dereferencing expression marked as \'noderef\' [-Wnoderef]","clang/test/Frontend/noderef.c:49:7: warning: dereferencing expression marked as \'noderef\' [-Wnoderef]","clang/test/Frontend/noderef.c:121:18: warning: dereferencing expression marked as \'noderef\' [-Wnoderef]","clang/test/Frontend/noderef.c:37:7: warning: dereferencing expression marked as \'noderef\' [-Wnoderef]","clang/test/Frontend/noderef.c:77:7: warning: dereferencing expression marked as \'noderef\' [-Wnoderef]","clang/test/Frontend/noderef.c:40:3: warning: dereferencing expression marked as \'noderef\' [-Wnoderef]","clang/test/Frontend/noderef.c:188:7: warning: dereferencing expression marked as \'noderef\' [-Wnoderef]","clang/test/Frontend/noderef.c:177:4: warning: dereferencing expression marked as \'noderef\' [-Wnoderef]","clang/test/Frontend/noderef.c:31:7: warning: dereferencing expression marked as \'noderef\' [-Wnoderef]","clang/test/Frontend/noderef.c:124:15: warning: dereferencing expression marked as \'noderef\' [-Wnoderef]","clang/test/Frontend/noderef.c:142:3: warning: dereferencing expression marked as \'noderef\' [-Wnoderef]","clang/test/Frontend/noderef.c:173:4: warning: dereferencing expression marked as \'noderef\' [-Wnoderef]","clang/test/Frontend/noderef.c:185:4: warning: dereferencing expression marked as \'noderef\' [-Wnoderef]","clang/test/Frontend/noderef.c:101:7: warning: dereferencing expression marked as \'noderef\' [-Wnoderef]","clang/test/Frontend/noderef.c:159:3: warning: dereferencing expression marked as \'noderef\' [-Wnoderef]","clang/test/Frontend/noderef.c:195:15: warning: dereferencing expression marked as \'noderef\' [-Wnoderef]"}
		}
	},
	["warn_diagnose_if_succeeded"]={
		[l]={vc,"all","most","user-defined-warnings"},
		[k]="user-defined-warnings",
		[i]="warn_diagnose_if_succeeded",
		[h]="%0",
		[b]="A",
		[f]=j,
		[g]="(.*?)",
		[e]=" \\[(?:\\-Werror,)?\\-Wuser\\-defined\\-warnings[^\\]]*\\]",
		[a]=r,
		[d]={"177399e2277c",1483935134,"Add the diagnose_if attribute to clang.","Add the diagnose_if attribute to clang.\n\n`diagnose_if` can be used to have clang emit either warnings or errors\nfor function calls that meet user-specified conditions. For example:\n\n```\nconstexpr int foo(int a)\n  __attribute__((diagnose_if(a > 10, \"configurations with a > 10 are \"\n                                      \"expensive.\", \"warning\")));\n\nint f1 = foo(9);\nint f2 = foo(10); // warning: configuration with a > 10 are expensive.\nint f3 = foo(f2);\n```\n\nIt currently only emits diagnostics in cases where the condition is\nguaranteed to always be true. So, the following code will emit no\nwarnings:\n\n```\nconstexpr int bar(int a) {\n  foo(a);\n  return 0;\n}\n\nconstexpr int i = bar(10);\n```\n\nWe hope to support optionally emitting diagnostics for cases like that\n(and emitting runtime checks) in the future.\n\nRelease notes will appear shortly. :)\n\nDifferential Revision: https://reviews.llvm.org/D27424\n\nllvm-svn: 291418"},
		[c]={{"clang/lib/Sema/SemaOpenMP.cpp",11167,"StmtResult Sema::ActOnOpenMPErrorDirective(ArrayRef<OMPClause *> Clauses, SourceLocation StartLoc, SourceLocation EndLoc, bool InExContext) {\n  // ...\n  if (!AtC || AtC->getAtKind() == OMPC_AT_compilation) {\n    if (SeverityC && SeverityC->getSeverityKind() == OMPC_SEVERITY_warning)\n      Diag(SeverityC->getSeverityKindKwLoc(), diag::warn_diagnose_if_succeeded) << (ME ? cast<StringLiteral>(ME)->getString() : \"WARNING\");"},{"clang/lib/Sema/SemaOverload.cpp",6960,"template <typename CheckFn> static bool diagnoseDiagnoseIfAttrsWith(Sema &S, const NamedDecl *ND, bool ArgDependent, SourceLocation Loc, CheckFn &&IsSuccessful) {\n  // ...\n  for (const auto *DIA : llvm::make_range(WarningBegin, Attrs.end()))\n    if (IsSuccessful(DIA)) {\n      S.Diag(Loc, diag::warn_diagnose_if_succeeded) << DIA->getMessage();"}},
		[m]={
			["clang/test/SemaCXX/operator-new-size-diagnose_if.cpp"]={"clang/test/SemaCXX/operator-new-size-diagnose_if.cpp:19:3: warning: yay [-Wuser-defined-warnings]","clang/test/SemaCXX/operator-new-size-diagnose_if.cpp:20:3: warning: yay [-Wuser-defined-warnings]","clang/test/SemaCXX/operator-new-size-diagnose_if.cpp:21:3: warning: yay [-Wuser-defined-warnings]"}
		}
	},
	["warn_direct_initialize_call"]={
		[l]={"explicit-initialize-call"},
		[k]="explicit-initialize-call",
		[i]="warn_direct_initialize_call",
		[h]="explicit call to +initialize results in duplicate call to +initialize",
		[b]="explicit call to +initialize results in duplicate call to +initialize",
		[f]=j,
		[g]="explicit call to \\+initialize results in duplicate call to \\+initialize",
		[e]=" \\[(?:\\-Werror,)?\\-Wexplicit\\-initialize\\-call[^\\]]*\\]",
		[a]=r,
		[d]={"78e9debf68d4",1408726646,"Objective-C. Warn if user has made explicit call","Objective-C. Warn if user has made explicit call\nto +initilize as this results in an extra call\nto this method. rdar://16628028\n\nllvm-svn: 216271"},
		[c]={{"clang/lib/Sema/SemaExprObjC.cpp",2718,"/// \\param ReceiverType The type of the object receiving the\n/// message. When \\p ReceiverTypeInfo is non-NULL, this is the same\n/// type as that refers to. For a superclass send, this is the type of\n/// the superclass.\n///\n/// \\param SuperLoc The location of the \"super\" keyword in a\n/// superclass message.\n///\n/// \\param Sel The selector to which the message is being sent.\n///\n/// \\param Method The method that this class message is invoking, if\n/// already known.\n///\n/// \\param LBracLoc The location of the opening square bracket \']\'.\n///\n/// \\param RBracLoc The location of the closing square bracket \']\'.\n///\n/// \\param ArgsIn The message arguments.\nExprResult Sema::BuildClassMessage(TypeSourceInfo *ReceiverTypeInfo, QualType ReceiverType, SourceLocation SuperLoc, Selector Sel, ObjCMethodDecl *Method, SourceLocation LBracLoc, ArrayRef<SourceLocation> SelectorLocs, SourceLocation RBracLoc, MultiExprArg ArgsIn, bool isImplicit) {\n  // ...\n  // Warn about explicit call of +initialize on its own class. But not on \'super\'.\n  if (Method && Method->getMethodFamily() == OMF_initialize) {\n    if (!SuperLoc.isValid()) {\n      // ...\n      if (ID == Class) {\n        Diag(Loc, diag::warn_direct_initialize_call);"}},
		[m]={
			["clang/test/SemaObjC/warn-explicit-call-initialize.m"]={"clang/test/SemaObjC/warn-explicit-call-initialize.m:15:4: warning: explicit call to +initialize results in duplicate call to +initialize [-Wexplicit-initialize-call]","clang/test/SemaObjC/warn-explicit-call-initialize.m:16:4: warning: explicit call to +initialize results in duplicate call to +initialize [-Wexplicit-initialize-call]"}
		}
	},
	["warn_direct_ivar_access"]={
		[l]={"direct-ivar-access"},
		[k]="direct-ivar-access",
		[i]="warn_direct_ivar_access",
		[h]="instance variable %0 is being directly accessed",
		[b]="instance variable A is being directly accessed",
		[f]=j,
		[g]="instance variable (.*?) is being directly accessed",
		[e]=" \\[(?:\\-Werror,)?\\-Wdirect\\-ivar\\-access[^\\]]*\\]",
		[a]=r,
		[d]={"14f1aa70a9fa",1344297051,"objective-c: Implement gcc\'s -Wdirect-ivar-access option.","objective-c: Implement gcc\'s -Wdirect-ivar-access option.\n// rdar://6505197\n\nllvm-svn: 161362"},
		[c]={{hb,3041,"ExprResult Sema::BuildIvarRefExpr(Scope *S, SourceLocation Loc, ObjCIvarDecl *IV) {\n  // ...\n  if (MF != OMF_init && MF != OMF_dealloc && MF != OMF_finalize && !IvarBacksCurrentMethodAccessor(IFace, CurMethod, IV))\n    Diag(Loc, diag::warn_direct_ivar_access) << IV->getDeclName();"},{"clang/lib/Sema/SemaExprMember.cpp",1474,"/// Look up the given member of the given non-type-dependent\n/// expression.  This can return in one of two ways:\n///  * If it returns a sentinel null-but-valid result, the caller will\n///    assume that lookup was performed and the results written into\n///    the provided structure.  It will take over from there.\n///  * Otherwise, the returned expression will be produced in place of\n///    an ordinary member expression.\n///\n/// The ObjCImpDecl bit is a gross hack that will need to be properly\n/// fixed for ObjC++.\nstatic ExprResult LookupMemberExpr(Sema &S, LookupResult &R, ExprResult &BaseExpr, bool &IsArrow, SourceLocation OpLoc, CXXScopeSpec &SS, Decl *ObjCImpDecl, bool HasTemplateArgs, SourceLocation TemplateKWLoc) {\n  // ...\n  // Handle ivar access to Objective-C objects.\n  if (const ObjCObjectType *OTy = BaseType->getAs<ObjCObjectType>()) {\n    // ...\n    if (warn) {\n      // ...\n      if (warn)\n        S.Diag(MemberLoc, diag::warn_direct_ivar_access) << IV->getDeclName();"}},
		[m]={
			["clang/test/SemaObjC/warn-direct-ivar-access.m"]={"clang/test/SemaObjC/warn-direct-ivar-access.m:22:5: warning: instance variable \'_myLeader\' is being directly accessed [-Wdirect-ivar-access]","clang/test/SemaObjC/warn-direct-ivar-access.m:22:17: warning: instance variable \'_isTickledPink\' is being directly accessed [-Wdirect-ivar-access]","clang/test/SemaObjC/warn-direct-ivar-access.m:37:5: warning: instance variable \'_isTickledPink\' is being directly accessed [-Wdirect-ivar-access]","clang/test/SemaObjC/warn-direct-ivar-access.m:37:27: warning: instance variable \'_myLeader\' is being directly accessed [-Wdirect-ivar-access]","clang/test/SemaObjC/warn-direct-ivar-access.m:39:16: warning: instance variable \'_myIntProp\' is being directly accessed [-Wdirect-ivar-access]","clang/test/SemaObjC/warn-direct-ivar-access.m:40:14: warning: instance variable \'_myIntProp\' is being directly accessed [-Wdirect-ivar-access]","clang/test/SemaObjC/warn-direct-ivar-access.m:41:12: warning: instance variable \'_isTickledPink\' is being directly accessed [-Wdirect-ivar-access]","clang/test/SemaObjC/warn-direct-ivar-access.m:74:38: warning: instance variable \'_property_in_protocol\' is being directly accessed [-Wdirect-ivar-access]"}
		}
	},
	["warn_direct_super_initialize_call"]={
		[l]={"explicit-initialize-call"},
		[k]="explicit-initialize-call",
		[i]="warn_direct_super_initialize_call",
		[h]="explicit call to [super initialize] should only be in implementation of +initialize",
		[b]="explicit call to [super initialize] should only be in implementation of +initialize",
		[f]=j,
		[g]="explicit call to \\[super initialize\\] should only be in implementation of \\+initialize",
		[e]=" \\[(?:\\-Werror,)?\\-Wexplicit\\-initialize\\-call[^\\]]*\\]",
		[a]=r,
		[d]={"422922838920",1409002058,"Objective-C. Allow [super initialize] in an +initialize","Objective-C. Allow [super initialize] in an +initialize\nimplementation but not anywhere else.\nrdar://16628028\n\nllvm-svn: 216408"},
		[c]={{"clang/lib/Sema/SemaExprObjC.cpp",2726,"/// \\param ReceiverType The type of the object receiving the\n/// message. When \\p ReceiverTypeInfo is non-NULL, this is the same\n/// type as that refers to. For a superclass send, this is the type of\n/// the superclass.\n///\n/// \\param SuperLoc The location of the \"super\" keyword in a\n/// superclass message.\n///\n/// \\param Sel The selector to which the message is being sent.\n///\n/// \\param Method The method that this class message is invoking, if\n/// already known.\n///\n/// \\param LBracLoc The location of the opening square bracket \']\'.\n///\n/// \\param RBracLoc The location of the closing square bracket \']\'.\n///\n/// \\param ArgsIn The message arguments.\nExprResult Sema::BuildClassMessage(TypeSourceInfo *ReceiverTypeInfo, QualType ReceiverType, SourceLocation SuperLoc, Selector Sel, ObjCMethodDecl *Method, SourceLocation LBracLoc, ArrayRef<SourceLocation> SelectorLocs, SourceLocation RBracLoc, MultiExprArg ArgsIn, bool isImplicit) {\n  // ...\n  // Warn about explicit call of +initialize on its own class. But not on \'super\'.\n  if (Method && Method->getMethodFamily() == OMF_initialize) {\n    if (!SuperLoc.isValid()) {\n    // ...\n    } else if (ObjCMethodDecl *CurMeth = getCurMethodDecl()) {\n      // [super initialize] is allowed only within an +initialize implementation\n      if (CurMeth->getMethodFamily() != OMF_initialize) {\n        Diag(Loc, diag::warn_direct_super_initialize_call);"}},
		[m]={
			["clang/test/SemaObjC/warn-explicit-call-initialize.m"]={"clang/test/SemaObjC/warn-explicit-call-initialize.m:22:4: warning: explicit call to [super initialize] should only be in implementation of +initialize [-Wexplicit-initialize-call]"}
		}
	},
	["warn_dispatch_body_ignored"]={
		[l]={"function-multiversion"},
		[k]="function-multiversion",
		[i]={{nil,O,"warn_dispatch_body_ignored"}},
		[h]={{nil,O,"body of cpu_dispatch function will be ignored"}},
		[b]={{nil,O,"body of cpu_dispatch function will be ignored"}},
		[f]=j,
		[g]="body of cpu_dispatch function will be ignored",
		[e]=" \\[(?:\\-Werror,)?\\-Wfunction\\-multiversion[^\\]]*\\]",
		[a]={{nil,O,A}},
		[d]={"3efe00206f0f",1532096008,"Implement cpu_dispatch/cpu_specific Multiversioning","Implement cpu_dispatch/cpu_specific Multiversioning\n\nAs documented here: https://software.intel.com/en-us/node/682969 and\nhttps://software.intel.com/en-us/node/523346. cpu_dispatch multiversioning\nis an ICC feature that provides for function multiversioning.\n\nThis feature is implemented with two attributes: First, cpu_specific,\nwhich specifies the individual function versions. Second, cpu_dispatch,\nwhich specifies the location of the resolver function and the list of\nresolvable functions.\n\nThis is valuable since it provides a mechanism where the resolver\'s TU\ncan be specified in one location, and the individual implementions\neach in their own translation units.\n\nThe goal of this patch is to be source-compatible with ICC, so this\nimplementation diverges from the ICC implementation in a few ways:\n1- Linux x86/64 only: This implementation uses ifuncs in order to\nproperly dispatch functions. This is is a valuable performance benefit\nover the ICC implementation. A future patch will be provided to enable\nthis feature on Windows, but it will obviously more closely fit ICC\'s\nimplementation.\n2- CPU Identification functions: ICC uses a set of custom functions to identify\nthe feature list of the host processor. This patch uses the cpu_supports\nfunctionality in order to better align with \'target\' multiversioning.\n1- cpu_dispatch function def/decl: ICC\'s cpu_dispatch requires that the function\nmarked cpu_dispatch be an empty definition. This patch supports that as well,\nhowever declarations are also permitted, since the linker will solve the\nissue of multiple emissions.\n\nDifferential Revision: https://reviews.llvm.org/D47474\n\nllvm-svn: 337552"},
		[c]={{bb,15786,"Decl *Sema::ActOnFinishFunctionBody(Decl *dcl, Stmt *Body, bool IsInstantiation) {\n  // ...\n  {\n    // ...\n    if (FD) {\n      // ...\n      // Warn on CPUDispatch with an actual body.\n      if (FD->isMultiVersion() && FD->hasAttr<CPUDispatchAttr>() && Body)\n        if (const auto *CmpndBody = dyn_cast<CompoundStmt>(Body))\n          if (!CmpndBody->body_empty())\n            Diag(CmpndBody->body_front()->getBeginLoc(), diag::warn_dispatch_body_ignored);"}},
		[m]={
			["clang/test/Sema/attr-cpuspecific.c"]={"clang/test/Sema/attr-cpuspecific.c:102:3: warning: body of cpu_dispatch function will be ignored [-Wfunction-multiversion]"}
		}
	},
	["warn_division_sizeof_array"]={
		[l]={"sizeof-array-div"},
		[k]="sizeof-array-div",
		[i]={{nil,s,"warn_division_sizeof_array"}},
		[h]={{nil,s,"expression does not compute the number of elements in this array; element type is %0, not %1"}},
		[b]={{nil,s,"expression does not compute the number of elements in this array; element type is A, not B"}},
		[f]=j,
		[g]="expression does not compute the number of elements in this array; element type is (.*?), not (.*?)",
		[e]=" \\[(?:\\-Werror,)?\\-Wsizeof\\-array\\-div[^\\]]*\\]",
		[a]={{nil,s,r}},
		[d]={cc,1567434909,ac,Xb},
		[c]={{hb,11329,"static void DiagnoseDivisionSizeofPointerOrArray(Sema &S, Expr *LHS, Expr *RHS, SourceLocation Loc) {\n  // ...\n  if (LHSTy->isPointerType() && !RHSTy->isPointerType()) {\n  // ...\n  } else if (const auto *ArrayTy = S.Context.getAsArrayType(LHSTy)) {\n    // ...\n    S.Diag(Loc, diag::warn_division_sizeof_array) << LHSArg->getSourceRange() << ArrayElemTy << RHSTy;"}},
		[m]={
			["clang/test/Sema/div-sizeof-array.cpp"]={"clang/test/Sema/div-sizeof-array.cpp:16:23: warning: expression does not compute the number of elements in this array; element type is \'int\', not \'int *\' [-Wsizeof-array-div]","clang/test/Sema/div-sizeof-array.cpp:19:24: warning: expression does not compute the number of elements in this array; element type is \'int\', not \'short\' [-Wsizeof-array-div]","clang/test/Sema/div-sizeof-array.cpp:51:29: warning: expression does not compute the number of elements in this array; element type is \'int *\', not \'int\' [-Wsizeof-array-div]"}
		}
	},
	["warn_division_sizeof_ptr"]={
		[l]={"sizeof-pointer-div"},
		[k]="sizeof-pointer-div",
		[i]={{nil,v,"warn_division_sizeof_ptr"}},
		[h]={{nil,v,"\'%0\' will return the size of the pointer, not the array itself"}},
		[b]={{nil,v,"\'A\' will return the size of the pointer, not the array itself"}},
		[f]=j,
		[g]="\'(.*?)\' will return the size of the pointer, not the array itself",
		[e]=" \\[(?:\\-Werror,)?\\-Wsizeof\\-pointer\\-div[^\\]]*\\]",
		[a]={{nil,v,r}},
		[d]={"b8dc05260c7d",1541089570,"[Diagnostics] Implement -Wsizeof-pointer-div ","[Diagnostics] Implement -Wsizeof-pointer-div \n\nSummary:\nvoid test(int *arr) {\n    int arr_len = sizeof(arr) / sizeof(*arr);  // warn, incorrect way to compute number of array elements\n}\n\nEnabled under -Wall (same behaviour as GCC)\n\nReviewers: rsmith, MTC, aaron.ballman\n\nReviewed By: aaron.ballman\n\nSubscribers: MTC, thakis, jfb, cfe-commits\n\nDifferential Revision: https://reviews.llvm.org/D52949\n\nllvm-svn: 345847"},
		[c]={{hb,11315,"static void DiagnoseDivisionSizeofPointerOrArray(Sema &S, Expr *LHS, Expr *RHS, SourceLocation Loc) {\n  // ...\n  if (LHSTy->isPointerType() && !RHSTy->isPointerType()) {\n    // ...\n    S.Diag(Loc, diag::warn_division_sizeof_ptr) << LHS << LHS->getSourceRange();"}},
		[m]={
			["clang/test/Sema/div-sizeof-ptr.cpp"]={"clang/test/Sema/div-sizeof-ptr.cpp:12:22: warning: \'sizeof (p)\' will return the size of the pointer, not the array itself [-Wsizeof-pointer-div]","clang/test/Sema/div-sizeof-ptr.cpp:13:21: warning: \'sizeof p\' will return the size of the pointer, not the array itself [-Wsizeof-pointer-div]","clang/test/Sema/div-sizeof-ptr.cpp:14:22: warning: \'sizeof (p)\' will return the size of the pointer, not the array itself [-Wsizeof-pointer-div]","clang/test/Sema/div-sizeof-ptr.cpp:15:22: warning: \'sizeof (p)\' will return the size of the pointer, not the array itself [-Wsizeof-pointer-div]","clang/test/Sema/div-sizeof-ptr.cpp:16:22: warning: \'sizeof (p)\' will return the size of the pointer, not the array itself [-Wsizeof-pointer-div]","clang/test/Sema/div-sizeof-ptr.cpp:17:22: warning: \'sizeof (r)\' will return the size of the pointer, not the array itself [-Wsizeof-pointer-div]","clang/test/Sema/div-sizeof-ptr.cpp:20:22: warning: \'sizeof (d)\' will return the size of the pointer, not the array itself [-Wsizeof-pointer-div]","clang/test/Sema/div-sizeof-ptr.cpp:21:22: warning: \'sizeof (d)\' will return the size of the pointer, not the array itself [-Wsizeof-pointer-div]","clang/test/Sema/div-sizeof-ptr.cpp:23:23: warning: \'sizeof (*q)\' will return the size of the pointer, not the array itself [-Wsizeof-pointer-div]","clang/test/Sema/div-sizeof-ptr.cpp:24:23: warning: \'sizeof (p)\' will return the size of the pointer, not the array itself [-Wsizeof-pointer-div]"}
		}
	},
	["warn_dllimport_dropped_from_inline_function"]={
		[l]={Oc,Ob},
		[k]=Ob,
		[i]="warn_dllimport_dropped_from_inline_function",
		[h]="%q0 redeclared inline; %1 attribute ignored",
		[b]="A redeclared inline; B attribute ignored",
		[f]=j,
		[g]="(.*?) redeclared inline; (.*?) attribute ignored",
		[e]=Bc,
		[a]=r,
		[d]={"606bd6dcc547",1415024685,"Don\'t dllimport inline functions when targeting MinGW (PR21366)","Don\'t dllimport inline functions when targeting MinGW (PR21366)\n\nIt turns out that MinGW never dllimports of exports inline functions.\nThis means that code compiled with Clang would fail to link with\nMinGW-compiled libraries since we might try to import functions that\nare not imported.\n\nTo fix this, make Clang never dllimport inline functions when targeting\nMinGW.\n\nllvm-svn: 221154"},
		[c]={{bb,7160,"static void checkDLLAttributeRedeclaration(Sema &S, NamedDecl *OldDecl, NamedDecl *NewDecl, bool IsSpecialization, bool IsDefinition) {\n  // ...\n  if (OldImportAttr && !HasNewAttr && (!IsInline || (IsMicrosoftABI && IsTemplate)) && !IsStaticDataMember && !NewDecl->isLocalExternDecl() && !IsQualifiedFriend) {\n  // ...\n  } else if (IsInline && OldImportAttr && !IsMicrosoftABI) {\n    // ...\n    S.Diag(NewDecl->getLocation(), diag::warn_dllimport_dropped_from_inline_function) << NewDecl << OldImportAttr;"}},
		[m]={
			["clang/test/Sema/dllimport.c"]={"clang/test/Sema/dllimport.c:208:35: warning: \'redecl6\' redeclared inline; \'dllimport\' attribute ignored [-Wignored-attributes]"}
		}
	},
	["warn_doc_api_container_decl_mismatch"]={
		[l]={L},
		[k]=L,
		[i]="warn_doc_api_container_decl_mismatch",
		[h]="\'%select{\\|@}0%select{class|interface|protocol|struct|union}1\' command should not be used in a comment attached to a non-%select{class|interface|protocol|struct|union}2 declaration",
		[b]={{nil,nil,{mc,{Sb,bc},{zc,md,"protocol",kd,yc},"\' command should not be used in a comment attached to a non-",{zc,md,"protocol",kd,yc}," declaration"}}},
		[f]=j,
		[g]="\'(?:\\\\|@)(?:class|interface|protocol|struct|union)\' command should not be used in a comment attached to a non\\-(?:class|interface|protocol|struct|union) declaration",
		[e]=qb,
		[a]=eb,
		[d]={"a649eee9e877",1362699191,"HeaderDoc: Support more of HeaderDoc documentation ","HeaderDoc: Support more of HeaderDoc documentation \ncommands; top level tags such as @interface and\ntheir 2nd level tags such as @coclass, etc.\n// rdar://12379114\n\nllvm-svn: 176667"},
		[c]={{jb,165,"void Sema::checkContainerDeclVerbatimLine(const BlockCommandComment *Comment) {\n  // ...\n  if (DiagSelect)\n    Diag(Comment->getLocation(), diag::warn_doc_api_container_decl_mismatch) << Comment->getCommandMarker() << (DiagSelect - 1) << (DiagSelect - 1) << Comment->getSourceRange();"}},
		[m]={
			["clang/test/Sema/warn-documentation.m"]={"clang/test/Sema/warn-documentation.m:116:2: warning: \'@interface\' command should not be used in a comment attached to a non-interface declaration [-Wdocumentation]","clang/test/Sema/warn-documentation.m:143:2: warning: \'@protocol\' command should not be used in a comment attached to a non-protocol declaration [-Wdocumentation]","clang/test/Sema/warn-documentation.m:167:3: warning: \'@protocol\' command should not be used in a comment attached to a non-protocol declaration [-Wdocumentation]","clang/test/Sema/warn-documentation.m:173:4: warning: \'@struct\' command should not be used in a comment attached to a non-struct declaration [-Wdocumentation]"}
		}
	},
	["warn_doc_block_command_duplicate"]={
		[l]={L},
		[k]=L,
		[i]="warn_doc_block_command_duplicate",
		[h]="duplicated command \'%select{\\|@}0%1\'",
		[b]={{nil,nil,{"duplicated command \'",{Sb,bc},"B\'"}}},
		[f]=j,
		[g]="duplicated command \'(?:\\\\|@)(.*?)\'",
		[e]=qb,
		[a]=eb,
		[d]={"5ec0c7536a98",1344272907,"Comment diagnostics: warn on duplicate \\brief and \\return commands.","Comment diagnostics: warn on duplicate \\brief and \\return commands.\n\nDoxygen manual claims that multiple \\brief or \\returns commands will be merged\ntogether, but actual behavior is different (second \\brief command becomes a\npart of a discussion, second \\returns becomes a \"Returns: blah\" paragraph on\nits own).  Anyway, it seems to be a bad idea to use multiple \\brief or \\returns\ncommands in a single command.\n\nllvm-svn: 161325"},
		[c]={{jb,623,"void Sema::checkBlockCommandDuplicate(const BlockCommandComment *Command) {\n  // ...\n  Diag(Command->getLocation(), diag::warn_doc_block_command_duplicate) << Command->getCommandMarker() << CommandName << Command->getSourceRange();"}},
		[m]={
			[Hb]={"clang/test/Sema/warn-documentation.cpp:158:6: warning: duplicated command \'\\brief\' [-Wdocumentation]","clang/test/Sema/warn-documentation.cpp:166:6: warning: duplicated command \'\\short\' [-Wdocumentation]","clang/test/Sema/warn-documentation.cpp:174:6: warning: duplicated command \'\\brief\' [-Wdocumentation]","clang/test/Sema/warn-documentation.cpp:732:6: warning: duplicated command \'\\headerfile\' [-Wdocumentation]"}
		}
	},
	["warn_doc_block_command_empty_paragraph"]={
		[l]={L},
		[k]=L,
		[i]="warn_doc_block_command_empty_paragraph",
		[h]="empty paragraph passed to \'%select{\\|@}0%1\' command",
		[b]={{nil,nil,{"empty paragraph passed to \'",{Sb,bc},"B\' command"}}},
		[f]=j,
		[g]="empty paragraph passed to \'(?:\\\\|@)(.*?)\' command",
		[e]=qb,
		[a]=eb,
		[d]={Wc,1342042719,nd,ld},
		[c]={{jb,549,"void Sema::checkBlockCommandEmptyParagraph(BlockCommandComment *Command) {\n  // ...\n  if (Paragraph->isWhitespace()) {\n    // ...\n    Diag(DiagLoc, diag::warn_doc_block_command_empty_paragraph) << Command->getCommandMarker() << Command->getCommandName(Traits) << Command->getSourceRange();"}},
		[m]={
			["clang/test/Sema/warn-documentation-crlf.c"]={"clang/test/Sema/warn-documentation-crlf.c:10:13: warning: empty paragraph passed to \'@param\' command [-Wdocumentation]"}
		}
	},
	["warn_doc_container_decl_mismatch"]={
		[l]={L},
		[k]=L,
		[i]="warn_doc_container_decl_mismatch",
		[h]="\'%select{\\|@}0%select{classdesign|coclass|dependency|helper|helperclass|helps|instancesize|ownership|performance|security|superclass}1\' command should not be used in a comment attached to a non-container declaration",
		[b]={{nil,nil,{mc,{Sb,bc},{"classdesign","coclass","dependency","helper","helperclass","helps","instancesize","ownership","performance","security","superclass"},"\' command should not be used in a comment attached to a non-container declaration"}}},
		[f]=j,
		[g]="\'(?:\\\\|@)(?:classdesign|coclass|dependency|helper|helperclass|helps|instancesize|ownership|performance|security|superclass)\' command should not be used in a comment attached to a non\\-container declaration",
		[e]=qb,
		[a]=eb,
		[d]={"a649eee9e877",1362699191,"HeaderDoc: Support more of HeaderDoc documentation ","HeaderDoc: Support more of HeaderDoc documentation \ncommands; top level tags such as @interface and\ntheir 2nd level tags such as @coclass, etc.\n// rdar://12379114\n\nllvm-svn: 176667"},
		[c]={{jb,215,"void Sema::checkContainerDecl(const BlockCommandComment *Comment) {\n  // ...\n  if (DiagSelect)\n    Diag(Comment->getLocation(), diag::warn_doc_container_decl_mismatch) << Comment->getCommandMarker() << (DiagSelect - 1) << Comment->getSourceRange();"}},
		[m]={
			["clang/test/Sema/warn-documentation.m"]={"clang/test/Sema/warn-documentation.m:117:2: warning: \'@classdesign\' command should not be used in a comment attached to a non-container declaration [-Wdocumentation]","clang/test/Sema/warn-documentation.m:118:2: warning: \'@coclass\' command should not be used in a comment attached to a non-container declaration [-Wdocumentation]"}
		}
	},
	["warn_doc_deprecated_not_sync"]={
		[l]={L,"documentation-deprecated-sync"},
		[k]="documentation-deprecated-sync",
		[i]="warn_doc_deprecated_not_sync",
		[h]={{nil,s,"declaration is marked with \'%select{\\|@}0deprecated\' command but does not have a deprecation attribute"},{t,nil,"declaration is marked with \'\\deprecated\' command but does not have a deprecation attribute"}},
		[b]={{nil,s,{"declaration is marked with \'",{Sb,bc},"deprecated\' command but does not have a deprecation attribute"}},{t,nil,"declaration is marked with \'\\deprecated\' command but does not have a deprecation attribute"}},
		[f]=j,
		[g]="declaration is marked with \'(?:\\\\|@)deprecated\' command but does not have a deprecation attribute",
		[e]=" \\[(?:\\-Werror,)?\\-Wdocumentation\\-deprecated\\-sync[^\\]]*\\]",
		[a]=eb,
		[d]={"1da888691587",1348350470,"Comment sema: warn when comment has \\deprecated but declaration does not have a","Comment sema: warn when comment has \\deprecated but declaration does not have a\ndeprecation attribute (\'deprecated\', \'availability\' or \'unavailable\').\n\nThis warning is under a separate flag, -Wdocumentation-deprecated-sync, so it\ncan be turned off easily while leaving other -Wdocumentation warnings on.\n\nllvm-svn: 164467"},
		[c]={{jb,655,"void Sema::checkDeprecatedCommand(const BlockCommandComment *Command) {\n  // ...\n  Diag(Command->getLocation(), diag::warn_doc_deprecated_not_sync) << Command->getSourceRange() << Command->getCommandMarker();"}},
		[m]={
			["clang/test/Sema/warn-documentation-fixits.c"]={"clang/test/Sema/warn-documentation-fixits.c:6:6: warning: declaration is marked with \'\\deprecated\' command but does not have a deprecation attribute [-Wdocumentation-deprecated-sync]","clang/test/Sema/warn-documentation-fixits.c:10:6: warning: declaration is marked with \'\\deprecated\' command but does not have a deprecation attribute [-Wdocumentation-deprecated-sync]","clang/test/Sema/warn-documentation-fixits.c:16:6: warning: declaration is marked with \'\\deprecated\' command but does not have a deprecation attribute [-Wdocumentation-deprecated-sync]","clang/test/Sema/warn-documentation-fixits.c:23:6: warning: declaration is marked with \'\\deprecated\' command but does not have a deprecation attribute [-Wdocumentation-deprecated-sync]"}
		}
	},
	["warn_doc_function_method_decl_mismatch"]={
		[l]={L},
		[k]=L,
		[i]="warn_doc_function_method_decl_mismatch",
		[h]="\'%select{\\|@}0%select{function|functiongroup|method|methodgroup|callback}1\' command should be used in a comment attached to %select{a function|a function|an Objective-C method|an Objective-C method|a pointer to function}2 declaration",
		[b]={{nil,nil,{mc,{Sb,bc},{zb,"functiongroup","method","methodgroup","callback"},"\' command should be used in a comment attached to ",{"a function","a function","an Objective-C method","an Objective-C method","a pointer to function"}," declaration"}}},
		[f]=j,
		[g]="\'(?:\\\\|@)(?:function|functiongroup|method|methodgroup|callback)\' command should be used in a comment attached to (?:a function|a function|an Objective\\-C method|an Objective\\-C method|a pointer to function) declaration",
		[e]=qb,
		[a]=eb,
		[d]={"41bb7131b39a",1362591411,"say objective-C in the warning and streamline","say objective-C in the warning and streamline\nseveral diagnostics into one. // rdar://13094352\n\nllvm-svn: 176560"},
		[c]={{jb,126,"void Sema::checkFunctionDeclVerbatimLine(const BlockCommandComment *Comment) {\n  // ...\n  if (DiagSelect)\n    Diag(Comment->getLocation(), diag::warn_doc_function_method_decl_mismatch) << Comment->getCommandMarker() << (DiagSelect - 1) << (DiagSelect - 1) << Comment->getSourceRange();"}},
		[m]={
			["clang/test/Sema/warn-documentation.m"]={"clang/test/Sema/warn-documentation.m:104:6: warning: \'@method\' command should be used in a comment attached to an Objective-C method declaration [-Wdocumentation]","clang/test/Sema/warn-documentation.m:132:3: warning: \'@methodgroup\' command should be used in a comment attached to an Objective-C method declaration [-Wdocumentation]","clang/test/Sema/warn-documentation.m:135:3: warning: \'@method\' command should be used in a comment attached to an Objective-C method declaration [-Wdocumentation]"}
		}
	},
	["warn_doc_html_end_forbidden"]={
		[l]={L,rc},
		[k]=rc,
		[i]="warn_doc_html_end_forbidden",
		[h]="HTML end tag \'%0\' is forbidden",
		[b]="HTML end tag \'A\' is forbidden",
		[f]=j,
		[g]="HTML end tag \'(.*?)\' is forbidden",
		[e]=" \\[(?:\\-Werror,)?\\-Wdocumentation\\-html[^\\]]*\\]",
		[a]=eb,
		[d]={jd,1342140264,gd,dd},
		[c]={{jb,457,"HTMLEndTagComment *Sema::actOnHTMLEndTag(SourceLocation LocBegin, SourceLocation LocEnd, StringRef TagName) {\n  // ...\n  if (isHTMLEndTagForbidden(TagName)) {\n    Diag(HET->getLocation(), diag::warn_doc_html_end_forbidden) << TagName << HET->getSourceRange();"}},
		[m]={
			[Hb]={"clang/test/Sema/warn-documentation.cpp:62:11: warning: HTML end tag \'br\' is forbidden [-Wdocumentation-html]"}
		}
	},
	["warn_doc_html_end_unbalanced"]={
		[l]={L,rc},
		[k]=rc,
		[i]="warn_doc_html_end_unbalanced",
		[h]="HTML end tag does not match any start tag",
		[b]="HTML end tag does not match any start tag",
		[f]=j,
		[g]="HTML end tag does not match any start tag",
		[e]=" \\[(?:\\-Werror,)?\\-Wdocumentation\\-html[^\\]]*\\]",
		[a]=eb,
		[d]={jd,1342140264,gd,dd},
		[c]={{jb,473,"HTMLEndTagComment *Sema::actOnHTMLEndTag(SourceLocation LocBegin, SourceLocation LocEnd, StringRef TagName) {\n  // ...\n  if (!FoundOpen) {\n    Diag(HET->getLocation(), diag::warn_doc_html_end_unbalanced) << HET->getSourceRange();"}},
		[m]={
			[Hb]={"clang/test/Sema/warn-documentation.cpp:97:17: warning: HTML end tag does not match any start tag [-Wdocumentation-html]","clang/test/Sema/warn-documentation.cpp:102:21: warning: HTML end tag does not match any start tag [-Wdocumentation-html]","clang/test/Sema/warn-documentation.cpp:107:21: warning: HTML end tag does not match any start tag [-Wdocumentation-html]"}
		}
	},
	["warn_doc_html_missing_end_tag"]={
		[l]={L,rc},
		[k]=rc,
		[i]="warn_doc_html_missing_end_tag",
		[h]="HTML tag \'%0\' requires an end tag",
		[b]="HTML tag \'A\' requires an end tag",
		[f]=j,
		[g]="HTML tag \'(.*?)\' requires an end tag",
		[e]=" \\[(?:\\-Werror,)?\\-Wdocumentation\\-html[^\\]]*\\]",
		[a]=eb,
		[d]={"93043620bc63",1398164353,"Comment parsing: in the generated XML file, mark HTML that is safe to pass","Comment parsing: in the generated XML file, mark HTML that is safe to pass\nthrough to the output even if the input comment comes from an untrusted source\n\nAttribute filtering is currently based on a blacklist, which right now includes\nall event handler attributes (they contain JavaScipt code).  It should be\nswitched to a whitelist, but going over all of the HTML5 spec requires a\nsignificant amount of time.\n\nllvm-svn: 206882"},
		[c]={{jb,530,"FullComment *Sema::actOnFullComment(ArrayRef<BlockContentComment *> Blocks) {\n  // ...\n  // Complain about HTML tags that are not closed.\n  while (!HTMLOpenTags.empty()) {\n    // ...\n    Diag(HST->getLocation(), diag::warn_doc_html_missing_end_tag) << HST->getTagName() << HST->getSourceRange();"}},
		[m]={
			[Hb]={"clang/test/Sema/warn-documentation.cpp:10:6: warning: HTML tag \'a\' requires an end tag [-Wdocumentation-html]","clang/test/Sema/warn-documentation.cpp:15:6: warning: HTML tag \'a\' requires an end tag [-Wdocumentation-html]","clang/test/Sema/warn-documentation.cpp:21:6: warning: HTML tag \'a\' requires an end tag [-Wdocumentation-html]","clang/test/Sema/warn-documentation.cpp:26:6: warning: HTML tag \'a\' requires an end tag [-Wdocumentation-html]","clang/test/Sema/warn-documentation.cpp:31:6: warning: HTML tag \'a\' requires an end tag [-Wdocumentation-html]","clang/test/Sema/warn-documentation.cpp:36:6: warning: HTML tag \'a\' requires an end tag [-Wdocumentation-html]","clang/test/Sema/warn-documentation.cpp:41:6: warning: HTML tag \'a\' requires an end tag [-Wdocumentation-html]","clang/test/Sema/warn-documentation.cpp:46:6: warning: HTML tag \'a\' requires an end tag [-Wdocumentation-html]","clang/test/Sema/warn-documentation.cpp:97:9: warning: HTML tag \'i\' requires an end tag [-Wdocumentation-html]","clang/test/Sema/warn-documentation.cpp:97:6: warning: HTML tag \'b\' requires an end tag [-Wdocumentation-html]","clang/test/Sema/warn-documentation.cpp:111:6: warning: HTML tag \'b\' requires an end tag [-Wdocumentation-html]"}
		}
	},
	["warn_doc_html_start_end_mismatch"]={
		[l]={L,rc},
		[k]=rc,
		[i]="warn_doc_html_start_end_mismatch",
		[h]="HTML start tag \'%0\' closed by \'%1\'",
		[b]="HTML start tag \'A\' closed by \'B\'",
		[f]=j,
		[g]="HTML start tag \'(.*?)\' closed by \'(.*?)\'",
		[e]=" \\[(?:\\-Werror,)?\\-Wdocumentation\\-html[^\\]]*\\]",
		[a]=eb,
		[d]={jd,1342140264,gd,dd},
		[c]={{jb,502,"HTMLEndTagComment *Sema::actOnHTMLEndTag(SourceLocation LocBegin, SourceLocation LocEnd, StringRef TagName) {\n  // ...\n  while (!HTMLOpenTags.empty()) {\n    // ...\n    if (OpenLineInvalid || CloseLineInvalid || OpenLine == CloseLine) {\n      Diag(HST->getLocation(), diag::warn_doc_html_start_end_mismatch) << HST->getTagName() << HET->getTagName() << HST->getSourceRange() << HET->getSourceRange();"},{jb,507,"HTMLEndTagComment *Sema::actOnHTMLEndTag(SourceLocation LocBegin, SourceLocation LocEnd, StringRef TagName) {\n  // ...\n  while (!HTMLOpenTags.empty()) {\n    // ...\n    if (OpenLineInvalid || CloseLineInvalid || OpenLine == CloseLine) {\n    // ...\n    } else {\n      Diag(HST->getLocation(), diag::warn_doc_html_start_end_mismatch) << HST->getTagName() << HET->getTagName() << HST->getSourceRange();"}},
		[m]={
			[Hb]={"clang/test/Sema/warn-documentation.cpp:102:9: warning: HTML start tag \'i\' closed by \'b\' [-Wdocumentation-html]","clang/test/Sema/warn-documentation.cpp:107:9: warning: HTML start tag \'i\' closed by \'b\' [-Wdocumentation-html]"}
		}
	},
	["warn_doc_html_start_tag_expected_ident_or_greater"]={
		[l]={L},
		[k]=L,
		[i]="warn_doc_html_start_tag_expected_ident_or_greater",
		[h]="HTML start tag prematurely ended, expected attribute name or \'>\'",
		[b]="HTML start tag prematurely ended, expected attribute name or \'>\'",
		[f]=j,
		[g]="HTML start tag prematurely ended, expected attribute name or \'\\>\'",
		[e]=qb,
		[a]=eb,
		[d]={jd,1342140264,gd,dd},
		[c]={{qd,487,"HTMLStartTagComment *Parser::parseHTMLStartTag() {\n  // ...\n  while (true) {\n    // ...\n    case tok::html_equals:\n    case tok::html_quoted_string:\n      Diag(Tok.getLocation(), diag::warn_doc_html_start_tag_expected_ident_or_greater);"},{qd,516,"HTMLStartTagComment *Parser::parseHTMLStartTag() {\n  // ...\n  while (true) {\n    // ...\n    default:\n      // ...\n      if (StartLineInvalid || EndLineInvalid || StartLine == EndLine)\n        Diag(Tok.getLocation(), diag::warn_doc_html_start_tag_expected_ident_or_greater) << HST->getSourceRange();"},{qd,520,"HTMLStartTagComment *Parser::parseHTMLStartTag() {\n  // ...\n  while (true) {\n    // ...\n    default:\n      // ...\n      if (StartLineInvalid || EndLineInvalid || StartLine == EndLine)\n      // ...\n      else {\n        Diag(Tok.getLocation(), diag::warn_doc_html_start_tag_expected_ident_or_greater);"}},
		[m]={
			[Hb]={"clang/test/Sema/warn-documentation.cpp:21:18: warning: HTML start tag prematurely ended, expected attribute name or \'>\' [-Wdocumentation]","clang/test/Sema/warn-documentation.cpp:26:8: warning: HTML start tag prematurely ended, expected attribute name or \'>\' [-Wdocumentation]","clang/test/Sema/warn-documentation.cpp:31:8: warning: HTML start tag prematurely ended, expected attribute name or \'>\' [-Wdocumentation]","clang/test/Sema/warn-documentation.cpp:36:14: warning: HTML start tag prematurely ended, expected attribute name or \'>\' [-Wdocumentation]","clang/test/Sema/warn-documentation.cpp:41:14: warning: HTML start tag prematurely ended, expected attribute name or \'>\' [-Wdocumentation]","clang/test/Sema/warn-documentation.cpp:46:14: warning: HTML start tag prematurely ended, expected attribute name or \'>\' [-Wdocumentation]","clang/test/Sema/warn-documentation.cpp:51:2: warning: HTML start tag prematurely ended, expected attribute name or \'>\' [-Wdocumentation]","clang/test/Sema/warn-documentation.cpp:56:25: warning: HTML start tag prematurely ended, expected attribute name or \'>\' [-Wdocumentation]"}
		}
	},
	["warn_doc_html_start_tag_expected_quoted_string"]={
		[l]={L},
		[k]=L,
		[i]="warn_doc_html_start_tag_expected_quoted_string",
		[h]="expected quoted string after equals sign",
		[b]="expected quoted string after equals sign",
		[f]=j,
		[g]="expected quoted string after equals sign",
		[e]=qb,
		[a]=eb,
		[d]={jd,1342140264,gd,dd},
		[c]={{qd,450,"HTMLStartTagComment *Parser::parseHTMLStartTag() {\n  // ...\n  while (true) {\n    // ...\n    case tok::html_ident: {\n      // ...\n      if (Tok.isNot(tok::html_quoted_string)) {\n        Diag(Tok.getLocation(), diag::warn_doc_html_start_tag_expected_quoted_string) << SourceRange(Equals.getLocation());"}},
		[m]={
			[Hb]={"clang/test/Sema/warn-documentation.cpp:10:13: warning: expected quoted string after equals sign [-Wdocumentation]","clang/test/Sema/warn-documentation.cpp:15:13: warning: expected quoted string after equals sign [-Wdocumentation]","clang/test/Sema/warn-documentation.cpp:21:14: warning: expected quoted string after equals sign [-Wdocumentation]"}
		}
	},
	["warn_doc_inline_command_not_enough_arguments"]={
		[l]={L},
		[k]=L,
		[i]={{nil,D,"warn_doc_inline_command_not_enough_arguments"}},
		[h]={{nil,D,"\'%select{\\|@}0%1\' command has %plural{0:no|:%2}2 word argument%s2, expected %3"}},
		[b]={{nil,D,{mc,{Sb,bc},"B\' command has ",{"no","C"}," word argumentC, expected D"}}},
		[f]=j,
		[g]="\'(?:\\\\|@)(.*?)\' command has (?:no|(.*?)) word argument(.*?), expected (.*?)",
		[e]=qb,
		[a]={{nil,D,eb}},
		[d]={"d3a4033d6ee1",1652441850,"Comment parsing: Allow inline commands to have 0 or more than 1 argument","Comment parsing: Allow inline commands to have 0 or more than 1 argument\n\nThat\'s required to support `\\n`, but can also be used for other commands.\nWe already had the infrastructure in place to parse a varying number of\narguments, we simply needed to generalize it so that it would work not\nonly for block commands.\n\nThis should fix #55319.\n\nReviewed By: gribozavr2\n\nDifferential Revision: https://reviews.llvm.org/D125429"},
		[c]={{qd,417,"InlineCommandComment *Parser::parseInlineCommand() {\n  // ...\n  if (Args.size() < Info->NumArgs) {\n    Diag(CommandTok.getEndLocation().getLocWithOffset(1), diag::warn_doc_inline_command_not_enough_arguments) << CommandTok.is(tok::at_command) << Info->Name << Args.size() << Info->NumArgs << SourceRange(CommandTok.getLocation(), CommandTok.getEndLocation());"}},
		[m]={
			[Hb]={"clang/test/Sema/warn-documentation.cpp:1135:7: warning: \'\\a\' command has no word arguments, expected 1 [-Wdocumentation]","clang/test/Sema/warn-documentation.cpp:1142:12: warning: \'\\anchor\' command has no word arguments, expected 1 [-Wdocumentation]","clang/test/Sema/warn-documentation.cpp:1149:7: warning: \'@b\' command has no word arguments, expected 1 [-Wdocumentation]","clang/test/Sema/warn-documentation.cpp:1156:7: warning: \'\\c\' command has no word arguments, expected 1 [-Wdocumentation]","clang/test/Sema/warn-documentation.cpp:1163:7: warning: \'\\e\' command has no word arguments, expected 1 [-Wdocumentation]","clang/test/Sema/warn-documentation.cpp:1170:8: warning: \'\\em\' command has no word arguments, expected 1 [-Wdocumentation]","clang/test/Sema/warn-documentation.cpp:1177:7: warning: \'\\p\' command has no word arguments, expected 1 [-Wdocumentation]"}
		}
	},
	["warn_doc_param_duplicate"]={
		[l]={L},
		[k]=L,
		[i]="warn_doc_param_duplicate",
		[h]="parameter \'%0\' is already documented",
		[b]="parameter \'A\' is already documented",
		[f]=j,
		[g]="parameter \'(.*?)\' is already documented",
		[e]=qb,
		[a]=eb,
		[d]={"8f0f1b0c41cd",1343166256,"Comment diagnostics: add warning for multiple \\param commands with duplicate","Comment diagnostics: add warning for multiple \\param commands with duplicate\nparameter names.\n\nllvm-svn: 160696"},
		[c]={{jb,743,"void Sema::resolveParamCommandIndexes(const FullComment *FC) {\n  // ...\n  // First pass over all \\\\param commands: resolve all parameter names.\n  for (Comment::child_iterator I = FC->child_begin(), E = FC->child_end(); I != E; ++I) {\n    // ...\n    if (ParamVarDocs[ResolvedParamIndex]) {\n      // ...\n      Diag(ArgRange.getBegin(), diag::warn_doc_param_duplicate) << ParamName << ArgRange;"}},
		[m]={
			[Hb]={"clang/test/Sema/warn-documentation.cpp:315:12: warning: parameter \'a\' is already documented [-Wdocumentation]","clang/test/Sema/warn-documentation.cpp:322:12: warning: parameter \'x2\' is already documented [-Wdocumentation]"}
		}
	},
	["warn_doc_param_invalid_direction"]={
		[l]={L},
		[k]=L,
		[i]="warn_doc_param_invalid_direction",
		[h]="unrecognized parameter passing direction, valid directions are \'[in]\', \'[out]\' and \'[in,out]\'",
		[b]="unrecognized parameter passing direction, valid directions are \'[in]\', \'[out]\' and \'[in,out]\'",
		[f]=j,
		[g]="unrecognized parameter passing direction, valid directions are \'\\[in\\]\', \'\\[out\\]\' and \'\\[in,out\\]\'",
		[e]=qb,
		[a]=eb,
		[d]={Wc,1342042719,nd,ld},
		[c]={{jb,250,"void Sema::actOnParamCommandDirectionArg(ParamCommandComment *Command, SourceLocation ArgLocBegin, SourceLocation ArgLocEnd, StringRef Arg) {\n  // ...\n  if (Direction == -1) {\n    // ...\n    if (Direction != -1) {\n    // ...\n    } else {\n      Diag(ArgLocBegin, diag::warn_doc_param_invalid_direction) << ArgRange;"}},
		[m]={
			[Hb]={"clang/test/Sema/warn-documentation.cpp:255:12: warning: unrecognized parameter passing direction, valid directions are \'[in]\', \'[out]\' and \'[in,out]\' [-Wdocumentation]"}
		}
	},
	["warn_doc_param_not_attached_to_a_function_decl"]={
		[l]={L},
		[k]=L,
		[i]="warn_doc_param_not_attached_to_a_function_decl",
		[h]="\'%select{\\|@}0param\' command used in a comment that is not attached to a function declaration",
		[b]={{nil,nil,{mc,{Sb,bc},"param\' command used in a comment that is not attached to a function declaration"}}},
		[f]=j,
		[g]="\'(?:\\\\|@)param\' command used in a comment that is not attached to a function declaration",
		[e]=qb,
		[a]=eb,
		[d]={Wc,1342042719,nd,ld},
		[c]={{jb,92,"ParamCommandComment *Sema::actOnParamCommandStart(SourceLocation LocBegin, SourceLocation LocEnd, unsigned CommandID, CommandMarkerKind CommandMarker) {\n  // ...\n  if (!involvesFunctionType())\n    Diag(Command->getLocation(), diag::warn_doc_param_not_attached_to_a_function_decl) << CommandMarker << Command->getCommandNameRange(Traits);"}},
		[m]={
			[Hb]={"clang/test/Sema/warn-documentation.cpp:216:6: warning: \'\\param\' command used in a comment that is not attached to a function declaration [-Wdocumentation]","clang/test/Sema/warn-documentation.cpp:222:6: warning: \'@param\' command used in a comment that is not attached to a function declaration [-Wdocumentation]","clang/test/Sema/warn-documentation.cpp:400:6: warning: \'\\param\' command used in a comment that is not attached to a function declaration [-Wdocumentation]","clang/test/Sema/warn-documentation.cpp:406:6: warning: \'@param\' command used in a comment that is not attached to a function declaration [-Wdocumentation]","clang/test/Sema/warn-documentation.cpp:410:6: warning: \'\\param\' command used in a comment that is not attached to a function declaration [-Wdocumentation]","clang/test/Sema/warn-documentation.cpp:496:6: warning: \'\\param\' command used in a comment that is not attached to a function declaration [-Wdocumentation]","clang/test/Sema/warn-documentation.cpp:501:6: warning: \'@param\' command used in a comment that is not attached to a function declaration [-Wdocumentation]","clang/test/Sema/warn-documentation.cpp:505:6: warning: \'\\param\' command used in a comment that is not attached to a function declaration [-Wdocumentation]","clang/test/Sema/warn-documentation.cpp:1443:5: warning: \'@param\' command used in a comment that is not attached to a function declaration [-Wdocumentation]","clang/test/Sema/warn-documentation.cpp:1454:7: warning: \'\\param\' command used in a comment that is not attached to a function declaration [-Wdocumentation]"}
		}
	},
	["warn_doc_param_not_found"]={
		[l]={L},
		[k]=L,
		[i]="warn_doc_param_not_found",
		[h]="parameter \'%0\' not found in the function declaration",
		[b]="parameter \'A\' not found in the function declaration",
		[f]=j,
		[g]="parameter \'(.*?)\' not found in the function declaration",
		[e]=qb,
		[a]=eb,
		[d]={Wc,1342042719,nd,ld},
		[c]={{jb,767,"void Sema::resolveParamCommandIndexes(const FullComment *FC) {\n  // ...\n  // Second pass over unresolved \\\\param commands: do typo correction.\n  // Suggest corrections from a set of parameter declarations that have no\n  // corresponding \\\\param.\n  for (unsigned i = 0, e = UnresolvedParamCommands.size(); i != e; ++i) {\n    // ...\n    Diag(ArgRange.getBegin(), diag::warn_doc_param_not_found) << ParamName << ArgRange;"},{bb,14658,"void Sema::ActOnDocumentableDecls(ArrayRef<Decl *> Group) {\n  // ...\n  if (Diags.isIgnored(diag::warn_doc_param_not_found, Group[0]->getLocation()) && Diags.isIgnored(diag::warn_unknown_comment_command_name, Group[0]->getLocation()))"}},
		[m]={
			["clang/test/Sema/warn-documentation-crlf.c"]={"clang/test/Sema/warn-documentation-crlf.c:10:11: warning: parameter \'abc\' not found in the function declaration [-Wdocumentation]"}
		}
	},
	["warn_doc_param_spaces_in_direction"]={
		[l]={"documentation-pedantic"},
		[k]="documentation-pedantic",
		[i]="warn_doc_param_spaces_in_direction",
		[h]="whitespace is not allowed in parameter passing direction",
		[b]="whitespace is not allowed in parameter passing direction",
		[f]=j,
		[g]="whitespace is not allowed in parameter passing direction",
		[e]=" \\[(?:\\-Werror,)?\\-Wdocumentation\\-pedantic[^\\]]*\\]",
		[a]=eb,
		[d]={Wc,1342042719,nd,ld},
		[c]={{jb,247,"void Sema::actOnParamCommandDirectionArg(ParamCommandComment *Command, SourceLocation ArgLocBegin, SourceLocation ArgLocEnd, StringRef Arg) {\n  // ...\n  if (Direction == -1) {\n    // ...\n    if (Direction != -1) {\n      // ...\n      Diag(ArgLocBegin, diag::warn_doc_param_spaces_in_direction) << ArgRange << FixItHint::CreateReplacement(ArgRange, FixedName);"}},
		[m]={
			[Hb]={"clang/test/Sema/warn-documentation.cpp:247:12: warning: whitespace is not allowed in parameter passing direction [-Wdocumentation-pedantic]","clang/test/Sema/warn-documentation.cpp:251:12: warning: whitespace is not allowed in parameter passing direction [-Wdocumentation-pedantic]"}
		}
	},
	["warn_doc_returns_attached_to_a_void_function"]={
		[l]={L},
		[k]=L,
		[i]="warn_doc_returns_attached_to_a_void_function",
		[h]="\'%select{\\|@}0%1\' command used in a comment that is attached to a %select{function returning void|constructor|destructor|method returning void}2",
		[b]={{nil,nil,{mc,{Sb,bc},"B\' command used in a comment that is attached to a ",{"function returning void",kb,nc,"method returning void"}}}},
		[f]=j,
		[g]="\'(?:\\\\|@)(.*?)\' command used in a comment that is attached to a (?:function returning void|constructor|destructor|method returning void)",
		[e]=qb,
		[a]=eb,
		[d]={"6430583017c0",1344028532,"Comment diagnostics: warn if \\returns is used in a non-function comment or if","Comment diagnostics: warn if \\returns is used in a non-function comment or if\nthe function returns void.\n\nllvm-svn: 161261"},
		[c]={{jb,586,"void Sema::checkReturnsCommand(const BlockCommandComment *Command) {\n  // ...\n  if (involvesFunctionType()) {\n    // ...\n    if (ThisDeclInfo->ReturnType->isVoidType()) {\n      // ...\n      Diag(Command->getLocation(), diag::warn_doc_returns_attached_to_a_void_function) << Command->getCommandMarker() << Command->getCommandName(Traits) << DiagKind << Command->getSourceRange();"}},
		[m]={
			["clang/test/Sema/warn-documentation.m"]={"clang/test/Sema/warn-documentation.m:91:6: warning: \'\\returns\' command used in a comment that is attached to a method returning void [-Wdocumentation]","clang/test/Sema/warn-documentation.m:257:5: warning: \'\\returns\' command used in a comment that is attached to a function returning void [-Wdocumentation]"}
		}
	},
	["warn_doc_returns_not_attached_to_a_function_decl"]={
		[l]={L},
		[k]=L,
		[i]="warn_doc_returns_not_attached_to_a_function_decl",
		[h]="\'%select{\\|@}0%1\' command used in a comment that is not attached to a function or method declaration",
		[b]={{nil,nil,{mc,{Sb,bc},"B\' command used in a comment that is not attached to a function or method declaration"}}},
		[f]=j,
		[g]="\'(?:\\\\|@)(.*?)\' command used in a comment that is not attached to a function or method declaration",
		[e]=qb,
		[a]=eb,
		[d]={"6430583017c0",1344028532,"Comment diagnostics: warn if \\returns is used in a non-function comment or if","Comment diagnostics: warn if \\returns is used in a non-function comment or if\nthe function returns void.\n\nllvm-svn: 161261"},
		[c]={{jb,596,"void Sema::checkReturnsCommand(const BlockCommandComment *Command) {\n  // ...\n  Diag(Command->getLocation(), diag::warn_doc_returns_not_attached_to_a_function_decl) << Command->getCommandMarker() << Command->getCommandName(Traits) << Command->getSourceRange();"}},
		[m]={
			["clang/test/Sema/no-documentation-warn-tagdecl-specifier.c"]={"clang/test/Sema/no-documentation-warn-tagdecl-specifier.c:18:6: warning: \'@return\' command used in a comment that is not attached to a function or method declaration [-Wdocumentation]","clang/test/Sema/no-documentation-warn-tagdecl-specifier.c:27:6: warning: \'@return\' command used in a comment that is not attached to a function or method declaration [-Wdocumentation]","clang/test/Sema/no-documentation-warn-tagdecl-specifier.c:32:6: warning: \'@return\' command used in a comment that is not attached to a function or method declaration [-Wdocumentation]","clang/test/Sema/no-documentation-warn-tagdecl-specifier.c:37:6: warning: \'@return\' command used in a comment that is not attached to a function or method declaration [-Wdocumentation]","clang/test/Sema/no-documentation-warn-tagdecl-specifier.c:60:6: warning: \'@return\' command used in a comment that is not attached to a function or method declaration [-Wdocumentation]","clang/test/Sema/no-documentation-warn-tagdecl-specifier.c:69:6: warning: \'@return\' command used in a comment that is not attached to a function or method declaration [-Wdocumentation]","clang/test/Sema/no-documentation-warn-tagdecl-specifier.c:74:6: warning: \'@return\' command used in a comment that is not attached to a function or method declaration [-Wdocumentation]","clang/test/Sema/no-documentation-warn-tagdecl-specifier.c:79:6: warning: \'@return\' command used in a comment that is not attached to a function or method declaration [-Wdocumentation]"}
		}
	},
	["warn_doc_tparam_duplicate"]={
		[l]={L},
		[k]=L,
		[i]="warn_doc_tparam_duplicate",
		[h]="template parameter \'%0\' is already documented",
		[b]="template parameter \'A\' is already documented",
		[f]=j,
		[g]="template parameter \'(.*?)\' is already documented",
		[e]=qb,
		[a]=eb,
		[d]={"34df220410b3",1343774226,"Comment parsing: add support for \\tparam command on all levels.","Comment parsing: add support for \\tparam command on all levels.\n\nThe only caveat is renumbering CXCommentKind enum for aesthetic reasons -- this\nbreaks libclang binary compatibility, but should not be a problem since API is\nso new.\n\nThis also fixes PR13372 as a side-effect.\n\nllvm-svn: 161087"},
		[c]={{jb,322,"void Sema::actOnTParamCommandParamNameArg(TParamCommandComment *Command, SourceLocation ArgLocBegin, SourceLocation ArgLocEnd, StringRef Arg) {\n  // ...\n  if (resolveTParamReference(Arg, TemplateParameters, &Position)) {\n    // ...\n    if (PrevCommand) {\n      // ...\n      Diag(ArgLocBegin, diag::warn_doc_tparam_duplicate) << Arg << ArgRange;"}},
		[m]={
			[Hb]={"clang/test/Sema/warn-documentation.cpp:586:13: warning: template parameter \'T1\' is already documented [-Wdocumentation]"}
		}
	},
	["warn_doc_tparam_not_attached_to_a_template_decl"]={
		[l]={L},
		[k]=L,
		[i]="warn_doc_tparam_not_attached_to_a_template_decl",
		[h]="\'%select{\\|@}0tparam\' command used in a comment that is not attached to a template declaration",
		[b]={{nil,nil,{mc,{Sb,bc},"tparam\' command used in a comment that is not attached to a template declaration"}}},
		[f]=j,
		[g]="\'(?:\\\\|@)tparam\' command used in a comment that is not attached to a template declaration",
		[e]=qb,
		[a]=eb,
		[d]={"34df220410b3",1343774226,"Comment parsing: add support for \\tparam command on all levels.","Comment parsing: add support for \\tparam command on all levels.\n\nThe only caveat is renumbering CXCommentKind enum for aesthetic reasons -- this\nbreaks libclang binary compatibility, but should not be a problem since API is\nso new.\n\nThis also fixes PR13372 as a side-effect.\n\nllvm-svn: 161087"},
		[c]={{jb,291,"TParamCommandComment *Sema::actOnTParamCommandStart(SourceLocation LocBegin, SourceLocation LocEnd, unsigned CommandID, CommandMarkerKind CommandMarker) {\n  // ...\n  if (!isTemplateOrSpecialization())\n    Diag(Command->getLocation(), diag::warn_doc_tparam_not_attached_to_a_template_decl) << CommandMarker << Command->getCommandNameRange(Traits);"}},
		[m]={
			["clang/test/AST/ast-dump-comment.cpp"]={"clang/test/AST/ast-dump-comment.cpp:53:6: warning: \'\\tparam\' command used in a comment that is not attached to a template declaration [-Wdocumentation]"}
		}
	},
	["warn_doc_tparam_not_found"]={
		[l]={L},
		[k]=L,
		[i]="warn_doc_tparam_not_found",
		[h]="template parameter \'%0\' not found in the template declaration",
		[b]="template parameter \'A\' not found in the template declaration",
		[f]=j,
		[g]="template parameter \'(.*?)\' not found in the template declaration",
		[e]=qb,
		[a]=eb,
		[d]={"34df220410b3",1343774226,"Comment parsing: add support for \\tparam command on all levels.","Comment parsing: add support for \\tparam command on all levels.\n\nThe only caveat is renumbering CXCommentKind enum for aesthetic reasons -- this\nbreaks libclang binary compatibility, but should not be a problem since API is\nso new.\n\nThis also fixes PR13372 as a side-effect.\n\nllvm-svn: 161087"},
		[c]={{jb,332,"void Sema::actOnTParamCommandParamNameArg(TParamCommandComment *Command, SourceLocation ArgLocBegin, SourceLocation ArgLocEnd, StringRef Arg) {\n  // ...\n  Diag(ArgLocBegin, diag::warn_doc_tparam_not_found) << Arg << ArgRange;"}},
		[m]={
			["clang/test/Sema/warn-documentation-fixits.cpp"]={"clang/test/Sema/warn-documentation-fixits.cpp:14:13: warning: template parameter \'ZZZZZZZZZZ\' not found in the template declaration [-Wdocumentation]","clang/test/Sema/warn-documentation-fixits.cpp:19:13: warning: template parameter \'SomTy\' not found in the template declaration [-Wdocumentation]"}
		}
	},
	["warn_double_const_requires_fp64"]={
		[i]="warn_double_const_requires_fp64",
		[h]={{nil,z,"double precision constant requires %select{cl_khr_fp64|cl_khr_fp64 and __opencl_c_fp64}0, casting to single precision"},{W,nil,"double precision constant requires cl_khr_fp64, casting to single precision"}},
		[b]={{nil,z,{"double precision constant requires ",{"cl_khr_fp64","cl_khr_fp64 and __opencl_c_fp64"},", casting to single precision"}},{W,nil,"double precision constant requires cl_khr_fp64, casting to single precision"}},
		[f]=j,
		[g]="double precision constant requires (?:cl_khr_fp64|cl_khr_fp64 and __opencl_c_fp64), casting to single precision",
		[e]=Xc,
		[a]=r,
		[d]={"c77f85b4b0fe",1299871499,"OpenCL: if double precision floating point constant encountered","OpenCL: if double precision floating point constant encountered\nwithout cl_khr_fp64, warn and cast to single precision\n\nllvm-svn: 127476"},
		[c]={{hb,4044,"ExprResult Sema::ActOnNumericConstant(const Token &Tok, Scope *UDLScope) {\n  // ...\n  if (Literal.isFixedPointLiteral()) {\n  // ...\n  } else if (Literal.isFloatingLiteral()) {\n    // ...\n    if (Ty == Context.DoubleTy) {\n      if (getLangOpts().SinglePrecisionConstants) {\n      // ...\n      } else if (getLangOpts().OpenCL && !getOpenCLOptions().isAvailableOption(\"cl_khr_fp64\", getLangOpts())) {\n        // ...\n        Diag(Tok.getLocation(), diag::warn_double_const_requires_fp64) << (getLangOpts().getOpenCLCompatibleVersion() >= 300);"}},
		[m]={
			["clang/test/CodeGenOpenCL/fpmath.cl"]={"clang/test/CodeGenOpenCL/fpmath.cl:37:16: warning: double precision constant requires cl_khr_fp64, casting to single precision"}
		}
	},
	["warn_double_lock"]={
		[l]={"thread-safety","thread-safety-analysis"},
		[k]="thread-safety-analysis",
		[i]="warn_double_lock",
		[h]="acquiring %0 \'%1\' that is already held",
		[b]="acquiring A \'B\' that is already held",
		[f]=j,
		[g]="acquiring (.*?) \'(.*?)\' that is already held",
		[e]=" \\[(?:\\-Werror,)?\\-Wthread\\-safety\\-analysis[^\\]]*\\]",
		[a]=r,
		[d]={"afbbd8e5adac",1314125194,"Thread-safety analysis: adding in a basic lockset tracking system. This","Thread-safety analysis: adding in a basic lockset tracking system. This\nsystem flags an error when unlocking a lock which was not held, locking\nthe same lock twice, having a different lockset on each iteration of a\nloop, or going out of scope while still holding a lock. In order to\nsuccessfully use the lockset, this patch also makes sure that attribute\narguments are attached correctly for later parsing.\n\nThis patch was also worked on by DeLesley Hutchins.\n\nNote: This patch has been reviewed by Chandler Carruth and Jeffrey\nYasskin. Feel free to provide post-commit review comments for a\nsubsequent patch.\n\nllvm-svn: 138350"},
		[c]={{"clang/lib/Sema/AnalysisBasedWarnings.cpp",1896,"class ThreadSafetyReporter : public clang::threadSafety::ThreadSafetyHandler {\n  // ...\n  void handleDoubleLock(StringRef Kind, Name LockName, SourceLocation LocLocked, SourceLocation LocDoubleLock) override {\n    // ...\n    PartialDiagnosticAt Warning(LocDoubleLock, S.PDiag(diag::warn_double_lock) << Kind << LockName);"}},
		[m]={
			["clang/test/Sema/warn-thread-safety-analysis.c"]={"clang/test/Sema/warn-thread-safety-analysis.c:84:3: warning: acquiring mutex \'mu1\' that is already held [-Wthread-safety-analysis]"}
		}
	},
	["warn_drv_assuming_mfloat_abi_is"]={
		[i]="warn_drv_assuming_mfloat_abi_is",
		[h]="unknown platform, assuming -mfloat-abi=%0",
		[b]="unknown platform, assuming -mfloat-abi=A",
		[f]=j,
		[g]="unknown platform, assuming \\-mfloat\\-abi\\=(.*?)",
		[e]=Xc,
		[a]=A,
		[d]={"7848592ec652",1252623609,"Initial handling of -m{soft-float,hard-float,float-abi=} for ARM.","Initial handling of -m{soft-float,hard-float,float-abi=} for ARM.\n\nllvm-svn: 81471"},
		[c]={{"clang/lib/Driver/ToolChains/Arch/ARM.cpp",472,"// Select the float ABI as determined by -msoft-float, -mhard-float, and\n// -mfloat-abi=.\narm::FloatABI arm::getARMFloatABI(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) {\n  // ...\n  if (ABI == FloatABI::Invalid) {\n    // ...\n    if (Triple.getOS() != llvm::Triple::UnknownOS || !Triple.isOSBinFormatMachO())\n      D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << \"soft\";"}},
		[m]={
			["clang/test/Preprocessor/arm-target-features.c"]={"clang: warning: unknown platform, assuming -mfloat-abi=soft","clang: warning: unknown platform, assuming -mfloat-abi=soft","clang: warning: unknown platform, assuming -mfloat-abi=soft"}
		}
	},
	["warn_drv_avr_family_linking_stdlibs_not_implemented"]={
		[l]={fc},
		[k]=fc,
		[i]={{nil,t,"warn_drv_avr_family_linking_stdlibs_not_implemented"}},
		[h]={{nil,t,"support for linking stdlibs for microcontroller \'%0\' is not implemented"}},
		[b]={{nil,t,"support for linking stdlibs for microcontroller \'A\' is not implemented"}},
		[f]=j,
		[g]="support for linking stdlibs for microcontroller \'(.*?)\' is not implemented",
		[e]=fd,
		[a]={{nil,t,A}},
		[d]={Yb,1534346725,Zb,Tb},
		[c]={{od,481,"void AVR::Linker::ConstructJob(Compilation &C, const JobAction &JA, const InputInfo &Output, const InputInfoList &Inputs, const ArgList &Args, const char *LinkingOutput) const {\n  // ...\n  if (!Args.hasArg(options::OPT_nostdlib) && !Args.hasArg(options::OPT_nodefaultlibs)) {\n    if (!CPU.empty()) {\n      if (!FamilyName) {\n        // ...\n        D.Diag(diag::warn_drv_avr_family_linking_stdlibs_not_implemented) << CPU;"}}
	},
	["warn_drv_avr_libc_not_found"]={
		[l]={fc},
		[k]=fc,
		[i]={{nil,t,"warn_drv_avr_libc_not_found"}},
		[h]={{nil,t,"no avr-libc installation can be found on the system, cannot link standard libraries"}},
		[b]={{nil,t,"no avr-libc installation can be found on the system, cannot link standard libraries"}},
		[f]=j,
		[g]="no avr\\-libc installation can be found on the system, cannot link standard libraries",
		[e]=fd,
		[a]={{nil,t,A}},
		[d]={Yb,1534346725,Zb,Tb},
		[c]={{od,485,"void AVR::Linker::ConstructJob(Compilation &C, const JobAction &JA, const InputInfo &Output, const InputInfoList &Inputs, const ArgList &Args, const char *LinkingOutput) const {\n  // ...\n  if (!Args.hasArg(options::OPT_nostdlib) && !Args.hasArg(options::OPT_nodefaultlibs)) {\n    if (!CPU.empty()) {\n      if (!FamilyName) {\n      // ...\n      } else if (!AVRLibcRoot) {\n        // ...\n        D.Diag(diag::warn_drv_avr_libc_not_found);"}}
	},
	["warn_drv_avr_linker_section_addresses_not_implemented"]={
		[l]={fc},
		[k]=fc,
		[i]={{nil,W,"warn_drv_avr_linker_section_addresses_not_implemented"}},
		[h]={{nil,W,"support for passing the data section address to the linker for microcontroller \'%0\' is not implemented"}},
		[b]={{nil,W,"support for passing the data section address to the linker for microcontroller \'A\' is not implemented"}},
		[f]=j,
		[g]="support for passing the data section address to the linker for microcontroller \'(.*?)\' is not implemented",
		[e]=fd,
		[a]={{nil,W,A}},
		[d]={"0175999805cf",1585492323,"[AMDGPU] Add options -mamdgpu-ieee -mno-amdgpu-ieee","[AMDGPU] Add options -mamdgpu-ieee -mno-amdgpu-ieee\n\nAMDGPU backend need to know whether floating point opcodes that support exception\nflag gathering quiet and propagate signaling NaN inputs per IEEE754-2008, which is\nconveyed by a function attribute \"amdgpu-ieee\". \"amdgpu-ieee\"=\"false\" turns this off.\nWithout this function attribute backend assumes it is on for compute functions.\n\n-mamdgpu-ieee and -mno-amdgpu-ieee are added to Clang to control this function attribute.\nBy default it is on. -mno-amdgpu-ieee requires -fno-honor-nans or equivalent.\n\nReviewed by: Matt Arsenault\n\nDifferential Revision: https://reviews.llvm.org/D77013"},
		[c]={{od,507,"void AVR::Linker::ConstructJob(Compilation &C, const JobAction &JA, const InputInfo &Output, const InputInfoList &Inputs, const ArgList &Args, const char *LinkingOutput) const {\n  // ...\n  if (SectionAddressData) {\n  // ...\n  } else {\n    // ...\n    D.Diag(diag::warn_drv_avr_linker_section_addresses_not_implemented) << CPU;"}}
	},
	["warn_drv_avr_mcu_not_specified"]={
		[l]={fc},
		[k]=fc,
		[i]={{nil,t,"warn_drv_avr_mcu_not_specified"}},
		[h]={{nil,t,"no target microcontroller specified on command line, cannot link standard libraries, please pass -mmcu=<mcu name>"}},
		[b]={{nil,t,"no target microcontroller specified on command line, cannot link standard libraries, please pass -mmcu=<mcu name>"}},
		[f]=j,
		[g]="no target microcontroller specified on command line, cannot link standard libraries, please pass \\-mmcu\\=\\<mcu name\\>",
		[e]=fd,
		[a]={{nil,t,A}},
		[d]={Yb,1534346725,Zb,Tb},
		[c]={{od,373,"/// AVR Toolchain\nAVRToolChain::AVRToolChain(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) : Generic_ELF(D, Triple, Args) {\n  // ...\n  if (getCPUName(D, Args, Triple).empty())\n    D.Diag(diag::warn_drv_avr_mcu_not_specified);"}}
	},
	["warn_drv_avr_stdlib_not_linked"]={
		[l]={fc},
		[k]=fc,
		[i]={{nil,t,"warn_drv_avr_stdlib_not_linked"}},
		[h]={{nil,t,"standard library not linked and so no interrupt vector table or compiler runtime routines will be linked"}},
		[b]={{nil,t,"standard library not linked and so no interrupt vector table or compiler runtime routines will be linked"}},
		[f]=j,
		[g]="standard library not linked and so no interrupt vector table or compiler runtime routines will be linked",
		[e]=fd,
		[a]={{nil,t,A}},
		[d]={Yb,1534346725,Zb,Tb},
		[c]={{od,498,"void AVR::Linker::ConstructJob(Compilation &C, const JobAction &JA, const InputInfo &Output, const InputInfoList &Inputs, const ArgList &Args, const char *LinkingOutput) const {\n  // ...\n  if (!Args.hasArg(options::OPT_nostdlib) && !Args.hasArg(options::OPT_nodefaultlibs)) {\n    // ...\n    if (!LinkStdlib)\n      D.Diag(diag::warn_drv_avr_stdlib_not_linked);"}}
	},
	["warn_drv_clang_unsupported"]={
		[i]="warn_drv_clang_unsupported",
		[h]="the clang compiler does not support \'%0\'",
		[b]="the clang compiler does not support \'A\'",
		[f]=j,
		[g]="the clang compiler does not support \'(.*?)\'",
		[e]=Xc,
		[a]=A,
		[d]={"513d500fda01",1239131904,"Driver: Explicitly warn that -pg isn\'t supported (even though we","Driver: Explicitly warn that -pg isn\'t supported (even though we\naren\'t failing the compilation).\n\nllvm-svn: 68540"},
		[c]={{cb,6965,"#endif\n  // ...\n  // -fsigned-bitfields is default, and clang doesn\'t yet support\n  // -funsigned-bitfields.\n  if (!Args.hasFlag(options::OPT_fsigned_bitfields, options::OPT_funsigned_bitfields, true))\n    D.Diag(diag::warn_drv_clang_unsupported) << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);"}}
	},
	["warn_drv_darwin_sdk_invalid_settings"]={
		[l]={"darwin-sdk-settings"},
		[k]="darwin-sdk-settings",
		[i]={{nil,v,"warn_drv_darwin_sdk_invalid_settings"}},
		[h]={{nil,v,"SDK settings were ignored as \'SDKSettings.json\' could not be parsed"}},
		[b]={{nil,v,"SDK settings were ignored as \'SDKSettings.json\' could not be parsed"}},
		[f]=j,
		[g]="SDK settings were ignored as \'SDKSettings\\.json\' could not be parsed",
		[e]=" \\[(?:\\-Werror,)?\\-Wdarwin\\-sdk\\-settings[^\\]]*\\]",
		[a]={{nil,v,A}},
		[d]={Yb,1534346725,Zb,Tb},
		[c]={{"clang/lib/Driver/ToolChains/Darwin.cpp",2131,"std::optional<DarwinSDKInfo> parseSDKSettings(llvm::vfs::FileSystem &VFS, const ArgList &Args, const Driver &TheDriver) {\n  // ...\n  if (!SDKInfoOrErr) {\n    // ...\n    TheDriver.Diag(diag::warn_drv_darwin_sdk_invalid_settings);"}}
	},
	["warn_drv_deprecated_arg"]={
		[l]={ab},
		[k]=ab,
		[i]="warn_drv_deprecated_arg",
		[h]="argument \'%0\' is deprecated, use \'%1\' instead",
		[b]="argument \'A\' is deprecated, use \'B\' instead",
		[f]=j,
		[g]="argument \'(.*?)\' is deprecated, use \'(.*?)\' instead",
		[e]=" \\[(?:\\-Werror,)?\\-Wdeprecated[^\\]]*\\]",
		[a]=fb,
		[d]={"aa716577495a",1352164322,"Per discussion on cfe-commits, treat -faddress-sanitizer,","Per discussion on cfe-commits, treat -faddress-sanitizer,\n-fno-address-sanitizer, -fthread-sanitizer, -fno-thread-sanitizer, and\n-fcatch-undefined-behavior as deprecated: produce a warning if they are used\npointing to the corresponding -fsanitize= option. In passing add the missing\n\'-\' to some diagnostics.\n\nllvm-svn: 167429"},
		[c]={{Gc,798,"SanitizerArgs::SanitizerArgs(const ToolChain &TC, const llvm::opt::ArgList &Args, bool DiagnoseErrors) {\n  // ...\n  // Parse -f(no-)?sanitize-coverage flags if coverage is supported by the\n  // enabled sanitizers.\n  for (const auto *Arg : Args) {\n    if (Arg->getOption().matches(options::OPT_fsanitize_coverage)) {\n      // ...\n      if (Arg->getNumValues() == 1 && !StringRef(Arg->getValue(0)).getAsInteger(0, LegacySanitizeCoverage)) {\n        // ...\n        if (LegacySanitizeCoverage != 0 && DiagnoseErrors) {\n          D.Diag(diag::warn_drv_deprecated_arg) << Arg->getAsString(Args) << \"-fsanitize-coverage=trace-pc-guard\";"},{Gc,834,"SanitizerArgs::SanitizerArgs(const ToolChain &TC, const llvm::opt::ArgList &Args, bool DiagnoseErrors) {\n  // ...\n  // Choose at most one coverage type: function, bb, or edge.\n  if (DiagnoseErrors) {\n    // ...\n    // Basic block tracing and 8-bit counters require some type of coverage\n    // enabled.\n    if (CoverageFeatures & CoverageTraceBB)\n      D.Diag(clang::diag::warn_drv_deprecated_arg) << \"-fsanitize-coverage=trace-bb\""},{Gc,838,"SanitizerArgs::SanitizerArgs(const ToolChain &TC, const llvm::opt::ArgList &Args, bool DiagnoseErrors) {\n  // ...\n  // Choose at most one coverage type: function, bb, or edge.\n  if (DiagnoseErrors) {\n    // ...\n    if (CoverageFeatures & Coverage8bitCounters)\n      D.Diag(clang::diag::warn_drv_deprecated_arg) << \"-fsanitize-coverage=8bit-counters\""},{Gc,850,"SanitizerArgs::SanitizerArgs(const ToolChain &TC, const llvm::opt::ArgList &Args, bool DiagnoseErrors) {\n  // ...\n  if ((CoverageFeatures & InsertionPointTypes) && !(CoverageFeatures & InstrumentationTypes) && DiagnoseErrors) {\n    D.Diag(clang::diag::warn_drv_deprecated_arg) << \"-fsanitize-coverage=[func|bb|edge]\""}}
	},
	["warn_drv_diagnostics_hotness_requires_pgo"]={
		[l]={Ab},
		[k]=Ab,
		[i]={{nil,tb,"warn_drv_diagnostics_hotness_requires_pgo"}},
		[h]={{nil,tb,"argument \'%0\' requires profile-guided optimization information"}},
		[b]={{nil,tb,"argument \'A\' requires profile-guided optimization information"}},
		[f]=j,
		[g]="argument \'(.*?)\' requires profile\\-guided optimization information",
		[e]=vb,
		[a]={{nil,tb,A}},
		[d]={"dc6fa5d1f678",1498884278,"[Driver] Add -fdiagnostics-hotness-threshold","[Driver] Add -fdiagnostics-hotness-threshold\n\nSummary:\nDepends on https://reviews.llvm.org/D34867.\n\nAdd a Clang frontend option to enable optimization remark hotness\nthresholds, which were added to LLVM in https://reviews.llvm.org/D34867.\nThis prevents diagnostics that do not meet a minimum hotness\nthreshold from being output. When generating optimization remarks for large\ncodebases with a ton of cold code paths, this option can be used\nto limit the optimization remark output at a reasonable size.\nDiscussion of this change can be read here:\nhttp://lists.llvm.org/pipermail/llvm-dev/2017-June/114377.html\n\nReviewers: anemet, davidxl, hfinkel\n\nReviewed By: anemet\n\nSubscribers: fhahn, cfe-commits\n\nDifferential Revision: https://reviews.llvm.org/D34868\n\nllvm-svn: 306945"},
		[c]={{bd,1993,"#include \"clang/Driver/Options.inc\"\n  // ...\n  if (Opts.DiagnosticsWithHotness && !UsingProfile &&\n    // ...\n    Diags.Report(diag::warn_drv_diagnostics_hotness_requires_pgo) << \"-fdiagnostics-show-hotness\";"},{bd,2010,"#include \"clang/Driver/Options.inc\"\n  // ...\n  // Parse remarks hotness threshold. Valid value is either integer or \'auto\'.\n  if (auto *arg = Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ)) {\n    // ...\n    if (!ResultOrErr) {\n    // ...\n    } else {\n      // ...\n      if ((!Opts.DiagnosticsHotnessThreshold || *Opts.DiagnosticsHotnessThreshold > 0) && !UsingProfile)\n        Diags.Report(diag::warn_drv_diagnostics_hotness_requires_pgo) << \"-fdiagnostics-hotness-threshold=\";"}},
		[m]={
			["clang/test/Profile/misexpect-branch.c"]={"warning: argument \'-fdiagnostics-misexpect-tolerance=\' requires profile-guided optimization information"}
		}
	},
	["warn_drv_diagnostics_misexpect_requires_pgo"]={
		[l]={Ab},
		[k]=Ab,
		[i]={{nil,D,"warn_drv_diagnostics_misexpect_requires_pgo"}},
		[h]={{nil,D,"argument \'%0\' requires profile-guided optimization information"}},
		[b]={{nil,D,"argument \'A\' requires profile-guided optimization information"}},
		[f]=j,
		[g]="argument \'(.*?)\' requires profile\\-guided optimization information",
		[e]=Qc,
		[a]={{nil,D,A}},
		[d]={"c5e5b54350fe",1645456106,"[CUDA] Add driver support for compiling CUDA with the new driver","[CUDA] Add driver support for compiling CUDA with the new driver\n\nThis patch adds the basic support for the clang driver to compile and link CUDA\nusing the new offloading driver. This requires handling the CUDA offloading kind\nand embedding the generated files into the host. This will allow us to link\nOpenMP code with CUDA code in the linker wrapper. More support will be required\nto create functional CUDA / HIP binaries using this method.\n\nDepends on D120270 D120271 D120934\n\nReviewed By: tra\n\nDifferential Revision: https://reviews.llvm.org/D120272"},
		[c]={{bd,2027,"#include \"clang/Driver/Options.inc\"\n  // ...\n  if (auto *arg = Args.getLastArg(options::OPT_fdiagnostics_misexpect_tolerance_EQ)) {\n    // ...\n    if (!ResultOrErr) {\n    // ...\n    } else {\n      // ...\n      if ((!Opts.DiagnosticsMisExpectTolerance || *Opts.DiagnosticsMisExpectTolerance > 0) && !UsingProfile)\n        Diags.Report(diag::warn_drv_diagnostics_misexpect_requires_pgo) << \"-fdiagnostics-misexpect-tolerance=\";"}}
	},
	["warn_drv_disabling_vptr_no_rtti_default"]={
		[l]={"auto-disable-vptr-sanitizer"},
		[k]="auto-disable-vptr-sanitizer",
		[i]="warn_drv_disabling_vptr_no_rtti_default",
		[h]="implicitly disabling vptr sanitizer because rtti wasn\'t enabled",
		[b]="implicitly disabling vptr sanitizer because rtti wasn\'t enabled",
		[f]=j,
		[g]="implicitly disabling vptr sanitizer because rtti wasn\'t enabled",
		[e]=" \\[(?:\\-Werror,)?\\-Wauto\\-disable\\-vptr\\-sanitizer[^\\]]*\\]",
		[a]=A,
		[d]={"28f353c7d0d3",1422575803,"Add some more PS4 driver settings related to rtti and exceptions.","Add some more PS4 driver settings related to rtti and exceptions.\n\nSummary:\nThe PS4 defaults to -fno-rtti, and has to have rtti enabled when enabling\nexceptions.\n\nThis commit makes clang add the -fno-rtti by default on the PS4, unless\n-frtti was passed in.\n\nIt also diagnoses misuses for the PS4:\n- Exceptions need rtti. Warn and enable rtti if no rtti flag was passed,\n  error if -fno-rtti was passed.\n\nI also added a more general warning for when -fno-rtti is the default\n(currently it\'s only on the PS4) and the vptr sanitizer is on.\n\nFixed a few tests, due to different flag order when passing cc1 arguments.\n\nReviewers: chandlerc\n\nSubscribers: cfe-commits\n\nDifferential Revision: http://reviews.llvm.org/D7250\n\nllvm-svn: 227518"},
		[c]={{Gc,473,"SanitizerArgs::SanitizerArgs(const ToolChain &TC, const llvm::opt::ArgList &Args, bool DiagnoseErrors) {\n  // ...\n  for (const llvm::opt::Arg *Arg : llvm::reverse(Args)) {\n    if (Arg->getOption().matches(options::OPT_fsanitize_EQ)) {\n      // ...\n      // Test for -fno-rtti + explicit -fsanitizer=vptr before expanding groups\n      // so we don\'t error out if -fno-rtti and -fsanitize=undefined were\n      // passed.\n      if ((Add & SanitizerKind::Vptr) && (RTTIMode == ToolChain::RM_Disabled)) {\n        if (const llvm::opt::Arg *NoRTTIArg = TC.getRTTIArg()) {\n        // ...\n        } else {\n          // The vptr sanitizer requires RTTI, but RTTI is disabled (by\n          // default). Warn that the vptr sanitizer is being disabled.\n          if (DiagnoseErrors)\n            D.Diag(diag::warn_drv_disabling_vptr_no_rtti_default);"}}
	},
	["warn_drv_dwarf_version_limited_by_target"]={
		[l]={"unsupported-target-opt"},
		[k]="unsupported-target-opt",
		[i]={{nil,W,"warn_drv_dwarf_version_limited_by_target"}},
		[h]={{nil,x,"debug information option \'%0\' is not supported; requires DWARF-%2 but target \'%1\' only provides DWARF-%3"},{z,W,"debug information option \'%0\' is not supported. It needs DWARF-%2 but target \'%1\' only provides DWARF-%3."}},
		[b]={{nil,x,"debug information option \'A\' is not supported; requires DWARF-C but target \'B\' only provides DWARF-D"},{z,W,"debug information option \'A\' is not supported. It needs DWARF-C but target \'B\' only provides DWARF-D."}},
		[f]=j,
		[g]="debug information option \'(.*?)\' is not supported; requires DWARF\\-(.*?) but target \'(.*?)\' only provides DWARF\\-(.*?)",
		[e]=" \\[(?:\\-Werror,)?\\-Wunsupported\\-target\\-opt[^\\]]*\\]",
		[a]={{nil,W,A}},
		[d]={"0175999805cf",1585492323,"[AMDGPU] Add options -mamdgpu-ieee -mno-amdgpu-ieee","[AMDGPU] Add options -mamdgpu-ieee -mno-amdgpu-ieee\n\nAMDGPU backend need to know whether floating point opcodes that support exception\nflag gathering quiet and propagate signaling NaN inputs per IEEE754-2008, which is\nconveyed by a function attribute \"amdgpu-ieee\". \"amdgpu-ieee\"=\"false\" turns this off.\nWithout this function attribute backend assumes it is on for compute functions.\n\n-mamdgpu-ieee and -mno-amdgpu-ieee are added to Clang to control this function attribute.\nBy default it is on. -mno-amdgpu-ieee requires -fno-honor-nans or equivalent.\n\nReviewed by: Matt Arsenault\n\nDifferential Revision: https://reviews.llvm.org/D77013"},
		[c]={{cb,4395,"static void renderDebugOptions(const ToolChain &TC, const Driver &D, const llvm::Triple &T, const ArgList &Args, bool EmitCodeView, bool IRInput, ArgStringList &CmdArgs, llvm::codegenoptions::DebugInfoKind &DebugInfoKind, DwarfFissionKind &DwarfFission) {\n  // ...\n  if (Args.hasFlag(options::OPT_gembed_source, options::OPT_gno_embed_source, false)) {\n    // ...\n    if (RequestedDWARFVersion < 5)\n    // ...\n    else if (EffectiveDWARFVersion < 5)\n      // ...\n      D.Diag(diag::warn_drv_dwarf_version_limited_by_target) << A->getAsString(Args) << TC.getTripleString() << 5 << EffectiveDWARFVersion;"}}
	},
	["warn_drv_dxc_missing_dxv"]={
		[l]={"dxil-validation"},
		[k]="dxil-validation",
		[i]="warn_drv_dxc_missing_dxv",
		[h]="dxv not found. Resulting DXIL will not be validated or signed for use in release environments.",
		[b]="dxv not found. Resulting DXIL will not be validated or signed for use in release environments.",
		[f]=j,
		[g]="dxv not found\\. Resulting DXIL will not be validated or signed for use in release environments\\.",
		[e]=" \\[(?:\\-Werror,)?\\-Wdxil\\-validation[^\\]]*\\]",
		[a]=A,
		[d]={"d5a7439e220c",1673633136,"[HLSL] [Dirver] add dxv as a VerifyDebug Job","[HLSL] [Dirver] add dxv as a VerifyDebug Job\n\nNew option --dxv-path is  added for dxc mode to set the installation path for dxv.\nIf cannot find dxv, a warning will be report.\n\ndxv will be executed with command line dxv file_name -o file_name.\nIt will validate and sign the file and overwrite it.\n\nDifferential Revision: https://reviews.llvm.org/D141705"},
		[c]={{"clang/lib/Driver/ToolChains/HLSL.cpp",266,"bool HLSLToolChain::requiresValidation(DerivedArgList &Args) const {\n  // ...\n  getDriver().Diag(diag::warn_drv_dxc_missing_dxv);"}},
		[m]={
			["clang/test/Driver/dxc_D.hlsl"]={"clang: warning: dxv not found. Resulting DXIL will not be validated or signed for use in release environments. [-Wdxil-validation]"}
		}
	},
	["warn_drv_empty_joined_argument"]={
		[l]={Ab},
		[k]=Ab,
		[i]="warn_drv_empty_joined_argument",
		[h]="joined argument expects additional value: \'%0\'",
		[b]="joined argument expects additional value: \'A\'",
		[f]=j,
		[g]="joined argument expects additional value\\: \'(.*?)\'",
		[e]=Qc,
		[a]=A,
		[d]={"ce975d999750",1329933322,"[driver] Add a warning for when -mcpu= is specified without an argument.  There","[driver] Add a warning for when -mcpu= is specified without an argument.  There\nare likely many other OPT_xxxx_EQ options that could/should be added here.\nrdar://10704648\n\nllvm-svn: 151174"},
		[c]={{Rb,309,"InputArgList Driver::ParseArgStrings(ArrayRef<const char *> ArgStrings, bool IsClCompatMode, bool &ContainsError) {\n  // ...\n  // Check for unsupported options.\n  for (const Arg *A : Args) {\n    // ...\n    // Warn about -mcpu= without an argument.\n    if (A->getOption().matches(options::OPT_mcpu_EQ) && A->containsValue(\"\")) {\n      Diag(diag::warn_drv_empty_joined_argument) << A->getAsString(Args);"},{Rb,311,"InputArgList Driver::ParseArgStrings(ArrayRef<const char *> ArgStrings, bool IsClCompatMode, bool &ContainsError) {\n  // ...\n  // Check for unsupported options.\n  for (const Arg *A : Args) {\n    // ...\n    // Warn about -mcpu= without an argument.\n    if (A->getOption().matches(options::OPT_mcpu_EQ) && A->containsValue(\"\")) {\n      // ...\n      ContainsError |= Diags.getDiagnosticLevel(diag::warn_drv_empty_joined_argument, SourceLocation()) > DiagnosticsEngine::Warning;"},{Rb,870,"void Driver::CreateOffloadingDeviceToolChains(Compilation &C, InputList &Inputs) {\n  // ...\n  if (IsOpenMPOffloading) {\n    // ...\n    // If the user specified -fopenmp-targets= we create a toolchain for each\n    // valid triple. Otherwise, if only --offload-arch= was specified we instead\n    // attempt to derive the appropriate toolchains from the arguments.\n    if (Arg *OpenMPTargets = C.getInputArgs().getLastArg(options::OPT_fopenmp_targets_EQ)) {\n      if (OpenMPTargets && !OpenMPTargets->getNumValues()) {\n        Diag(clang::diag::warn_drv_empty_joined_argument) << OpenMPTargets->getAsString(C.getInputArgs());"}}
	},
	["warn_drv_fine_grained_bitfield_accesses_ignored"]={
		[l]={mb},
		[k]=mb,
		[i]={{nil,H,"warn_drv_fine_grained_bitfield_accesses_ignored"}},
		[h]={{nil,H,"option \'-ffine-grained-bitfield-accesses\' cannot be enabled together with a sanitizer; flag ignored"}},
		[b]={{nil,H,"option \'-ffine-grained-bitfield-accesses\' cannot be enabled together with a sanitizer; flag ignored"}},
		[f]=j,
		[g]="option \'\\-ffine\\-grained\\-bitfield\\-accesses\' cannot be enabled together with a sanitizer; flag ignored",
		[e]=vb,
		[a]={{nil,H,A}},
		[d]={"9b3d6272800a",1508172627,"[Bitfield] Add an option to access bitfield in a fine-grained manner.","[Bitfield] Add an option to access bitfield in a fine-grained manner.\n\nCurrently all the consecutive bitfields are wrapped as a large integer unless there is unamed zero sized bitfield in between. The patch provides an alternative manner which makes the bitfield to be accessed as separate memory location if it has legal integer width and is naturally aligned. Such separate bitfield may split the original consecutive bitfields into subgroups of consecutive bitfields, and each subgroup will be wrapped as an integer. Now This is all controlled by an option -ffine-grained-bitfield-accesses. The alternative of bitfield access manner can improve the access efficiency of those bitfields with legal width and being aligned, but may reduce the chance of load/store combining of other bitfields, so it depends on how the bitfields are defined and actually accessed to choose when to use the option. For now the option is off by default.\n\nDifferential revision: https://reviews.llvm.org/D36562\n\nllvm-svn: 315915"},
		[c]={{bd,4472,"bool CompilerInvocation::CreateFromArgsImpl(CompilerInvocation &Res, ArrayRef<const char *> CommandLineArgs, DiagnosticsEngine &Diags, const char *Argv0) {\n  // ...\n  // If sanitizer is enabled, disable OPT_ffine_grained_bitfield_accesses.\n  if (Res.getCodeGenOpts().FineGrainedBitfieldAccesses && !Res.getLangOpts()->Sanitize.empty()) {\n    // ...\n    Diags.Report(diag::warn_drv_fine_grained_bitfield_accesses_ignored);"}},
		[m]={
			["clang/test/CodeGenCXX/finegrain-bitfield-access.cpp"]={"warning: option \'-ffine-grained-bitfield-accesses\' cannot be enabled together with a sanitizer; flag ignored"}
		}
	},
	["warn_drv_fjmc_for_elf_only"]={
		[l]={mb},
		[k]=mb,
		[i]={{nil,D,"warn_drv_fjmc_for_elf_only"}},
		[h]={{nil,D,"-fjmc works only for ELF; option ignored"}},
		[b]={{nil,D,"-fjmc works only for ELF; option ignored"}},
		[f]=j,
		[g]="\\-fjmc works only for ELF; option ignored",
		[e]=qc,
		[a]={{nil,D,A}},
		[d]={hc,1610286626,lc,ic},
		[c]={{cb,5723,"#endif\n  // ...\n  // This controls whether or not we perform JustMyCode instrumentation.\n  if (Args.hasFlag(options::OPT_fjmc, options::OPT_fno_jmc, false)) {\n    if (TC.getTriple().isOSBinFormatELF()) {\n    // ...\n    } else {\n      D.Diag(clang::diag::warn_drv_fjmc_for_elf_only);"},{"clang/lib/Driver/ToolChains/CommonArgs.cpp",818,"#endif\n  // ...\n  // This controls whether or not we perform JustMyCode instrumentation.\n  if (Args.hasFlag(options::OPT_fjmc, options::OPT_fno_jmc, false)) {\n    if (ToolChain.getEffectiveTriple().isOSBinFormatELF())\n    // ...\n    else\n      D.Diag(clang::diag::warn_drv_fjmc_for_elf_only);"}}
	},
	["warn_drv_fuse_ld_path"]={
		[l]={vb,vc,"extra","fuse-ld-path"},
		[k]="fuse-ld-path",
		[i]={{nil,W,"warn_drv_fuse_ld_path"}},
		[h]={{nil,x,"\'-fuse-ld=\' taking a path is deprecated; use \'--ld-path=\' instead"},{z,W,"\'-fuse-ld=\' taking a path is deprecated. Use \'--ld-path=\' instead"}},
		[b]={{nil,x,"\'-fuse-ld=\' taking a path is deprecated; use \'--ld-path=\' instead"},{z,W,"\'-fuse-ld=\' taking a path is deprecated. Use \'--ld-path=\' instead"}},
		[f]=j,
		[g]="\'\\-fuse\\-ld\\=\' taking a path is deprecated; use \'\\-\\-ld\\-path\\=\' instead",
		[e]=" \\[(?:\\-Werror,)?\\-Wfuse\\-ld\\-path[^\\]]*\\]",
		[a]={{nil,W,A}},
		[d]={"0175999805cf",1585492323,"[AMDGPU] Add options -mamdgpu-ieee -mno-amdgpu-ieee","[AMDGPU] Add options -mamdgpu-ieee -mno-amdgpu-ieee\n\nAMDGPU backend need to know whether floating point opcodes that support exception\nflag gathering quiet and propagate signaling NaN inputs per IEEE754-2008, which is\nconveyed by a function attribute \"amdgpu-ieee\". \"amdgpu-ieee\"=\"false\" turns this off.\nWithout this function attribute backend assumes it is on for compute functions.\n\n-mamdgpu-ieee and -mno-amdgpu-ieee are added to Clang to control this function attribute.\nBy default it is on. -mno-amdgpu-ieee requires -fno-honor-nans or equivalent.\n\nReviewed by: Matt Arsenault\n\nDifferential Revision: https://reviews.llvm.org/D77013"},
		[c]={{"clang/lib/Driver/ToolChain.cpp",830,"std::string ToolChain::GetLinkerPath(bool *LinkerIsLLD) const {\n  // ...\n  // Extending -fuse-ld= to an absolute or relative path is unexpected. Checking\n  // for the linker flavor is brittle. In addition, prepending \"ld.\" or \"ld64.\"\n  // to a relative path is surprising. This is more complex due to priorities\n  // among -B, COMPILER_PATH and PATH. --ld-path= should be used instead.\n  if (UseLinker.contains(\'/\'))\n    getDriver().Diag(diag::warn_drv_fuse_ld_path);"}}
	},
	["warn_drv_global_isel_incomplete"]={
		[l]={"global-isel"},
		[k]="global-isel",
		[i]={{nil,R,"warn_drv_global_isel_incomplete"}},
		[h]={{nil,R,"-fglobal-isel support for the \'%0\' architecture is incomplete"}},
		[b]={{nil,R,"-fglobal-isel support for the \'A\' architecture is incomplete"}},
		[f]=j,
		[g]="\\-fglobal\\-isel support for the \'(.*?)\' architecture is incomplete",
		[e]=" \\[(?:\\-Werror,)?\\-Wglobal\\-isel[^\\]]*\\]",
		[a]={{nil,R,A}},
		[d]={Yb,1534346725,Zb,Tb},
		[c]={{cb,7399,"#endif\n  // ...\n  if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel, options::OPT_fno_global_isel)) {\n    // ...\n    if (A->getOption().matches(options::OPT_fglobal_isel)) {\n      // ...\n      if (!IsArchSupported || !IsOptLevelSupported) {\n        // ...\n        if (!IsArchSupported)\n          D.Diag(diag::warn_drv_global_isel_incomplete) << Triple.getArchName();"}}
	},
	["warn_drv_global_isel_incomplete_opt"]={
		[l]={"global-isel"},
		[k]="global-isel",
		[i]={{nil,R,"warn_drv_global_isel_incomplete_opt"}},
		[h]={{nil,R,"-fglobal-isel support is incomplete for this architecture at the current optimization level"}},
		[b]={{nil,R,"-fglobal-isel support is incomplete for this architecture at the current optimization level"}},
		[f]=j,
		[g]="\\-fglobal\\-isel support is incomplete for this architecture at the current optimization level",
		[e]=" \\[(?:\\-Werror,)?\\-Wglobal\\-isel[^\\]]*\\]",
		[a]={{nil,R,A}},
		[d]={Yb,1534346725,Zb,Tb},
		[c]={{cb,7401,"#endif\n  // ...\n  if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel, options::OPT_fno_global_isel)) {\n    // ...\n    if (A->getOption().matches(options::OPT_fglobal_isel)) {\n      // ...\n      if (!IsArchSupported || !IsOptLevelSupported) {\n        // ...\n        if (!IsArchSupported)\n        // ...\n        else\n          D.Diag(diag::warn_drv_global_isel_incomplete_opt);"}}
	},
	["warn_drv_input_file_unused"]={
		[l]={Ab},
		[k]=Ab,
		[i]="warn_drv_input_file_unused",
		[h]="%0: \'%1\' input unused%select{ when \'%3\' is present|}2",
		[b]={{nil,nil,{"A: \'B\' input unused",{" when \'D\' is present",vb}}}},
		[f]=j,
		[g]="(.*?)\\: \'(.*?)\' input unused(?: when \'(.*?)\' is present|)",
		[e]=Qc,
		[a]=A,
		[d]={"5a8987ca5113",1237025389,"Update tablegen diagnostic files to be in sync with the def files.","Update tablegen diagnostic files to be in sync with the def files.\n\nllvm-svn: 67004"},
		[c]={{Rb,4031,"void Driver::handleArguments(Compilation &C, DerivedArgList &Args, const InputList &Inputs, ActionList &Actions) const {\n  // ...\n  for (auto &I : Inputs) {\n    // ...\n    if (InitialPhase > FinalPhase) {\n      // ...\n      // Special case when final phase determined by binary name, rather than\n      // by a command-line argument with a corresponding Arg.\n      if (CCCIsCPP())\n      // ...\n      // Special case \'-E\' warning on a previously preprocessed file to make\n      // more sense.\n      else if (InitialPhase == phases::Compile && (Args.getLastArg(options::OPT__SLASH_EP, options::OPT__SLASH_P) || Args.getLastArg(options::OPT_E) || Args.getLastArg(options::OPT_M, options::OPT_MM)) && getPreprocessedType(InputType) == types::TY_INVALID)\n      // ...\n      else\n        Diag(clang::diag::warn_drv_input_file_unused) << InputArg->getAsString(Args) << getPhaseName(InitialPhase) << !!FinalPhaseArg << (FinalPhaseArg ? FinalPhaseArg->getOption().getName() : \"\");"},{"clang/lib/Tooling/CompilationDatabase.cpp",189,"// Special DiagnosticConsumer that looks for warn_drv_input_file_unused\n// diagnostics from the driver and collects the option strings for those unused\n// options.\nclass UnusedInputDiagConsumer : public DiagnosticConsumer {\n  // ...\n  void HandleDiagnostic(DiagnosticsEngine::Level DiagLevel, const Diagnostic &Info) override {\n    if (Info.getID() == diag::warn_drv_input_file_unused) {"}},
		[m]={
			["clang/test/CodeGenCoroutines/coro-symmetric-transfer-01.cpp"]={"clang: warning: build/tools/clang/test/CodeGenCoroutines/Output/coro-symmetric-transfer-01.cpp.tmp: \'linker\' input unused [-Wunused-command-line-argument]"}
		}
	},
	["warn_drv_input_file_unused_by_cpp"]={
		[l]={Ab},
		[k]=Ab,
		[i]="warn_drv_input_file_unused_by_cpp",
		[h]="%0: \'%1\' input unused in cpp mode",
		[b]="A: \'B\' input unused in cpp mode",
		[f]=j,
		[g]="(.*?)\\: \'(.*?)\' input unused in cpp mode",
		[e]=Qc,
		[a]=A,
		[d]={"403f76ee02a3",1344226146,"PR13529: Don\'t crash if the driver sees an unused input file when running as","PR13529: Don\'t crash if the driver sees an unused input file when running as\n\'clang-cpp\'.\n\nFor now, the test uses \"REQUIRES: shell\" to determine if the host system\nsupports \"ln -s\", which it uses to create a \'clang-cpp\' symlink. This is a bit\nhacky and should likely be directly supported by lit.cfg.\n\nllvm-svn: 161317"},
		[c]={{Rb,4017,"void Driver::handleArguments(Compilation &C, DerivedArgList &Args, const InputList &Inputs, ActionList &Actions) const {\n  // ...\n  for (auto &I : Inputs) {\n    // ...\n    if (InitialPhase > FinalPhase) {\n      // ...\n      // Special case when final phase determined by binary name, rather than\n      // by a command-line argument with a corresponding Arg.\n      if (CCCIsCPP())\n        Diag(clang::diag::warn_drv_input_file_unused_by_cpp) << InputArg->getAsString(Args) << getPhaseName(InitialPhase);"}},
		[m]={
			["clang/test/Driver/ccc-as-cpp.c"]={"clang: warning: -lfoo: \'linker\' input unused in cpp mode [-Wunused-command-line-argument]"}
		}
	},
	["warn_drv_invalid_arch_name_with_suggestion"]={
		[l]={Ab},
		[k]=Ab,
		[i]={{nil,x,"warn_drv_invalid_arch_name_with_suggestion"}},
		[h]={{nil,x,"ignoring invalid /arch: argument \'%0\'; for %select{64|32}1-bit expected one of %2"}},
		[b]={{nil,x,{"ignoring invalid /arch: argument \'A\'; for ",{"64","32"},"-bit expected one of C"}}},
		[f]=j,
		[g]="ignoring invalid \\/arch\\: argument \'(.*?)\'; for (?:64|32)\\-bit expected one of (.*?)",
		[e]=Qc,
		[a]={{nil,x,A}},
		[d]={hc,1610286626,lc,ic},
		[c]={{"clang/lib/Driver/ToolChains/Arch/X86.cpp",62,"std::string x86::getX86TargetCPU(const Driver &D, const ArgList &Args, const llvm::Triple &Triple) {\n  // ...\n  if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {\n    // ...\n    if (CPU.empty()) {\n      // ...\n      D.Diag(diag::warn_drv_invalid_arch_name_with_suggestion) << A->getValue() << (Triple.getArch() == llvm::Triple::x86) << join(ValidArchs, \", \");"}}
	},
	["warn_drv_jmc_requires_debuginfo"]={
		[l]={mb},
		[k]=mb,
		[i]={{nil,D,"warn_drv_jmc_requires_debuginfo"}},
		[h]={{nil,D,"%0 requires debug info. Use %1 or debug options that enable debugger\'s stepping function; option ignored"}},
		[b]={{nil,D,"A requires debug info. Use B or debug options that enable debugger\'s stepping function; option ignored"}},
		[f]=j,
		[g]="(.*?) requires debug info\\. Use (.*?) or debug options that enable debugger\'s stepping function; option ignored",
		[e]=qc,
		[a]={{nil,D,A}},
		[d]={hc,1610286626,lc,ic},
		[c]={{cb,5720,"#endif\n  // ...\n  // This controls whether or not we perform JustMyCode instrumentation.\n  if (Args.hasFlag(options::OPT_fjmc, options::OPT_fno_jmc, false)) {\n    if (TC.getTriple().isOSBinFormatELF()) {\n      if (DebugInfoKind >= llvm::codegenoptions::DebugInfoConstructor)\n      // ...\n      else\n        D.Diag(clang::diag::warn_drv_jmc_requires_debuginfo) << \"-fjmc\""},{cb,7826,"void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType, ArgStringList &CmdArgs, llvm::codegenoptions::DebugInfoKind *DebugInfoKind, bool *EmitCodeView) const {\n  // ...\n  // This controls whether or not we perform JustMyCode instrumentation.\n  if (Args.hasFlag(options::OPT__SLASH_JMC, options::OPT__SLASH_JMC_,\n    // ...\n    if (*EmitCodeView && *DebugInfoKind >= llvm::codegenoptions::DebugInfoConstructor)\n    // ...\n    else\n      D.Diag(clang::diag::warn_drv_jmc_requires_debuginfo) << \"/JMC\""}}
	},
	["warn_drv_libstdcxx_not_found"]={
		[l]={"stdlibcxx-not-found"},
		[k]="stdlibcxx-not-found",
		[i]={{nil,t,"warn_drv_libstdcxx_not_found"}},
		[h]={{nil,t,"include path for libstdc++ headers not found; pass \'-stdlib=libc++\' on the command line to use the libc++ standard library instead"}},
		[b]={{nil,t,"include path for libstdc++ headers not found; pass \'-stdlib=libc++\' on the command line to use the libc++ standard library instead"}},
		[f]=j,
		[g]="include path for libstdc\\+\\+ headers not found; pass \'\\-stdlib\\=libc\\+\\+\' on the command line to use the libc\\+\\+ standard library instead",
		[e]=" \\[(?:\\-Werror,)?\\-Wstdlibcxx\\-not\\-found[^\\]]*\\]",
		[a]={{nil,t,A}},
		[d]={Yb,1534346725,Zb,Tb},
		[c]={{"clang/lib/Driver/ToolChains/Darwin.cpp",2551,"void DarwinClang::AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const {\n  // ...\n  case ToolChain::CST_Libstdcxx:\n    // ...\n    if (!IsBaseFound) {\n      getDriver().Diag(diag::warn_drv_libstdcxx_not_found);"}}
	},
	["warn_drv_loongarch_conflicting_implied_val"]={
		[l]={mb},
		[k]=mb,
		[i]="warn_drv_loongarch_conflicting_implied_val",
		[h]="ignoring \'%0\' as it conflicts with that implied by \'%1\' (%2)",
		[b]="ignoring \'A\' as it conflicts with that implied by \'B\' (C)",
		[f]=j,
		[g]="ignoring \'(.*?)\' as it conflicts with that implied by \'(.*?)\' \\((.*?)\\)",
		[e]=qc,
		[a]=A,
		[d]={"f6932007ab4e",1687763241,"[Clang][LoongArch] Consume and check -mabi and -mfpu even if -m*-float is present","[Clang][LoongArch] Consume and check -mabi and -mfpu even if -m*-float is present\n\nThis kind of CLI flags duplication can sometimes be convenient for build\nsystems that may have to tinker with these.\n\nFor example, in the Linux kernel we almost always want to ensure no FP\ninstruction is emitted, so `-msoft-float` is present by default; but\nsometimes we do want to allow FPU usage (e.g. certain parts of amdgpu DC\ncode), in which case we want the `-msoft-float` stripped and `-mfpu=64`\nadded. Here we face a dilemma without this change:\n\n* Either `-mabi` is not supplied by `arch/loongarch` Makefile, in which\n  case the correct ABI has to be supplied by the driver Makefile\n  (otherwise the ABI will become double-float due to `-mfpu`), which is\n  arguably not appropriate for a driver;\n* Or `-mabi` is still supplied by `arch/loongarch` Makefile, and the\n  build immediately errors out because\n  `-Werror=unused-command-line-argument` is unconditionally set for\n  Clang builds.\n\nTo solve this, simply make sure to check `-mabi` and `-mfpu` (and gain\nsome useful diagnostics in case of conflicting settings) when\n`-m*-float` is successfully parsed.\n\nReviewed By: SixWeining, MaskRay\n\nDifferential Revision: https://reviews.llvm.org/D153707"},
		[c]={{"clang/lib/Driver/ToolChains/Arch/LoongArch.cpp",78,"StringRef loongarch::getLoongArchABI(const Driver &D, const ArgList &Args, const llvm::Triple &Triple) {\n  // ...\n  // Check -m*-float firstly since they have highest priority.\n  if (const Arg *A = Args.getLastArg(options::OPT_mdouble_float, options::OPT_msingle_float, options::OPT_msoft_float)) {\n    // ...\n    // Check `-mabi=` and `-mfpu=` settings and report if they conflict with\n    // the higher-priority settings implied by -m*-float.\n    //\n    // ImpliedABI and ImpliedFPU are guaranteed to have valid values because\n    // one of the match arms must match if execution can arrive here at all.\n    if (!MABIValue.empty() && ImpliedABI != MABIValue)\n      D.Diag(diag::warn_drv_loongarch_conflicting_implied_val) << MABIArg->getAsString(Args) << A->getAsString(Args) << ImpliedABI;"},{"clang/lib/Driver/ToolChains/Arch/LoongArch.cpp",82,"StringRef loongarch::getLoongArchABI(const Driver &D, const ArgList &Args, const llvm::Triple &Triple) {\n  // ...\n  // Check -m*-float firstly since they have highest priority.\n  if (const Arg *A = Args.getLastArg(options::OPT_mdouble_float, options::OPT_msingle_float, options::OPT_msoft_float)) {\n    // ...\n    if (FPU != -1 && ImpliedFPU != FPU)\n      D.Diag(diag::warn_drv_loongarch_conflicting_implied_val) << MFPUArg->getAsString(Args) << A->getAsString(Args) << ImpliedFPU;"}}
	},
	["warn_drv_missing_multilib"]={
		[l]={"missing-multilib"},
		[k]="missing-multilib",
		[i]="warn_drv_missing_multilib",
		[h]="no multilib found matching flags: %0",
		[b]="no multilib found matching flags: A",
		[f]=j,
		[g]="no multilib found matching flags\\: (.*?)",
		[e]=" \\[(?:\\-Werror,)?\\-Wmissing\\-multilib[^\\]]*\\]",
		[a]=A,
		[d]={"dc8cbbd55f80",1688026032,"[Clang][Driver] Change missing multilib error to warning","[Clang][Driver] Change missing multilib error to warning\n\nThe error could be awkward to work around when experimenting with flags\nthat didn\'t have a matching multilib. It also broke many tests when\nmultilib.yaml was present in the build directory.\n\nReviewed By: simon_tatham, MaskRay\n\nDifferential Revision: https://reviews.llvm.org/D153885"},
		[c]={{"clang/lib/Driver/ToolChains/BareMetal.cpp",190,"static void findMultilibsFromYAML(const ToolChain &TC, const Driver &D, StringRef MultilibPath, const ArgList &Args, DetectedMultilibs &Result) {\n  // ...\n  D.Diag(clang::diag::warn_drv_missing_multilib) << llvm::join(Flags, \" \");"}}
	},
	["warn_drv_missing_plugin_arg"]={
		[l]={Bb},
		[k]=Bb,
		[i]={{nil,x,"warn_drv_missing_plugin_arg"}},
		[h]={{nil,x,"missing plugin argument for plugin %0 in %1"}},
		[b]={{nil,x,"missing plugin argument for plugin A in B"}},
		[f]=j,
		[g]="missing plugin argument for plugin (.*?) in (.*?)",
		[e]=Pc,
		[a]={{nil,x,A}},
		[d]={hc,1610286626,lc,ic},
		[c]={{cb,7110,"#endif\n  // ...\n  // Turn -fplugin-arg-pluginname-key=value into\n  // -plugin-arg-pluginname key=value\n  // GCC has an actual plugin_argument struct with key/value pairs that it\n  // passes to its plugins, but we don\'t, so just pass it on as-is.\n  //\n  // The syntax for -fplugin-arg- is ambiguous if both plugin name and\n  // argument key are allowed to contain dashes. GCC therefore only\n  // allows dashes in the key. We do the same.\n  for (const Arg *A : Args.filtered(options::OPT_fplugin_arg)) {\n    // ...\n    if (FirstDashIndex == StringRef::npos || Arg.empty()) {\n      if (PluginName.empty()) {\n      // ...\n      } else {\n        D.Diag(diag::warn_drv_missing_plugin_arg) << PluginName << A->getAsString(Args);"}}
	},
	["warn_drv_missing_plugin_name"]={
		[l]={Bb},
		[k]=Bb,
		[i]={{nil,x,"warn_drv_missing_plugin_name"}},
		[h]={{nil,x,"missing plugin name in %0"}},
		[b]={{nil,x,"missing plugin name in A"}},
		[f]=j,
		[g]="missing plugin name in (.*?)",
		[e]=Pc,
		[a]={{nil,x,A}},
		[d]={hc,1610286626,lc,ic},
		[c]={{cb,7108,"#endif\n  // ...\n  // Turn -fplugin-arg-pluginname-key=value into\n  // -plugin-arg-pluginname key=value\n  // GCC has an actual plugin_argument struct with key/value pairs that it\n  // passes to its plugins, but we don\'t, so just pass it on as-is.\n  //\n  // The syntax for -fplugin-arg- is ambiguous if both plugin name and\n  // argument key are allowed to contain dashes. GCC therefore only\n  // allows dashes in the key. We do the same.\n  for (const Arg *A : Args.filtered(options::OPT_fplugin_arg)) {\n    // ...\n    if (FirstDashIndex == StringRef::npos || Arg.empty()) {\n      if (PluginName.empty()) {\n        D.Diag(diag::warn_drv_missing_plugin_name) << A->getAsString(Args);"}}
	},
	["warn_drv_moutline_atomics_unsupported_opt"]={
		[l]={mb},
		[k]=mb,
		[i]={{nil,W,"warn_drv_moutline_atomics_unsupported_opt"}},
		[h]={{nil,x,"\'%0\' does not support \'-%1\'; flag ignored"},{z,W,"The \'%0\' architecture does not support -moutline-atomics; flag ignored"}},
		[b]={{nil,x,"\'A\' does not support \'-B\'; flag ignored"},{z,W,"The \'A\' architecture does not support -moutline-atomics; flag ignored"}},
		[f]=j,
		[g]="\'(.*?)\' does not support \'\\-(.*?)\'; flag ignored",
		[e]=qc,
		[a]={{nil,W,A}},
		[d]={"0175999805cf",1585492323,"[AMDGPU] Add options -mamdgpu-ieee -mno-amdgpu-ieee","[AMDGPU] Add options -mamdgpu-ieee -mno-amdgpu-ieee\n\nAMDGPU backend need to know whether floating point opcodes that support exception\nflag gathering quiet and propagate signaling NaN inputs per IEEE754-2008, which is\nconveyed by a function attribute \"amdgpu-ieee\". \"amdgpu-ieee\"=\"false\" turns this off.\nWithout this function attribute backend assumes it is on for compute functions.\n\n-mamdgpu-ieee and -mno-amdgpu-ieee are added to Clang to control this function attribute.\nBy default it is on. -mno-amdgpu-ieee requires -fno-honor-nans or equivalent.\n\nReviewed by: Matt Arsenault\n\nDifferential Revision: https://reviews.llvm.org/D77013"},
		[c]={{cb,7440,"#endif\n  // ...\n  if (Arg *A = Args.getLastArg(options::OPT_moutline_atomics, options::OPT_mno_outline_atomics)) {\n    // Option -moutline-atomics supported for AArch64 target only.\n    if (!Triple.isAArch64()) {\n      D.Diag(diag::warn_drv_moutline_atomics_unsupported_opt) << Triple.getArchName() << A->getOption().getName();"}}
	},
	["warn_drv_moutline_unsupported_opt"]={
		[l]={mb},
		[k]=mb,
		[i]={{nil,O,"warn_drv_moutline_unsupported_opt"}},
		[h]={{nil,x,"\'%0\' does not support \'-moutline\'; flag ignored"},{z,O,"The \'%0\' architecture does not support -moutline; flag ignored"}},
		[b]={{nil,x,"\'A\' does not support \'-moutline\'; flag ignored"},{z,O,"The \'A\' architecture does not support -moutline; flag ignored"}},
		[f]=j,
		[g]="\'(.*?)\' does not support \'\\-moutline\'; flag ignored",
		[e]=qc,
		[a]={{nil,O,A}},
		[d]={"a67abc83b733",1530050988,"[MachineOutliner] Emit a warning when using -moutline on unsupported targets","[MachineOutliner] Emit a warning when using -moutline on unsupported targets\n\nInstead of just saying \"flag unused\", we should tell the user that the\noutliner isn\'t (at least officially) supported for some given architecture.\n\nThis adds a warning that will state something like\n\nThe \'blah\' architecture does not support -moutline; flag ignored\n\nwhen we call -moutline with the \'blah\' architecture.\n\nSince the outliner is still mostly an AArch64 thing, any architecture\nother than AArch64 will emit this warning.\n\nllvm-svn: 335672"},
		[c]={{"clang/lib/Driver/ToolChains/CommonArgs.cpp",2355,"void tools::addMachineOutlinerArgs(const Driver &D, const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs, const llvm::Triple &Triple, bool IsLTO, const StringRef PluginOptPrefix) {\n  // ...\n  if (Arg *A = Args.getLastArg(options::OPT_moutline, options::OPT_mno_outline)) {\n    if (A->getOption().matches(options::OPT_moutline)) {\n      // We only support -moutline in AArch64 and ARM targets right now. If\n      // we\'re not compiling for these, emit a warning and ignore the flag.\n      // Otherwise, add the proper mllvm flags.\n      if (!(Triple.isARM() || Triple.isThumb() || Triple.getArch() == llvm::Triple::aarch64 || Triple.getArch() == llvm::Triple::aarch64_32)) {\n        D.Diag(diag::warn_drv_moutline_unsupported_opt) << Triple.getArchName();"}}
	},
	["warn_drv_msp430_hwmult_mismatch"]={
		[l]={Bb},
		[k]=Bb,
		[i]={{nil,v,"warn_drv_msp430_hwmult_mismatch"}},
		[h]={{nil,x,"the given MCU supports %0 hardware multiply, but \'-mhwmult\' is set to %1"},{z,v,"the given MCU supports %0 hardware multiply, but -mhwmult is set to %1."}},
		[b]={{nil,x,"the given MCU supports A hardware multiply, but \'-mhwmult\' is set to B"},{z,v,"the given MCU supports A hardware multiply, but -mhwmult is set to B."}},
		[f]=j,
		[g]="the given MCU supports (.*?) hardware multiply, but \'\\-mhwmult\' is set to (.*?)",
		[e]=Pc,
		[a]={{nil,v,A}},
		[d]={Yb,1534346725,Zb,Tb},
		[c]={{"clang/lib/Driver/ToolChains/MSP430.cpp",91,"void msp430::getMSP430TargetFeatures(const Driver &D, const ArgList &Args, std::vector<StringRef> &Features) {\n  // ...\n  if (MCU && HWMult != SupportedHWMult)\n    D.Diag(clang::diag::warn_drv_msp430_hwmult_mismatch) << SupportedHWMult << HWMult;"}}
	},
	["warn_drv_msp430_hwmult_no_device"]={
		[l]={Bb},
		[k]=Bb,
		[i]={{nil,v,"warn_drv_msp430_hwmult_no_device"}},
		[h]={{nil,x,"no MCU device specified, but \'-mhwmult\' is set to \'auto\', assuming no hardware multiply; use \'-mmcu\' to specify an MSP430 device, or \'-mhwmult\' to set the hardware multiply type explicitly"},{z,v,"no MCU device specified, but \'-mhwmult\' is set to \'auto\', assuming no hardware multiply. Use -mmcu to specify a MSP430 device, or -mhwmult to set hardware multiply type explicitly."}},
		[b]={{nil,x,"no MCU device specified, but \'-mhwmult\' is set to \'auto\', assuming no hardware multiply; use \'-mmcu\' to specify an MSP430 device, or \'-mhwmult\' to set the hardware multiply type explicitly"},{z,v,"no MCU device specified, but \'-mhwmult\' is set to \'auto\', assuming no hardware multiply. Use -mmcu to specify a MSP430 device, or -mhwmult to set hardware multiply type explicitly."}},
		[f]=j,
		[g]="no MCU device specified, but \'\\-mhwmult\' is set to \'auto\', assuming no hardware multiply; use \'\\-mmcu\' to specify an MSP430 device, or \'\\-mhwmult\' to set the hardware multiply type explicitly",
		[e]=Pc,
		[a]={{nil,v,A}},
		[d]={Yb,1534346725,Zb,Tb},
		[c]={{"clang/lib/Driver/ToolChains/MSP430.cpp",76,"void msp430::getMSP430TargetFeatures(const Driver &D, const ArgList &Args, std::vector<StringRef> &Features) {\n  // ...\n  if (HWMult == \"auto\") {\n    // \'auto\' - deduce hw multiplier support based on mcu name provided.\n    // If no mcu name is provided, assume no hw multiplier is supported.\n    if (!MCU)\n      D.Diag(clang::diag::warn_drv_msp430_hwmult_no_device);"}}
	},
	["warn_drv_msp430_hwmult_unsupported"]={
		[l]={Bb},
		[k]=Bb,
		[i]={{nil,v,"warn_drv_msp430_hwmult_unsupported"}},
		[h]={{nil,x,"the given MCU does not support hardware multiply, but \'-mhwmult\' is set to %0"},{z,v,"the given MCU does not support hardware multiply, but -mhwmult is set to %0."}},
		[b]={{nil,x,"the given MCU does not support hardware multiply, but \'-mhwmult\' is set to A"},{z,v,"the given MCU does not support hardware multiply, but -mhwmult is set to A."}},
		[f]=j,
		[g]="the given MCU does not support hardware multiply, but \'\\-mhwmult\' is set to (.*?)",
		[e]=Pc,
		[a]={{nil,v,A}},
		[d]={Yb,1534346725,Zb,Tb},
		[c]={{"clang/lib/Driver/ToolChains/MSP430.cpp",89,"void msp430::getMSP430TargetFeatures(const Driver &D, const ArgList &Args, std::vector<StringRef> &Features) {\n  // ...\n  if (MCU && SupportedHWMult == \"none\")\n    D.Diag(clang::diag::warn_drv_msp430_hwmult_unsupported) << HWMult;"}}
	},
	["warn_drv_msvc_not_found"]={
		[l]={"msvc-not-found"},
		[k]="msvc-not-found",
		[i]={{nil,tb,"warn_drv_msvc_not_found"}},
		[h]={{nil,tb,"unable to find a Visual Studio installation; try running Clang from a developer command prompt"}},
		[b]={{nil,tb,"unable to find a Visual Studio installation; try running Clang from a developer command prompt"}},
		[f]=j,
		[g]="unable to find a Visual Studio installation; try running Clang from a developer command prompt",
		[e]=" \\[(?:\\-Werror,)?\\-Wmsvc\\-not\\-found[^\\]]*\\]",
		[a]={{nil,tb,A}},
		[d]={"f6302523490c",1489594055,"Update clang-cl driver for MSVC 2017.","Update clang-cl driver for MSVC 2017.\n\n2017 changes the way you find an installed copy of\nVisual Studio as well as its internal directory layout.\nAs a result, clang-cl was unable to find VS2017 even\nwhen you had run vcvarsall to set up a toolchain\nenvironment.  This patch updates everything for 2017\nand cleans up the way we handle a tiered search a la\nenvironment -> installation -> PATH for which copy\nof Visual Studio to bind to.\n\nPatch originally by Hamza Sood, with some fixups for landing.\n\nDifferential Revision: https://reviews.llvm.org/D30758\n\nllvm-svn: 297851"},
		[c]={{"clang/lib/Driver/ToolChains/MSVC.cpp",341,"void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA, const InputInfo &Output, const InputInfoList &Inputs, const ArgList &Args, const char *LinkingOutput) const {\n  // ...\n  if (Linker.equals_insensitive(\"link\")) {\n    // ...\n    if (!TC.FoundMSVCInstall() && !canExecute(TC.getVFS(), linkPath)) {\n      // ...\n      if (canExecute(TC.getVFS(), ClPath)) {\n        // ...\n        if (!canExecute(TC.getVFS(), linkPath))\n          C.getDriver().Diag(clang::diag::warn_drv_msvc_not_found);"},{"clang/lib/Driver/ToolChains/MSVC.cpp",343,"void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA, const InputInfo &Output, const InputInfoList &Inputs, const ArgList &Args, const char *LinkingOutput) const {\n  // ...\n  if (Linker.equals_insensitive(\"link\")) {\n    // ...\n    if (!TC.FoundMSVCInstall() && !canExecute(TC.getVFS(), linkPath)) {\n      // ...\n      if (canExecute(TC.getVFS(), ClPath)) {\n      // ...\n      } else {\n        C.getDriver().Diag(clang::diag::warn_drv_msvc_not_found);"}}
	},
	["warn_drv_multi_gpu_arch"]={
		[l]={"multi-gpu"},
		[k]="multi-gpu",
		[i]="warn_drv_multi_gpu_arch",
		[h]="multiple %0 architectures are detected: %1; only the first one is used for \'%2\'",
		[b]="multiple A architectures are detected: B; only the first one is used for \'C\'",
		[f]=j,
		[g]="multiple (.*?) architectures are detected\\: (.*?); only the first one is used for \'(.*?)\'",
		[e]=" \\[(?:\\-Werror,)?\\-Wmulti\\-gpu[^\\]]*\\]",
		[a]=A,
		[d]={"91b9bdeb9256",1688572615,"[AMDGPU] Support -mcpu=native for OpenCL","[AMDGPU] Support -mcpu=native for OpenCL\n\nWhen -mcpu=native is specified, try detecting GPU\non the system by using amdgpu-arch tool. If it\nfails to detect GPU, emit an error about GPU\nnot detected. If multiple GPUs are detected,\nuse the first GPU and emit a warning.\n\nReviewed by: Matt Arsenault, Fangrui Song\n\nDifferential Revision: https://reviews.llvm.org/D154531"},
		[c]={{"clang/lib/Driver/ToolChains/AMDGPU.cpp",651,"DerivedArgList *AMDGPUToolChain::TranslateArgs(const DerivedArgList &Args, StringRef BoundArch, Action::OffloadKind DeviceOffloadKind) const {\n  // ...\n  if (LastMCPUArg && StringRef(LastMCPUArg->getValue()) == \"native\") {\n    // ...\n    if (!GPUsOrErr) {\n    // ...\n    } else {\n      // ...\n      if (GPUs.size() > 1) {\n        getDriver().Diag(diag::warn_drv_multi_gpu_arch) << llvm::Triple::getArchTypeName(getArch()) << llvm::join(GPUs, \", \") << \"-mcpu\";"}}
	},
	["warn_drv_needs_hvx"]={
		[l]={mb},
		[k]=mb,
		[i]={{nil,x,"warn_drv_needs_hvx"}},
		[h]={{nil,x,"%0 requires HVX, use -mhvx/-mhvx= to enable it"}},
		[b]={{nil,x,"A requires HVX, use -mhvx/-mhvx= to enable it"}},
		[f]=j,
		[g]="(.*?) requires HVX, use \\-mhvx\\/\\-mhvx\\= to enable it",
		[e]=qc,
		[a]={{nil,x,A}},
		[d]={hc,1610286626,lc,ic},
		[c]={{"clang/lib/Driver/ToolChains/Hexagon.cpp",191,"// Hexagon target features.\nvoid hexagon::getHexagonTargetFeatures(const Driver &D, const llvm::Triple &Triple, const ArgList &Args, std::vector<StringRef> &Features) {\n  // ...\n  if (HexagonToolChain::isAutoHVXEnabled(Args) && !HasHVX)\n    D.Diag(diag::warn_drv_needs_hvx) << \"auto-vectorization\";"}}
	},
	["warn_drv_new_cuda_version"]={
		[l]={"unknown-cuda-version"},
		[k]="unknown-cuda-version",
		[i]={{nil,x,"warn_drv_new_cuda_version"}},
		[h]={{nil,x,"CUDA version%0 is newer than the latest%select{| partially}1 supported version %2"}},
		[b]={{nil,x,{"CUDA versionA is newer than the latest",{vb," partially"}," supported version C"}}},
		[f]=j,
		[g]="CUDA version(.*?) is newer than the latest(?:| partially) supported version (.*?)",
		[e]=" \\[(?:\\-Werror,)?\\-Wunknown\\-cuda\\-version[^\\]]*\\]",
		[a]={{nil,x,A}},
		[d]={hc,1610286626,lc,ic},
		[c]={{"clang/lib/Driver/ToolChains/Cuda.cpp",119,"void CudaInstallationDetector::WarnIfUnsupportedVersion() {\n  if (Version > CudaVersion::PARTIALLY_SUPPORTED) {\n    // ...\n    D.Diag(diag::warn_drv_new_cuda_version) << VersionString << (CudaVersion::PARTIALLY_SUPPORTED != CudaVersion::FULLY_SUPPORTED) << CudaVersionToString(CudaVersion::PARTIALLY_SUPPORTED);"}}
	},
	["warn_drv_no_floating_point_registers"]={
		[l]={"unsupported-abi"},
		[k]="unsupported-abi",
		[i]="warn_drv_no_floating_point_registers",
		[h]="\'%0\': selected processor lacks floating point registers",
		[b]="\'A\': selected processor lacks floating point registers",
		[f]=j,
		[g]="\'(.*?)\'\\: selected processor lacks floating point registers",
		[e]=" \\[(?:\\-Werror,)?\\-Wunsupported\\-abi[^\\]]*\\]",
		[a]=A,
		[d]={"1d511e1864f1",1684763280,"[ARM][Driver] Warn if -mhard-float is incompatible","[ARM][Driver] Warn if -mhard-float is incompatible\n\nMixing -mfloat-abi=hard with a CPU that doesn\'t have floating point\nregisters is an error in GCC:\n  cc1: error: \'-mfloat-abi=hard\': selected processor lacks an FPU\n\nSince there is code in the wild (including in clang tests) that relies\non Clang\'s current behaviour, emit a warning instead of an error.\n\nUnlike the GCC error, the new warning refers to floating point\nregisters instead of an FPU. This is because -mfloat-abi=hard and\n-march=armv8.1-m.main+mve+nofp are compatible - in that case floating\npoint registers are required, but an FPU is not required.\n\nMy initial thought was to use the floating point ABI calculated by\narm::getARMFloatABI() but in invalid cases which error for other\nreasons the ABI is miscalculated and the warning would cause confusion.\nTherefore only warn if the user specifies the float ABI explicitly.\n\nFixes part of https://github.com/llvm/llvm-project/issues/55755\n\nDifferential Revision: https://reviews.llvm.org/D150902"},
		[c]={{"clang/lib/Driver/ToolChains/Arch/ARM.cpp",174,"// If -mfloat-abi=hard or -mhard-float are specified explicitly then check that\n// floating point registers are available on the target CPU.\nstatic void checkARMFloatABI(const Driver &D, const ArgList &Args, bool HasFPRegs) {\n  // ...\n  if (A && (A->getOption().matches(options::OPT_mhard_float) || (A->getOption().matches(options::OPT_mfloat_abi_EQ) && A->getValue() == StringRef(\"hard\"))))\n    D.Diag(clang::diag::warn_drv_no_floating_point_registers) << A->getAsString(Args);"}},
		[m]={
			["clang/test/Preprocessor/arm-target-features.c"]={"clang: warning: \'-mfloat-abi=hard\': selected processor lacks floating point registers [-Wunsupported-abi]"}
		}
	},
	["warn_drv_object_size_disabled_O0"]={
		[l]={Bb},
		[k]=Bb,
		[i]={{nil,tb,"warn_drv_object_size_disabled_O0"}},
		[h]={{nil,tb,"the object size sanitizer has no effect at -O0, but is explicitly enabled: %0"}},
		[b]={{nil,tb,"the object size sanitizer has no effect at -O0, but is explicitly enabled: A"}},
		[f]=j,
		[g]="the object size sanitizer has no effect at \\-O0, but is explicitly enabled\\: (.*?)",
		[e]=Pc,
		[a]={{nil,tb,A}},
		[d]={"7aacb659dad5",1498259724,"[ubsan] Disable the object size check at -O0","[ubsan] Disable the object size check at -O0\n\nThis check currently isn\'t able to diagnose any issues at -O0, not is it\nlikely to [1]. Disabling the check at -O0 leads to substantial compile\ntime and binary size savings.\n\n[1] [cfe-dev] Disabling ubsan\'s object size check at -O0\n\nDifferential Revision: https://reviews.llvm.org/D34563\n\nllvm-svn: 306181"},
		[c]={{Gc,364,"SanitizerArgs::SanitizerArgs(const ToolChain &TC, const llvm::opt::ArgList &Args, bool DiagnoseErrors) {\n  // ...\n  for (const llvm::opt::Arg *Arg : llvm::reverse(Args)) {\n    if (Arg->getOption().matches(options::OPT_fsanitize_EQ)) {\n      // ...\n      if (RemoveObjectSizeAtO0) {\n        // ...\n        // The user explicitly enabled the object size sanitizer. Warn\n        // that this does nothing at -O0.\n        if ((Add & SanitizerKind::ObjectSize) && DiagnoseErrors)\n          D.Diag(diag::warn_drv_object_size_disabled_O0) << Arg->getAsString(Args);"}}
	},
	["warn_drv_omp_offload_target_duplicate"]={
		[l]={"openmp","openmp-target"},
		[k]="openmp-target",
		[i]="warn_drv_omp_offload_target_duplicate",
		[h]={{nil,x,"OpenMP offloading target \'%0\' is similar to target \'%1\' already specified; will be ignored"},{z,nil,"The OpenMP offloading target \'%0\' is similar to target \'%1\' already specified - will be ignored."}},
		[b]={{nil,x,"OpenMP offloading target \'A\' is similar to target \'B\' already specified; will be ignored"},{z,nil,"The OpenMP offloading target \'A\' is similar to target \'B\' already specified - will be ignored."}},
		[f]=j,
		[g]="OpenMP offloading target \'(.*?)\' is similar to target \'(.*?)\' already specified; will be ignored",
		[e]=" \\[(?:\\-Werror,)?\\-Wopenmp\\-target[^\\]]*\\]",
		[a]=A,
		[d]={"39f9da2a8752",1477586285,"[Driver][OpenMP] Create tool chains for OpenMP offloading kind.","[Driver][OpenMP] Create tool chains for OpenMP offloading kind.\n\nSummary: This patch adds new logic to create the necessary tool chains to support offloading for OpenMP. The OpenMP related options are checked and the tool chains created accordingly. Diagnostics are emitted in case the options are illegal or express unknown targets.\n\nReviewers: echristo, tra, jlebar, rsmith, ABataev, hfinkel\n\nSubscribers: whchung, mkuron, mehdi_amini, cfe-commits, Hahnfeld, arpith-jacob, carlo.bertolli, caomhin\n\nDifferential Revision: https://reviews.llvm.org/D21843\n\nllvm-svn: 285311"},
		[c]={{Rb,940,"void Driver::CreateOffloadingDeviceToolChains(Compilation &C, InputList &Inputs) {\n  // ...\n  if (IsOpenMPOffloading) {\n    // ...\n    for (StringRef Val : OpenMPTriples) {\n      // ...\n      if (Duplicate != FoundNormalizedTriples.end()) {\n        Diag(clang::diag::warn_drv_omp_offload_target_duplicate) << Val << Duplicate->second;"}}
	},
	["warn_drv_optimization_value"]={
		[l]={Bb},
		[k]=Bb,
		[i]="warn_drv_optimization_value",
		[h]="optimization level \'%0\' is not supported; using \'%1%2\' instead",
		[b]="optimization level \'A\' is not supported; using \'BC\' instead",
		[f]=j,
		[g]="optimization level \'(.*?)\' is not supported; using \'(.*?)(.*?)\' instead",
		[e]=vb,
		[a]=A,
		[d]={"6ae39801189b",1384529954,"Using an invalid -O falls back on -O3 instead of an error","Using an invalid -O falls back on -O3 instead of an error\n\nSummary:\nCurrently with clang:\n$ clang -O20 foo.c\nerror: invalid value \'20\' in \'-O20\'\n\nWith the patch:\n$ clang -O20 foo.c\nwarning: optimization level \'-O20\' is unsupported; using \'-O3\' instead.\n1 warning generated.\n\nThis matches the gcc behavior (with a warning added)\n\nPass all tests:\nTesting: 0 .. 10.. 20.. 30.. 40.. 50.. 60.. 70.. 80.. 90..\nTesting Time: 94.14s\n  Expected Passes    : 6721\n  Expected Failures  : 20\n  Unsupported Tests  : 17\n\n(which was not the case of http://llvm-reviews.chandlerc.com/D2125)\n\nReviewers: chandlerc, rafael, rengolin, hfinkel\n\nReviewed By: rengolin\n\nCC: cfe-commits\n\nDifferential Revision: http://llvm-reviews.chandlerc.com/D2152\n\nllvm-svn: 194817"},
		[c]={{bd,1617,"bool CompilerInvocation::ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK, DiagnosticsEngine &Diags, const llvm::Triple &T, const std::string &OutputFile, const LangOptions &LangOptsRef) {\n  // ...\n  if (OptimizationLevel > MaxOptLevel) {\n    // ...\n    Diags.Report(diag::warn_drv_optimization_value) << Args.getLastArg(OPT_O)->getAsString(Args) << \"-O\" << MaxOptLevel;"}},
		[m]={
			["clang/test/Frontend/invalid-o-level.c"]={"warning: optimization level \'-O8\' is not supported; using \'-O3\' instead"}
		}
	},
	["warn_drv_overriding_flag_option"]={
		[l]={"overriding-t-option"},
		[k]="overriding-t-option",
		[i]="warn_drv_overriding_flag_option",
		[h]="overriding \'%0\' option with \'%1\'",
		[b]="overriding \'A\' option with \'B\'",
		[f]=j,
		[g]="overriding \'(.*?)\' option with \'(.*?)\'",
		[e]=" \\[(?:\\-Werror,)?\\-Woverriding\\-t\\-option[^\\]]*\\]",
		[a]=A,
		[d]={"d9ad0681fad9",1378917521,"clang-cl: Warn about overriding /MD with /MT etc.","clang-cl: Warn about overriding /MD with /MT etc.\n\nThis also bakes the /M options into a separate option group to make\nthem easier to refer to from the code.\n\nllvm-svn: 190529"},
		[c]={{Rb,2622,"// Construct a the list of inputs and their types.\nvoid Driver::BuildInputs(const ToolChain &TC, DerivedArgList &Args, InputList &Inputs) const {\n  // ...\n  // The last /TC or /TP option sets the input type to C or C++ globally.\n  if (Arg *TCTP = Args.getLastArgNoClaim(options::OPT__SLASH_TC, options::OPT__SLASH_TP)) {\n    // ...\n    for (Arg *A : Args.filtered(options::OPT__SLASH_TC, options::OPT__SLASH_TP)) {\n      if (Previous) {\n        Diag(clang::diag::warn_drv_overriding_flag_option) << Previous->getSpelling() << A->getSpelling();"},{cb,2842,"static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D, bool OFastEnabled, const ArgList &Args, ArgStringList &CmdArgs, const JobAction &JA) {\n  // ...\n  for (const Arg *A : Args) {\n    // ...\n    case options::OPT_ffp_model_EQ: {\n      // ...\n      if (OFastEnabled && !Val.equals(\"fast\")) {\n        // ...\n        D.Diag(clang::diag::warn_drv_overriding_flag_option) << Args.MakeArgString(\"-ffp-model=\" + Val) << \"-Ofast\";"},{cb,2853,"static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D, bool OFastEnabled, const ArgList &Args, ArgStringList &CmdArgs, const JobAction &JA) {\n  // ...\n  for (const Arg *A : Args) {\n    // ...\n    case options::OPT_ffp_model_EQ: {\n      // ...\n      // ffp-model= is a Driver option, it is entirely rewritten into more\n      // granular options before being passed into cc1.\n      // Use the gcc option in the switch below.\n      if (!FPModel.empty() && !FPModel.equals(Val))\n        D.Diag(clang::diag::warn_drv_overriding_flag_option) << Args.MakeArgString(\"-ffp-model=\" + FPModel) << Args.MakeArgString(\"-ffp-model=\" + Val);"},{cb,2902,"static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D, bool OFastEnabled, const ArgList &Args, ArgStringList &CmdArgs, const JobAction &JA) {\n  // ...\n  for (const Arg *A : Args) {\n    // ...\n    case options::OPT_ftrapping_math:\n      if (!TrappingMathPresent && !FPExceptionBehavior.empty() && !FPExceptionBehavior.equals(\"strict\"))\n        // ...\n        D.Diag(clang::diag::warn_drv_overriding_flag_option) << Args.MakeArgString(\"-ffp-exception-behavior=\" + FPExceptionBehavior) << \"-ftrapping-math\";"},{cb,2913,"static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D, bool OFastEnabled, const ArgList &Args, ArgStringList &CmdArgs, const JobAction &JA) {\n  // ...\n  for (const Arg *A : Args) {\n    // ...\n    case options::OPT_fno_trapping_math:\n      if (!TrappingMathPresent && !FPExceptionBehavior.empty() && !FPExceptionBehavior.equals(\"ignore\"))\n        // ...\n        D.Diag(clang::diag::warn_drv_overriding_flag_option) << Args.MakeArgString(\"-ffp-exception-behavior=\" + FPExceptionBehavior) << \"-fno-trapping-math\";"},{cb,2978,"static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D, bool OFastEnabled, const ArgList &Args, ArgStringList &CmdArgs, const JobAction &JA) {\n  // ...\n  for (const Arg *A : Args) {\n    // ...\n    // Validate and pass through -ffp-exception-behavior option.\n    case options::OPT_ffp_exception_behavior_EQ: {\n      // ...\n      if (!TrappingMathPresent && !FPExceptionBehavior.empty() && !FPExceptionBehavior.equals(Val))\n        // ...\n        D.Diag(clang::diag::warn_drv_overriding_flag_option) << Args.MakeArgString(\"-ffp-exception-behavior=\" + FPExceptionBehavior) << Args.MakeArgString(\"-ffp-exception-behavior=\" + Val);"},{cb,3126,"static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D, bool OFastEnabled, const ArgList &Args, ArgStringList &CmdArgs, const JobAction &JA) {\n  // ...\n  for (const Arg *A : Args) {\n    // ...\n    if (StrictFPModel) {\n      // If -ffp-model=strict has been specified on command line but\n      // subsequent options conflict then emit warning diagnostic.\n      if (HonorINFs && HonorNaNs && !AssociativeMath && !ReciprocalMath && SignedZeros && TrappingMath && RoundingFPMath && !ApproxFunc && DenormalFPMath == llvm::DenormalMode::getIEEE() && DenormalFP32Math == llvm::DenormalMode::getIEEE() && FPContract.equals(\"off\"))\n      // ...\n      else {\n        // ...\n        if (RHS != \"-ffp-model=strict\")\n          D.Diag(clang::diag::warn_drv_overriding_flag_option) << \"-ffp-model=strict\" << RHS;"},{cb,3220,"static void RenderFloatingPointOptions(const ToolChain &TC, const Driver &D, bool OFastEnabled, const ArgList &Args, ArgStringList &CmdArgs, const JobAction &JA) {\n  // ...\n  // -ffast-math enables the __FAST_MATH__ preprocessor macro, but check for the\n  // individual features enabled by -ffast-math instead of the option itself as\n  // that\'s consistent with gcc\'s behaviour.\n  if (!HonorINFs && !HonorNaNs && !MathErrno && AssociativeMath && ApproxFunc && ReciprocalMath && !SignedZeros && !TrappingMath && !RoundingFPMath) {\n    // ...\n    if (FPModel.equals(\"fast\")) {\n      if (FPContract.equals(\"fast\"))\n      // ...\n      else if (FPContract.empty())\n      // ...\n      else\n        D.Diag(clang::diag::warn_drv_overriding_flag_option) << \"-ffp-model=fast\" << Args.MakeArgString(\"-ffp-contract=\" + FPContract);"},{"clang/lib/Driver/ToolChains/Darwin.cpp",2202,"void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {\n  // ...\n  if (OSTarget) {\n    // ...\n    if (OSVersionArgTarget) {\n      // ...\n      if (OSTarget->getPlatform() != OSVersionArgTarget->getPlatform() || (Driver::GetReleaseVersion(OSTarget->getOSVersion(), TargetMajor, TargetMinor, TargetMicro, TargetExtra) && Driver::GetReleaseVersion(OSVersionArgTarget->getOSVersion(), ArgMajor, ArgMinor, ArgMicro, ArgExtra) && (VersionTuple(TargetMajor, TargetMinor, TargetMicro) != VersionTuple(ArgMajor, ArgMinor, ArgMicro) || TargetExtra != ArgExtra))) {\n        // Select the OS version from the -m<os>-version-min argument when\n        // the -target does not include an OS version.\n        if (OSTarget->getPlatform() == OSVersionArgTarget->getPlatform() && !OSTarget->hasOSVersion()) {\n        // ...\n        } else {\n          // ...\n          getDriver().Diag(clang::diag::warn_drv_overriding_flag_option) << OSVersionArg << TargetArg;"}},
		[m]={
			["clang/test/CodeGen/ffp-model.c"]={"clang: warning: overriding \'-ffp-model=strict\' option with \'-ffast-math\' [-Woverriding-t-option]"}
		}
	},
	["warn_drv_partially_supported_cuda_version"]={
		[l]={"unknown-cuda-version"},
		[k]="unknown-cuda-version",
		[i]={{nil,x,"warn_drv_partially_supported_cuda_version"}},
		[h]={{nil,x,"CUDA version %0 is only partially supported"}},
		[b]={{nil,x,"CUDA version A is only partially supported"}},
		[f]=j,
		[g]="CUDA version (.*?) is only partially supported",
		[e]=" \\[(?:\\-Werror,)?\\-Wunknown\\-cuda\\-version[^\\]]*\\]",
		[a]={{nil,x,A}},
		[d]={hc,1610286626,lc,ic},
		[c]={{"clang/lib/Driver/ToolChains/Cuda.cpp",124,"void CudaInstallationDetector::WarnIfUnsupportedVersion() {\n  if (Version > CudaVersion::PARTIALLY_SUPPORTED) {\n  // ...\n  } else if (Version > CudaVersion::FULLY_SUPPORTED)\n    D.Diag(diag::warn_drv_partially_supported_cuda_version) << CudaVersionToString(Version);"}}
	},
	["warn_drv_pch_not_first_include"]={
		[i]="warn_drv_pch_not_first_include",
		[h]="precompiled header \'%0\' was ignored because \'%1\' is not first \'-include\'",
		[b]="precompiled header \'A\' was ignored because \'B\' is not first \'-include\'",
		[f]=j,
		[g]="precompiled header \'(.*?)\' was ignored because \'(.*?)\' is not first \'\\-include\'",
		[e]=Xc,
		[a]=A,
		[d]={"2f23b414e9bc",1285865627,"Driver: Ignore the found PCH file if its \'-include\' is not the first one.","Driver: Ignore the found PCH file if its \'-include\' is not the first one.\n\nllvm-svn: 115158"},
		[c]={{cb,1300,"void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA, const Driver &D, const ArgList &Args, ArgStringList &CmdArgs, const InputInfo &Output, const InputInfoList &Inputs) const {\n  // ...\n  for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {\n    if (A->getOption().matches(options::OPT_include) && D.getProbePrecompiled()) {\n      // ...\n      if (FoundPCH) {\n        if (IsFirstImplicitInclude) {\n        // ...\n        } else {\n          // ...\n          D.Diag(diag::warn_drv_pch_not_first_include) << P << A->getAsString(Args);"}}
	},
	["warn_drv_potentially_misspelled_joined_argument"]={
		[l]={Fc},
		[k]=Fc,
		[i]={{nil,U,"warn_drv_potentially_misspelled_joined_argument"}},
		[h]={{nil,U,"joined argument treated as \'%0\'; did you mean \'%1\'?"}},
		[b]={{nil,U,"joined argument treated as \'A\'; did you mean \'B\'?"}},
		[f]=j,
		[g]="joined argument treated as \'(.*?)\'; did you mean \'(.*?)\'\\?",
		[e]=" \\[(?:\\-Werror,)?\\-Wunknown\\-argument[^\\]]*\\]",
		[a]={{nil,U,A}},
		[d]={"5aba68960719",1665085845,"[Clang] Emit a warning for ambiguous joined \'-o\' arguments","[Clang] Emit a warning for ambiguous joined \'-o\' arguments\n\nThe offloading toolchain makes heavy use of options beginning with\n`--o`. This is problematic when combined with the joined `-o` flag. In\nthe following situation, the user will not get the expected output and\nwill not notice as the expected output will still be written.\n```\nclang++ -x cuda foo.cu -offload-arch=sm_80 -o foo\n```\n\nThis patch introduces a warning that checks for joined `-o` arguments\nthat would also be a valid driver argument if an additional `-` were\nadded. I believe this situation is uncommon enough to warrant a warning,\nand can be trivially fixed by the end user by using the more common\nseparate form instead.\n\nReviewed By: tra, MaskRay\n\nDifferential Revision: https://reviews.llvm.org/D135389"},
		[c]={{Rb,350,"InputArgList Driver::ParseArgStrings(ArrayRef<const char *> ArgStrings, bool IsClCompatMode, bool &ContainsError) {\n  // ...\n  for (const Arg *A : Args.filtered(options::OPT_o)) {\n    // ...\n    if (getOpts().findExact(\"-\" + ArgString, Nearest, IncludedFlagsBitmask, ExcludedFlagsBitmask))\n      Diags.Report(diag::warn_drv_potentially_misspelled_joined_argument) << A->getAsString(Args) << Nearest;"}}
	},
	["warn_drv_preprocessed_input_file_unused"]={
		[l]={Ab},
		[k]=Ab,
		[i]="warn_drv_preprocessed_input_file_unused",
		[h]="%0: previously preprocessed input%select{ unused when \'%2\' is present|}1",
		[b]={{nil,nil,{"A: previously preprocessed input",{" unused when \'C\' is present",vb}}}},
		[f]=j,
		[g]="(.*?)\\: previously preprocessed input(?: unused when \'(.*?)\' is present|)",
		[e]=Qc,
		[a]=A,
		[d]={"07806ca7ab36",1253160806,"Improve driver error message when only running the preprocessor and an input is","Improve driver error message when only running the preprocessor and an input is\nalready preprocessed.\n\n--\nddunbar@giles:tmp$ touch t.i\nddunbar@giles:tmp$ gcc -E t.i\nddunbar@giles:tmp$ clang -E t.i\nclang: warning: t.i: previously preprocessed input unused when \'-E\' is present\nddunbar@giles:tmp$ \n--\n\n<rdar://problem/6813375> [driver] driver prints confusing message when running -E on preprocessed file\n\nllvm-svn: 82120"},
		[c]={{Rb,4027,"void Driver::handleArguments(Compilation &C, DerivedArgList &Args, const InputList &Inputs, ActionList &Actions) const {\n  // ...\n  for (auto &I : Inputs) {\n    // ...\n    if (InitialPhase > FinalPhase) {\n      // ...\n      // Special case when final phase determined by binary name, rather than\n      // by a command-line argument with a corresponding Arg.\n      if (CCCIsCPP())\n      // ...\n      // Special case \'-E\' warning on a previously preprocessed file to make\n      // more sense.\n      else if (InitialPhase == phases::Compile && (Args.getLastArg(options::OPT__SLASH_EP, options::OPT__SLASH_P) || Args.getLastArg(options::OPT_E) || Args.getLastArg(options::OPT_M, options::OPT_MM)) && getPreprocessedType(InputType) == types::TY_INVALID)\n        Diag(clang::diag::warn_drv_preprocessed_input_file_unused) << InputArg->getAsString(Args) << !!FinalPhaseArg << (FinalPhaseArg ? FinalPhaseArg->getOption().getName() : \"\");"}}
	},
	["warn_drv_ps_force_pic"]={
		[l]={mb},
		[k]=mb,
		[i]={{nil,D,"warn_drv_ps_force_pic"}},
		[h]={{nil,D,"option \'%0\' was ignored by the %1 toolchain, using \'-fPIC\'"}},
		[b]={{nil,D,"option \'A\' was ignored by the B toolchain, using \'-fPIC\'"}},
		[f]=j,
		[g]="option \'(.*?)\' was ignored by the (.*?) toolchain, using \'\\-fPIC\'",
		[e]=qc,
		[a]={{nil,D,A}},
		[d]={"aef03c9b3bed",1651866463,"[clang][auto-init] Deprecate -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clan...","[clang][auto-init] Deprecate -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang\n\nGCC 12 has been released and contains unconditional support for\n-ftrivial-auto-var-init=zero:\nhttps://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-ftrivial-auto-var-init\n\nMaintain compatibility with GCC, and remove the -enable flag for \"zero\"\nmode. The flag is left to generate an \"unused\" warning, though, to not\nbreak all the existing users. The flag will be fully removed in Clang 17.\n\nLink: https://github.com/llvm/llvm-project/issues/44842\n\nReviewed By: nickdesaulniers, MaskRay, srhines, xbolva00\n\nDifferential Revision: https://reviews.llvm.org/D125142"},
		[c]={{"clang/lib/Driver/ToolChains/CommonArgs.cpp",1517,"/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments.  Then,\n/// smooshes them together with platform defaults, to decide whether\n/// this compile should be using PIC mode or not. Returns a tuple of\n/// (RelocationModel, PICLevel, IsPIE).\nstd::tuple<llvm::Reloc::Model, unsigned, bool> tools::ParsePICArgs(const ToolChain &ToolChain, const ArgList &Args) {\n  // ...\n  // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness\n  // is forced, then neither PIC nor PIE flags will have no effect.\n  if (!ToolChain.isPICDefaultForced()) {\n    if (LastPICArg) {\n      // ...\n      if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) || O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {\n      // ...\n      } else {\n        // ...\n        if (EffectiveTriple.isPS()) {\n          // ...\n          if (Model != \"kernel\") {\n            // ...\n            ToolChain.getDriver().Diag(diag::warn_drv_ps_force_pic) << LastPICArg->getSpelling() << (EffectiveTriple.isPS4() ? \"PS4\" : \"PS5\");"}}
	},
	["warn_drv_sarif_format_unstable"]={
		[l]={"sarif-format-unstable"},
		[k]="sarif-format-unstable",
		[i]={{nil,D,"warn_drv_sarif_format_unstable"}},
		[h]={{nil,D,"diagnostic formatting in SARIF mode is currently unstable"}},
		[b]={{nil,D,"diagnostic formatting in SARIF mode is currently unstable"}},
		[f]=j,
		[g]="diagnostic formatting in SARIF mode is currently unstable",
		[e]=" \\[(?:\\-Werror,)?\\-Wsarif\\-format\\-unstable[^\\]]*\\]",
		[a]={{nil,D,A}},
		[d]={"aef03c9b3bed",1651866463,"[clang][auto-init] Deprecate -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clan...","[clang][auto-init] Deprecate -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang\n\nGCC 12 has been released and contains unconditional support for\n-ftrivial-auto-var-init=zero:\nhttps://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-ftrivial-auto-var-init\n\nMaintain compatibility with GCC, and remove the -enable flag for \"zero\"\nmode. The flag is left to generate an \"unused\" warning, though, to not\nbreak all the existing users. The flag will be fully removed in Clang 17.\n\nLink: https://github.com/llvm/llvm-project/issues/44842\n\nReviewed By: nickdesaulniers, MaskRay, srhines, xbolva00\n\nDifferential Revision: https://reviews.llvm.org/D125142"},
		[c]={{cb,4111,"static void RenderDiagnosticsOptions(const Driver &D, const ArgList &Args, ArgStringList &CmdArgs) {\n  // ...\n  if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {\n    // ...\n    if (StringRef(A->getValue()) == \"sarif\" || StringRef(A->getValue()) == \"SARIF\")\n      D.Diag(diag::warn_drv_sarif_format_unstable);"}},
		[m]={
			["clang/test/Frontend/sarif-diagnostics.cpp"]={"clang: warning: diagnostic formatting in SARIF mode is currently unstable [-Wsarif-format-unstable]"}
		}
	},
	["warn_drv_treating_input_as_cxx"]={
		[l]={ab},
		[k]=ab,
		[i]="warn_drv_treating_input_as_cxx",
		[h]="treating \'%0\' input as \'%1\' when in C++ mode, this behavior is deprecated",
		[b]="treating \'A\' input as \'B\' when in C++ mode, this behavior is deprecated",
		[f]=j,
		[g]="treating \'(.*?)\' input as \'(.*?)\' when in C\\+\\+ mode, this behavior is deprecated",
		[e]=" \\[(?:\\-Werror,)?\\-Wdeprecated[^\\]]*\\]",
		[a]=fb,
		[d]={"0ac9445098f7",1266438778,"PR5803: clang++: Treat untyped \'C\' inputs as C++.","PR5803: clang++: Treat untyped \'C\' inputs as C++.\n - Patch by Andrzej K. Haczewski, with a tweak by me to emit a \'deprecated\'\n   diagnostic when we do this. We\'ll see what zee users say.\n\nllvm-svn: 96511"},
		[c]={{Rb,2702,"// Construct a the list of inputs and their types.\nvoid Driver::BuildInputs(const ToolChain &TC, DerivedArgList &Args, InputList &Inputs) const {\n  // ...\n  for (Arg *A : Args) {\n    if (A->getOption().getKind() == Option::InputClass) {\n      // ...\n      // Infer the input type if necessary.\n      if (InputType == types::TY_Nothing) {\n        // ...\n        // stdin must be handled specially.\n        if (memcmp(Value, \"-\", 2) == 0) {\n        // ...\n        } else {\n          // ...\n          // If the driver is invoked as C++ compiler (like clang++ or c++) it\n          // should autodetect some input files as C++ for g++ compatibility.\n          if (CCCIsCXX()) {\n            // ...\n            // Do not complain about foo.h, when we are known to be processing\n            // it as a C++20 header unit.\n            if (Ty != OldTy && !(OldTy == types::TY_CHeader && hasHeaderMode()))\n              Diag(clang::diag::warn_drv_treating_input_as_cxx) << getTypeName(OldTy) << getTypeName(Ty);"}},
		[m]={
			["clang/test/Driver/aix-ld.c"]={"clang: warning: treating \'c\' input as \'c++\' when in C++ mode, this behavior is deprecated [-Wdeprecated]"}
		}
	},
	["warn_drv_unable_to_find_directory_expected"]={
		[l]={"invalid-or-nonexistent-directory"},
		[k]="invalid-or-nonexistent-directory",
		[i]="warn_drv_unable_to_find_directory_expected",
		[h]="unable to find %0 directory, expected to be in \'%1\' found via %2",
		[b]="unable to find A directory, expected to be in \'B\' found via C",
		[f]=j,
		[g]="unable to find (.*?) directory, expected to be in \'(.*?)\' found via (.*?)",
		[e]=" \\[(?:\\-Werror,)?\\-Winvalid\\-or\\-nonexistent\\-directory[^\\]]*\\]",
		[a]=A,
		[d]={"c52c30a78e7c",1443132412,"This patch adds missing pieces to clang, including the PS4 toolchain","This patch adds missing pieces to clang, including the PS4 toolchain\ndefinition, added warnings, PS4 defaults, and Driver changes needed for\nour compiler.\n\nA patch by Filipe Cabecinhas, Pierre Gousseau and Katya Romanova!\n\nDifferential Revision: http://reviews.llvm.org/D11279\n\nllvm-svn: 248546"},
		[c]={{"clang/lib/Driver/ToolChains/PS4CPU.cpp",285,"toolchains::PS4PS5Base::PS4PS5Base(const Driver &D, const llvm::Triple &Triple, const ArgList &Args, StringRef Platform, const char *EnvVar) : Generic_ELF(D, Triple, Args) {\n  // ...\n  if (!Args.hasArg(options::OPT_nostdinc) && !Args.hasArg(options::OPT_nostdlibinc) && !Args.hasArg(options::OPT_isysroot) && !Args.hasArg(options::OPT__sysroot_EQ) && !llvm::sys::fs::exists(SDKIncludeDir)) {\n    D.Diag(clang::diag::warn_drv_unable_to_find_directory_expected) << Twine(Platform, \" system headers\").str() << SDKIncludeDir << Whence;"},{"clang/lib/Driver/ToolChains/PS4CPU.cpp",297,"toolchains::PS4PS5Base::PS4PS5Base(const Driver &D, const llvm::Triple &Triple, const ArgList &Args, StringRef Platform, const char *EnvVar) : Generic_ELF(D, Triple, Args) {\n  // ...\n  if (!Args.hasArg(options::OPT_nostdlib) && !Args.hasArg(options::OPT_nodefaultlibs) && !Args.hasArg(options::OPT__sysroot_EQ) && !Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT_c) && !Args.hasArg(options::OPT_S) && !Args.hasArg(options::OPT_emit_ast) && !llvm::sys::fs::exists(SDKLibDir)) {\n    D.Diag(clang::diag::warn_drv_unable_to_find_directory_expected) << Twine(Platform, \" system libraries\").str() << SDKLibDir << Whence;"}}
	},
	["warn_drv_unknown_argument_clang_cl"]={
		[l]={Fc},
		[k]=Fc,
		[i]="warn_drv_unknown_argument_clang_cl",
		[h]="unknown argument ignored in clang-cl: \'%0\'",
		[b]="unknown argument ignored in clang-cl: \'A\'",
		[f]=j,
		[g]="unknown argument ignored in clang\\-cl\\: \'(.*?)\'",
		[e]=" \\[(?:\\-Werror,)?\\-Wunknown\\-argument[^\\]]*\\]",
		[a]=A,
		[d]={"d851833c9a76",1453756492,"[MSVC Compat] Only warn for unknown clang-cl arguments","[MSVC Compat] Only warn for unknown clang-cl arguments\n\nSummary:\nMSVC\'s driver accepts all unknown arguments but warns about them.  clang\nby default rejects all unknown arguments.  This causes issues\nspecifically with build systems such as autoconf which liberally pass\nthings such as $LDFLAGS to the compiler and expect everything to work.\nThis patch teaches clang-cl to ignore unknown driver arguments.\n\nReviewers: rnk\n\nSubscribers: cfe-commits\n\nDifferential Revision: http://reviews.llvm.org/D16511\n\nllvm-svn: 258720"},
		[c]={{Rb,327,"InputArgList Driver::ParseArgStrings(ArrayRef<const char *> ArgStrings, bool IsClCompatMode, bool &ContainsError) {\n  // ...\n  for (const Arg *A : Args.filtered(options::OPT_UNKNOWN)) {\n    // ...\n    if (getOpts().findNearest(ArgString, Nearest, IncludedFlagsBitmask, ExcludedFlagsBitmask) > 1) {\n      if (!IsCLMode() && getOpts().findExact(ArgString, Nearest, options::CC1Option)) {\n      // ...\n      } else {\n        DiagID = IsCLMode() ? diag::warn_drv_unknown_argument_clang_cl : diag::err_drv_unknown_argument;"}}
	},
	["warn_drv_unknown_argument_clang_cl_with_suggestion"]={
		[l]={Fc},
		[k]=Fc,
		[i]={{nil,O,"warn_drv_unknown_argument_clang_cl_with_suggestion"}},
		[h]={{nil,t,"unknown argument ignored in clang-cl \'%0\'; did you mean \'%1\'?"},{v,O,"unknown argument ignored in clang-cl \'%0\' (did you mean \'%1\'?)"}},
		[b]={{nil,t,"unknown argument ignored in clang-cl \'A\'; did you mean \'B\'?"},{v,O,"unknown argument ignored in clang-cl \'A\' (did you mean \'B\'?)"}},
		[f]=j,
		[g]="unknown argument ignored in clang\\-cl \'(.*?)\'; did you mean \'(.*?)\'\\?",
		[e]=" \\[(?:\\-Werror,)?\\-Wunknown\\-argument[^\\]]*\\]",
		[a]={{nil,O,A}},
		[d]={"24910765e266",1515198340,"[Driver] Suggest correctly spelled driver options","[Driver] Suggest correctly spelled driver options\n\nSummary:\nDepends on https://reviews.llvm.org/D41732.\n\nUtilities such as `opt`, when invoked with arguments that are very\nnearly spelled correctly, suggest the correctly spelled options:\n\n```\nbin/opt -hel\nopt: Unknown command line argument \'-hel\'.  Try: \'bin/opt -help\'\nopt: Did you mean \'-help\'?\n```\n\nClang, on the other hand, prior to this commit, does not:\n\n```\nbin/clang -hel\nclang-6.0: error: unknown argument: \'-hel\'\n```\n\nThis commit makes use of the new libLLVMOption API from\nhttps://reviews.llvm.org/D41732 in order to provide correct suggestions:\n\n```\nbin/clang -hel\nclang-6.0: error: unknown argument: \'-hel\', did you mean \'-help\'?\n```\n\nTest Plan: `check-clang`\n\nReviewers: yamaguchi, v.g.vassilev, teemperor, ruiu, bruno\n\nReviewed By: bruno\n\nSubscribers: bruno, jroelofs, cfe-commits\n\nDifferential Revision: https://reviews.llvm.org/D41733\n\nllvm-svn: 321917"},
		[c]={{Rb,333,"InputArgList Driver::ParseArgStrings(ArrayRef<const char *> ArgStrings, bool IsClCompatMode, bool &ContainsError) {\n  // ...\n  for (const Arg *A : Args.filtered(options::OPT_UNKNOWN)) {\n    // ...\n    if (getOpts().findNearest(ArgString, Nearest, IncludedFlagsBitmask, ExcludedFlagsBitmask) > 1) {\n    // ...\n    } else {\n      DiagID = IsCLMode() ? diag::warn_drv_unknown_argument_clang_cl_with_suggestion : diag::err_drv_unknown_argument_with_suggestion;"}}
	},
	["warn_drv_unsupported_debug_info_opt_for_target"]={
		[l]={"unsupported-target-opt"},
		[k]="unsupported-target-opt",
		[i]={{nil,O,"warn_drv_unsupported_debug_info_opt_for_target"}},
		[h]={{nil,O,"debug information option \'%0\' is not supported for target \'%1\'"}},
		[b]={{nil,O,"debug information option \'A\' is not supported for target \'B\'"}},
		[f]=j,
		[g]="debug information option \'(.*?)\' is not supported for target \'(.*?)\'",
		[e]=" \\[(?:\\-Werror,)?\\-Wunsupported\\-target\\-opt[^\\]]*\\]",
		[a]={{nil,O,A}},
		[d]={"b83b4e40fe43",1532720714,"[DEBUGINFO] Disable unsupported debug info options for NVPTX target.","[DEBUGINFO] Disable unsupported debug info options for NVPTX target.\n\nSummary:\nSome targets support only default set of the debug options and do not\nsupport additional debug options, like NVPTX target. Patch introduced\nvirtual function supportsDebugInfoOptions() that can be overloaded\nby the toolchain, checks if the target supports some debug\noptions and emits warning when an unsupported debug option is\nfound.\n\nReviewers: echristo\n\nSubscribers: aprantl, JDevlieghere, cfe-commits\n\nDifferential Revision: https://reviews.llvm.org/D49148\n\nllvm-svn: 338155"},
		[c]={{cb,1012,"static bool checkDebugInfoOption(const Arg *A, const ArgList &Args, const Driver &D, const ToolChain &TC) {\n  // ...\n  D.Diag(diag::warn_drv_unsupported_debug_info_opt_for_target) << A->getAsString(Args) << TC.getTripleString();"}}
	},
	["warn_drv_unsupported_diag_option_for_flang"]={
		[l]={mb},
		[k]=mb,
		[i]="warn_drv_unsupported_diag_option_for_flang",
		[h]="The warning option \'-%0\' is not supported",
		[b]="The warning option \'-A\' is not supported",
		[f]=j,
		[g]="The warning option \'\\-(.*?)\' is not supported",
		[e]=qc,
		[a]=A,
		[d]={"ce3a1c59e180",1677017374,"[flang] Handle unsupported warning flags","[flang] Handle unsupported warning flags\n\nThis PR makes flang emit a warning when the user passes an unsupported gfortran warning flag in as a CLI arg.  This PR also checks each `-W` argument instead of just looking at the last one passed in.\n\nReviewed By: awarzynski\n\nDifferential Revision: https://reviews.llvm.org/D143301"},
		[c]={{"clang/lib/Driver/ToolChains/Flang.cpp",499,"void Flang::ConstructJob(Compilation &C, const JobAction &JA, const InputInfo &Output, const InputInfoList &Inputs, const ArgList &Args, const char *LinkingOutput) const {\n  // ...\n  // Remove any unsupported gfortran diagnostic options\n  for (const Arg *A : Args.filtered(options::OPT_flang_ignored_w_Group)) {\n    // ...\n    D.Diag(diag::warn_drv_unsupported_diag_option_for_flang) << A->getOption().getName();"}}
	},
	["warn_drv_unsupported_float_abi_by_lib"]={
		[l]={"unsupported-abi"},
		[k]="unsupported-abi",
		[i]={{nil,x,"warn_drv_unsupported_float_abi_by_lib"}},
		[h]={{nil,x,"float ABI \'%0\' is not supported by current library"}},
		[b]={{nil,x,"float ABI \'A\' is not supported by current library"}},
		[f]=j,
		[g]="float ABI \'(.*?)\' is not supported by current library",
		[e]=" \\[(?:\\-Werror,)?\\-Wunsupported\\-abi[^\\]]*\\]",
		[a]={{nil,x,A}},
		[d]={hc,1610286626,lc,ic},
		[c]={{"clang/lib/Driver/ToolChains/PPCLinux.cpp",57,"PPCLinuxToolChain::PPCLinuxToolChain(const Driver &D, const llvm::Triple &Triple, const llvm::opt::ArgList &Args) : Linux(D, Triple, Args) {\n  if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {\n    // ...\n    if ((ABIName == \"ieeelongdouble\" && !SupportIEEEFloat128(D, Triple, Args)) || (ABIName == \"ibmlongdouble\" && !supportIBMLongDouble(D, Args)))\n      D.Diag(diag::warn_drv_unsupported_float_abi_by_lib) << ABIName;"}},
		[m]={
			["clang/test/CodeGen/PowerPC/ppc64-long-double.cpp"]={"clang: warning: float ABI \'ieeelongdouble\' is not supported by current library [-Wunsupported-abi]"}
		}
	},
	["warn_drv_unsupported_gpopt"]={
		[l]={"unsupported-gpopt"},
		[k]="unsupported-gpopt",
		[i]={{nil,H,"warn_drv_unsupported_gpopt"}},
		[h]={{nil,H,"ignoring \'-mgpopt\' option as it cannot be used with %select{|the implicit usage of }0-mabicalls"}},
		[b]={{nil,H,{"ignoring \'-mgpopt\' option as it cannot be used with ",{vb,"the implicit usage of "},"-mabicalls"}}},
		[f]=j,
		[g]="ignoring \'\\-mgpopt\' option as it cannot be used with (?:|the implicit usage of )\\-mabicalls",
		[e]=" \\[(?:\\-Werror,)?\\-Wunsupported\\-gpopt[^\\]]*\\]",
		[a]={{nil,H,A}},
		[d]={"e435e41e01b6",1500460683,"[mips] Teach the driver to accept -m(no-)gpopt.","[mips] Teach the driver to accept -m(no-)gpopt.\n\nThis patch teaches the driver to pass -mgpopt by default to the backend when it\nis supported, i.e. we are using -mno-abicalls.\n\nReviewers: atanasyan, slthakur\n\nDifferential Revision: https://reviews.llvm.org/D35548\n\nllvm-svn: 308431"},
		[c]={{cb,1992,"void Clang::AddMIPSTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const {\n  // ...\n  // We quietly ignore -mno-gpopt as the backend defaults to -mno-gpopt.\n  if (NoABICalls && (!GPOpt || WantGPOpt)) {\n  // ...\n  } else if ((!ABICalls || (!NoABICalls && ABICalls)) && WantGPOpt)\n    D.Diag(diag::warn_drv_unsupported_gpopt) << (ABICalls ? 0 : 1);"}}
	}
};