Module:ClangDiags/DiagsLongData10

From emmtrix Wiki
Jump to navigation Jump to search

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

local a="id_hist";
local b="message_hist";
local c="hierarchical_hist";
local d="regex1";
local e="regex2";
local f="regex3";
local g="category_hist";
local h="commit";
local i="source";
local j="tests2";
local k="";
local l="(?:error|fatal error)\\: ";
local m="Semantic Issue";
local n="groups";
local o="maingroup";
local p="(?:warning|error|fatal error)\\: ";
local q="10.0";
local r="clang/lib/Sema/SemaDeclCXX.cpp";
local s="Parse Issue";
local t="None";
local u="clang/lib/Sema/SemaDecl.cpp";
local v="clang/lib/Sema/SemaExpr.cpp";
local w="pedantic";
local x="13.0";
local y="9.0";
local z="6.0";
local A="15.0";
local B="16.0";
local C="11.0";
local D="clang/lib/Parse/ParseDecl.cpp";
local E="5.0";
local F="95f50964fbf5";
local G="Implement P2361 Unevaluated string literals";
local H="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 I="Lexical or Preprocessor Issue";
local J="c++20-extensions";
local K="clang/lib/Sema/SemaChecking.cpp";
local L="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";
local M="The basic representation of diagnostics information in tablegen format, plus (uncommented and incomp...";
local N="Update tablegen diagnostic files to be in sync with the def files.";
local O="5a8987ca5113";
local P="Update tablegen diagnostic files to be in sync with the def files.\n\nllvm-svn: 67004";
local Q="b1c4d5507fad";
local R="clang/lib/Sema/SemaExprCXX.cpp";
local S="c++23-extensions";
local T="14.0";
local U="clang/lib/Sema/SemaType.cpp";
local V="clang/lib/Frontend/VerifyDiagnosticConsumer.cpp";
local W="c99-extensions";
local X="8.0";
local Y="clang/lib/Parse/ParseDeclCXX.cpp";
local Z="clang/lib/Sema/SemaTemplate.cpp";
local ab="clang/lib/Sema/SemaDeclObjC.cpp";
local bb="7.0";
local cb="c++2a-extensions";
local db="c++14-extensions";
local eb="c2x-extensions";
local fb="function";
local gb="constructor";
local hb="c++11-extensions";
local ib="c++17-extensions";
local jb="clang/lib/Lex/LiteralSupport.cpp";
local kb="clang/lib/Lex/Lexer.cpp";
local lb="clang/test/Sema/wasm-refs-and-tables.c";
local mb=" \\[(?:\\-Werror,)?\\-Wc\\+\\+20\\-extensions[^\\]]*\\]";
local nb="clang/lib/Sema/SemaInit.cpp";
local ob=" \\[(?:\\-Werror,)?\\-Wc\\+\\+23\\-extensions[^\\]]*\\]";
local pb="#error";
local qb="[C++20][Modules][3/8] Initial handling for module partitions.";
local rb="69350e569dc4";
local sb="c++2b-extensions";
local tb="clang/lib/Parse/ParseExprCXX.cpp";
local ub="[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 vb=" \\[(?:\\-Werror,)?\\-Wc99\\-extensions[^\\]]*\\]";
local wb="c++1y-extensions";
local xb="clang/lib/Sema/SemaDeclAttr.cpp";
local yb="clang/lib/Parse/ParseObjc.cpp";
local zb="clang/lib/Lex/PPDirectives.cpp";
local Ab="clang/test/Sema/vla.c";
local Bb="enumerator value";
local Cb="clang/lib/Parse/Parser.cpp";
local Db="clang/lib/AST/ASTImporter.cpp";
local Eb="clang/lib/Parse/ParseExpr.cpp";
local Fb="c11-extensions";
local Gb=" \\[(?:\\-Werror,)?\\-Wc2x\\-extensions[^\\]]*\\]";
local Hb="clang/lib/Sema/SemaCast.cpp";
local Ib="c++1z-extensions";
local Jb="clang/lib/Sema/SemaExprObjC.cpp";
local Kb="c++0x-extensions";
local Lb="clang/test/SemaCXX/unknown-anytype.cpp";
local Mb=" \\[(?:\\-Werror,)?\\-Wc\\+\\+11\\-extensions[^\\]]*\\]";
local Nb=" \\[(?:\\-Werror,)?\\-Wc\\+\\+17\\-extensions[^\\]]*\\]";
local Ob="clang/lib/Sema/SemaTemplateInstantiateDecl.cpp";
local Pb="7c11da0cfd33";
local Qb=" \\[(?:\\-Werror,)?\\-Wc\\+\\+14\\-extensions[^\\]]*\\]";
local Rb="clang/lib/Parse/ParseStmt.cpp";
local Sb="clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp";
local Tb="clang/lib/Sema/SemaObjCProperty.cpp";
local Ub="microsoft";
local Vb=" ";
local Wb="[clang] New __attribute__((__clang_arm_mve_alias)).";
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";

return {
	["err_typename_not_type"]={
		[a]={{nil,q,"err_typename_not_type"}},
		[b]={{nil,q,"typename specifier refers to non-type %0"}},
		[c]={{nil,q,"typename specifier refers to non-type A"}},
		[d]=l,
		[e]="typename specifier refers to non\\-type (.*?)",
		[f]=k,
		[g]={{nil,q,m}},
		[h]={"6d485ff455ea",1576172311,"Improve static checks for sprintf and __builtin___sprintf_chk","Improve static checks for sprintf and __builtin___sprintf_chk\n\nImplement a pessimistic evaluator of the minimal required size for a buffer\nbased on the format string, and couple that with the fortified version to emit a\nwarning when the buffer size is lower than the lower bound computed from the\nformat string.\n\nDifferential Revision: https://reviews.llvm.org/D71566"},
		[i]={{Z,11146,"/// Build the type that describes a C++ typename specifier,\n/// e.g., \"typename T::type\".\nQualType Sema::CheckTypenameType(ElaboratedTypeKeyword Keyword, SourceLocation KeywordLoc, NestedNameSpecifierLoc QualifierLoc, const IdentifierInfo &II, SourceLocation IILoc, bool DeducedTSTContext) {\n  // ...\n  case LookupResult::Found:\n    // ...\n    DiagID = Ctx ? diag::err_typename_nested_not_type : diag::err_typename_not_type;"},{Z,11152,"/// Build the type that describes a C++ typename specifier,\n/// e.g., \"typename T::type\".\nQualType Sema::CheckTypenameType(ElaboratedTypeKeyword Keyword, SourceLocation KeywordLoc, NestedNameSpecifierLoc QualifierLoc, const IdentifierInfo &II, SourceLocation IILoc, bool DeducedTSTContext) {\n  // ...\n  case LookupResult::FoundOverloaded:\n    DiagID = Ctx ? diag::err_typename_nested_not_type : diag::err_typename_not_type;"}},
		[j]={
			["clang/test/CXX/expr/expr.prim/expr.prim.req/type-requirement.cpp"]={"clang/test/CXX/expr/expr.prim/expr.prim.req/type-requirement.cpp:37:37: error: typename specifier refers to non-type \'C\'"}
		}
	},
	["err_typename_refers_to_non_type_template"]={
		[a]="err_typename_refers_to_non_type_template",
		[b]="typename specifier refers to a non-type template",
		[c]="typename specifier refers to a non-type template",
		[d]=l,
		[e]="typename specifier refers to a non\\-type template",
		[f]=k,
		[g]=s,
		[h]={"dce2b62b7006",1238545739,"Parsing, semantic analysis, and template instantiation for typename","Parsing, semantic analysis, and template instantiation for typename\nspecifiers that terminate in a simple-template-id, e.g.,\n\n  typename MetaFun::template apply<T1, T2>\n\nAlso, implement template instantiation for dependent\nnested-name-specifiers that involve unresolved identifiers, e.g.,\n\n  typename T::type::type\n\nllvm-svn: 68166"},
		[i]={{Cb,2017,"/// TryAnnotateTypeOrScopeToken - If the current token position is on a\n/// typename (possibly qualified in C++) or a C++ scope specifier not followed\n/// by a typename, TryAnnotateTypeOrScopeToken will replace one or more tokens\n/// with a single annotation token representing the typename or C++ scope\n/// respectively.\n/// This simplifies handling of C++ scope specifiers and allows efficient\n/// backtracking without the need to re-parse and resolve nested-names and\n/// typenames.\n/// It will mainly be called when we expect to treat identifiers as typenames\n/// (if they are typenames). For example, in C we do not expect identifiers\n/// inside expressions to be treated as typenames so it will not be called\n/// for expressions in C.\n/// The benefit for C/ObjC is that a typename will be annotated and\n/// Actions.getTypeName will not be needed to be called again (e.g. getTypeName\n/// will not be called twice, once to check whether we have a declaration\n/// specifier, and another one to get the actual type inside\n/// ParseDeclarationSpecifiers).\n///\n/// This returns true if an error occurred.\n///\n/// Note that this routine emits an error if you call it with ::new or ::delete\n/// as the current tokens, so only call it in contexts where these are invalid.\nbool Parser::TryAnnotateTypeOrScopeToken(ImplicitTypenameContext AllowImplicitTypename) {\n  // ...\n  if (Tok.is(tok::kw_typename)) {\n    // ...\n    if (Tok.is(tok::identifier)) {\n    // ...\n    } else if (Tok.is(tok::annot_template_id)) {\n      // ...\n      if (!TemplateId->mightBeType()) {\n        Diag(Tok, diag::err_typename_refers_to_non_type_template) << Tok.getAnnotationRange();"}},
		[j]={
			["clang/test/CXX/drs/dr3xx.cpp"]={"clang/test/CXX/drs/dr3xx.cpp:30:17: error: typename specifier refers to a non-type template"}
		}
	},
	["err_typename_refers_to_using_value_decl"]={
		[a]="err_typename_refers_to_using_value_decl",
		[b]="typename specifier refers to a dependent using declaration for a value %0 in %1",
		[c]="typename specifier refers to a dependent using declaration for a value A in B",
		[d]=l,
		[e]="typename specifier refers to a dependent using declaration for a value (.*?) in (.*?)",
		[f]=k,
		[g]=m,
		[h]={"aed2efbbb54f",1291853187,"A typename specifier can end up referring to a unresolved using","A typename specifier can end up referring to a unresolved using\ndeclaration that is a value in ill-formed code. Instead of crashing,\ntreat this as a dependent typename specifier and suggest that the\nusing add \"typename\" into the using declaration. Fixes <rdar://problem/8740998>.\n\nllvm-svn: 121322"},
		[i]={{Z,11068,"/// Build the type that describes a C++ typename specifier,\n/// e.g., \"typename T::type\".\nQualType Sema::CheckTypenameType(ElaboratedTypeKeyword Keyword, SourceLocation KeywordLoc, NestedNameSpecifierLoc QualifierLoc, const IdentifierInfo &II, SourceLocation IILoc, bool DeducedTSTContext) {\n  // ...\n  case LookupResult::FoundUnresolvedValue: {\n    // ...\n    Diag(IILoc, diag::err_typename_refers_to_using_value_decl) << Name << Ctx << FullRange;"}},
		[j]={
			["clang/test/SemaTemplate/typename-specifier-4.cpp"]={"clang/test/SemaTemplate/typename-specifier-4.cpp:150:22: error: typename specifier refers to a dependent using declaration for a value \'iterator\' in \'X<T>\'"}
		}
	},
	["err_typename_requires_specqual"]={
		[a]="err_typename_requires_specqual",
		[b]="type name requires a specifier or qualifier",
		[c]="type name requires a specifier or qualifier",
		[d]=l,
		[e]="type name requires a specifier or qualifier",
		[f]=k,
		[g]=s,
		[h]={Q,1236199783,M,L},
		[i]={{D,2658,"/// ParseSpecifierQualifierList\n///        specifier-qualifier-list:\n///          type-specifier specifier-qualifier-list[opt]\n///          type-qualifier specifier-qualifier-list[opt]\n/// [GNU]    attributes     specifier-qualifier-list[opt]\n///\nvoid Parser::ParseSpecifierQualifierList(DeclSpec &DS, ImplicitTypenameContext AllowImplicitTypename, AccessSpecifier AS, DeclSpecContext DSC) {\n  // ...\n  if (isTypeSpecifier(DSC) && !DS.hasTypeSpecifier()) {\n  // ...\n  } else if (Specs == DeclSpec::PQ_None && !DS.hasAttributes()) {\n    Diag(Tok, diag::err_typename_requires_specqual);"}},
		[j]={
			["clang/test/Sema/block-misc.c"]={"clang/test/Sema/block-misc.c:117:14: error: type name requires a specifier or qualifier"}
		}
	},
	["err_ucn_control_character"]={
		[a]="err_ucn_control_character",
		[b]="universal character name refers to a control character",
		[c]="universal character name refers to a control character",
		[d]=l,
		[e]="universal character name refers to a control character",
		[f]=k,
		[g]=I,
		[h]={"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"},
		[i]={{kb,3509,"uint32_t Lexer::tryReadUCN(const char *&StartPtr, const char *SlashLoc, Token *Result) {\n  // ...\n  // C++11 [lex.charset]p2: If the hexadecimal value for a\n  //   universal-character-name corresponds to a surrogate code point (in the\n  //   range 0xD800-0xDFFF, inclusive), the program is ill-formed. Additionally,\n  //   if the hexadecimal value for a universal-character-name outside the\n  //   c-char-sequence, s-char-sequence, or r-char-sequence of a character or\n  //   string literal corresponds to a control character (in either of the\n  //   ranges 0x00-0x1F or 0x7F-0x9F, both inclusive) or to a character in the\n  //   basic source character set, the program is ill-formed.\n  if (CodePoint < 0xA0) {\n    // We don\'t use isLexingRawMode() here because we need to warn about bad\n    // UCNs even when skipping preprocessing tokens in a #if block.\n    if (Result && PP) {\n      if (CodePoint < 0x20 || CodePoint >= 0x7F)\n        Diag(BufferPtr, diag::err_ucn_control_character);"},{jb,684,"/// 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);"}},
		[j]={
			["clang/test/Sema/ucn-cstring.c"]={"clang/test/Sema/ucn-cstring.c:14:19: error: universal character name refers to a control character"}
		}
	},
	["err_ucn_escape_basic_scs"]={
		[a]="err_ucn_escape_basic_scs",
		[b]="character \'%0\' cannot be specified by a universal character name",
		[c]="character \'A\' cannot be specified by a universal character name",
		[d]=l,
		[e]="character \'(.*?)\' cannot be specified by a universal character name",
		[f]=k,
		[g]=I,
		[h]={"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"},
		[i]={{kb,3512,"uint32_t Lexer::tryReadUCN(const char *&StartPtr, const char *SlashLoc, Token *Result) {\n  // ...\n  // C++11 [lex.charset]p2: If the hexadecimal value for a\n  //   universal-character-name corresponds to a surrogate code point (in the\n  //   range 0xD800-0xDFFF, inclusive), the program is ill-formed. Additionally,\n  //   if the hexadecimal value for a universal-character-name outside the\n  //   c-char-sequence, s-char-sequence, or r-char-sequence of a character or\n  //   string literal corresponds to a control character (in either of the\n  //   ranges 0x00-0x1F or 0x7F-0x9F, both inclusive) or to a character in the\n  //   basic source character set, the program is ill-formed.\n  if (CodePoint < 0xA0) {\n    // We don\'t use isLexingRawMode() here because we need to warn about bad\n    // UCNs even when skipping preprocessing tokens in a #if block.\n    if (Result && PP) {\n      if (CodePoint < 0x20 || CodePoint >= 0x7F)\n      // ...\n      else {\n        // ...\n        Diag(BufferPtr, diag::err_ucn_escape_basic_scs) << StringRef(&C, 1);"},{jb,677,"/// 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);"}},
		[j]={
			["clang/test/CXX/lex/lex.charset/p2-cxx98.cpp"]={"clang/test/CXX/lex/lex.charset/p2-cxx98.cpp:6:13: error: character \' \' cannot be specified by a universal character name","clang/test/CXX/lex/lex.charset/p2-cxx98.cpp:7:13: error: character \'\"\' cannot be specified by a universal character name","clang/test/CXX/lex/lex.charset/p2-cxx98.cpp:8:13: error: character \'#\' cannot be specified by a universal character name","clang/test/CXX/lex/lex.charset/p2-cxx98.cpp:10:13: error: character \'%\' cannot be specified by a universal character name","clang/test/CXX/lex/lex.charset/p2-cxx98.cpp:11:13: error: character \'\'\' cannot be specified by a universal character name","clang/test/CXX/lex/lex.charset/p2-cxx98.cpp:12:13: error: character \'?\' cannot be specified by a universal character name","clang/test/CXX/lex/lex.charset/p2-cxx98.cpp:14:13: error: character \'A\' cannot be specified by a universal character name","clang/test/CXX/lex/lex.charset/p2-cxx98.cpp:15:13: error: character \'_\' cannot be specified by a universal character name","clang/test/CXX/lex/lex.charset/p2-cxx98.cpp:17:13: error: character \'~\' cannot be specified by a universal character name","clang/test/CXX/lex/lex.charset/p2-cxx98.cpp:33:20: error: character \' \' cannot be specified by a universal character name","clang/test/CXX/lex/lex.charset/p2-cxx98.cpp:34:20: error: character \'\"\' cannot be specified by a universal character name","clang/test/CXX/lex/lex.charset/p2-cxx98.cpp:35:20: error: character \'#\' cannot be specified by a universal character name","clang/test/CXX/lex/lex.charset/p2-cxx98.cpp:37:20: error: character \'%\' cannot be specified by a universal character name","clang/test/CXX/lex/lex.charset/p2-cxx98.cpp:38:20: error: character \'\'\' cannot be specified by a universal character name","clang/test/CXX/lex/lex.charset/p2-cxx98.cpp:39:20: error: character \'?\' cannot be specified by a universal character name","clang/test/CXX/lex/lex.charset/p2-cxx98.cpp:41:20: error: character \'A\' cannot be specified by a universal character name","clang/test/CXX/lex/lex.charset/p2-cxx98.cpp:42:20: error: character \'_\' cannot be specified by a universal character name","clang/test/CXX/lex/lex.charset/p2-cxx98.cpp:44:20: error: character \'~\' cannot be specified by a universal character name"}
		}
	},
	["err_ucn_escape_incomplete"]={
		[a]="err_ucn_escape_incomplete",
		[b]="incomplete universal character name",
		[c]="incomplete universal character name",
		[d]=l,
		[e]="incomplete universal character name",
		[f]=k,
		[g]=I,
		[h]={"7b753d21b54d",1238456763,"Implement UCN support for C string literals (C99 6.4.3) and add some very basic tests. Chris Goller ...","Implement UCN support for C string literals (C99 6.4.3) and add some very basic tests. Chris Goller has graciously offered to write some test to help validate UCN support.\n\nFrom a front-end perspective, I believe this code should work for ObjC @-strings. At the moment, I believe we need to tweak the code generation for @-strings (which doesn\'t appear to handle them). Will be investigating.\n\nllvm-svn: 68076"},
		[i]={{jb,523,"static bool ProcessNumericUCNEscape(const char *ThisTokBegin, const char *&ThisTokBuf, const char *ThisTokEnd, uint32_t &UcnVal, unsigned short &UcnLen, bool &Delimited, FullSourceLoc Loc, DiagnosticsEngine *Diags, const LangOptions &Features, bool in_char_string_literal = false) {\n  // ...\n  // If we didn\'t consume the proper number of digits, there is a problem.\n  if (Count == 0 || (!Delimited && Count != UcnLen)) {\n    if (Diags)\n      Diag(Diags, Features, Loc, ThisTokBegin, UcnBegin, ThisTokBuf, Delimited ? diag::err_delimited_escape_empty : diag::err_ucn_escape_incomplete);"},{jb,610,"static bool ProcessNamedUCNEscape(const char *ThisTokBegin, const char *&ThisTokBuf, const char *ThisTokEnd, uint32_t &UcnVal, unsigned short &UcnLen, FullSourceLoc Loc, DiagnosticsEngine *Diags, const LangOptions &Features) {\n  // ...\n  if (Incomplete || Empty) {\n    if (Diags) {\n      Diag(Diags, Features, Loc, ThisTokBegin, UcnBegin, ThisTokBuf, Incomplete ? diag::err_ucn_escape_incomplete : diag::err_delimited_escape_empty) << StringRef(&UcnBegin[1], 1);"}},
		[j]={
			["clang/test/Sema/ucn-cstring.c"]={"clang/test/Sema/ucn-cstring.c:12:19: error: incomplete universal character name","clang/test/Sema/ucn-cstring.c:13:19: error: incomplete universal character name"}
		}
	},
	["err_ucn_escape_invalid"]={
		[a]="err_ucn_escape_invalid",
		[b]="invalid universal character",
		[c]="invalid universal character",
		[d]=l,
		[e]="invalid universal character",
		[f]=k,
		[g]=I,
		[h]={"7b753d21b54d",1238456763,"Implement UCN support for C string literals (C99 6.4.3) and add some very basic tests. Chris Goller ...","Implement UCN support for C string literals (C99 6.4.3) and add some very basic tests. Chris Goller has graciously offered to write some test to help validate UCN support.\n\nFrom a front-end perspective, I believe this code should work for ObjC @-strings. At the moment, I believe we need to tweak the code generation for @-strings (which doesn\'t appear to handle them). Will be investigating.\n\nllvm-svn: 68076"},
		[i]={{kb,3525,"uint32_t Lexer::tryReadUCN(const char *&StartPtr, const char *SlashLoc, Token *Result) {\n  // ...\n  // C++11 [lex.charset]p2: If the hexadecimal value for a\n  //   universal-character-name corresponds to a surrogate code point (in the\n  //   range 0xD800-0xDFFF, inclusive), the program is ill-formed. Additionally,\n  //   if the hexadecimal value for a universal-character-name outside the\n  //   c-char-sequence, s-char-sequence, or r-char-sequence of a character or\n  //   string literal corresponds to a control character (in either of the\n  //   ranges 0x00-0x1F or 0x7F-0x9F, both inclusive) or to a character in the\n  //   basic source character set, the program is ill-formed.\n  if (CodePoint < 0xA0) {\n  // ...\n  } else if (CodePoint >= 0xD800 && CodePoint <= 0xDFFF) {\n    // C++03 allows UCNs representing surrogate characters. C99 and C++11 don\'t.\n    // We don\'t use isLexingRawMode() here because we need to diagnose bad\n    // UCNs even when skipping preprocessing tokens in a #if block.\n    if (Result && PP) {\n      if (LangOpts.CPlusPlus && !LangOpts.CPlusPlus11)\n      // ...\n      else\n        Diag(BufferPtr, diag::err_ucn_escape_invalid);"},{jb,662,"/// 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  // Check UCN constraints (C99 6.4.3p2) [C++11 lex.charset p2]\n  if ((0xD800 <= UcnVal && UcnVal <= 0xDFFF) || // surrogate codepoints\n    // ...\n    if (Diags)\n      Diag(Diags, Features, Loc, ThisTokBegin, UcnBegin, ThisTokBuf, diag::err_ucn_escape_invalid);"}},
		[j]={
			["clang/test/CXX/lex/lex.charset/p2-cxx98.cpp"]={"clang/test/CXX/lex/lex.charset/p2-cxx98.cpp:26:19: error: invalid universal character","clang/test/CXX/lex/lex.charset/p2-cxx98.cpp:27:19: error: invalid universal character","clang/test/CXX/lex/lex.charset/p2-cxx98.cpp:53:27: error: invalid universal character","clang/test/CXX/lex/lex.charset/p2-cxx98.cpp:54:27: error: invalid universal character"}
		}
	},
	["err_unable_to_make_temp"]={
		[a]="err_unable_to_make_temp",
		[b]="unable to make temporary file: %0",
		[c]="unable to make temporary file: A",
		[d]=l,
		[e]="unable to make temporary file\\: (.*?)",
		[f]=k,
		[g]=t,
		[h]={"3ef9c44747fb",1337201758,"Pulls diagnostics for temp file handling into the common diagnostic kinds.","Pulls diagnostics for temp file handling into the common diagnostic kinds.\n\nllvm-svn: 156947"},
		[i]={{"clang/lib/Driver/Driver.cpp",5715,"const char *Driver::CreateTempFile(Compilation &C, StringRef Prefix, StringRef Suffix, bool MultipleArchs, StringRef BoundArch, bool NeedUniqueDirectory) const {\n  // ...\n  if (CrashDirectory) {\n    // ...\n    if (std::error_code EC = llvm::sys::fs::createUniqueFile(Path + Middle + Suffix, TmpName)) {\n      Diag(clang::diag::err_unable_to_make_temp) << EC.message();"},{"clang/lib/Driver/Driver.cpp",6119,"std::string Driver::GetTemporaryPath(StringRef Prefix, StringRef Suffix) const {\n  // ...\n  if (EC) {\n    Diag(clang::diag::err_unable_to_make_temp) << EC.message();"},{"clang/lib/Driver/Driver.cpp",6130,"std::string Driver::GetTemporaryDirectory(StringRef Prefix) const {\n  // ...\n  if (EC) {\n    Diag(clang::diag::err_unable_to_make_temp) << EC.message();"},{"clang/lib/Driver/ToolChains/HIPUtility.cpp",160,"/// Add Generated HIP Object File which has device images embedded into the\n/// host to the argument list for linking. Using MC directives, embed the\n/// device code and also define symbols required by the code generation so that\n/// the image can be retrieved at runtime.\nvoid HIP::constructGenerateObjFileFromHIPFatBinary(Compilation &C, const InputInfo &Output, const InputInfoList &Inputs, const ArgList &Args, const JobAction &JA, const Tool &T) {\n  // ...\n  if (EC) {\n    C.getDriver().Diag(clang::diag::err_unable_to_make_temp) << EC.message();"}}
	},
	["err_unable_to_rename_temp"]={
		[a]="err_unable_to_rename_temp",
		[b]="unable to rename temporary \'%0\' to output file \'%1\': \'%2\'",
		[c]="unable to rename temporary \'A\' to output file \'B\': \'C\'",
		[d]=l,
		[e]="unable to rename temporary \'(.*?)\' to output file \'(.*?)\'\\: \'(.*?)\'",
		[f]=k,
		[g]=t,
		[h]={"3ef9c44747fb",1337201758,"Pulls diagnostics for temp file handling into the common diagnostic kinds.","Pulls diagnostics for temp file handling into the common diagnostic kinds.\n\nllvm-svn: 156947"},
		[i]={{"clang/lib/Frontend/CompilerInstance.cpp",793,"void CompilerInstance::clearOutputFiles(bool EraseFiles) {\n  // ...\n  // Ignore errors that occur when trying to discard the temp file.\n  for (OutputFile &OF : OutputFiles) {\n    // ...\n    getDiagnostics().Report(diag::err_unable_to_rename_temp) << OF.File->TmpName << OF.Filename << std::move(E);"}}
	},
	["err_unavailable"]={
		[a]="err_unavailable",
		[b]="%0 is unavailable",
		[c]="A is unavailable",
		[d]=l,
		[e]="(.*?) is unavailable",
		[f]=k,
		[g]=m,
		[h]={"1ddd6d2b6b80",1279744991,"Upgrade \"\'X\' is unavailable\" from a warning to an error.  This matches GCC\'s behavior.  Note that","Upgrade \"\'X\' is unavailable\" from a warning to an error.  This matches GCC\'s behavior.  Note that\nGCC emits a warning instead of an error when using an unavailable Objective-C protocol, so now\nClang\'s behavior is more strict in this case, but more consistent.  We will need to see how much\nthis fires on real code and determine whether this case should be downgraded to a warning.\n\nFixes <rdar://problem/8213093>.\n\nllvm-svn: 109033"},
		[i]={{"clang/lib/ARCMigrate/TransAPIUses.cpp",90,"class APIChecker : public RecursiveASTVisitor<APIChecker> {\n  // ...\n  bool VisitObjCMessageExpr(ObjCMessageExpr *E) {\n    // ...\n    if (E->isInstanceMessage() && E->getInstanceReceiver() && E->getSelector() == zoneSel && Pass.TA.hasDiagnostic(diag::err_unavailable, diag::err_unavailable_message, E->getSelectorLoc(0))) {"},{"clang/lib/ARCMigrate/TransAPIUses.cpp",95,"class APIChecker : public RecursiveASTVisitor<APIChecker> {\n  // ...\n  bool VisitObjCMessageExpr(ObjCMessageExpr *E) {\n    // ...\n    // -zone.\n    if (E->isInstanceMessage() && E->getInstanceReceiver() && E->getSelector() == zoneSel && Pass.TA.hasDiagnostic(diag::err_unavailable, diag::err_unavailable_message, E->getSelectorLoc(0))) {\n      // ...\n      Pass.TA.clearDiagnostic(diag::err_unavailable, diag::err_unavailable_message, E->getSelectorLoc(0));"},{"clang/lib/ARCMigrate/TransAutoreleasePool.cpp",220,"class AutoreleasePoolRewriter : public RecursiveASTVisitor<AutoreleasePoolRewriter> {\n  // ...\n  void clearUnavailableDiags(Stmt *S) {\n    if (S)\n      Pass.TA.clearDiagnostic(diag::err_unavailable, diag::err_unavailable_message, S->getSourceRange());"},{"clang/lib/ARCMigrate/TransGCCalls.cpp",54,"class GCCollectableCallsChecker : public RecursiveASTVisitor<GCCollectableCallsChecker> {\n  // ...\n  bool VisitCallExpr(CallExpr *E) {\n    // ...\n    if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CEE)) {\n      if (FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(DRE->getDecl())) {\n        // ...\n        if (FD->getIdentifier() == NSMakeCollectableII) {\n          // ...\n          TA.clearDiagnostic(diag::err_unavailable, diag::err_unavailable_message,"},{"clang/lib/ARCMigrate/TransRetainReleaseDealloc.cpp",391,"class RetainReleaseDeallocRemover : public RecursiveASTVisitor<RetainReleaseDeallocRemover> {\n  // ...\n  void clearDiagnostics(SourceLocation loc) const { Pass.TA.clearDiagnostic(diag::err_arc_illegal_explicit_message, diag::err_unavailable, diag::err_unavailable_message, loc); }"},{"clang/lib/Basic/DiagnosticIDs.cpp",844,"bool DiagnosticIDs::isUnrecoverable(unsigned DiagID) const {\n  // ...\n  if (DiagID == diag::err_unavailable || DiagID == diag::err_unavailable_message)"},{"clang/lib/Sema/SemaAvailability.cpp",447,"/// 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_Unavailable:\n    diag = !ObjCPropertyAccess ? diag::err_unavailable : diag::err_property_method_unavailable;"}},
		[j]={
			["clang/test/SemaObjC/protocol-attribute.m"]={"clang/test/SemaObjC/protocol-attribute.m:6:8: error: \'FwProto\' is unavailable","clang/test/SemaObjC/protocol-attribute.m:38:22: error: \'FwProto\' is unavailable","clang/test/SemaObjC/protocol-attribute.m:43:5: error: \'XProto\' is unavailable"}
		}
	},
	["err_unavailable_in_arc"]={
		[a]="err_unavailable_in_arc",
		[b]="%0 is unavailable in ARC",
		[c]="A is unavailable in ARC",
		[d]=l,
		[e]="(.*?) is unavailable in ARC",
		[f]=k,
		[g]="ARC Restrictions",
		[h]={"c6af8c606dae",1446008599,"Refine r251469 to give better (and more localizable) diagnostics","Refine r251469 to give better (and more localizable) diagnostics\nfor all the reasons that ARC makes things implicitly unavailable.\n\nllvm-svn: 251496"},
		[i]={{"clang/lib/Sema/SemaAvailability.cpp",462,"/// 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_Unavailable:\n    // ...\n    if (auto AL = OffendingDecl->getAttr<UnavailableAttr>()) {\n      if (AL->isImplicit() && AL->getImplicitReason()) {\n        // Most of these failures are due to extra restrictions in ARC;\n        // reflect that in the primary diagnostic when applicable.\n        auto flagARCError = [&] {\n          if (S.getLangOpts().ObjCAutoRefCount && S.getSourceManager().isInSystemHeader(OffendingDecl->getLocation()))\n            diag = diag::err_unavailable_in_arc;"}},
		[j]={
			["clang/test/SemaObjC/arc-unavailable-system-function.m"]={"arc-unavailable-system-function.m:2:3: error: \'foo\' is unavailable in ARC"}
		}
	},
	["err_unavailable_message"]={
		[a]="err_unavailable_message",
		[b]="%0 is unavailable: %1",
		[c]="A is unavailable: B",
		[d]=l,
		[e]="(.*?) is unavailable\\: (.*?)",
		[f]=k,
		[g]=m,
		[h]={"c74073cd2045",1286406752,"Patch for adding message to unavailable attribute.","Patch for adding message to unavailable attribute.\nAnd its documentation.\nFinishes off // rdar: // 6734520.\n\nllvm-svn: 115862"},
		[i]={{"clang/lib/ARCMigrate/TransAPIUses.cpp",91,"class APIChecker : public RecursiveASTVisitor<APIChecker> {\n  // ...\n  bool VisitObjCMessageExpr(ObjCMessageExpr *E) {\n    // ...\n    if (E->isInstanceMessage() && E->getInstanceReceiver() && E->getSelector() == zoneSel && Pass.TA.hasDiagnostic(diag::err_unavailable, diag::err_unavailable_message, E->getSelectorLoc(0))) {"},{"clang/lib/ARCMigrate/TransAPIUses.cpp",96,"class APIChecker : public RecursiveASTVisitor<APIChecker> {\n  // ...\n  bool VisitObjCMessageExpr(ObjCMessageExpr *E) {\n    // ...\n    // -zone.\n    if (E->isInstanceMessage() && E->getInstanceReceiver() && E->getSelector() == zoneSel && Pass.TA.hasDiagnostic(diag::err_unavailable, diag::err_unavailable_message, E->getSelectorLoc(0))) {\n      // ...\n      Pass.TA.clearDiagnostic(diag::err_unavailable, diag::err_unavailable_message, E->getSelectorLoc(0));"},{"clang/lib/ARCMigrate/TransAutoreleasePool.cpp",221,"class AutoreleasePoolRewriter : public RecursiveASTVisitor<AutoreleasePoolRewriter> {\n  // ...\n  void clearUnavailableDiags(Stmt *S) {\n    if (S)\n      Pass.TA.clearDiagnostic(diag::err_unavailable, diag::err_unavailable_message, S->getSourceRange());"},{"clang/lib/ARCMigrate/TransGCCalls.cpp",55,"class GCCollectableCallsChecker : public RecursiveASTVisitor<GCCollectableCallsChecker> {\n  // ...\n  bool VisitCallExpr(CallExpr *E) {\n    // ...\n    if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CEE)) {\n      if (FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(DRE->getDecl())) {\n        // ...\n        if (FD->getIdentifier() == NSMakeCollectableII) {\n          // ...\n          TA.clearDiagnostic(diag::err_unavailable, diag::err_unavailable_message,"},{"clang/lib/ARCMigrate/TransRetainReleaseDealloc.cpp",392,"class RetainReleaseDeallocRemover : public RecursiveASTVisitor<RetainReleaseDeallocRemover> {\n  // ...\n  void clearDiagnostics(SourceLocation loc) const { Pass.TA.clearDiagnostic(diag::err_arc_illegal_explicit_message, diag::err_unavailable, diag::err_unavailable_message, loc); }"},{"clang/lib/Basic/DiagnosticIDs.cpp",845,"bool DiagnosticIDs::isUnrecoverable(unsigned DiagID) const {\n  // ...\n  if (DiagID == diag::err_unavailable || DiagID == diag::err_unavailable_message)"},{"clang/lib/Sema/SemaAvailability.cpp",449,"/// 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_Unavailable:\n    // ...\n    diag_message = diag::err_unavailable_message;"}},
		[j]={
			["clang/test/Sema/attr-c2x.c"]={"clang/test/Sema/attr-c2x.c:27:3: error: \'foo2\' is unavailable: not available - replaced"}
		}
	},
	["err_uncasted_call_of_unknown_any"]={
		[a]="err_uncasted_call_of_unknown_any",
		[b]="%0 has unknown return type; cast the call to its declared return type",
		[c]="A has unknown return type; cast the call to its declared return type",
		[d]=l,
		[e]="(.*?) has unknown return type; cast the call to its declared return type",
		[f]=k,
		[g]=m,
		[h]={"2d2e870745c2",1302505370,"More __unknown_anytype work.","More __unknown_anytype work.\n\nllvm-svn: 129269"},
		[i]={{v,21484,"static ExprResult diagnoseUnknownAnyExpr(Sema &S, Expr *E) {\n  // ...\n  while (true) {\n    // ...\n    if (CallExpr *call = dyn_cast<CallExpr>(E)) {\n      // ...\n      diagID = diag::err_uncasted_call_of_unknown_any;"},{v,21488,"static ExprResult diagnoseUnknownAnyExpr(Sema &S, Expr *E) {\n  // ...\n  if (DeclRefExpr *ref = dyn_cast<DeclRefExpr>(E)) {\n  // ...\n  } else if (MemberExpr *mem = dyn_cast<MemberExpr>(E)) {\n  // ...\n  } else if (ObjCMessageExpr *msg = dyn_cast<ObjCMessageExpr>(E)) {\n    diagID = diag::err_uncasted_call_of_unknown_any;"}},
		[j]={
			[Lb]={"clang/test/SemaCXX/unknown-anytype.cpp:26:5: error: \'foo\' has unknown return type; cast the call to its declared return type"}
		}
	},
	["err_uncasted_send_to_unknown_any_method"]={
		[a]="err_uncasted_send_to_unknown_any_method",
		[b]="no known method %select{%objcinstance1|%objcclass1}0; cast the message send to the method\'s return type",
		[c]={{nil,nil,{"no known method ",{"B","B"},"; cast the message send to the method\'s return type"}}},
		[d]=l,
		[e]="no known method (?:(.*?)|(.*?)); cast the message send to the method\'s return type",
		[f]=k,
		[g]=m,
		[h]={"fa6f5d6ab8c3",1314824256,"Don\'t assert when diagnosing a missing cast of an unknown-anytype","Don\'t assert when diagnosing a missing cast of an unknown-anytype\nmessage send to an unknown method.\n\nrdar://problem/9416370, redux.\n\nllvm-svn: 138893"},
		[i]={{v,21494,"static ExprResult diagnoseUnknownAnyExpr(Sema &S, Expr *E) {\n  // ...\n  if (DeclRefExpr *ref = dyn_cast<DeclRefExpr>(E)) {\n  // ...\n  } else if (MemberExpr *mem = dyn_cast<MemberExpr>(E)) {\n  // ...\n  } else if (ObjCMessageExpr *msg = dyn_cast<ObjCMessageExpr>(E)) {\n    // ...\n    if (!d) {\n      S.Diag(loc, diag::err_uncasted_send_to_unknown_any_method) << static_cast<unsigned>(msg->isClassMessage()) << msg->getSelector() << orig->getSourceRange();"}},
		[j]={
			["clang/test/SemaObjCXX/unknown-anytype.mm"]={"clang/test/SemaObjCXX/unknown-anytype.mm:6:12: error: no known method \'-foo\'; cast the message send to the method\'s return type","clang/test/SemaObjCXX/unknown-anytype.mm:7:8: error: no known method \'-foo\'; cast the message send to the method\'s return type"}
		}
	},
	["err_uncasted_use_of_unknown_any"]={
		[a]="err_uncasted_use_of_unknown_any",
		[b]="%0 has unknown type; cast it to its declared type to use it",
		[c]="A has unknown type; cast it to its declared type to use it",
		[d]=l,
		[e]="(.*?) has unknown type; cast it to its declared type to use it",
		[f]=k,
		[g]=m,
		[h]={"2d2e870745c2",1302505370,"More __unknown_anytype work.","More __unknown_anytype work.\n\nllvm-svn: 129269"},
		[i]={{v,21469,"static ExprResult diagnoseUnknownAnyExpr(Sema &S, Expr *E) {\n  // ...\n  unsigned diagID = diag::err_uncasted_use_of_unknown_any;"}},
		[j]={
			[Lb]={"clang/test/SemaCXX/unknown-anytype.cpp:17:13: error: \'foo\' has unknown type; cast it to its declared type to use it","clang/test/SemaCXX/unknown-anytype.cpp:18:17: error: \'foo\' has unknown type; cast it to its declared type to use it","clang/test/SemaCXX/unknown-anytype.cpp:19:12: error: \'foo\' has unknown type; cast it to its declared type to use it"}
		}
	},
	["err_undeclared_boxing_method"]={
		[a]="err_undeclared_boxing_method",
		[b]="declaration of %0 is missing in %1 class",
		[c]="declaration of A is missing in B class",
		[d]=l,
		[e]="declaration of (.*?) is missing in (.*?) class",
		[f]=k,
		[g]=m,
		[h]={"890f4577b11a",1336838021,"Don\'t crash on boxed strings when +stringWithUTF8String: is missing.","Don\'t crash on boxed strings when +stringWithUTF8String: is missing.\n\nAlso, unify some diagnostics for boxed expressions that have the same form.\n\nFixes PR12804.\n\nllvm-svn: 156713"},
		[i]={{Jb,154,"/// Emits an error if the given method does not exist, or if the return\n/// type is not an Objective-C object.\nstatic bool validateBoxingMethod(Sema &S, SourceLocation Loc, const ObjCInterfaceDecl *Class, Selector Sel, const ObjCMethodDecl *Method) {\n  if (!Method) {\n    // ...\n    S.Diag(Loc, diag::err_undeclared_boxing_method) << Sel << Class->getName();"}},
		[j]={
			["clang/test/SemaObjC/objc-literal-nsnumber.m"]={"clang/test/SemaObjC/objc-literal-nsnumber.m:54:18: error: declaration of \'numberWithDouble:\' is missing in NSNumber class","clang/test/SemaObjC/objc-literal-nsnumber.m:55:24: error: declaration of \'numberWithBool:\' is missing in NSNumber class","clang/test/SemaObjC/objc-literal-nsnumber.m:124:10: error: declaration of \'stringWithUTF8String:\' is missing in NSString class"}
		}
	},
	["err_undeclared_destructor_name"]={
		[a]={{nil,C,"err_undeclared_destructor_name"}},
		[b]={{nil,C,"undeclared identifier %0 in destructor name"}},
		[c]={{nil,C,"undeclared identifier A in destructor name"}},
		[d]=l,
		[e]="undeclared identifier (.*?) in destructor name",
		[f]=k,
		[g]={{nil,C,m}},
		[h]={"1228d42ddab8",1576809732,"[OpenMP][Part 2] Use reusable OpenMP context/traits handling","[OpenMP][Part 2] Use reusable OpenMP context/traits handling\n\nThis patch implements an almost complete handling of OpenMP\ncontexts/traits such that we can reuse most of the logic in Flang\nthrough the OMPContext.{h,cpp} in llvm/Frontend/OpenMP.\n\nAll but construct SIMD specifiers, e.g., inbranch, and the device ISA\nselector are define in `llvm/lib/Frontend/OpenMP/OMPKinds.def`. From\nthese definitions we generate the enum classes `TraitSet`,\n`TraitSelector`, and `TraitProperty` as well as conversion and helper\nfunctions in `llvm/lib/Frontend/OpenMP/OMPContext.{h,cpp}`.\n\nThe above enum classes are used in the parser, sema, and the AST\nattribute. The latter is not a collection of multiple primitive variant\narguments that contain encodings via numbers and strings but instead a\ntree that mirrors the `match` clause (see `struct OpenMPTraitInfo`).\n\nThe changes to the parser make it more forgiving when wrong syntax is\nread and they also resulted in more specialized diagnostics. The tests\nare updated and the core issues are detected as before. Here and\nelsewhere this patch tries to be generic, thus we do not distinguish\nwhat selector set, selector, or property is parsed except if they do\nbehave exceptionally, as for example `user={condition(EXPR)}` does.\n\nThe sema logic changed in two ways: First, the OMPDeclareVariantAttr\nrepresentation changed, as mentioned above, and the sema was adjusted to\nwork with the new `OpenMPTraitInfo`. Second, the matching and scoring\nlogic moved into `OMPContext.{h,cpp}`. It is implemented on a flat\nrepresentation of the `match` clause that is not tied to clang.\n`OpenMPTraitInfo` provides a method to generate this flat structure (see\n`struct VariantMatchInfo`) by computing integer score values and boolean\nuser conditions from the `clang::Expr` we keep for them.\n\nThe OpenMP context is now an explicit object (see `struct OMPContext`).\nThis is in anticipation of construct traits that need to be tracked. The\nOpenMP context, as well as the `VariantMatchInfo`, are basically made up\nof a set of active or respectively required traits, e.g., \'host\', and an\nordered container of constructs which allows duplication. Matching and\nscoring is kept as generic as possible to allow easy extension in the\nfuture.\n\n---\n\nTest changes:\n\nThe messages checked in `OpenMP/declare_variant_messages.{c,cpp}` have\nbeen auto generated to match the new warnings and notes of the parser.\nThe \"subset\" checks were reversed causing the wrong version to be\npicked. The tests have been adjusted to correct this.\nWe do not print scores if the user did not provide one.\nWe print spaces to make lists in the `match` clause more legible.\n\nReviewers: kiranchandramohan, ABataev, RaviNarayanaswamy, gtbercea, grokos, sdmitriev, JonChesterfield, hfinkel, fghanim\n\nSubscribers: merge_guards_bot, rampitec, mgorny, hiraditya, aheejin, fedor.sergeev, simoncook, bollu, guansong, dexonsmith, jfb, s.egerton, llvm-commits, cfe-commits\n\nTags: #clang, #llvm\n\nDifferential Revision: https://reviews.llvm.org/D71830"},
		[i]={{R,438,"ParsedType Sema::getDestructorName(SourceLocation TildeLoc, IdentifierInfo &II, SourceLocation NameLoc, Scope *S, CXXScopeSpec &SS, ParsedType ObjectTypePtr, bool EnteringContext) {\n  // ...\n  if (FoundDecls.empty()) {\n    // ...\n    Diag(NameLoc, diag::err_undeclared_destructor_name) << &II << MakeFixItHint();"}},
		[j]={
			["clang/test/SemaCXX/pseudo-destructors.cpp"]={"clang/test/SemaCXX/pseudo-destructors.cpp:26:7: error: undeclared identifier \'foo\' in destructor name","clang/test/SemaCXX/pseudo-destructors.cpp:86:9: error: undeclared identifier \'oops\' in destructor name","clang/test/SemaCXX/pseudo-destructors.cpp:139:45: error: undeclared identifier \'G\' in destructor name"}
		}
	},
	["err_undeclared_label_use"]={
		[a]="err_undeclared_label_use",
		[b]="use of undeclared label %0",
		[c]="use of undeclared label A",
		[d]=l,
		[e]="use of undeclared label (.*?)",
		[f]=k,
		[g]=m,
		[h]={O,1237025389,N,P},
		[i]={{u,2222,"static void CheckPoppedLabel(LabelDecl *L, Sema &S, Sema::DiagReceiverTy DiagReceiver) {\n  // ...\n  if (Diagnose)\n    DiagReceiver(L->getLocation(), S.PDiag(diag::err_undeclared_label_use) << L);"}},
		[j]={
			["clang/test/Misc/explicit.cpp"]={"clang/test/Misc/explicit.cpp:5:16: error: use of undeclared label \'b\'"}
		}
	},
	["err_undeclared_objc_literal_class"]={
		[a]="err_undeclared_objc_literal_class",
		[b]="definition of class %0 must be available to use Objective-C %select{array literals|dictionary literals|numeric literals|boxed expressions|string literals}1",
		[c]={{nil,nil,{"definition of class A must be available to use Objective-C ",{"array literals","dictionary literals","numeric literals","boxed expressions","string literals"}}}},
		[d]=l,
		[e]="definition of class (.*?) must be available to use Objective\\-C (?:array literals|dictionary literals|numeric literals|boxed expressions|string literals)",
		[f]=k,
		[g]=m,
		[h]={"b7d8563973fe",1437714580,"Cleanup ObjCInterfaceDecl lookup for ObjC literals","Cleanup ObjCInterfaceDecl lookup for ObjC literals\n\nllvm-svn: 243092"},
		[i]={{Jb,204,"/// Validates ObjCInterfaceDecl availability.\n/// ObjCInterfaceDecl, used to create ObjC literals, should be defined\n/// if clang not in a debugger mode.\nstatic bool ValidateObjCLiteralInterfaceDecl(Sema &S, ObjCInterfaceDecl *Decl, SourceLocation Loc, Sema::ObjCLiteralKind LiteralKind) {\n  if (!Decl) {\n    // ...\n    S.Diag(Loc, diag::err_undeclared_objc_literal_class) << II->getName() << LiteralKind;"},{Jb,208,"/// Validates ObjCInterfaceDecl availability.\n/// ObjCInterfaceDecl, used to create ObjC literals, should be defined\n/// if clang not in a debugger mode.\nstatic bool ValidateObjCLiteralInterfaceDecl(Sema &S, ObjCInterfaceDecl *Decl, SourceLocation Loc, Sema::ObjCLiteralKind LiteralKind) {\n  if (!Decl) {\n  // ...\n  } else if (!Decl->hasDefinition() && !S.getLangOpts().DebuggerObjCLiteral) {\n    S.Diag(Loc, diag::err_undeclared_objc_literal_class) << Decl->getName() << LiteralKind;"}},
		[j]={
			["clang/test/SemaObjC/objc-literal-nsnumber.m"]={"clang/test/SemaObjC/objc-literal-nsnumber.m:13:12: error: definition of class NSNumber must be available to use Objective-C numeric literals","clang/test/SemaObjC/objc-literal-nsnumber.m:16:13: error: definition of class NSNumber must be available to use Objective-C numeric literals","clang/test/SemaObjC/objc-literal-nsnumber.m:23:12: error: definition of class NSNumber must be available to use Objective-C numeric literals","clang/test/SemaObjC/objc-literal-nsnumber.m:26:13: error: definition of class NSNumber must be available to use Objective-C numeric literals","clang/test/SemaObjC/objc-literal-nsnumber.m:77:10: error: definition of class NSDictionary must be available to use Objective-C dictionary literals"}
		}
	},
	["err_undeclared_protocol"]={
		[a]="err_undeclared_protocol",
		[b]="cannot find protocol declaration for %0",
		[c]="cannot find protocol declaration for A",
		[d]=l,
		[e]="cannot find protocol declaration for (.*?)",
		[f]=k,
		[g]=m,
		[h]={Q,1236199783,M,L},
		[i]={{ab,1331,"/// FindProtocolDeclaration - This routine looks up protocols and\n/// issues an error if they are not declared. It returns list of\n/// protocol declarations in its \'Protocols\' argument.\nvoid Sema::FindProtocolDeclaration(bool WarnOnDeclarations, bool ForObjCContainer, ArrayRef<IdentifierLocPair> ProtocolId, SmallVectorImpl<Decl *> &Protocols) {\n  for (const IdentifierLocPair &Pair : ProtocolId) {\n    // ...\n    if (!PDecl) {\n      Diag(Pair.second, diag::err_undeclared_protocol) << Pair.first;"},{ab,1745,"void Sema::actOnObjCTypeArgsOrProtocolQualifiers(Scope *S, ParsedType baseType, SourceLocation lAngleLoc, ArrayRef<IdentifierInfo *> identifiers, ArrayRef<SourceLocation> identifierLocs, SourceLocation rAngleLoc, SourceLocation &typeArgsLAngleLoc, SmallVectorImpl<ParsedType> &typeArgs, SourceLocation &typeArgsRAngleLoc, SourceLocation &protocolLAngleLoc, SmallVectorImpl<Decl *> &protocols, SourceLocation &protocolRAngleLoc, bool warnOnIncompleteProtocols) {\n  // ...\n  for (unsigned i = 0, n = identifiers.size(); i != n; ++i) {\n    // ...\n    Diag(identifierLocs[i], (lookupKind == LookupAnyName ? diag::err_objc_type_arg_missing : lookupKind == LookupObjCProtocolName ? diag::err_undeclared_protocol : diag::err_unknown_typename)) << identifiers[i];"},{Jb,1393,"ExprResult Sema::ParseObjCProtocolExpression(IdentifierInfo *ProtocolId, SourceLocation AtLoc, SourceLocation ProtoLoc, SourceLocation LParenLoc, SourceLocation ProtoIdLoc, SourceLocation RParenLoc) {\n  // ...\n  if (!PDecl) {\n    Diag(ProtoLoc, diag::err_undeclared_protocol) << ProtocolId;"}},
		[j]={
			["clang/test/SemaObjC/undefined-protocol-type-1.m"]={"clang/test/SemaObjC/undefined-protocol-type-1.m:7:10: error: cannot find protocol declaration for \'p3\'","clang/test/SemaObjC/undefined-protocol-type-1.m:8:10: error: cannot find protocol declaration for \'p3\'"}
		}
	},
	["err_undeclared_protocol_suggest"]={
		[a]="err_undeclared_protocol_suggest",
		[b]="cannot find protocol declaration for %0; did you mean %1?",
		[c]="cannot find protocol declaration for A; did you mean B?",
		[d]=l,
		[e]="cannot find protocol declaration for (.*?); did you mean (.*?)\\?",
		[f]=k,
		[g]=m,
		[h]={"35b0bac8c51a",1262541717,"Implement typo correction for a variety of Objective-C-specific","Implement typo correction for a variety of Objective-C-specific\nconstructs:\n\n  - Instance variable lookup (\"foo->ivar\" and, in instance methods, \"ivar\")\n  - Property name lookup (\"foo.prop\")\n  - Superclasses\n  - Various places where a class name is required\n  - Protocol names (e.g., id<proto>)\n\nThis seems to cover many of the common places where typos could occur.\n\nllvm-svn: 92449"},
		[i]={{ab,1326,"/// FindProtocolDeclaration - This routine looks up protocols and\n/// issues an error if they are not declared. It returns list of\n/// protocol declarations in its \'Protocols\' argument.\nvoid Sema::FindProtocolDeclaration(bool WarnOnDeclarations, bool ForObjCContainer, ArrayRef<IdentifierLocPair> ProtocolId, SmallVectorImpl<Decl *> &Protocols) {\n  for (const IdentifierLocPair &Pair : ProtocolId) {\n    // ...\n    if (!PDecl) {\n      // ...\n      if ((PDecl = Corrected.getCorrectionDeclAs<ObjCProtocolDecl>()))\n        diagnoseTypo(Corrected, PDiag(diag::err_undeclared_protocol_suggest) << Pair.first);"},{ab,1711,"void Sema::actOnObjCTypeArgsOrProtocolQualifiers(Scope *S, ParsedType baseType, SourceLocation lAngleLoc, ArrayRef<IdentifierInfo *> identifiers, ArrayRef<SourceLocation> identifierLocs, SourceLocation rAngleLoc, SourceLocation &typeArgsLAngleLoc, SmallVectorImpl<ParsedType> &typeArgs, SourceLocation &typeArgsRAngleLoc, SourceLocation &protocolLAngleLoc, SmallVectorImpl<Decl *> &protocols, SourceLocation &protocolRAngleLoc, bool warnOnIncompleteProtocols) {\n  // ...\n  for (unsigned i = 0, n = identifiers.size(); i != n; ++i) {\n    // ...\n    if (corrected) {\n      // Did we find a protocol?\n      if (auto proto = corrected.getCorrectionDeclAs<ObjCProtocolDecl>()) {\n        diagnoseTypo(corrected, PDiag(diag::err_undeclared_protocol_suggest) << identifiers[i]);"}},
		[j]={
			["clang/test/SemaObjC/parameterized_classes.m"]={"clang/test/SemaObjC/parameterized_classes.m:227:24: error: cannot find protocol declaration for \'NSObjec\'; did you mean \'NSObject\'?","clang/test/SemaObjC/parameterized_classes.m:234:33: error: cannot find protocol declaration for \'NSCopyin\'; did you mean \'NSCopying\'?"}
		}
	},
	["err_undeclared_use"]={
		[a]="err_undeclared_use",
		[b]="use of undeclared %0",
		[c]="use of undeclared A",
		[d]=l,
		[e]="use of undeclared (.*?)",
		[f]=k,
		[g]=m,
		[h]={O,1237025389,N,P},
		[i]={{"clang/lib/Sema/SemaAttr.cpp",805,"void Sema::ActOnPragmaMSAllocText(SourceLocation PragmaLocation, StringRef Section, const SmallVector<std::tuple<IdentifierInfo *, SourceLocation>> &Functions) {\n  // ...\n  for (auto &Function : Functions) {\n    // ...\n    if (!ND) {\n      Diag(Loc, diag::err_undeclared_use) << II->getName();"},{v,2381,"/// Diagnose an empty lookup.\n///\n/// \\return false if new lookup candidates were found\nbool Sema::DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R, CorrectionCandidateCallback &CCC, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef<Expr *> Args, TypoExpr **Out) {\n  // ...\n  if (Name.getNameKind() == DeclarationName::CXXOperatorName || Name.getNameKind() == DeclarationName::CXXLiteralOperatorName || Name.getNameKind() == DeclarationName::CXXConversionFunctionName) {\n    diagnostic = diag::err_undeclared_use;"},{Z,5162,"/// 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  // ...\n  if (!MemberOfUnknownSpecialization) {\n    // ...\n    if (!LookupTemplateName(R, S, SS, ObjectType.get(), EnteringContext, MOUS, RTK, nullptr, /*AllowTypoCorrection=*/false) && !R.isAmbiguous()) {\n      if (LookupCtx)\n      // ...\n      else\n        Diag(Name.getBeginLoc(), diag::err_undeclared_use) << DNI.getName() << SS.getRange();"}},
		[j]={
			["clang/test/Sema/pragma-ms-alloc-text.cpp"]={"clang/test/Sema/pragma-ms-alloc-text.cpp:6:23: error: use of undeclared a"}
		}
	},
	["err_undeclared_use_of_module"]={
		[a]="err_undeclared_use_of_module",
		[b]="module %0 does not depend on a module exporting \'%1\'",
		[c]="module A does not depend on a module exporting \'B\'",
		[d]=l,
		[e]="module (.*?) does not depend on a module exporting \'(.*?)\'",
		[f]=k,
		[g]=I,
		[h]={"11152dd55f7a",1424304628,"Allow errors on use of a private module header to be disabled, to better support incremental transit...","Allow errors on use of a private module header to be disabled, to better support incremental transition to modules.\n\nllvm-svn: 229788"},
		[i]={{"clang/lib/Lex/ModuleMap.cpp",540,"void ModuleMap::diagnoseHeaderInclusion(Module *RequestingModule, bool RequestingModuleIsModuleInterface, SourceLocation FilenameLoc, StringRef Filename, FileEntryRef File) {\n  // ...\n  if (RequestingModule && LangOpts.ModulesStrictDeclUse) {\n    Diags.Report(FilenameLoc, diag::err_undeclared_use_of_module) << RequestingModule->getTopLevelModule()->Name << Filename;"}},
		[j]={
			["clang/test/Modules/strict-decluse.cpp"]={"clang/test/Modules/strict-decluse.cpp:7:10: error: module XG does not depend on a module exporting \'i.h\'"}
		}
	},
	["err_undeclared_use_of_module_indirect"]={
		[a]="err_undeclared_use_of_module_indirect",
		[b]="module %0 does not directly depend on a module exporting \'%1\', which is part of indirectly-used module %2",
		[c]="module A does not directly depend on a module exporting \'B\', which is part of indirectly-used module C",
		[d]=l,
		[e]="module (.*?) does not directly depend on a module exporting \'(.*?)\', which is part of indirectly\\-used module (.*?)",
		[f]=k,
		[g]=I,
		[h]={F,1625925174,G,H},
		[i]={{"clang/lib/Lex/ModuleMap.cpp",528,"void ModuleMap::diagnoseHeaderInclusion(Module *RequestingModule, bool RequestingModuleIsModuleInterface, SourceLocation FilenameLoc, StringRef Filename, FileEntryRef File) {\n  // ...\n  // We have found a module, but we don\'t use it.\n  if (NotUsed) {\n    Diags.Report(FilenameLoc, diag::err_undeclared_use_of_module_indirect) << RequestingModule->getTopLevelModule()->Name << Filename << NotUsed->Name;"}},
		[j]={
			["clang/test/Modules/declare-use2.cpp"]={"clang/test/Modules/Inputs/declare-use/h.h:4:10: error: module XH does not directly depend on a module exporting \'d.h\', which is part of indirectly-used module XD","clang/test/Modules/declare-use2.cpp:6:10: error: module XH does not directly depend on a module exporting \'f.h\', which is part of indirectly-used module XF"}
		}
	},
	["err_undeclared_use_suggest"]={
		[a]="err_undeclared_use_suggest",
		[b]="use of undeclared %0; did you mean %1?",
		[c]="use of undeclared A; did you mean B?",
		[d]=l,
		[e]="use of undeclared (.*?); did you mean (.*?)\\?",
		[f]=k,
		[g]=m,
		[h]={"598b08f8182e",1262236813,"Implement typo correction for id-expressions, e.g.,","Implement typo correction for id-expressions, e.g.,\n\ntypo.cpp:22:10: error: use of undeclared identifier \'radious\'; did\n      you mean \'radius\'?\n  return radious * pi;\n         ^~~~~~~\n         radius\n\nThis was super-easy, since we already had decent recovery by looking\nfor names in dependent base classes.\n\nllvm-svn: 92341"},
		[i]={{v,2382,"/// Diagnose an empty lookup.\n///\n/// \\return false if new lookup candidates were found\nbool Sema::DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R, CorrectionCandidateCallback &CCC, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef<Expr *> Args, TypoExpr **Out) {\n  // ...\n  if (Name.getNameKind() == DeclarationName::CXXOperatorName || Name.getNameKind() == DeclarationName::CXXLiteralOperatorName || Name.getNameKind() == DeclarationName::CXXConversionFunctionName) {\n    // ...\n    diagnostic_suggest = diag::err_undeclared_use_suggest;"}}
	},
	["err_undeclared_var_use"]={
		[a]="err_undeclared_var_use",
		[b]="use of undeclared identifier %0",
		[c]="use of undeclared identifier A",
		[d]=l,
		[e]="use of undeclared identifier (.*?)",
		[f]=k,
		[g]=m,
		[h]={O,1237025389,N,P},
		[i]={{"clang/lib/Sema/SemaCUDA.cpp",56,"ExprResult Sema::ActOnCUDAExecConfigExpr(Scope *S, SourceLocation LLLLoc, MultiExprArg ExecConfig, SourceLocation GGGLoc) {\n  // ...\n  if (!ConfigDecl)\n    return ExprError(Diag(LLLLoc, diag::err_undeclared_var_use) << getCudaConfigureFuncName());"},{"clang/lib/Sema/SemaCXXScopeSpec.cpp",826,"/// 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 (!Found.empty()) {\n  // ...\n  } else if (SS.isSet())\n  // ...\n  else\n    Diag(IdInfo.IdentifierLoc, diag::err_undeclared_var_use) << IdInfo.Identifier;"},{v,2376,"/// Diagnose an empty lookup.\n///\n/// \\return false if new lookup candidates were found\nbool Sema::DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R, CorrectionCandidateCallback &CCC, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef<Expr *> Args, TypoExpr **Out) {\n  // ...\n  unsigned diagnostic = diag::err_undeclared_var_use;"},{Tb,1591,"/// ActOnPropertyImplDecl - This routine performs semantic checks and\n/// builds the AST node for a property implementation declaration; declared\n/// as \\@synthesize or \\@dynamic.\n///\nDecl *Sema::ActOnPropertyImplDecl(Scope *S, SourceLocation AtLoc, SourceLocation PropertyLoc, bool Synthesize, IdentifierInfo *PropertyId, IdentifierInfo *PropertyIvar, SourceLocation PropertyIvarLoc, ObjCPropertyQueryKind QueryKind) {\n  // ...\n  if (IC) {\n    // ...\n    if (getLangOpts().ObjCDefaultSynthProperties && getLangOpts().ObjCRuntime.isNonFragile() && !IDecl->isObjCRequiresPropertyDefs()) {\n      // ...\n      // Issue diagnostics only if Ivar belongs to current class.\n      if (Ivar && Ivar->getSynthesize() && declaresSameEntity(IC->getClassInterface(), ClassDeclared)) {\n        Diag(Ivar->getLocation(), diag::err_undeclared_var_use) << PropertyId;"},{"clang/lib/Sema/SemaOpenMP.cpp",3053,"ExprResult Sema::ActOnOpenMPIdExpression(Scope *CurScope, CXXScopeSpec &ScopeSpec, const DeclarationNameInfo &Id, OpenMPDirectiveKind Kind) {\n  // ...\n  if (!Lookup.isSingleResult()) {\n    // ...\n    if (TypoCorrection Corrected = CorrectTypo(Id, LookupOrdinaryName, CurScope, nullptr, CCC, CTK_ErrorRecovery)) {\n    // ...\n    } else {\n      Diag(Id.getLoc(), Lookup.empty() ? diag::err_undeclared_var_use : diag::err_omp_expected_var_arg) << Id.getName();"},{"clang/lib/Sema/SemaOpenMP.cpp",23037,"NamedDecl *Sema::lookupOpenMPDeclareTargetName(Scope *CurScope, CXXScopeSpec &ScopeSpec, const DeclarationNameInfo &Id) {\n  // ...\n  if (!Lookup.isSingleResult()) {\n    // ...\n    Diag(Id.getLoc(), diag::err_undeclared_var_use) << Id.getName();"}},
		[j]={
			["clang/test/SemaTemplate/nss-recovery.cpp"]={"clang/test/SemaTemplate/nss-recovery.cpp:5:12: error: use of undeclared identifier \'undef\'"}
		}
	},
	["err_undeclared_var_use_suggest"]={
		[a]="err_undeclared_var_use_suggest",
		[b]="use of undeclared identifier %0; did you mean %1?",
		[c]="use of undeclared identifier A; did you mean B?",
		[d]=l,
		[e]="use of undeclared identifier (.*?); did you mean (.*?)\\?",
		[f]=k,
		[g]=m,
		[h]={"598b08f8182e",1262236813,"Implement typo correction for id-expressions, e.g.,","Implement typo correction for id-expressions, e.g.,\n\ntypo.cpp:22:10: error: use of undeclared identifier \'radious\'; did\n      you mean \'radius\'?\n  return radious * pi;\n         ^~~~~~~\n         radius\n\nThis was super-easy, since we already had decent recovery by looking\nfor names in dependent base classes.\n\nllvm-svn: 92341"},
		[i]={{"clang/lib/Sema/SemaCXXScopeSpec.cpp",627,"/// 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 (Found.empty() && !ErrorRecoveryLookup && !getLangOpts().MSVCCompat) {\n    // ...\n    if (TypoCorrection Corrected = CorrectTypo(Found.getLookupNameInfo(), Found.getLookupKind(), S, &SS, CCC, CTK_ErrorRecovery, LookupCtx, EnteringContext)) {\n      if (LookupCtx) {\n      // ...\n      } else\n        diagnoseTypo(Corrected, PDiag(diag::err_undeclared_var_use_suggest) << Name);"},{u,1009,"Corrected:\n  // ...\n  case LookupResult::NotFound:\n    // ...\n    // Perform typo correction to determine if there is another name that is\n    // close to this name.\n    if (!SecondTry && CCC) {\n      // ...\n      if (TypoCorrection Corrected = CorrectTypo(Result.getLookupNameInfo(), Result.getLookupKind(), S, &SS, *CCC, CTK_ErrorRecovery)) {\n        unsigned UnqualifiedDiag = diag::err_undeclared_var_use_suggest;"},{v,2377,"/// Diagnose an empty lookup.\n///\n/// \\return false if new lookup candidates were found\nbool Sema::DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R, CorrectionCandidateCallback &CCC, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef<Expr *> Args, TypoExpr **Out) {\n  // ...\n  unsigned diagnostic_suggest = diag::err_undeclared_var_use_suggest;"},{"clang/lib/Sema/SemaOpenMP.cpp",3048,"ExprResult Sema::ActOnOpenMPIdExpression(Scope *CurScope, CXXScopeSpec &ScopeSpec, const DeclarationNameInfo &Id, OpenMPDirectiveKind Kind) {\n  // ...\n  if (!Lookup.isSingleResult()) {\n    // ...\n    if (TypoCorrection Corrected = CorrectTypo(Id, LookupOrdinaryName, CurScope, nullptr, CCC, CTK_ErrorRecovery)) {\n      diagnoseTypo(Corrected, PDiag(Lookup.empty() ? diag::err_undeclared_var_use_suggest : diag::err_omp_expected_var_arg_suggest) << Id.getName());"},{"clang/lib/Sema/SemaOpenMP.cpp",23031,"NamedDecl *Sema::lookupOpenMPDeclareTargetName(Scope *CurScope, CXXScopeSpec &ScopeSpec, const DeclarationNameInfo &Id) {\n  // ...\n  if (!Lookup.isSingleResult()) {\n    // ...\n    if (TypoCorrection Corrected = CorrectTypo(Id, LookupOrdinaryName, CurScope, nullptr, CCC, CTK_ErrorRecovery)) {\n      diagnoseTypo(Corrected, PDiag(diag::err_undeclared_var_use_suggest) << Id.getName());"}},
		[j]={
			["clang/test/Sema/PR28181.c"]={"clang/test/Sema/PR28181.c:8:22: error: use of undeclared identifier \'lock\'; did you mean \'long\'?","clang/test/Sema/PR28181.c:12:22: error: use of undeclared identifier \'lock\'; did you mean \'long\'?"}
		}
	},
	["err_undef_interface"]={
		[a]="err_undef_interface",
		[b]="cannot find interface declaration for %0",
		[c]="cannot find interface declaration for A",
		[d]=l,
		[e]="cannot find interface declaration for (.*?)",
		[f]=k,
		[g]=m,
		[h]={Q,1236199783,M,L},
		[i]={{ab,1845,"ObjCCategoryDecl *Sema::ActOnStartCategoryInterface(SourceLocation AtInterfaceLoc, IdentifierInfo *ClassName, SourceLocation ClassLoc, ObjCTypeParamList *typeParamList, IdentifierInfo *CategoryName, SourceLocation CategoryLoc, Decl *const *ProtoRefs, unsigned NumProtoRefs, const SourceLocation *ProtoLocs, SourceLocation EndProtoLoc, const ParsedAttributesView &AttrList) {\n  // ...\n  if (!IDecl || RequireCompleteType(ClassLoc, Context.getObjCInterfaceType(IDecl), diag::err_category_forward_interface, CategoryName == nullptr)) {\n    // ...\n    if (!IDecl)\n      Diag(ClassLoc, diag::err_undef_interface) << ClassName;"},{ab,1941,"/// ActOnStartCategoryImplementation - Perform semantic checks on the\n/// category implementation declaration and build an ObjCCategoryImplDecl\n/// object.\nObjCCategoryImplDecl *Sema::ActOnStartCategoryImplementation(SourceLocation AtCatImplLoc, IdentifierInfo *ClassName, SourceLocation ClassLoc, IdentifierInfo *CatName, SourceLocation CatLoc, const ParsedAttributesView &Attrs) {\n  // ...\n  /// Check that class of this category is already completely declared.\n  if (!IDecl) {\n    Diag(ClassLoc, diag::err_undef_interface) << ClassName;"},{ab,1944,"/// ActOnStartCategoryImplementation - Perform semantic checks on the\n/// category implementation declaration and build an ObjCCategoryImplDecl\n/// object.\nObjCCategoryImplDecl *Sema::ActOnStartCategoryImplementation(SourceLocation AtCatImplLoc, IdentifierInfo *ClassName, SourceLocation ClassLoc, IdentifierInfo *CatName, SourceLocation CatLoc, const ParsedAttributesView &Attrs) {\n  // ...\n  } else if (RequireCompleteType(ClassLoc, Context.getObjCInterfaceType(IDecl), diag::err_undef_interface)) {"},{ab,5106,"/// Called whenever \\@defs(ClassName) is encountered in the source.  Inserts the\n/// instance variables of ClassName into Decls.\nvoid Sema::ActOnDefs(Scope *S, Decl *TagD, SourceLocation DeclStart, IdentifierInfo *ClassName, SmallVectorImpl<Decl *> &Decls) {\n  // ...\n  if (!Class) {\n    Diag(DeclStart, diag::err_undef_interface) << ClassName;"}}
	},
	["err_undef_interface_suggest"]={
		[a]="err_undef_interface_suggest",
		[b]="cannot find interface declaration for %0; did you mean %1?",
		[c]="cannot find interface declaration for A; did you mean B?",
		[d]=l,
		[e]="cannot find interface declaration for (.*?); did you mean (.*?)\\?",
		[f]=k,
		[g]=m,
		[h]={"35b0bac8c51a",1262541717,"Implement typo correction for a variety of Objective-C-specific","Implement typo correction for a variety of Objective-C-specific\nconstructs:\n\n  - Instance variable lookup (\"foo->ivar\" and, in instance methods, \"ivar\")\n  - Property name lookup (\"foo.prop\")\n  - Superclasses\n  - Various places where a class name is required\n  - Protocol names (e.g., id<proto>)\n\nThis seems to cover many of the common places where typos could occur.\n\nllvm-svn: 92449"},
		[i]={{u,2330,"/// Look for an Objective-C class in the translation unit.\n///\n/// \\param Id The name of the Objective-C class we\'re looking for. If\n/// typo-correction fixes this name, the Id will be updated\n/// to the fixed name.\n///\n/// \\param IdLoc The location of the name in the translation unit.\n///\n/// \\param DoTypoCorrection If true, this routine will attempt typo correction\n/// if there is no class with the given name.\n///\n/// \\returns The declaration of the named Objective-C class, or NULL if the\n/// class could not be found.\nObjCInterfaceDecl *Sema::getObjCInterfaceDecl(IdentifierInfo *&Id, SourceLocation IdLoc, bool DoTypoCorrection) {\n  // ...\n  if (!IDecl && DoTypoCorrection) {\n    // ...\n    if (TypoCorrection C = CorrectTypo(DeclarationNameInfo(Id, IdLoc), LookupOrdinaryName, TUScope, nullptr, CCC, CTK_ErrorRecovery)) {\n      diagnoseTypo(C, PDiag(diag::err_undef_interface_suggest) << Id);"}},
		[j]={
			["clang/test/SemaObjC/undef-class-messagin-error.m"]={"clang/test/SemaObjC/undef-class-messagin-error.m:7:12: error: cannot find interface declaration for \'Child\'; did you mean \'_Child\'?"}
		}
	},
	["err_undef_superclass"]={
		[a]="err_undef_superclass",
		[b]="cannot find interface declaration for %0, superclass of %1",
		[c]="cannot find interface declaration for A, superclass of B",
		[d]=l,
		[e]="cannot find interface declaration for (.*?), superclass of (.*?)",
		[f]=k,
		[g]=m,
		[h]={Q,1236199783,M,L},
		[i]={{ab,617,"void Sema::ActOnSuperClassOfClassInterface(Scope *S, SourceLocation AtInterfaceLoc, ObjCInterfaceDecl *IDecl, IdentifierInfo *ClassName, SourceLocation ClassLoc, IdentifierInfo *SuperName, SourceLocation SuperLoc, ArrayRef<ParsedType> SuperTypeArgs, SourceRange SuperTypeArgsRange) {\n  // ...\n  if (declaresSameEntity(PrevDecl, IDecl)) {\n  // ...\n  } else {\n    // ...\n    if (!isa_and_nonnull<TypedefNameDecl>(PrevDecl)) {\n      if (!SuperClassDecl)\n        Diag(SuperLoc, diag::err_undef_superclass) << SuperName << ClassName << SourceRange(AtInterfaceLoc, ClassLoc);"},{ab,2034,"ObjCImplementationDecl *Sema::ActOnStartClassImplementation(SourceLocation AtClassImplLoc, IdentifierInfo *ClassName, SourceLocation ClassLoc, IdentifierInfo *SuperClassname, SourceLocation SuperClassLoc, const ParsedAttributesView &Attrs) {\n  // ...\n  if (SuperClassname) {\n    // ...\n    if (PrevDecl && !isa<ObjCInterfaceDecl>(PrevDecl)) {\n    // ...\n    } else {\n      // ...\n      if (!SDecl)\n        Diag(SuperClassLoc, diag::err_undef_superclass) << SuperClassname << ClassName;"}},
		[j]={
			["clang/test/SemaObjC/class-def-test-1.m"]={"clang/test/SemaObjC/class-def-test-1.m:26:20: error: cannot find interface declaration for \'PROTO\', superclass of \'INTF3\'","clang/test/SemaObjC/class-def-test-1.m:35:27: error: cannot find interface declaration for \'SomeClassSup\', superclass of \'SomeClassSub\'"}
		}
	},
	["err_undef_superclass_suggest"]={
		[a]="err_undef_superclass_suggest",
		[b]="cannot find interface declaration for %0, superclass of %1; did you mean %2?",
		[c]="cannot find interface declaration for A, superclass of B; did you mean C?",
		[d]=l,
		[e]="cannot find interface declaration for (.*?), superclass of (.*?); did you mean (.*?)\\?",
		[f]=k,
		[g]=m,
		[h]={"35b0bac8c51a",1262541717,"Implement typo correction for a variety of Objective-C-specific","Implement typo correction for a variety of Objective-C-specific\nconstructs:\n\n  - Instance variable lookup (\"foo->ivar\" and, in instance methods, \"ivar\")\n  - Property name lookup (\"foo.prop\")\n  - Superclasses\n  - Various places where a class name is required\n  - Protocol names (e.g., id<proto>)\n\nThis seems to cover many of the common places where typos could occur.\n\nllvm-svn: 92449"},
		[i]={{ab,563,"void Sema::ActOnSuperClassOfClassInterface(Scope *S, SourceLocation AtInterfaceLoc, ObjCInterfaceDecl *IDecl, IdentifierInfo *ClassName, SourceLocation ClassLoc, IdentifierInfo *SuperName, SourceLocation SuperLoc, ArrayRef<ParsedType> SuperTypeArgs, SourceRange SuperTypeArgsRange) {\n  // ...\n  if (!PrevDecl) {\n    // ...\n    if (TypoCorrection Corrected = CorrectTypo(DeclarationNameInfo(SuperName, SuperLoc), LookupOrdinaryName, TUScope, nullptr, CCC, CTK_ErrorRecovery)) {\n      diagnoseTypo(Corrected, PDiag(diag::err_undef_superclass_suggest) << SuperName << ClassName);"}},
		[j]={
			["clang/test/FixIt/typo.m"]={"clang/test/FixIt/typo.m:86:22: error: cannot find interface declaration for \'Collid\', superclass of \'Derived\'; did you mean \'Collide\'?"}
		}
	},
	["err_undefined_inline_var"]={
		[a]="err_undefined_inline_var",
		[b]="inline variable %q0 is not defined",
		[c]="inline variable A is not defined",
		[d]=l,
		[e]="inline variable (.*?) is not defined",
		[f]=k,
		[g]=m,
		[h]={"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"},
		[i]={{"clang/lib/Sema/Sema.cpp",915,"/// checkUndefinedButUsed - Check for undefined objects with internal linkage\n/// or that are inline.\nstatic void checkUndefinedButUsed(Sema &S) {\n  // ...\n  for (const auto &Undef : Undefined) {\n    // ...\n    if (S.isExternalWithNoLinkageType(VD)) {\n    // ...\n    } else if (!VD->isExternallyVisible()) {\n    // ...\n    } else if (auto *FD = dyn_cast<FunctionDecl>(VD)) {\n    // ...\n    } else {\n      // ...\n      S.Diag(VD->getLocation(), diag::err_undefined_inline_var) << VD;"}},
		[j]={
			["clang/test/CXX/basic/basic.def/p4.cpp"]={"clang/test/CXX/basic/basic.def/p4.cpp:4:19: error: inline variable \'n\' is not defined"}
		}
	},
	["err_undefined_internal_type"]={
		[a]={{nil,z,"err_undefined_internal_type"}},
		[b]={{nil,z,"%select{function|variable}0 %q1 is used but not defined in this translation unit, and cannot be defined in any other translation unit because its type does not have linkage"}},
		[c]={{nil,z,{{fb,"variable"}," B is used but not defined in this translation unit, and cannot be defined in any other translation unit because its type does not have linkage"}}},
		[d]=l,
		[e]="(?:function|variable) (.*?) is used but not defined in this translation unit, and cannot be defined in any other translation unit because its type does not have linkage",
		[f]=k,
		[g]={{nil,z,m}},
		[h]={"405e2dbf3767",1505892120,"Implement C++ [basic.link]p8.","Implement C++ [basic.link]p8.\n\nIf a function or variable has a type with no linkage (and is not extern \"C\"),\nany use of it requires a definition within the same translation unit; the idea\nis that it is not possible to define the entity elsewhere, so any such use is\nnecessarily an error.\n\nThere is an exception, though: some types formally have no linkage but\nnonetheless can be referenced from other translation units (for example, this\nhappens to anonymous structures defined within inline functions). For entities\nwith those types, we suppress the diagnostic except under -pedantic.\n\nllvm-svn: 313729"},
		[i]={{"clang/lib/Sema/Sema.cpp",885,"/// checkUndefinedButUsed - Check for undefined objects with internal linkage\n/// or that are inline.\nstatic void checkUndefinedButUsed(Sema &S) {\n  // ...\n  for (const auto &Undef : Undefined) {\n    // ...\n    if (S.isExternalWithNoLinkageType(VD)) {\n      // ...\n      S.Diag(VD->getLocation(), isExternallyVisible(VD->getType()->getLinkage()) ? diag::ext_undefined_internal_type : diag::err_undefined_internal_type) << isa<VarDecl>(VD) << VD;"}},
		[j]={
			["clang/test/CXX/basic/basic.link/p8.cpp"]={"clang/test/CXX/basic/basic.link/p8.cpp:35:19: error: function \'no_linkage1\' is used but not defined in this translation unit, and cannot be defined in any other translation unit because its type does not have linkage","clang/test/CXX/basic/basic.link/p8.cpp:36:19: error: function \'no_linkage2\' is used but not defined in this translation unit, and cannot be defined in any other translation unit because its type does not have linkage","clang/test/CXX/basic/basic.link/p8.cpp:37:19: error: function \'no_linkage3\' is used but not defined in this translation unit, and cannot be defined in any other translation unit because its type does not have linkage","clang/test/CXX/basic/basic.link/p8.cpp:58:17: error: function \'internal_linkage\' is used but not defined in this translation unit, and cannot be defined in any other translation unit because its type does not have linkage"}
		}
	},
	["err_underlying_type_of_incomplete_enum"]={
		[a]="err_underlying_type_of_incomplete_enum",
		[b]="cannot determine underlying type of incomplete enumeration type %0",
		[c]="cannot determine underlying type of incomplete enumeration type A",
		[d]=l,
		[e]="cannot determine underlying type of incomplete enumeration type (.*?)",
		[f]=k,
		[g]=m,
		[h]={"29d0e6b60116",1402531305,"PR19966: don\'t crash/assert when __underlying_type is applied to an incomplete","PR19966: don\'t crash/assert when __underlying_type is applied to an incomplete\nenumeration type. I\'ve also filed a LWG issue pointing out that this should be\nill-formed.\n\nllvm-svn: 210723"},
		[i]={{U,9530,"QualType Sema::BuiltinEnumUnderlyingType(QualType BaseType, SourceLocation Loc) {\n  // ...\n  if (BaseType->isIncompleteType(&FwdDecl)) {\n    Diag(Loc, diag::err_underlying_type_of_incomplete_enum) << BaseType;"}},
		[j]={
			["clang/test/SemaCXX/underlying_type.cpp"]={"clang/test/SemaCXX/underlying_type.cpp:49:5: error: cannot determine underlying type of incomplete enumeration type \'Invalid\'","clang/test/SemaCXX/underlying_type.cpp:53:10: error: cannot determine underlying type of incomplete enumeration type \'E\'"}
		}
	},
	["err_unevaluated_string_invalid_escape_sequence"]={
		[a]="err_unevaluated_string_invalid_escape_sequence",
		[b]="invalid escape sequence \'%0\' in an unevaluated string literal",
		[c]="invalid escape sequence \'A\' in an unevaluated string literal",
		[d]=l,
		[e]="invalid escape sequence \'(.*?)\' in an unevaluated string literal",
		[f]=k,
		[g]=I,
		[h]={F,1625925174,G,H},
		[i]={{jb,365,"/// 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 (EvalMethod == StringLiteralEvalMethod::Unevaluated && !IsEscapeValidInUnevaluatedStringLiteral(Escape)) {\n    Diag(Diags, Features, Loc, ThisTokBegin, EscapeBegin, ThisTokBuf, diag::err_unevaluated_string_invalid_escape_sequence) << StringRef(EscapeBegin, ThisTokBuf - EscapeBegin);"}},
		[j]={
			["clang/test/CXX/dcl.dcl/p4-0x.cpp"]={"clang/test/CXX/dcl.dcl/p4-0x.cpp:21:24: error: invalid escape sequence \'\\x14\' in an unevaluated string literal"}
		}
	},
	["err_unevaluated_string_prefix"]={
		[a]="err_unevaluated_string_prefix",
		[b]="an unevaluated string literal cannot have an encoding prefix",
		[c]="an unevaluated string literal cannot have an encoding prefix",
		[d]=l,
		[e]="an unevaluated string literal cannot have an encoding prefix",
		[f]=k,
		[g]=I,
		[h]={F,1625925174,G,H},
		[i]={{jb,1953,"void StringLiteralParser::init(ArrayRef<Token> StringToks) {\n  // ...\n  /// (C99 5.1.1.2p1).  The common case is only one string fragment.\n  for (const Token &Tok : StringToks) {\n    // ...\n    // Remember if we see any wide or utf-8/16/32 strings.\n    // Also check for illegal concatenations.\n    if (isUnevaluated() && Tok.getKind() != tok::string_literal) {\n      if (Diags) {\n        // ...\n        Diags->Report(Tok.getLocation(), Features.CPlusPlus26 ? diag::err_unevaluated_string_prefix : diag::warn_unevaluated_string_prefix) << Prefix << Features.CPlusPlus << FixItHint::CreateRemoval(Range);"}},
		[j]={
			["clang/test/FixIt/unevaluated-strings.cpp"]={"clang/test/FixIt/unevaluated-strings.cpp:7:21: error: an unevaluated string literal cannot have an encoding prefix","clang/test/FixIt/unevaluated-strings.cpp:10:21: error: an unevaluated string literal cannot have an encoding prefix","clang/test/FixIt/unevaluated-strings.cpp:13:21: error: an unevaluated string literal cannot have an encoding prefix","clang/test/FixIt/unevaluated-strings.cpp:16:21: error: an unevaluated string literal cannot have an encoding prefix"}
		}
	},
	["err_unevaluated_string_udl"]={
		[a]="err_unevaluated_string_udl",
		[b]="an unevaluated string literal cannot be a user-defined literal",
		[c]="an unevaluated string literal cannot be a user-defined literal",
		[d]=l,
		[e]="an unevaluated string literal cannot be a user\\-defined literal",
		[f]=k,
		[g]=I,
		[h]={F,1625925174,G,H},
		[i]={{jb,2047,"void StringLiteralParser::init(ArrayRef<Token> StringToks) {\n  // ...\n  for (unsigned i = 0, e = StringToks.size(); i != e; ++i) {\n    // ...\n    // Remove an optional ud-suffix.\n    if (ThisTokEnd[-1] != \'\"\') {\n      // ...\n      if (UDSuffixBuf.empty()) {\n      // ...\n      } else {\n        // ...\n        if (UDSuffixBuf != UDSuffix || UnevaluatedStringHasUDL) {\n          if (Diags) {\n            // ...\n            if (UnevaluatedStringHasUDL) {\n              Diags->Report(TokLoc, diag::err_unevaluated_string_udl) << SourceRange(TokLoc, TokLoc);"}}
	},
	["err_unexpanded_parameter_pack"]={
		[a]="err_unexpanded_parameter_pack",
		[b]={{nil,"12.0","%select{expression|base type|declaration type|data member type|bit-field size|static assertion|fixed underlying type|enumerator value|using declaration|friend declaration|qualifier|initializer|default argument|non-type template parameter type|exception type|partial specialization|__if_exists name|__if_not_exists name|lambda|block|type constraint|requirement|requires clause}0 contains%plural{0: an|:}1 unexpanded parameter pack%plural{0:|1: %2|2:s %2 and %3|:s %2, %3, ...}1"},{"11.1",q,"%select{expression|base type|declaration type|data member type|bit-field size|static assertion|fixed underlying type|enumerator value|using declaration|friend declaration|qualifier|initializer|default argument|non-type template parameter type|exception type|partial specialization|__if_exists name|__if_not_exists name|lambda|block|type constraint}0 contains%plural{0: an|:}1 unexpanded parameter pack%plural{0:|1: %2|2:s %2 and %3|:s %2, %3, ...}1"},{y,nil,"%select{expression|base type|declaration type|data member type|bit-field size|static assertion|fixed underlying type|enumerator value|using declaration|friend declaration|qualifier|initializer|default argument|non-type template parameter type|exception type|partial specialization|__if_exists name|__if_not_exists name|lambda|block}0 contains%plural{0: an|:}1 unexpanded parameter pack%plural{0:|1: %2|2:s %2 and %3|:s %2, %3, ...}1"}},
		[c]={{nil,"12.0",{{"expression","base type","declaration type","data member type","bit-field size","static assertion","fixed underlying type",Bb,"using declaration","friend declaration","qualifier","initializer","default argument","non-type template parameter type","exception type","partial specialization","__if_exists name","__if_not_exists name","lambda","block","type constraint","requirement","requires clause"}," contains",{" an",k}," unexpanded parameter pack",{k," C","s C and D","s C, D, ..."}}},{"11.1",q,{{"expression","base type","declaration type","data member type","bit-field size","static assertion","fixed underlying type",Bb,"using declaration","friend declaration","qualifier","initializer","default argument","non-type template parameter type","exception type","partial specialization","__if_exists name","__if_not_exists name","lambda","block","type constraint"}," contains",{" an",k}," unexpanded parameter pack",{k," C","s C and D","s C, D, ..."}}},{y,nil,{{"expression","base type","declaration type","data member type","bit-field size","static assertion","fixed underlying type",Bb,"using declaration","friend declaration","qualifier","initializer","default argument","non-type template parameter type","exception type","partial specialization","__if_exists name","__if_not_exists name","lambda","block"}," contains",{" an",k}," unexpanded parameter pack",{k," C","s C and D","s C, D, ..."}}}},
		[d]=l,
		[e]="(?:expression|base type|declaration type|data member type|bit\\-field size|static assertion|fixed underlying type|enumerator value|using declaration|friend declaration|qualifier|initializer|default argument|non\\-type template parameter type|exception type|partial specialization|__if_exists name|__if_not_exists name|lambda|block|type constraint|requirement|requires clause) contains(?: an|) unexpanded parameter pack(?:| (.*?)|s (.*?) and (.*?)|s (.*?), (.*?), \\.\\.\\.)",
		[f]=k,
		[g]=m,
		[h]={"506bd56484a5",1292280562,"Variadic templates: extend Type, NestedNameSpecifier, TemplateName,","Variadic templates: extend Type, NestedNameSpecifier, TemplateName,\nand TemplateArgument with an operation that determines whether there\nare any unexpanded parameter packs within that construct. Use this\ninformation to diagnose the appearance of the names of parameter packs\nthat have not been expanded (C++ [temp.variadic]p5). Since this\nproperty is checked often (every declaration, ever expression\nstatement, etc.), we extend Type and Expr with a bit storing the\nresult of this computation, rather than walking the AST each time to\ndetermine whether any unexpanded parameter packs occur.\n\nThis commit is deficient in several ways, which will be remedied with\nfuture commits:\n  - Expr has a bit to store the presence of an unexpanded parameter\n  pack, but it is never set.\n  - The error messages don\'t point out where the unexpanded parameter\n  packs were named in the type/expression, but they should. \n  - We don\'t check for unexpanded parameter packs in all of the places\n  where we should.\n  - Testing is sparse, pending the resolution of the above three\n  issues.\n\nllvm-svn: 121724"},
		[i]={{"clang/lib/Sema/SemaTemplateVariadic.cpp",372,"/// Diagnose all of the unexpanded parameter packs in the given\n/// vector.\nbool Sema::DiagnoseUnexpandedParameterPacks(SourceLocation Loc, UnexpandedParameterPackContext UPPC, ArrayRef<UnexpandedParameterPack> Unexpanded) {\n  // ...\n  auto DB = Diag(Loc, diag::err_unexpanded_parameter_pack) << (int)UPPC << (int)Names.size();"}},
		[j]={
			["clang/test/CXX/temp/temp.decls/temp.variadic/p5.mm"]={"clang/test/CXX/temp/temp.decls/temp.variadic/p5.mm:5:16: error: expression contains unexpanded parameter pack \'values\'","clang/test/CXX/temp/temp.decls/temp.variadic/p5.mm:6:17: error: expression contains unexpanded parameter pack \'values\'","clang/test/CXX/temp/temp.decls/temp.variadic/p5.mm:7:12: error: expression contains unexpanded parameter pack \'values\'"}
		}
	},
	["err_unexpected_at"]={
		[a]="err_unexpected_at",
		[b]="unexpected \'@\' in program",
		[c]="unexpected \'@\' in program",
		[d]=l,
		[e]="unexpected \'@\' in program",
		[f]=k,
		[g]=s,
		[h]={Q,1236199783,M,L},
		[i]={{D,4694,"/// ParseStructUnionBody\n///       struct-contents:\n///         struct-declaration-list\n/// [EXT]   empty\n/// [GNU]   \"struct-declaration-list\" without terminating \';\'\n///       struct-declaration-list:\n///         struct-declaration\n///         struct-declaration-list struct-declaration\n/// [OBC]   \'@\' \'defs\' \'(\' class-name \')\'\n///\nvoid Parser::ParseStructUnionBody(SourceLocation RecordLoc, DeclSpec::TST TagType, RecordDecl *TagDecl) {\n  // ...\n  // While we still have something to read, read the declarations in the struct.\n  while (!tryParseMisplacedModuleImport() && Tok.isNot(tok::r_brace) && Tok.isNot(tok::eof)) {\n    // ...\n    if (!Tok.is(tok::at)) {\n    // ...\n    } else { // Handle @defs\n      // ...\n      if (!Tok.isObjCAtKeyword(tok::objc_defs)) {\n        Diag(Tok, diag::err_unexpected_at);"},{yb,107,"/// ParseObjCAtDirectives - Handle parts of the external-declaration production:\n///       external-declaration: [C99 6.9]\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\'\nParser::DeclGroupPtrTy Parser::ParseObjCAtDirectives(ParsedAttributes &DeclAttrs, ParsedAttributes &DeclSpecAttrs) {\n  // ...\n  default:\n    Diag(AtLoc, diag::err_unexpected_at);"},{yb,2902,"ExprResult Parser::ParseObjCAtExpression(SourceLocation AtLoc) {\n  // ...\n  default:\n    if (Tok.getIdentifierInfo() == nullptr)\n      return ExprError(Diag(AtLoc, diag::err_unexpected_at));"},{yb,2928,"ExprResult Parser::ParseObjCAtExpression(SourceLocation AtLoc) {\n  // ...\n  default:\n    // ...\n    default: {\n      // ...\n      if (str) {\n        // ...\n        return ExprError(Diag(AtLoc, diag::err_unexpected_at) << FixItHint::CreateReplacement(kwLoc, str));"},{yb,2932,"ExprResult Parser::ParseObjCAtExpression(SourceLocation AtLoc) {\n  // ...\n  default:\n    // ...\n    default: {\n      // ...\n      if (str) {\n      // ...\n      } else\n        return ExprError(Diag(AtLoc, diag::err_unexpected_at));"}},
		[j]={
			["clang/test/SemaObjC/invalid-code.m"]={"clang/test/SemaObjC/invalid-code.m:6:13: error: unexpected \'@\' in program"}
		}
	},
	["err_unexpected_colon_in_nested_name_spec"]={
		[a]="err_unexpected_colon_in_nested_name_spec",
		[b]="unexpected \':\' in nested name specifier; did you mean \'::\'?",
		[c]="unexpected \':\' in nested name specifier; did you mean \'::\'?",
		[d]=l,
		[e]="unexpected \'\\:\' in nested name specifier; did you mean \'\\:\\:\'\\?",
		[f]=k,
		[g]=s,
		[h]={"6a7ffbed8ab4",1397407923,"Improve error recovery around colon.","Improve error recovery around colon.\n\nParse of nested name spacifier is modified so that it properly recovers\nif colon is mistyped as double colon in case statement.\nThis patch fixes PR15133.\n\nDifferential Revision: http://llvm-reviews.chandlerc.com/D2870\n\nllvm-svn: 206135"},
		[i]={{tb,406,"/// Parse global scope or nested-name-specifier if present.\n///\n/// Parses a C++ global scope specifier (\'::\') or nested-name-specifier (which\n/// may be preceded by \'::\'). Note that this routine will not parse ::new or\n/// ::delete; it will just leave them in the token stream.\n///\n///       \'::\'[opt] nested-name-specifier\n///       \'::\'\n///\n///       nested-name-specifier:\n///         type-name \'::\'\n///         namespace-name \'::\'\n///         nested-name-specifier identifier \'::\'\n///         nested-name-specifier \'template\'[opt] simple-template-id \'::\'\n///\n///\n/// \\param SS the scope specifier that will be set to the parsed\n/// nested-name-specifier (or empty)\n///\n/// \\param ObjectType if this nested-name-specifier is being parsed following\n/// the \".\" or \"->\" of a member access expression, this parameter provides the\n/// type of the object whose members are being accessed.\n///\n/// \\param ObjectHadErrors if this unqualified-id occurs within a member access\n/// expression, indicates whether the original subexpressions had any errors.\n/// When true, diagnostics for missing \'template\' keyword will be supressed.\n///\n/// \\param EnteringContext whether we will be entering into the context of\n/// the nested-name-specifier after parsing it.\n///\n/// \\param MayBePseudoDestructor When non-NULL, points to a flag that\n/// indicates whether this nested-name-specifier may be part of a\n/// pseudo-destructor name. In this case, the flag will be set false\n/// if we don\'t actually end up parsing a destructor name. Moreover,\n/// if we do end up determining that we are parsing a destructor name,\n/// the last component of the nested-name-specifier is not parsed as\n/// part of the scope specifier.\n///\n/// \\param IsTypename If \\c true, this nested-name-specifier is known to be\n/// part of a type name. This is used to improve error recovery.\n///\n/// \\param LastII When non-NULL, points to an IdentifierInfo* that will be\n/// filled in with the leading identifier in the last component of the\n/// nested-name-specifier, if any.\n///\n/// \\param OnlyNamespace If true, only considers namespaces in lookup.\n///\n///\n/// \\returns true if there was an error parsing a scope specifier\nbool Parser::ParseOptionalCXXScopeSpecifier(CXXScopeSpec &SS, ParsedType ObjectType, bool ObjectHadErrors, bool EnteringContext, bool *MayBePseudoDestructor, bool IsTypename, IdentifierInfo **LastII, bool OnlyNamespace, bool InUsingDeclaration) {\n  // ...\n  while (true) {\n    // ...\n    // If we get foo:bar, this is almost certainly a typo for foo::bar.  Recover\n    // and emit a fixit hint for it.\n    if (Next.is(tok::colon) && !ColonIsSacred) {\n      if (Actions.IsInvalidUnlessNestedName(getCurScope(), SS, IdInfo, EnteringContext) &&\n        // ...\n        Diag(Next, diag::err_unexpected_colon_in_nested_name_spec) << FixItHint::CreateReplacement(Next.getLocation(), \"::\");"}},
		[j]={
			["clang/test/Misc/diag-inline-namespace.cpp"]={"clang/test/Misc/diag-inline-namespace.cpp:57:5: error: unexpected \':\' in nested name specifier; did you mean \'::\'?"}
		}
	},
	["err_unexpected_friend"]={
		[a]="err_unexpected_friend",
		[b]="friends can only be classes or functions",
		[c]="friends can only be classes or functions",
		[d]=l,
		[e]="friends can only be classes or functions",
		[f]=k,
		[g]=m,
		[h]={"07e91c04ba33",1249524943,"First pass at friend semantics.","First pass at friend semantics.\n\nllvm-svn: 78274"},
		[i]={{r,17499,"NamedDecl *Sema::ActOnFriendFunctionDecl(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParams) {\n  // ...\n  // C++ [class.friend]p1\n  //   A friend of a class is a function or class....\n  // Note that this sees through typedefs, which is intended.\n  // It *doesn\'t* see through dependent types, which is correct\n  // according to [temp.arg.type]p3:\n  //   If a declaration acquires a function type through a\n  //   type dependent on a template-parameter and this causes\n  //   a declaration that does not use the syntactic form of a\n  //   function declarator to have a function type, the program\n  //   is ill-formed.\n  if (!TInfo->getType()->isFunctionType()) {\n    Diag(Loc, diag::err_unexpected_friend);"}},
		[j]={
			["clang/test/CXX/class/class.friend/p1.cpp"]={"clang/test/CXX/class/class.friend/p1.cpp:34:28: error: friends can only be classes or functions","clang/test/CXX/class/class.friend/p1.cpp:35:28: error: friends can only be classes or functions","clang/test/CXX/class/class.friend/p1.cpp:37:14: error: friends can only be classes or functions"}
		}
	},
	["err_unexpected_interface"]={
		[a]="err_unexpected_interface",
		[b]="unexpected interface name %0: expected expression",
		[c]="unexpected interface name A: expected expression",
		[d]=l,
		[e]="unexpected interface name (.*?)\\: expected expression",
		[f]=k,
		[g]=m,
		[h]={O,1237025389,N,P},
		[i]={{v,3301,"/// Diagnoses obvious problems with the use of the given declaration\n/// as an expression.  This is only actually called for lookups that\n/// were not overloaded, and it doesn\'t promise that the declaration\n/// will in fact be used.\nstatic bool CheckDeclInExpr(Sema &S, SourceLocation Loc, NamedDecl *D, bool AcceptInvalid) {\n  // ...\n  if (isa<ObjCInterfaceDecl>(D)) {\n    S.Diag(Loc, diag::err_unexpected_interface) << D->getDeclName();"}},
		[j]={
			["clang/test/SemaObjC/crash-on-type-args-protocols.m"]={"clang/test/SemaObjC/crash-on-type-args-protocols.m:23:15: error: unexpected interface name \'X\': expected expression"}
		}
	},
	["err_unexpected_module_decl"]={
		[a]="err_unexpected_module_decl",
		[b]="module declaration must be the first declaration in the translation unit",
		[c]="module declaration must be the first declaration in the translation unit",
		[d]=l,
		[e]="module declaration can only appear at the top level",
		[f]=k,
		[g]="Modules Issue",
		[h]={"bbcc9f0462c1",1472170478,"C++ Modules TS: add frontend support for building pcm files from module","C++ Modules TS: add frontend support for building pcm files from module\ninterface files. At the moment, all declarations (and no macros) are exported,\nand \'export\' declarations are not supported yet.\n\nllvm-svn: 279794"},
		[i]={{Cb,1025,"/// 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_module:\n    Diag(Tok, diag::err_unexpected_module_decl);"}}
	},
	["err_unexpected_namespace"]={
		[a]="err_unexpected_namespace",
		[b]="unexpected namespace name %0: expected expression",
		[c]="unexpected namespace name A: expected expression",
		[d]=l,
		[e]="unexpected namespace name (.*?)\\: expected expression",
		[f]=k,
		[g]=m,
		[h]={O,1237025389,N,P},
		[i]={{v,3306,"/// Diagnoses obvious problems with the use of the given declaration\n/// as an expression.  This is only actually called for lookups that\n/// were not overloaded, and it doesn\'t promise that the declaration\n/// will in fact be used.\nstatic bool CheckDeclInExpr(Sema &S, SourceLocation Loc, NamedDecl *D, bool AcceptInvalid) {\n  // ...\n  if (isa<NamespaceDecl>(D)) {\n    S.Diag(Loc, diag::err_unexpected_namespace) << D->getDeclName();"}},
		[j]={
			["clang/test/SemaCXX/attr-musttail.cpp"]={"clang/test/SemaCXX/attr-musttail.cpp:268:30: error: unexpected namespace name \'ns\': expected expression"}
		}
	},
	["err_unexpected_namespace_attributes_alias"]={
		[a]="err_unexpected_namespace_attributes_alias",
		[b]="attributes cannot be specified on namespace alias",
		[c]="attributes cannot be specified on namespace alias",
		[d]=l,
		[e]="attributes cannot be specified on namespace alias",
		[f]=k,
		[g]=s,
		[h]={"6b6bba4a2087",1245268140,"Diagnose the use of attributes on namespace aliases, from Anis Ahmad","Diagnose the use of attributes on namespace aliases, from Anis Ahmad\n\nllvm-svn: 73626"},
		[i]={{Y,144,"/// 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 (Tok.is(tok::equal)) {\n    // ...\n    if (attrLoc.isValid())\n      Diag(attrLoc, diag::err_unexpected_namespace_attributes_alias);"}},
		[j]={
			["clang/test/Parser/cxx1z-attributes.cpp"]={"clang/test/Parser/cxx1z-attributes.cpp:5:11: error: attributes cannot be specified on namespace alias"}
		}
	},
	["err_unexpected_nested_namespace_attribute"]={
		[a]="err_unexpected_nested_namespace_attribute",
		[b]="attributes cannot be specified on a nested namespace definition",
		[c]="attributes cannot be specified on a nested namespace definition",
		[d]=l,
		[e]="attributes cannot be specified on a nested namespace definition",
		[f]=k,
		[g]=s,
		[h]={"c0ae7dfe75e5",1415466435,"Updated the wording for a diagnostic to be more grammatically correct, and use a %select. Also ensur...","Updated the wording for a diagnostic to be more grammatically correct, and use a %select. Also ensure that nested namespace definitions are diagnosed properly. Both changes are motivated by post-commit feedback from r221580.\n\nllvm-svn: 221581"},
		[i]={{Y,134,"/// 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  // A nested namespace definition cannot have attributes.\n  if (!ExtraNSs.empty() && attrLoc.isValid())\n    Diag(attrLoc, diag::err_unexpected_nested_namespace_attribute);"}},
		[j]={
			["clang/test/Parser/cxx1z-attributes.cpp"]={"clang/test/Parser/cxx1z-attributes.cpp:7:11: error: attributes cannot be specified on a nested namespace definition"}
		}
	},
	["err_unexpected_protocol_qualifier"]={
		[a]="err_unexpected_protocol_qualifier",
		[b]="@implementation declaration cannot be protocol qualified",
		[c]="@implementation declaration cannot be protocol qualified",
		[d]=l,
		[e]="@implementation declaration cannot be protocol qualified",
		[f]=k,
		[g]=s,
		[h]={"46ed4d978e1c",1366845827,"Objective-C parsing [qoi]: Recover gracefully with good diagnostic","Objective-C parsing [qoi]: Recover gracefully with good diagnostic\nwhen class implementation declaration adds protocol qualifier\nlist. // rdar://12233858\n\nllvm-svn: 180228"},
		[i]={{yb,2195,"///   objc-implementation:\n///     objc-class-implementation-prologue\n///     objc-category-implementation-prologue\n///\n///   objc-class-implementation-prologue:\n///     @implementation identifier objc-superclass[opt]\n///       objc-class-instance-variables[opt]\n///\n///   objc-category-implementation-prologue:\n///     @implementation identifier ( identifier )\nParser::DeclGroupPtrTy Parser::ParseObjCAtImplementationDeclaration(SourceLocation AtLoc, ParsedAttributes &Attrs) {\n  // ...\n  // Neither a type parameter list nor a list of protocol references is\n  // permitted here. Parse and diagnose them.\n  if (Tok.is(tok::less)) {\n    // ...\n    if (parseObjCTypeParamListOrProtocolRefs(typeParamScope, lAngleLoc, protocolIdents, rAngleLoc)) {\n    // ...\n    } else if (lAngleLoc.isValid()) {\n      Diag(lAngleLoc, diag::err_unexpected_protocol_qualifier) << FixItHint::CreateRemoval(SourceRange(lAngleLoc, rAngleLoc));"},{yb,2227,"///   objc-implementation:\n///     objc-class-implementation-prologue\n///     objc-category-implementation-prologue\n///\n///   objc-class-implementation-prologue:\n///     @implementation identifier objc-superclass[opt]\n///       objc-class-instance-variables[opt]\n///\n///   objc-category-implementation-prologue:\n///     @implementation identifier ( identifier )\nParser::DeclGroupPtrTy Parser::ParseObjCAtImplementationDeclaration(SourceLocation AtLoc, ParsedAttributes &Attrs) {\n  // ...\n  if (Tok.is(tok::l_paren)) {\n    // ...\n    if (Tok.is(tok::less)) { // we have illegal \'<\' try to recover\n      Diag(Tok, diag::err_unexpected_protocol_qualifier);"},{yb,2257,"///   objc-implementation:\n///     objc-class-implementation-prologue\n///     objc-category-implementation-prologue\n///\n///   objc-class-implementation-prologue:\n///     @implementation identifier objc-superclass[opt]\n///       objc-class-instance-variables[opt]\n///\n///   objc-category-implementation-prologue:\n///     @implementation identifier ( identifier )\nParser::DeclGroupPtrTy Parser::ParseObjCAtImplementationDeclaration(SourceLocation AtLoc, ParsedAttributes &Attrs) {\n  // ...\n  if (Tok.is(tok::l_paren)) {\n  // ...\n  } else {\n    // ...\n    if (Tok.is(tok::l_brace)) // we have ivars\n    // ...\n    else if (Tok.is(tok::less)) { // we have illegal \'<\' try to recover\n      Diag(Tok, diag::err_unexpected_protocol_qualifier);"}},
		[j]={
			["clang/test/SemaObjC/parameterized_classes.m"]={"clang/test/SemaObjC/parameterized_classes.m:168:20: error: @implementation declaration cannot be protocol qualified"}
		}
	},
	["err_unexpected_scope_on_base_decltype"]={
		[a]="err_unexpected_scope_on_base_decltype",
		[b]="unexpected namespace scope prior to decltype",
		[c]="unexpected namespace scope prior to decltype",
		[d]=l,
		[e]="unexpected namespace scope prior to decltype",
		[f]=k,
		[g]=s,
		[h]={"afa155fb8879",1319566678,"Fix erroneous name-specifiers prior to decltypes better/correctly as per Doug\'s feedback.","Fix erroneous name-specifiers prior to decltypes better/correctly as per Doug\'s feedback.\n\nllvm-svn: 142935"},
		[i]={{Y,1284,"/// ParseBaseTypeSpecifier - Parse a C++ base-type-specifier which is either a\n/// class name or decltype-specifier. Note that we only check that the result\n/// names a type; semantic analysis will need to verify that the type names a\n/// class. The result is either a type or null, depending on whether a type\n/// name was found.\n///\n///       base-type-specifier: [C++11 class.derived]\n///         class-or-decltype\n///       class-or-decltype: [C++11 class.derived]\n///         nested-name-specifier[opt] class-name\n///         decltype-specifier\n///       class-name: [C++ class.name]\n///         identifier\n///         simple-template-id\n///\n/// In C++98, instead of base-type-specifier, we have:\n///\n///         ::[opt] nested-name-specifier[opt] class-name\nTypeResult Parser::ParseBaseTypeSpecifier(SourceLocation &BaseLoc, SourceLocation &EndLocation) {\n  // ...\n  // Parse decltype-specifier\n  // tok == kw_decltype is just error recovery, it can only happen when SS\n  // isn\'t empty\n  if (Tok.isOneOf(tok::kw_decltype, tok::annot_decltype)) {\n    if (SS.isNotEmpty())\n      Diag(SS.getBeginLoc(), diag::err_unexpected_scope_on_base_decltype) << FixItHint::CreateRemoval(SS.getRange());"}},
		[j]={
			["clang/test/CXX/class.derived/p1.cpp"]={"clang/test/CXX/class.derived/p1.cpp:34:21: error: unexpected namespace scope prior to decltype","clang/test/CXX/class.derived/p1.cpp:36:21: error: unexpected namespace scope prior to decltype"}
		}
	},
	["err_unexpected_semi"]={
		[a]="err_unexpected_semi",
		[b]="unexpected \';\' before %0",
		[c]="unexpected \';\' before A",
		[d]=l,
		[e]="unexpected \';\' before (.*?)",
		[f]=k,
		[g]=s,
		[h]={"1d3b58e31796",1431466595,"Add a new error for unexpected semi-colon before closing delimiter.","Add a new error for unexpected semi-colon before closing delimiter.\n\nPreviously, if a semi-colon is unexpectedly added before a closing \')\', \']\' or\n\'}\', two errors and one note would emitted, and the parsing would get confused\nto which scope it was in.  This change consumes the semi-colon, recovers\nparsing better, and emits only one error with a fix-it.\n\nllvm-svn: 237192"},
		[j]={
			["clang/test/Parser/extra-semi.cpp"]={"clang/test/Parser/extra-semi.cpp:6:17: error: unexpected \';\' before \')\'","clang/test/Parser/extra-semi.cpp:7:15: error: unexpected \';\' before \')\'","clang/test/Parser/extra-semi.cpp:8:31: error: unexpected \';\' before \')\'","clang/test/Parser/extra-semi.cpp:9:20: error: unexpected \';\' before \')\'","clang/test/Parser/extra-semi.cpp:10:10: error: unexpected \';\' before \']\'","clang/test/Parser/extra-semi.cpp:11:8: error: unexpected \';\' before \']\'","clang/test/Parser/extra-semi.cpp:12:19: error: unexpected \';\' before \'}\'"}
		}
	},
	["err_unexpected_template_after_using"]={
		[a]={{nil,y,"err_unexpected_template_after_using"}},
		[b]={{nil,y,"\'template\' keyword not permitted after \'using\' keyword"}},
		[c]={{nil,y,"\'template\' keyword not permitted after \'using\' keyword"}},
		[d]=l,
		[e]="\'template\' keyword not permitted after \'using\' keyword",
		[f]=k,
		[g]={{nil,y,s}},
		[h]={"2efd30571bcc",1556753629,"Consume unexpected \"template\" keywords after \"using\"","Consume unexpected \"template\" keywords after \"using\"\n\nThe parser was dealing with unexpected \"template\" keywords after \"using\"\nkeywords too late and putting the parser into the wrong state, which could\nlead to a crash down the line.  This change allows the parser to consume the\nbad \"template\" keywords earlier, and continue parsing as if \"template\" was\nnever there to begin with for better error recovery.\n\nllvm-svn: 359740"},
		[i]={{Y,494,"/// ParseUsingDirectiveOrDeclaration - Parse C++ using using-declaration or\n/// using-directive. Assumes that current token is \'using\'.\nParser::DeclGroupPtrTy Parser::ParseUsingDirectiveOrDeclaration(DeclaratorContext Context, const ParsedTemplateInfo &TemplateInfo, SourceLocation &DeclEnd, ParsedAttributes &Attrs) {\n  // ...\n  // Consume unexpected \'template\' keywords.\n  while (Tok.is(tok::kw_template)) {\n    // ...\n    Diag(TemplateLoc, diag::err_unexpected_template_after_using) << FixItHint::CreateRemoval(TemplateLoc);"},{Y,2797,"/// 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  if (Tok.is(tok::kw_using)) {\n    // ...\n    // Consume unexpected \'template\' keywords.\n    while (Tok.is(tok::kw_template)) {\n      // ...\n      Diag(TemplateLoc, diag::err_unexpected_template_after_using) << FixItHint::CreateRemoval(TemplateLoc);"}},
		[j]={
			["clang/test/Parser/using-template.cpp"]={"clang/test/Parser/using-template.cpp:14:9: error: \'template\' keyword not permitted after \'using\' keyword","clang/test/Parser/using-template.cpp:23:7: error: \'template\' keyword not permitted after \'using\' keyword","clang/test/Parser/using-template.cpp:25:7: error: \'template\' keyword not permitted after \'using\' keyword","clang/test/Parser/using-template.cpp:25:16: error: \'template\' keyword not permitted after \'using\' keyword","clang/test/Parser/using-template.cpp:34:7: error: \'template\' keyword not permitted after \'using\' keyword","clang/test/Parser/using-template.cpp:47:7: error: \'template\' keyword not permitted after \'using\' keyword"}
		}
	},
	["err_unexpected_template_in_destructor_name"]={
		[a]={{nil,C,"err_unexpected_template_in_destructor_name"}},
		[b]={{nil,C,"\'template\' keyword not permitted in destructor name"}},
		[c]={{nil,C,"\'template\' keyword not permitted in destructor name"}},
		[d]=l,
		[e]="\'template\' keyword not permitted in destructor name",
		[f]=k,
		[g]={{nil,C,s}},
		[h]={"f08df464ae89",1582039343,"[OPENMP50]Add initial support for OpenMP 5.0 iterator.","[OPENMP50]Add initial support for OpenMP 5.0 iterator.\n\nAdded basic parsing/semantic analysis/(de)serialization support for\niterator expression introduced in OpenMP 5.0."},
		[i]={{tb,3050,"/// Parse a C++ unqualified-id (or a C identifier), which describes the\n/// name of an entity.\n///\n/// \\code\n///       unqualified-id: [C++ expr.prim.general]\n///         identifier\n///         operator-function-id\n///         conversion-function-id\n/// [C++0x] literal-operator-id [TODO]\n///         ~ class-name\n///         template-id\n///\n/// \\endcode\n///\n/// \\param SS The nested-name-specifier that preceded this unqualified-id. If\n/// non-empty, then we are parsing the unqualified-id of a qualified-id.\n///\n/// \\param ObjectType if this unqualified-id occurs within a member access\n/// expression, the type of the base object whose member is being accessed.\n///\n/// \\param ObjectHadErrors if this unqualified-id occurs within a member access\n/// expression, indicates whether the original subexpressions had any errors.\n/// When true, diagnostics for missing \'template\' keyword will be supressed.\n///\n/// \\param EnteringContext whether we are entering the scope of the\n/// nested-name-specifier.\n///\n/// \\param AllowDestructorName whether we allow parsing of a destructor name.\n///\n/// \\param AllowConstructorName whether we allow parsing a constructor name.\n///\n/// \\param AllowDeductionGuide whether we allow parsing a deduction guide name.\n///\n/// \\param Result on a successful parse, contains the parsed unqualified-id.\n///\n/// \\returns true if parsing fails, false otherwise.\nbool Parser::ParseUnqualifiedId(CXXScopeSpec &SS, ParsedType ObjectType, bool ObjectHadErrors, bool EnteringContext, bool AllowDestructorName, bool AllowConstructorName, bool AllowDeductionGuide, SourceLocation *TemplateKWLoc, UnqualifiedId &Result) {\n  // ...\n  if (getLangOpts().CPlusPlus && (AllowDestructorName || SS.isSet()) && Tok.is(tok::tilde)) {\n    // ...\n    if (TemplateSpecified) {\n      // ...\n      Diag(*TemplateKWLoc, diag::err_unexpected_template_in_destructor_name) << Tok.getLocation();"}},
		[j]={
			["clang/test/SemaCXX/pseudo-destructors.cpp"]={"clang/test/SemaCXX/pseudo-destructors.cpp:95:6: error: \'template\' keyword not permitted in destructor name","clang/test/SemaCXX/pseudo-destructors.cpp:97:7: error: \'template\' keyword not permitted in destructor name"}
		}
	},
	["err_unexpected_template_in_unqualified_id"]={
		[a]={{nil,bb,"err_unexpected_template_in_unqualified_id"}},
		[b]={{nil,bb,"\'template\' keyword not permitted here"}},
		[c]={{nil,bb,"\'template\' keyword not permitted here"}},
		[d]=l,
		[e]="\'template\' keyword not permitted here",
		[f]=k,
		[g]={{nil,bb,s}},
		[h]={"c08b693e309b",1524794413,"Parse A::template B as an identifier rather than as a template-id with no","Parse A::template B as an identifier rather than as a template-id with no\ntemplate arguments.\n\nThis fixes some cases where we\'d incorrectly accept \"A::template B\" when B is a\nkind of template that requires template arguments (in particular, a variable\ntemplate or a concept).\n\nllvm-svn: 331013"},
		[i]={{tb,2885,"/// Parse a C++ unqualified-id (or a C identifier), which describes the\n/// name of an entity.\n///\n/// \\code\n///       unqualified-id: [C++ expr.prim.general]\n///         identifier\n///         operator-function-id\n///         conversion-function-id\n/// [C++0x] literal-operator-id [TODO]\n///         ~ class-name\n///         template-id\n///\n/// \\endcode\n///\n/// \\param SS The nested-name-specifier that preceded this unqualified-id. If\n/// non-empty, then we are parsing the unqualified-id of a qualified-id.\n///\n/// \\param ObjectType if this unqualified-id occurs within a member access\n/// expression, the type of the base object whose member is being accessed.\n///\n/// \\param ObjectHadErrors if this unqualified-id occurs within a member access\n/// expression, indicates whether the original subexpressions had any errors.\n/// When true, diagnostics for missing \'template\' keyword will be supressed.\n///\n/// \\param EnteringContext whether we are entering the scope of the\n/// nested-name-specifier.\n///\n/// \\param AllowDestructorName whether we allow parsing of a destructor name.\n///\n/// \\param AllowConstructorName whether we allow parsing a constructor name.\n///\n/// \\param AllowDeductionGuide whether we allow parsing a deduction guide name.\n///\n/// \\param Result on a successful parse, contains the parsed unqualified-id.\n///\n/// \\returns true if parsing fails, false otherwise.\nbool Parser::ParseUnqualifiedId(CXXScopeSpec &SS, ParsedType ObjectType, bool ObjectHadErrors, bool EnteringContext, bool AllowDestructorName, bool AllowConstructorName, bool AllowDeductionGuide, SourceLocation *TemplateKWLoc, UnqualifiedId &Result) {\n  // ...\n  if (Tok.is(tok::kw_template)) {\n    if (TemplateKWLoc && (ObjectType || SS.isSet())) {\n    // ...\n    } else {\n      // ...\n      Diag(TemplateLoc, diag::err_unexpected_template_in_unqualified_id) << FixItHint::CreateRemoval(TemplateLoc);"},{tb,2992,"/// Parse a C++ unqualified-id (or a C identifier), which describes the\n/// name of an entity.\n///\n/// \\code\n///       unqualified-id: [C++ expr.prim.general]\n///         identifier\n///         operator-function-id\n///         conversion-function-id\n/// [C++0x] literal-operator-id [TODO]\n///         ~ class-name\n///         template-id\n///\n/// \\endcode\n///\n/// \\param SS The nested-name-specifier that preceded this unqualified-id. If\n/// non-empty, then we are parsing the unqualified-id of a qualified-id.\n///\n/// \\param ObjectType if this unqualified-id occurs within a member access\n/// expression, the type of the base object whose member is being accessed.\n///\n/// \\param ObjectHadErrors if this unqualified-id occurs within a member access\n/// expression, indicates whether the original subexpressions had any errors.\n/// When true, diagnostics for missing \'template\' keyword will be supressed.\n///\n/// \\param EnteringContext whether we are entering the scope of the\n/// nested-name-specifier.\n///\n/// \\param AllowDestructorName whether we allow parsing of a destructor name.\n///\n/// \\param AllowConstructorName whether we allow parsing a constructor name.\n///\n/// \\param AllowDeductionGuide whether we allow parsing a deduction guide name.\n///\n/// \\param Result on a successful parse, contains the parsed unqualified-id.\n///\n/// \\returns true if parsing fails, false otherwise.\nbool Parser::ParseUnqualifiedId(CXXScopeSpec &SS, ParsedType ObjectType, bool ObjectHadErrors, bool EnteringContext, bool AllowDestructorName, bool AllowConstructorName, bool AllowDeductionGuide, SourceLocation *TemplateKWLoc, UnqualifiedId &Result) {\n  // ...\n  // unqualified-id:\n  //   template-id (already parsed and annotated)\n  if (Tok.is(tok::annot_template_id)) {\n    // ...\n    if (TemplateLoc.isValid()) {\n      if (TemplateKWLoc && (ObjectType || SS.isSet()))\n      // ...\n      else\n        Diag(TemplateLoc, diag::err_unexpected_template_in_unqualified_id) << FixItHint::CreateRemoval(TemplateLoc);"}},
		[j]={
			["clang/test/CXX/drs/dr1xx.cpp"]={"clang/test/CXX/drs/dr1xx.cpp:90:14: error: \'template\' keyword not permitted here","clang/test/CXX/drs/dr1xx.cpp:91:14: error: \'template\' keyword not permitted here"}
		}
	},
	["err_unexpected_token_in_nested_name_spec"]={
		[a]="err_unexpected_token_in_nested_name_spec",
		[b]="\'%0\' cannot be a part of nested name specifier; did you mean \':\'?",
		[c]="\'A\' cannot be a part of nested name specifier; did you mean \':\'?",
		[d]=l,
		[e]="\'(.*?)\' cannot be a part of nested name specifier; did you mean \'\\:\'\\?",
		[f]=k,
		[g]=s,
		[h]={"6a7ffbed8ab4",1397407923,"Improve error recovery around colon.","Improve error recovery around colon.\n\nParse of nested name spacifier is modified so that it properly recovers\nif colon is mistyped as double colon in case statement.\nThis patch fixes PR15133.\n\nDifferential Revision: http://llvm-reviews.chandlerc.com/D2870\n\nllvm-svn: 206135"},
		[i]={{tb,434,"/// Parse global scope or nested-name-specifier if present.\n///\n/// Parses a C++ global scope specifier (\'::\') or nested-name-specifier (which\n/// may be preceded by \'::\'). Note that this routine will not parse ::new or\n/// ::delete; it will just leave them in the token stream.\n///\n///       \'::\'[opt] nested-name-specifier\n///       \'::\'\n///\n///       nested-name-specifier:\n///         type-name \'::\'\n///         namespace-name \'::\'\n///         nested-name-specifier identifier \'::\'\n///         nested-name-specifier \'template\'[opt] simple-template-id \'::\'\n///\n///\n/// \\param SS the scope specifier that will be set to the parsed\n/// nested-name-specifier (or empty)\n///\n/// \\param ObjectType if this nested-name-specifier is being parsed following\n/// the \".\" or \"->\" of a member access expression, this parameter provides the\n/// type of the object whose members are being accessed.\n///\n/// \\param ObjectHadErrors if this unqualified-id occurs within a member access\n/// expression, indicates whether the original subexpressions had any errors.\n/// When true, diagnostics for missing \'template\' keyword will be supressed.\n///\n/// \\param EnteringContext whether we will be entering into the context of\n/// the nested-name-specifier after parsing it.\n///\n/// \\param MayBePseudoDestructor When non-NULL, points to a flag that\n/// indicates whether this nested-name-specifier may be part of a\n/// pseudo-destructor name. In this case, the flag will be set false\n/// if we don\'t actually end up parsing a destructor name. Moreover,\n/// if we do end up determining that we are parsing a destructor name,\n/// the last component of the nested-name-specifier is not parsed as\n/// part of the scope specifier.\n///\n/// \\param IsTypename If \\c true, this nested-name-specifier is known to be\n/// part of a type name. This is used to improve error recovery.\n///\n/// \\param LastII When non-NULL, points to an IdentifierInfo* that will be\n/// filled in with the leading identifier in the last component of the\n/// nested-name-specifier, if any.\n///\n/// \\param OnlyNamespace If true, only considers namespaces in lookup.\n///\n///\n/// \\returns true if there was an error parsing a scope specifier\nbool Parser::ParseOptionalCXXScopeSpecifier(CXXScopeSpec &SS, ParsedType ObjectType, bool ObjectHadErrors, bool EnteringContext, bool *MayBePseudoDestructor, bool IsTypename, IdentifierInfo **LastII, bool OnlyNamespace, bool InUsingDeclaration) {\n  // ...\n  while (true) {\n    // ...\n    if (Next.is(tok::coloncolon)) {\n      // ...\n      if (ColonIsSacred) {\n        // ...\n        if (Next2.is(tok::kw_private) || Next2.is(tok::kw_protected) || Next2.is(tok::kw_public) || Next2.is(tok::kw_virtual)) {\n          Diag(Next2, diag::err_unexpected_token_in_nested_name_spec) << Next2.getName() << FixItHint::CreateReplacement(Next.getLocation(), \":\");"}},
		[j]={
			["clang/test/Parser/recovery.cpp"]={"clang/test/Parser/recovery.cpp:205:22: error: \'public\' cannot be a part of nested name specifier; did you mean \':\'?"}
		}
	},
	["err_unexpected_typedef"]={
		[a]="err_unexpected_typedef",
		[b]="unexpected type name %0: expected expression",
		[c]="unexpected type name A: expected expression",
		[d]=l,
		[e]="unexpected type name (.*?)\\: expected expression",
		[f]=k,
		[g]=m,
		[h]={O,1237025389,N,P},
		[i]={{v,3296,"/// Diagnoses obvious problems with the use of the given declaration\n/// as an expression.  This is only actually called for lookups that\n/// were not overloaded, and it doesn\'t promise that the declaration\n/// will in fact be used.\nstatic bool CheckDeclInExpr(Sema &S, SourceLocation Loc, NamedDecl *D, bool AcceptInvalid) {\n  // ...\n  if (isa<TypedefNameDecl>(D)) {\n    S.Diag(Loc, diag::err_unexpected_typedef) << D->getDeclName();"}},
		[j]={
			["clang/test/Parser/cxx0x-condition.cpp"]={"clang/test/Parser/cxx0x-condition.cpp:20:9: error: unexpected type name \'n\': expected expression","clang/test/Parser/cxx0x-condition.cpp:22:9: error: unexpected type name \'n\': expected expression"}
		}
	},
	["err_unexpected_typedef_ident"]={
		[a]="err_unexpected_typedef_ident",
		[b]="unexpected type name %0: expected identifier",
		[c]="unexpected type name A: expected identifier",
		[d]=l,
		[e]="unexpected type name (.*?)\\: expected identifier",
		[f]=k,
		[g]=s,
		[h]={Q,1236199783,M,L},
		[i]={{D,7237,"/// ParseFunctionDeclaratorIdentifierList - While parsing a function declarator\n/// we found a K&R-style identifier list instead of a typed parameter list.\n///\n/// After returning, ParamInfo will hold the parsed parameters.\n///\n///       identifier-list: [C99 6.7.5]\n///         identifier\n///         identifier-list \',\' identifier\n///\nvoid Parser::ParseFunctionDeclaratorIdentifierList(Declarator &D, SmallVectorImpl<DeclaratorChunk::ParamInfo> &ParamInfo) {\n  // ...\n  do {\n    // ...\n    // Reject \'typedef int y; int test(x, y)\', but continue parsing.\n    if (Actions.getTypeName(*ParmII, Tok.getLocation(), getCurScope()))\n      Diag(Tok, diag::err_unexpected_typedef_ident) << ParmII;"}},
		[j]={
			["clang/test/Parser/declarators.c"]={"clang/test/Parser/declarators.c:31:12: error: unexpected type name \'atype\': expected identifier"}
		}
	},
	["err_unexpected_unqualified_id"]={
		[a]="err_unexpected_unqualified_id",
		[b]="type-id cannot have a name",
		[c]="type-id cannot have a name",
		[d]=l,
		[e]="type\\-id cannot have a name",
		[f]=k,
		[g]=s,
		[h]={"9ce302ed9c29",1373519421,"PR5066: If a declarator cannot have an identifier, and cannot possibly be","PR5066: If a declarator cannot have an identifier, and cannot possibly be\nfollowed by an identifier, then diagnose an identifier as being a bogus part of\nthe declarator instead of tripping over it. Improves diagnostics for cases like\n\n  std::vector<const int *p> my_vec;\n\nllvm-svn: 186061"},
		[i]={{D,6541,"/// ParseDirectDeclarator\n///       direct-declarator: [C99 6.7.5]\n/// [C99]   identifier\n///         \'(\' declarator \')\'\n/// [GNU]   \'(\' attributes declarator \')\'\n/// [C90]   direct-declarator \'[\' constant-expression[opt] \']\'\n/// [C99]   direct-declarator \'[\' type-qual-list[opt] assignment-expr[opt] \']\'\n/// [C99]   direct-declarator \'[\' \'static\' type-qual-list[opt] assign-expr \']\'\n/// [C99]   direct-declarator \'[\' type-qual-list \'static\' assignment-expr \']\'\n/// [C99]   direct-declarator \'[\' type-qual-list[opt] \'*\' \']\'\n/// [C++11] direct-declarator \'[\' constant-expression[opt] \']\'\n///                    attribute-specifier-seq[opt]\n///         direct-declarator \'(\' parameter-type-list \')\'\n///         direct-declarator \'(\' identifier-list[opt] \')\'\n/// [GNU]   direct-declarator \'(\' parameter-forward-declarations\n///                    parameter-type-list[opt] \')\'\n/// [C++]   direct-declarator \'(\' parameter-declaration-clause \')\'\n///                    cv-qualifier-seq[opt] exception-specification[opt]\n/// [C++11] direct-declarator \'(\' parameter-declaration-clause \')\'\n///                    attribute-specifier-seq[opt] cv-qualifier-seq[opt]\n///                    ref-qualifier[opt] exception-specification[opt]\n/// [C++]   declarator-id\n/// [C++11] declarator-id attribute-specifier-seq[opt]\n///\n///       declarator-id: [C++ 8]\n///         \'...\'[opt] id-expression\n///         \'::\'[opt] nested-name-specifier[opt] type-name\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/// C++17 adds the following, which we also handle here:\n///\n///       simple-declaration:\n///         <decl-spec> \'[\' identifier-list \']\' brace-or-equal-initializer \';\'\n///\n/// Note, any additional constructs added here may need corresponding changes\n/// in isConstructorDeclarator.\nvoid Parser::ParseDirectDeclarator(Declarator &D) {\n  // ...\n  if (getLangOpts().CPlusPlus && D.mayHaveIdentifier()) {\n  // ...\n  } else if (Tok.is(tok::identifier) && D.mayHaveIdentifier()) {\n  // ...\n  } else if (Tok.is(tok::identifier) && !D.mayHaveIdentifier()) {\n    // ...\n    if (DiagnoseIdentifier) {\n      Diag(Tok.getLocation(), diag::err_unexpected_unqualified_id) << FixItHint::CreateRemoval(Tok.getLocation());"}},
		[j]={
			["clang/test/Sema/block-args.c"]={"clang/test/Sema/block-args.c:40:23: error: type-id cannot have a name"}
		}
	},
	["err_unimplemented_conversion_with_fixed_point_type"]={
		[a]={{nil,X,"err_unimplemented_conversion_with_fixed_point_type"}},
		[b]={{nil,X,"conversion between fixed point and %0 is not yet supported"}},
		[c]={{nil,X,"conversion between fixed point and A is not yet supported"}},
		[d]=l,
		[e]="conversion between fixed point and (.*?) is not yet supported",
		[f]=k,
		[g]={{nil,X,t}},
		[h]={"99bda375a14e",1539619622,"[Fixed Point Arithmetic] FixedPointCast","[Fixed Point Arithmetic] FixedPointCast\n\nThis patch is a part of https://reviews.llvm.org/D48456 in an attempt to\nsplit them up. This contains the code for casting between fixed point types\nand other fixed point types.\n\nThe method for converting between fixed point types is based off the convert()\nmethod in APFixedPoint.\n\nDifferential Revision: https://reviews.llvm.org/D50616\n\nllvm-svn: 344530"},
		[i]={{v,8060,"/// Prepares for a scalar cast, performing all the necessary stages\n/// except the final cast and returning the kind required.\nCastKind Sema::PrepareScalarCast(ExprResult &Src, QualType DestTy) {\n  // ...\n  case Type::STK_FixedPoint:\n    // ...\n    case Type::STK_IntegralComplex:\n    case Type::STK_FloatingComplex:\n      Diag(Src.get()->getExprLoc(), diag::err_unimplemented_conversion_with_fixed_point_type) << DestTy;"},{v,8094,"/// Prepares for a scalar cast, performing all the necessary stages\n/// except the final cast and returning the kind required.\nCastKind Sema::PrepareScalarCast(ExprResult &Src, QualType DestTy) {\n  // ...\n  case Type::STK_FloatingComplex:\n    // ...\n    case Type::STK_FixedPoint:\n      Diag(Src.get()->getExprLoc(), diag::err_unimplemented_conversion_with_fixed_point_type) << SrcTy;"},{v,8278,"/// Prepares for a scalar cast, performing all the necessary stages\n/// except the final cast and returning the kind required.\nCastKind Sema::PrepareScalarCast(ExprResult &Src, QualType DestTy) {\n  // ...\n  case Type::STK_IntegralComplex:\n    // ...\n    case Type::STK_FixedPoint:\n      Diag(Src.get()->getExprLoc(), diag::err_unimplemented_conversion_with_fixed_point_type) << SrcTy;"}},
		[j]={
			["clang/test/Frontend/fixed_point_unknown_conversions.c"]={"clang/test/Frontend/fixed_point_unknown_conversions.c:25:11: error: conversion between fixed point and \'_Complex double\' is not yet supported","clang/test/Frontend/fixed_point_unknown_conversions.c:26:11: error: conversion between fixed point and \'_Complex int\' is not yet supported","clang/test/Frontend/fixed_point_unknown_conversions.c:31:8: error: conversion between fixed point and \'_Complex double\' is not yet supported","clang/test/Frontend/fixed_point_unknown_conversions.c:32:8: error: conversion between fixed point and \'_Complex int\' is not yet supported"}
		}
	},
	["err_uninitialized_member_for_assign"]={
		[a]="err_uninitialized_member_for_assign",
		[b]="cannot define the implicit copy assignment operator for %0, because non-static %select{reference|const}1 member %2 cannot use copy assignment operator",
		[c]={{nil,nil,{"cannot define the implicit copy assignment operator for A, because non-static ",{"reference","const"}," member C cannot use copy assignment operator"}}},
		[d]=l,
		[e]="cannot define the implicit copy assignment operator for (.*?), because non\\-static (?:reference|const) member (.*?) cannot use copy assignment operator",
		[f]=k,
		[g]=m,
		[h]={"24a175b37c87",1246060156,"Patch to mark destructors when they are used.","Patch to mark destructors when they are used.\n\nllvm-svn: 74359"},
		[i]={{r,14859,"void Sema::DefineImplicitCopyAssignment(SourceLocation CurrentLocation, CXXMethodDecl *CopyAssignOperator) {\n  // ...\n  // Assign non-static members.\n  for (auto *Field : ClassDecl->fields()) {\n    // ...\n    // Check for members of reference type; we can\'t copy those.\n    if (Field->getType()->isReferenceType()) {\n      Diag(ClassDecl->getLocation(), diag::err_uninitialized_member_for_assign) << Context.getTagDeclType(ClassDecl) << 0 << Field->getDeclName();"},{r,14869,"void Sema::DefineImplicitCopyAssignment(SourceLocation CurrentLocation, CXXMethodDecl *CopyAssignOperator) {\n  // ...\n  // Assign non-static members.\n  for (auto *Field : ClassDecl->fields()) {\n    // ...\n    if (!BaseType->getAs<RecordType>() && BaseType.isConstQualified()) {\n      Diag(ClassDecl->getLocation(), diag::err_uninitialized_member_for_assign) << Context.getTagDeclType(ClassDecl) << 1 << Field->getDeclName();"},{r,15234,"void Sema::DefineImplicitMoveAssignment(SourceLocation CurrentLocation, CXXMethodDecl *MoveAssignOperator) {\n  // ...\n  // Assign non-static members.\n  for (auto *Field : ClassDecl->fields()) {\n    // ...\n    // Check for members of reference type; we can\'t move those.\n    if (Field->getType()->isReferenceType()) {\n      Diag(ClassDecl->getLocation(), diag::err_uninitialized_member_for_assign) << Context.getTagDeclType(ClassDecl) << 0 << Field->getDeclName();"},{r,15244,"void Sema::DefineImplicitMoveAssignment(SourceLocation CurrentLocation, CXXMethodDecl *MoveAssignOperator) {\n  // ...\n  // Assign non-static members.\n  for (auto *Field : ClassDecl->fields()) {\n    // ...\n    if (!BaseType->getAs<RecordType>() && BaseType.isConstQualified()) {\n      Diag(ClassDecl->getLocation(), diag::err_uninitialized_member_for_assign) << Context.getTagDeclType(ClassDecl) << 1 << Field->getDeclName();"}},
		[j]={
			["clang/test/SemaCXX/default-assignment-operator.cpp"]={"clang/test/SemaCXX/default-assignment-operator.cpp:5:7: error: cannot define the implicit copy assignment operator for \'Base\', because non-static reference member \'ref\' cannot use copy assignment operator","clang/test/SemaCXX/default-assignment-operator.cpp:18:7: error: cannot define the implicit copy assignment operator for \'X\', because non-static const member \'cint\' cannot use copy assignment operator","clang/test/SemaCXX/default-assignment-operator.cpp:103:7: error: cannot define the implicit copy assignment operator for \'E1\', because non-static const member \'a\' cannot use copy assignment operator"}
		}
	},
	["err_uninitialized_member_in_ctor"]={
		[a]="err_uninitialized_member_in_ctor",
		[b]="%select{constructor for %1|implicit default constructor for %1|cannot use constructor inherited from %1:}0 must explicitly initialize the %select{reference|const}2 member %3",
		[c]={{nil,nil,{{"constructor for B","implicit default constructor for B","cannot use constructor inherited from B:"}," must explicitly initialize the ",{"reference","const"}," member D"}}},
		[d]=l,
		[e]="(?:constructor for (.*?)|implicit default constructor for (.*?)|cannot use constructor inherited from (.*?)\\:) must explicitly initialize the (?:reference|const) member (.*?)",
		[f]=k,
		[g]=m,
		[h]={"7ae2d7758f3f",1264929171,"Rework base and member initialization in constructors, with several","Rework base and member initialization in constructors, with several\n(necessarily simultaneous) changes:\n\n  - CXXBaseOrMemberInitializer now contains only a single initializer\n    rather than a set of initialiation arguments + a constructor. The\n    single initializer covers all aspects of initialization, including\n    constructor calls as necessary but also cleanup of temporaries\n    created by the initializer (which we never handled\n    before!).\n\n  - Rework + simplify code generation for CXXBaseOrMemberInitializers,\n    since we can now just emit the initializer as an initializer.\n\n  - Switched base and member initialization over to the new\n    initialization code (InitializationSequence), so that it\n\n  - Improved diagnostics for the new initialization code when\n    initializing bases and members, to match the diagnostics produced\n    by the previous (special-purpose) code.\n\n  - Simplify the representation of type-checked constructor initializers in\n    templates; instead of keeping the fully-type-checked AST, which is\n    rather hard to undo at template instantiation time, throw away the\n    type-checked AST and store the raw expressions in the AST. This\n    simplifies instantiation, but loses a little but of information in\n    the AST.\n\n  - When type-checking implicit base or member initializers within a\n    dependent context, don\'t add the generated initializers into the\n    AST, because they\'ll look like they were explicit.\n\n  - Record in CXXConstructExpr when the constructor call is to\n  initialize a base class, so that CodeGen does not have to infer it\n  from context. This ensures that we call the right kind of\n  constructor.\n\nThere are also a few \"opportunity\" fixes here that were needed to not\nregress, for example:\n\n  - Diagnose default-initialization of a const-qualified class that\n    does not have a user-declared default constructor. We had this\n    diagnostic specifically for bases and members, but missed it for\n    variables. That\'s fixed now.\n\n  - When defining the implicit constructors, destructor, and\n    copy-assignment operator, set the CurContext to that constructor\n    when we\'re defining the body.\n\nllvm-svn: 94952"},
		[i]={{r,5048,"static bool BuildImplicitMemberInitializer(Sema &SemaRef, CXXConstructorDecl *Constructor, ImplicitInitializerKind ImplicitInitKind, FieldDecl *Field, IndirectFieldDecl *Indirect, CXXCtorInitializer *&CXXMemberInit) {\n  // ...\n  if (!Field->getParent()->isUnion()) {\n    if (FieldBaseElementType->isReferenceType()) {\n      SemaRef.Diag(Constructor->getLocation(), diag::err_uninitialized_member_in_ctor) << (int)Constructor->isImplicit() << SemaRef.Context.getTagDeclType(Constructor->getParent()) << 0 << Field->getDeclName();"},{r,5058,"static bool BuildImplicitMemberInitializer(Sema &SemaRef, CXXConstructorDecl *Constructor, ImplicitInitializerKind ImplicitInitKind, FieldDecl *Field, IndirectFieldDecl *Indirect, CXXCtorInitializer *&CXXMemberInit) {\n  // ...\n  if (!Field->getParent()->isUnion()) {\n    // ...\n    if (FieldBaseElementType.isConstQualified()) {\n      SemaRef.Diag(Constructor->getLocation(), diag::err_uninitialized_member_in_ctor) << (int)Constructor->isImplicit() << SemaRef.Context.getTagDeclType(Constructor->getParent()) << 1 << Field->getDeclName();"},{nb,9956,"bool InitializationSequence::Diagnose(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, ArrayRef<Expr *> Args) {\n  // ...\n  case FK_DefaultInitOfConst:\n    if (Entity.getKind() == InitializedEntity::EK_Member && isa<CXXConstructorDecl>(S.CurContext)) {\n      // ...\n      S.Diag(Kind.getLocation(), diag::err_uninitialized_member_in_ctor) << (Constructor->getInheritedConstructor() ? 2 : Constructor->isImplicit() ? 1 : 0) << S.Context.getTypeDeclType(Constructor->getParent()) << /*const=*/1 << Entity.getName();"}},
		[j]={
			["clang/test/CXX/special/class.init/class.base.init/p8-0x.cpp"]={"clang/test/CXX/special/class.init/class.base.init/p8-0x.cpp:12:3: error: constructor for \'S\' must explicitly initialize the reference member \'a\'","clang/test/CXX/special/class.init/class.base.init/p8-0x.cpp:14:3: error: constructor for \'S\' must explicitly initialize the reference member \'a\'"}
		}
	},
	["err_union_as_base_class"]={
		[a]="err_union_as_base_class",
		[b]="unions cannot be base classes",
		[c]="unions cannot be base classes",
		[d]=l,
		[e]="unions cannot be base classes",
		[f]=k,
		[g]=m,
		[h]={O,1237025389,N,P},
		[i]={{r,2718,"/// Check the validity of a C++ base class specifier.\n///\n/// \\returns a new CXXBaseSpecifier if well-formed, emits diagnostics\n/// and returns NULL otherwise.\nCXXBaseSpecifier *Sema::CheckBaseSpecifier(CXXRecordDecl *Class, SourceRange SpecifierRange, bool Virtual, AccessSpecifier Access, TypeSourceInfo *TInfo, SourceLocation EllipsisLoc) {\n  // ...\n  // C++ [class.union]p1:\n  //   A union shall not be used as a base class.\n  if (BaseType->isUnionType()) {\n    Diag(BaseLoc, diag::err_union_as_base_class) << SpecifierRange;"}},
		[j]={
			["clang/test/SemaCXX/inherit.cpp"]={"clang/test/SemaCXX/inherit.cpp:25:18: error: unions cannot be base classes"}
		}
	},
	["err_union_member_of_reference_type"]={
		[a]="err_union_member_of_reference_type",
		[b]="union member %0 has reference type %1",
		[c]="union member A has reference type B",
		[d]=l,
		[e]="union member (.*?) has reference type (.*?)",
		[f]=k,
		[g]=m,
		[h]={"2ceb347e8bce",1289157235,"A union cannot contain static data members or data members of reference type.","A union cannot contain static data members or data members of reference type.\n\nllvm-svn: 118381"},
		[i]={{u,18241,"/// Build a new FieldDecl and check its well-formedness.\n///\n/// This routine builds a new FieldDecl given the fields name, type,\n/// record, etc. \\p PrevDecl should refer to any previous declaration\n/// with the same name and in the same scope as the field to be\n/// created.\n///\n/// \\returns a new FieldDecl.\n///\n/// \\todo The Declarator argument is a hack. It will be removed once\nFieldDecl *Sema::CheckFieldDecl(DeclarationName Name, QualType T, TypeSourceInfo *TInfo, RecordDecl *Record, SourceLocation Loc, bool Mutable, Expr *BitWidth, InClassInitStyle InitStyle, SourceLocation TSSL, AccessSpecifier AS, NamedDecl *PrevDecl, Declarator *D) {\n  // ...\n  if (!InvalidDecl && getLangOpts().CPlusPlus) {\n    if (Record->isUnion()) {\n      // ...\n      // C++ [class.union]p1: If a union contains a member of reference type,\n      // the program is ill-formed, except when compiling with MSVC extensions\n      // enabled.\n      if (EltTy->isReferenceType()) {\n        Diag(NewFD->getLocation(), getLangOpts().MicrosoftExt ? diag::ext_union_member_of_reference_type : diag::err_union_member_of_reference_type) << NewFD->getDeclName() << EltTy;"}},
		[j]={
			["clang/test/CXX/class/class.union/p1.cpp"]={"clang/test/CXX/class/class.union/p1.cpp:105:8: error: union member \'i1\' has reference type \'int &\'"}
		}
	},
	["err_unknown_analyzer_checker_or_package"]={
		[a]={{nil,q,"err_unknown_analyzer_checker_or_package"}},
		[b]={{nil,q,"no analyzer checkers or packages are associated with \'%0\'"}},
		[c]={{nil,q,"no analyzer checkers or packages are associated with \'A\'"}},
		[d]=l,
		[e]="no analyzer checkers or packages are associated with \'(.*?)\'",
		[f]=k,
		[g]={{nil,q,t}},
		[h]={"a079a4270851",1565920394,"[analyzer] Analysis: Silence checkers","[analyzer] Analysis: Silence checkers\n\nSummary:\nThis patch introduces a new `analyzer-config` configuration:\n`-analyzer-config silence-checkers`\nwhich could be used to silence the given checkers.\n\nIt accepts a semicolon separated list, packed into quotation marks, e.g:\n`-analyzer-config silence-checkers=\"core.DivideZero;core.NullDereference\"`\n\nIt could be used to \"disable\" core checkers, so they model the analysis as\nbefore, just if some of them are too noisy it prevents to emit reports.\n\nThis patch also adds support for that new option to the scan-build.\nPassing the option `-disable-checker core.DivideZero` to the scan-build\nwill be transferred to `-analyzer-config silence-checkers=core.DivideZero`.\n\nReviewed By: NoQ, Szelethus\n\nDifferential Revision: https://reviews.llvm.org/D66042\n\nllvm-svn: 369078"},
		[i]={{"clang/lib/Frontend/CompilerInvocation.cpp",1169,"#include \"clang/StaticAnalyzer/Core/AnalyzerOptions.def\"\n  // ...\n  // FIXME: Here we try to validate the silenced checkers or packages are valid.\n  // The current approach only validates the registered checkers which does not\n  // contain the runtime enabled checkers and optimally we would validate both.\n  if (!AnOpts.RawSilencedCheckersAndPackages.empty()) {\n    // ...\n    for (const StringRef &CheckerOrPackage : CheckersAndPackages) {\n      if (Diags) {\n        // ...\n        if (!IsValidName)\n          Diags->Report(diag::err_unknown_analyzer_checker_or_package) << CheckerOrPackage;"},{"clang/lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp",178,"#endif\n  // ...\n  // Parse \'-analyzer-checker\' and \'-analyzer-disable-checker\' options from the\n  // command line.\n  for (const std::pair<std::string, bool> &Opt : AnOpts.CheckersAndPackages) {\n    // ...\n    if (CheckerForCmdLineArg.begin() == CheckerForCmdLineArg.end()) {\n      Diags.Report(diag::err_unknown_analyzer_checker_or_package) << Opt.first;"},{"clang/lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp",525,"void CheckerRegistry::validateCheckerOptions() const {\n  for (const auto &Config : AnOpts.Config) {\n    // ...\n    Diags.Report(diag::err_unknown_analyzer_checker_or_package) << SuppliedCheckerOrPackage;"}}
	},
	["err_unknown_any_addrof"]={
		[a]="err_unknown_any_addrof",
		[b]="the address of a declaration with unknown type can only be cast to a pointer type",
		[c]="the address of a declaration with unknown type can only be cast to a pointer type",
		[d]=l,
		[e]="the address of a declaration with unknown type can only be cast to a pointer type",
		[f]=k,
		[g]=m,
		[h]={"2979fe01da2c",1302568968,"After some discussion with Doug, we decided that it made a lot more sense","After some discussion with Doug, we decided that it made a lot more sense\nfor __unknown_anytype resolution to destructively modify the AST.  So that\'s\nwhat it does now, which significantly simplifies some of the implementation.\nNormal member calls work pretty cleanly now, and I added support for\npropagating unknown-ness through &.\n\nllvm-svn: 129331"},
		[i]={{v,21132,"/// A visitor for rebuilding an expression of type __unknown_anytype\n/// into one which resolves the type directly on the referring\n/// expression.  Strict preservation of the original source\n/// structure is not a goal.\nstruct RebuildUnknownAnyExpr : StmtVisitor<RebuildUnknownAnyExpr, ExprResult> {\n  // ...\n  ExprResult VisitUnaryAddrOf(UnaryOperator *E) {\n    // ...\n    if (!Ptr) {\n      S.Diag(E->getOperatorLoc(), diag::err_unknown_any_addrof) << E->getSourceRange();"}}
	},
	["err_unknown_any_addrof_call"]={
		[a]="err_unknown_any_addrof_call",
		[b]="address-of operator cannot be applied to a call to a function with unknown return type",
		[c]="address-of operator cannot be applied to a call to a function with unknown return type",
		[d]=l,
		[e]="address\\-of operator cannot be applied to a call to a function with unknown return type",
		[f]=k,
		[g]=m,
		[h]={"f7d563c76c40",1479514383,"[Sema] Don\'t allow applying address-of operator to a call to a function","[Sema] Don\'t allow applying address-of operator to a call to a function\nwith __unknown_anytype return type.\n\nWhen the following code is compiled, Sema infers that the type of\n__unknown_anytype is double:\n\nextern __unknown_anytype func();\ndouble *d = (double*)&func();\n\nThis triggers an assert in CodeGenFunction::EmitCallExprLValue because\nit doesn\'t expect to see a call to a function with a non-reference\nscalar return type.\n\nThis commit prevents the assert by making VisitUnaryAddrOf error out if\nthe address-of operator is applied to a call to a function with\n__unknown_anytype return type.\n\nrdar://problem/20287610\n\nDifferential revision: https://reviews.llvm.org/D26808\n\nllvm-svn: 287410"},
		[i]={{v,21190,"/// A visitor for rebuilding an expression of type __unknown_anytype\n/// into one which resolves the type directly on the referring\n/// expression.  Strict preservation of the original source\n/// structure is not a goal.\nstruct RebuildUnknownAnyExpr : StmtVisitor<RebuildUnknownAnyExpr, ExprResult> {\n  // ...\n  ExprResult VisitUnaryAddrOf(UnaryOperator *E) {\n    // ...\n    if (isa<CallExpr>(E->getSubExpr())) {\n      S.Diag(E->getOperatorLoc(), diag::err_unknown_any_addrof_call) << E->getSourceRange();"}},
		[j]={
			[Lb]={"clang/test/SemaCXX/unknown-anytype.cpp:66:18: error: address-of operator cannot be applied to a call to a function with unknown return type"}
		}
	},
	["err_unknown_any_function"]={
		[a]="err_unknown_any_function",
		[b]="function %0 with unknown type must be given a function type",
		[c]="function A with unknown type must be given a function type",
		[d]=l,
		[e]="function (.*?) with unknown type must be given a function type",
		[f]=k,
		[g]=m,
		[h]={"9a877fef910f",1312949543,"Change an assert into a check.  I\'m pretty sure there was a point","Change an assert into a check.  I\'m pretty sure there was a point\nin time when this assert was valid, but it\'s not valid now.\nAlso teach this code to correctly introduce function-to-pointer\ndecay.\n\nllvm-svn: 137201"},
		[i]={{v,21393,"ExprResult RebuildUnknownAnyExpr::resolveDecl(Expr *E, ValueDecl *VD) {\n  // ...\n  //  - functions\n  if (FunctionDecl *FD = dyn_cast<FunctionDecl>(VD)) {\n    // ...\n    if (!Type->isFunctionType()) {\n      S.Diag(E->getExprLoc(), diag::err_unknown_any_function) << VD << E->getSourceRange();"}},
		[j]={
			[Lb]={"clang/test/SemaCXX/unknown-anytype.cpp:45:19: error: function \'test1\' with unknown type must be given a function type"}
		}
	},
	["err_unknown_any_var_function_type"]={
		[a]="err_unknown_any_var_function_type",
		[b]="variable %0 with unknown type cannot be given a function type",
		[c]="variable A with unknown type cannot be given a function type",
		[d]=l,
		[e]="variable (.*?) with unknown type cannot be given a function type",
		[f]=k,
		[g]=m,
		[h]={"2979fe01da2c",1302568968,"After some discussion with Doug, we decided that it made a lot more sense","After some discussion with Doug, we decided that it made a lot more sense\nfor __unknown_anytype resolution to destructively modify the AST.  So that\'s\nwhat it does now, which significantly simplifies some of the implementation.\nNormal member calls work pretty cleanly now, and I added support for\npropagating unknown-ness through &.\n\nllvm-svn: 129331"},
		[i]={{v,21400,"ExprResult RebuildUnknownAnyExpr::resolveDecl(Expr *E, ValueDecl *VD) {\n  // ...\n  //  - functions\n  if (FunctionDecl *FD = dyn_cast<FunctionDecl>(VD)) {\n  // ...\n  } else if (isa<VarDecl>(VD)) {\n    if (const ReferenceType *RefTy = Type->getAs<ReferenceType>()) {\n    // ...\n    } else if (Type->isFunctionType()) {\n      S.Diag(E->getExprLoc(), diag::err_unknown_any_var_function_type) << VD << E->getSourceRange();"}},
		[j]={
			[Lb]={"clang/test/SemaCXX/unknown-anytype.cpp:34:19: error: variable \'foo\' with unknown type cannot be given a function type"}
		}
	},
	["err_unknown_hlsl_semantic"]={
		[a]={{nil,A,"err_unknown_hlsl_semantic"}},
		[b]={{nil,A,"unknown HLSL semantic %0"}},
		[c]={{nil,A,"unknown HLSL semantic A"}},
		[d]=l,
		[e]="unknown HLSL semantic (.*?)",
		[f]=k,
		[g]={{nil,A,t}},
		[h]={"1fdf952deeb9",1648668015,"[HLSL] Add Semantic syntax, and SV_GroupIndex","[HLSL] Add Semantic syntax, and SV_GroupIndex\n\nHLSL has a language feature called Semantics which get attached to\ndeclarations like attributes and are used in a variety of ways.\n\nOne example of semantic use is here with the `SV_GroupIndex` semantic\nwhich, when applied to an input for a compute shader is pre-populated\nby the driver with a flattened thread index.\n\nDifferential Revision: https://reviews.llvm.org/D122699\n\n# Conflicts:\n#	clang/include/clang/Basic/Attr.td\n#	clang/include/clang/Basic/AttrDocs.td"},
		[i]={{"clang/lib/Parse/ParseHLSL.cpp",189,"void Parser::ParseHLSLSemantics(ParsedAttributes &Attrs, SourceLocation *EndLoc) {\n  // ...\n  case ParsedAttr::UnknownAttribute:\n    Diag(Loc, diag::err_unknown_hlsl_semantic) << II;"}},
		[j]={
			["clang/test/ParserHLSL/semantic_parsing.hlsl"]={"clang/test/ParserHLSL/semantic_parsing.hlsl:7:20: error: unknown HLSL semantic \'SV_IWantAPony\'"}
		}
	},
	["err_unknown_nested_typename_suggest"]={
		[a]="err_unknown_nested_typename_suggest",
		[b]="no type named %0 in %1; did you mean %select{|simply }2%3?",
		[c]={{nil,nil,{"no type named A in B; did you mean ",{k,"simply "},"D?"}}},
		[d]=l,
		[e]="no type named (.*?) in (.*?); did you mean (?:|simply )(.*?)\\?",
		[f]=k,
		[g]=m,
		[h]={"2d435306e524",1262192684,"Typo correction for type names when they appear in declarations, e.g., given","Typo correction for type names when they appear in declarations, e.g., given\n\n  tring str2;\n\nwe produce the following diagnostic + fix-it:\n\ntypo.cpp:15:1: error: unknown type name \'tring\'; did you mean \'string\'?\n  tring str2;\n  ^~~~~\n  string\n\n\nTo make this really useful, we\'ll need to introduce typo correction in\nmany more places (wherever we do name lookup), and implement\ndeclaration-vs-expression heuristics that cope with typos\nbetter. However, for now this will handle the simple cases where we\nalready get good \"unknown type name\" diagnostics.\n\nThe LookupVisibleDecls functions are intended to be used by code\ncompletion as well as typo correction; that refactoring will happen\nlater.\n\nllvm-svn: 92308"},
		[i]={{u,765,"void Sema::DiagnoseUnknownTypeName(IdentifierInfo *&II, SourceLocation IILoc, Scope *S, CXXScopeSpec *SS, ParsedType &SuggestedType, bool IsTemplateName) {\n  // ...\n  if (TypoCorrection Corrected = CorrectTypo(DeclarationNameInfo(II, IILoc), LookupOrdinaryName, S, SS, CCC, CTK_ErrorRecovery)) {\n    // ...\n    if (Corrected.isKeyword()) {\n    // ...\n    } else {\n      // We found a similarly-named type or interface; suggest that.\n      if (!SS || !SS->isSet()) {\n      // ...\n      } else if (DeclContext *DC = computeDeclContext(*SS, false)) {\n        // ...\n        diagnoseTypo(Corrected, PDiag(IsTemplateName ? diag::err_no_member_template_suggest : diag::err_unknown_nested_typename_suggest) << II << DC << DroppedSpecifier << SS->getRange(), CanRecover);"},{u,1023,"Corrected:\n  // ...\n  case LookupResult::NotFound:\n    // ...\n    // Perform typo correction to determine if there is another name that is\n    // close to this name.\n    if (!SecondTry && CCC) {\n      // ...\n      if (TypoCorrection Corrected = CorrectTypo(Result.getLookupNameInfo(), Result.getLookupKind(), S, &SS, *CCC, CTK_ErrorRecovery)) {\n        // ...\n        if (getLangOpts().CPlusPlus && NextToken.is(tok::less) && UnderlyingFirstDecl && isa<TemplateDecl>(UnderlyingFirstDecl)) {\n        // ...\n        } else if (UnderlyingFirstDecl && (isa<TypeDecl>(UnderlyingFirstDecl) || isa<ObjCInterfaceDecl>(UnderlyingFirstDecl) || isa<ObjCCompatibleAliasDecl>(UnderlyingFirstDecl))) {\n          // ...\n          QualifiedDiag = diag::err_unknown_nested_typename_suggest;"}},
		[j]={
			["clang/test/CXX/basic/basic.scope/basic.scope.pdecl/p7.cpp"]={"clang/test/CXX/basic/basic.scope/basic.scope.pdecl/p7.cpp:23:17: error: no type named \'D\' in \'X\'; did you mean simply \'D\'?","clang/test/CXX/basic/basic.scope/basic.scope.pdecl/p7.cpp:25:17: error: no type named \'E\' in \'X\'; did you mean simply \'E\'?","clang/test/CXX/basic/basic.scope/basic.scope.pdecl/p7.cpp:40:21: error: no type named \'H\' in \'X\'; did you mean simply \'H\'?","clang/test/CXX/basic/basic.scope/basic.scope.pdecl/p7.cpp:42:21: error: no type named \'I\' in \'X\'; did you mean simply \'I\'?"}
		}
	},
	["err_unknown_receiver_suggest"]={
		[a]="err_unknown_receiver_suggest",
		[b]="unknown receiver %0; did you mean %1?",
		[c]="unknown receiver A; did you mean B?",
		[d]=l,
		[e]="unknown receiver (.*?); did you mean (.*?)\\?",
		[f]=k,
		[g]=m,
		[h]={"8aa4ebf0bcf7",1271213197,"Implement typo correction for Objective-C message sends when the","Implement typo correction for Objective-C message sends when the\nreceiver is a mis-typed class name. Previously, we would give a non-specific\ntypo-correction diagnostic from the expression-parsing code, but there\nwas no fix-it because it was too late to recover. Now, we give a nice\ndiagnostic\n\nhonk.m:6:4: error: unknown receiver \'Hnk\'; did you mean \'Honk\'?\n  [Hnk method];\n   ^~~\n   Honk\nhonk.m:1:1: note: \'Honk\' declared here\n@interface Honk\n^\n\nwhich includes a fix-it.\n\nWe still need to recover better from mis-typing \"super\".\n\nllvm-svn: 101211"},
		[i]={{Jb,2362,"Sema::ObjCMessageKind Sema::getObjCMessageKind(Scope *S, IdentifierInfo *Name, SourceLocation NameLoc, bool IsSuper, bool HasTrailingDot, ParsedType &ReceiverType) {\n  // ...\n  if (TypoCorrection Corrected = CorrectTypo(Result.getLookupNameInfo(), Result.getLookupKind(), S, nullptr, CCC, CTK_ErrorRecovery, nullptr, false, nullptr, false)) {\n    if (Corrected.isKeyword()) {\n      // ...\n      diagnoseTypo(Corrected, PDiag(diag::err_unknown_receiver_suggest) << Name);"},{Jb,2369,"Sema::ObjCMessageKind Sema::getObjCMessageKind(Scope *S, IdentifierInfo *Name, SourceLocation NameLoc, bool IsSuper, bool HasTrailingDot, ParsedType &ReceiverType) {\n  // ...\n  if (TypoCorrection Corrected = CorrectTypo(Result.getLookupNameInfo(), Result.getLookupKind(), S, nullptr, CCC, CTK_ErrorRecovery, nullptr, false, nullptr, false)) {\n    if (Corrected.isKeyword()) {\n    // ...\n    } else if (ObjCInterfaceDecl *Class = Corrected.getCorrectionDeclAs<ObjCInterfaceDecl>()) {\n      // ...\n      diagnoseTypo(Corrected, PDiag(diag::err_unknown_receiver_suggest) << Name);"}},
		[j]={
			["clang/test/FixIt/typo.m"]={"clang/test/FixIt/typo.m:64:4: error: unknown receiver \'NSstring\'; did you mean \'NSString\'?","clang/test/FixIt/typo.m:111:11: error: unknown receiver \'supper\'; did you mean \'super\'?","clang/test/FixIt/typo.m:122:11: error: unknown receiver \'supper\'; did you mean \'super\'?"}
		}
	},
	["err_unknown_template_name"]={
		[a]="err_unknown_template_name",
		[b]="unknown template name %0",
		[c]="unknown template name A",
		[d]=l,
		[e]="unknown template name (.*?)",
		[f]=k,
		[g]=s,
		[h]={"18473f329dbd",1263331724,"Improve recovery for template-ids whose template-name doesn\'t actually","Improve recovery for template-ids whose template-name doesn\'t actually\nname a template, when they occur in a base-specifier. This is one of\nthe (few) places where we know for sure that an identifier followed by\na \'<\' must be a template name, so we can diagnose and recover well:\n\ntest/SemaTemplate/dependent-base-classes.cpp:9:16: error: missing\n\'template\'\n      keyword prior to dependent template name \'T::apply\'\nstruct X1 : T::apply<U> { }; // expected-error{{missing \'template\' ...\n               ^\n               template \ntest/SemaTemplate/dependent-base-classes.cpp:12:13: error: unknown\ntemplate name\n      \'vector\'\nstruct X2 : vector<T> { }; // expected-error{{unknown template name\n\'vector\'}}\n            ^\n2 diagnostics generated.\n\nllvm-svn: 93257"},
		[i]={{Y,1330,"/// ParseBaseTypeSpecifier - Parse a C++ base-type-specifier which is either a\n/// class name or decltype-specifier. Note that we only check that the result\n/// names a type; semantic analysis will need to verify that the type names a\n/// class. The result is either a type or null, depending on whether a type\n/// name was found.\n///\n///       base-type-specifier: [C++11 class.derived]\n///         class-or-decltype\n///       class-or-decltype: [C++11 class.derived]\n///         nested-name-specifier[opt] class-name\n///         decltype-specifier\n///       class-name: [C++ class.name]\n///         identifier\n///         simple-template-id\n///\n/// In C++98, instead of base-type-specifier, we have:\n///\n///         ::[opt] nested-name-specifier[opt] class-name\nTypeResult Parser::ParseBaseTypeSpecifier(SourceLocation &BaseLoc, SourceLocation &EndLocation) {\n  // ...\n  if (Tok.is(tok::less)) {\n    // ...\n    if (!Actions.DiagnoseUnknownTemplateName(*Id, IdLoc, getCurScope(), &SS, Template, TNK)) {\n      Diag(IdLoc, diag::err_unknown_template_name) << Id;"}},
		[j]={
			["clang/test/SemaCXX/injected-class-name-crash.cpp"]={"clang/test/SemaCXX/injected-class-name-crash.cpp:4:19: error: unknown template name \'Foo\'"}
		}
	},
	["err_unknown_type_or_class_name_suggest"]={
		[a]="err_unknown_type_or_class_name_suggest",
		[b]="unknown %select{type|class}1 name %0; did you mean %2?",
		[c]={{nil,nil,{"unknown ",{"type","class"}," name A; did you mean C?"}}},
		[d]=l,
		[e]="unknown (?:type|class) name (.*?); did you mean (.*?)\\?",
		[f]=k,
		[g]=m,
		[h]={"9cb8e9fc89d3",1340408225,"Perform typo correction for base class specifiers.","Perform typo correction for base class specifiers.\n\nllvm-svn: 159046"},
		[i]={{u,470,"/// 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  case LookupResult::NotFound:\n  case LookupResult::NotFoundInCurrentInstantiation:\n    if (CorrectedII) {\n      // ...\n      if (Correction && (NNS || NewII != &II) &&\n        // ...\n        if (Ty) {\n          diagnoseTypo(Correction, PDiag(diag::err_unknown_type_or_class_name_suggest) << Result.getLookupName() << isClassName);"},{ab,1733,"void Sema::actOnObjCTypeArgsOrProtocolQualifiers(Scope *S, ParsedType baseType, SourceLocation lAngleLoc, ArrayRef<IdentifierInfo *> identifiers, ArrayRef<SourceLocation> identifierLocs, SourceLocation rAngleLoc, SourceLocation &typeArgsLAngleLoc, SmallVectorImpl<ParsedType> &typeArgs, SourceLocation &typeArgsRAngleLoc, SourceLocation &protocolLAngleLoc, SmallVectorImpl<Decl *> &protocols, SourceLocation &protocolRAngleLoc, bool warnOnIncompleteProtocols) {\n  // ...\n  for (unsigned i = 0, n = identifiers.size(); i != n; ++i) {\n    // ...\n    if (corrected) {\n      // ...\n      // Did we find an Objective-C class?\n      if (auto objcClass = corrected.getCorrectionDeclAs<ObjCInterfaceDecl>()) {\n        diagnoseTypo(corrected, PDiag(diag::err_unknown_type_or_class_name_suggest) << identifiers[i] << true);"}},
		[j]={
			["clang/test/Parser/recovery.c"]={"clang/test/Parser/recovery.c:86:10: error: unknown type name \'intptr\'; did you mean \'intptr_t\'?"}
		}
	},
	["err_unknown_typename"]={
		[a]="err_unknown_typename",
		[b]="unknown type name %0",
		[c]="unknown type name A",
		[d]=l,
		[e]="unknown type name (.*?)",
		[f]=k,
		[g]=m,
		[h]={"6cc055af1df1",1239568951,"Implement the first set of changes for PR3963 and rdar://6759604,","Implement the first set of changes for PR3963 and rdar://6759604,\nwhich tries to do better error recovery when it is \"obvious\" that an\nidentifier is a mis-typed typename.  In this case, we try to parse\nit as a typename instead of as the identifier in a declarator, which\ngives us several options for better error recovery and immediately\nmakes diagnostics more useful.  For example, we now produce:\n\nt.c:4:8: error: unknown type name \'foo_t\'\nstatic foo_t a = 4;\n       ^\n\ninstead of:\n\nt.c:4:14: error: invalid token after top level declarator\nstatic foo_t a = 4;\n             ^\n\nAlso, since we now parse \"a\" correctly, we make a decl for it,\npreventing later uses of \'a\' from emitting things like:\n\nt.c:12:20: error: use of undeclared identifier \'a\'\nint bar() { return a + b; }\n                   ^\n\nI\'d really appreciate any scrutiny possible on this, it \nis a tricky area.\n\nllvm-svn: 68911"},
		[i]={{u,809,"void Sema::DiagnoseUnknownTypeName(IdentifierInfo *&II, SourceLocation IILoc, Scope *S, CXXScopeSpec *SS, ParsedType &SuggestedType, bool IsTemplateName) {\n  // ...\n  if (!SS || (!SS->isSet() && !SS->isInvalid()))\n    Diag(IILoc, IsTemplateName ? diag::err_no_template : diag::err_unknown_typename) << II;"},{r,12113,"Decl *Sema::ActOnUsingEnumDeclaration(Scope *S, AccessSpecifier AS, SourceLocation UsingLoc, SourceLocation EnumLoc, SourceLocation IdentLoc, IdentifierInfo &II, CXXScopeSpec *SS) {\n  // ...\n  if (EnumTy.isNull()) {\n    Diag(IdentLoc, SS && isDependentScopeSpecifier(*SS) ? diag::err_using_enum_is_dependent : diag::err_unknown_typename) << II.getName() << SourceRange(SS ? SS->getBeginLoc() : IdentLoc, IdentLoc);"},{ab,1746,"void Sema::actOnObjCTypeArgsOrProtocolQualifiers(Scope *S, ParsedType baseType, SourceLocation lAngleLoc, ArrayRef<IdentifierInfo *> identifiers, ArrayRef<SourceLocation> identifierLocs, SourceLocation rAngleLoc, SourceLocation &typeArgsLAngleLoc, SmallVectorImpl<ParsedType> &typeArgs, SourceLocation &typeArgsRAngleLoc, SourceLocation &protocolLAngleLoc, SmallVectorImpl<Decl *> &protocols, SourceLocation &protocolRAngleLoc, bool warnOnIncompleteProtocols) {\n  // ...\n  for (unsigned i = 0, n = identifiers.size(); i != n; ++i) {\n    // ...\n    Diag(identifierLocs[i], (lookupKind == LookupAnyName ? diag::err_objc_type_arg_missing : lookupKind == LookupObjCProtocolName ? diag::err_undeclared_protocol : diag::err_unknown_typename)) << identifiers[i];"},{Z,11059,"/// Build the type that describes a C++ typename specifier,\n/// e.g., \"typename T::type\".\nQualType Sema::CheckTypenameType(ElaboratedTypeKeyword Keyword, SourceLocation KeywordLoc, NestedNameSpecifierLoc QualifierLoc, const IdentifierInfo &II, SourceLocation IILoc, bool DeducedTSTContext) {\n  // ...\n  case LookupResult::NotFound: {\n    // ...\n    DiagID = Ctx ? diag::err_typename_nested_not_found : diag::err_unknown_typename;"}},
		[j]={
			["clang/test/Preprocessor/pragma_poison.c"]={"clang/test/Preprocessor/pragma_poison.c:7:3: error: unknown type name \'XYZW\'"}
		}
	},
	["err_unknown_typename_suggest"]={
		[a]="err_unknown_typename_suggest",
		[b]="unknown type name %0; did you mean %1?",
		[c]="unknown type name A; did you mean B?",
		[d]=l,
		[e]="unknown type name (.*?); did you mean (.*?)\\?",
		[f]=k,
		[g]=m,
		[h]={"2d435306e524",1262192684,"Typo correction for type names when they appear in declarations, e.g., given","Typo correction for type names when they appear in declarations, e.g., given\n\n  tring str2;\n\nwe produce the following diagnostic + fix-it:\n\ntypo.cpp:15:1: error: unknown type name \'tring\'; did you mean \'string\'?\n  tring str2;\n  ^~~~~\n  string\n\n\nTo make this really useful, we\'ll need to introduce typo correction in\nmany more places (wherever we do name lookup), and implement\ndeclaration-vs-expression heuristics that cope with typos\nbetter. However, for now this will handle the simple cases where we\nalready get good \"unknown type name\" diagnostics.\n\nThe LookupVisibleDecls functions are intended to be used by code\ncompletion as well as typo correction; that refactoring will happen\nlater.\n\nllvm-svn: 92308"},
		[i]={{u,748,"void Sema::DiagnoseUnknownTypeName(IdentifierInfo *&II, SourceLocation IILoc, Scope *S, CXXScopeSpec *SS, ParsedType &SuggestedType, bool IsTemplateName) {\n  // ...\n  if (TypoCorrection Corrected = CorrectTypo(DeclarationNameInfo(II, IILoc), LookupOrdinaryName, S, SS, CCC, CTK_ErrorRecovery)) {\n    // ...\n    if (Corrected.isKeyword()) {\n      // ...\n      diagnoseTypo(Corrected, PDiag(IsTemplateName ? diag::err_no_template_suggest : diag::err_unknown_typename_suggest) << II);"},{u,756,"void Sema::DiagnoseUnknownTypeName(IdentifierInfo *&II, SourceLocation IILoc, Scope *S, CXXScopeSpec *SS, ParsedType &SuggestedType, bool IsTemplateName) {\n  // ...\n  if (TypoCorrection Corrected = CorrectTypo(DeclarationNameInfo(II, IILoc), LookupOrdinaryName, S, SS, CCC, CTK_ErrorRecovery)) {\n    // ...\n    if (Corrected.isKeyword()) {\n    // ...\n    } else {\n      // We found a similarly-named type or interface; suggest that.\n      if (!SS || !SS->isSet()) {\n        diagnoseTypo(Corrected, PDiag(IsTemplateName ? diag::err_no_template_suggest : diag::err_unknown_typename_suggest) << II, CanRecover);"},{u,1022,"Corrected:\n  // ...\n  case LookupResult::NotFound:\n    // ...\n    // Perform typo correction to determine if there is another name that is\n    // close to this name.\n    if (!SecondTry && CCC) {\n      // ...\n      if (TypoCorrection Corrected = CorrectTypo(Result.getLookupNameInfo(), Result.getLookupKind(), S, &SS, *CCC, CTK_ErrorRecovery)) {\n        // ...\n        if (getLangOpts().CPlusPlus && NextToken.is(tok::less) && UnderlyingFirstDecl && isa<TemplateDecl>(UnderlyingFirstDecl)) {\n        // ...\n        } else if (UnderlyingFirstDecl && (isa<TypeDecl>(UnderlyingFirstDecl) || isa<ObjCInterfaceDecl>(UnderlyingFirstDecl) || isa<ObjCCompatibleAliasDecl>(UnderlyingFirstDecl))) {\n          UnqualifiedDiag = diag::err_unknown_typename_suggest;"},{ab,1722,"void Sema::actOnObjCTypeArgsOrProtocolQualifiers(Scope *S, ParsedType baseType, SourceLocation lAngleLoc, ArrayRef<IdentifierInfo *> identifiers, ArrayRef<SourceLocation> identifierLocs, SourceLocation rAngleLoc, SourceLocation &typeArgsLAngleLoc, SmallVectorImpl<ParsedType> &typeArgs, SourceLocation &typeArgsRAngleLoc, SourceLocation &protocolLAngleLoc, SmallVectorImpl<Decl *> &protocols, SourceLocation &protocolRAngleLoc, bool warnOnIncompleteProtocols) {\n  // ...\n  for (unsigned i = 0, n = identifiers.size(); i != n; ++i) {\n    // ...\n    if (corrected) {\n      // ...\n      // Did we find a type?\n      if (auto typeDecl = corrected.getCorrectionDeclAs<TypeDecl>()) {\n        diagnoseTypo(corrected, PDiag(diag::err_unknown_typename_suggest) << identifiers[i]);"}}
	},
	["err_unofficial_altivec_support_not_enabled"]={
		[a]="err_unofficial_altivec_support_not_enabled",
		[b]="\"AltiVec support not enabled\"",
		[c]="\"AltiVec support not enabled\"",
		[d]=l,
		[e]="\"AltiVec support not enabled\"",
		[f]=k,
		[g]=pb
	},
	["err_unofficial_asm_invalid_register_name"]={
		[a]="err_unofficial_asm_invalid_register_name",
		[b]="invalid register name",
		[c]="invalid register name",
		[d]=l,
		[e]="invalid register name",
		[f]=k,
		[g]=m
	},
	["err_unofficial_cannot_compile_this_yet"]={
		[a]="err_unofficial_cannot_compile_this_yet",
		[b]="cannot compile this %0 yet",
		[c]="cannot compile this A yet",
		[d]=l,
		[e]="cannot compile this (.*?) yet",
		[f]=k,
		[g]=t,
		[j]={
			["clang/test/CodeGenHIP/printf-aggregate.cpp"]={"clang/test/CodeGenHIP/printf-aggregate.cpp:19:3: error: cannot compile this non-scalar arg to printf yet"}
		}
	},
	["err_unofficial_coroutine_requires_fcoroutines"]={
		[a]="err_unofficial_coroutine_requires_fcoroutines",
		[b]="\"the <coroutine> header requires -fcoroutines\"",
		[c]="\"the <coroutine> header requires -fcoroutines\"",
		[d]=l,
		[e]="\"the \\<coroutine\\> header requires \\-fcoroutines\"",
		[f]=k,
		[g]=pb
	},
	["err_unofficial_cuda_unsupported_unified_addressing"]={
		[a]="err_unofficial_cuda_unsupported_unified_addressing",
		[b]="Target architecture %0 does not support unified addressing",
		[c]="Target architecture A does not support unified addressing",
		[d]=l,
		[e]="Target architecture (.*?) does not support unified addressing",
		[f]=k,
		[g]=t,
		[j]={
			["clang/test/OpenMP/requires_codegen.cpp"]={"clang/test/OpenMP/requires_codegen.cpp:24:22: error: Target architecture sm_53 does not support unified addressing"}
		}
	},
	["err_unofficial_gcov_failed_to_open_coverage_notes_file_for_writing"]={
		[a]="err_unofficial_gcov_failed_to_open_coverage_notes_file_for_writing",
		[b]="failed to open coverage notes file for writing: %0",
		[c]="failed to open coverage notes file for writing: A",
		[d]=l,
		[e]="failed to open coverage notes file for writing\\: (.*?)",
		[f]=k,
		[g]=t,
		[j]={
			["clang/test/CodeGen/code-coverage-filter.c"]={"error: failed to open coverage notes file for writing: Permission denied"}
		}
	},
	["err_unofficial_header_arm_mve_support_not_enabled"]={
		[a]="err_unofficial_header_arm_mve_support_not_enabled",
		[b]="\"MVE support not enabled\"",
		[c]="\"MVE support not enabled\"",
		[d]=l,
		[e]="\"MVE support not enabled\"",
		[f]=k,
		[g]=pb
	},
	["err_unofficial_header_arm_neon_intrinsics_not_available"]={
		[a]="err_unofficial_header_arm_neon_intrinsics_not_available",
		[b]="\"NEON intrinsics not available with the soft-float ABI. Please use -mfloat-abi=softfp or -mfloat-abi=hard\"",
		[c]="\"NEON intrinsics not available with the soft-float ABI. Please use -mfloat-abi=softfp or -mfloat-abi=hard\"",
		[d]=l,
		[e]="\"NEON intrinsics not available with the soft\\-float ABI\\. Please use \\-mfloat\\-abi\\=softfp or \\-mfloat\\-abi\\=hard\"",
		[f]=k,
		[g]=pb
	},
	["err_unofficial_header_arm_neon_support_not_enabled"]={
		[a]="err_unofficial_header_arm_neon_support_not_enabled",
		[b]="\"NEON support not enabled\"",
		[c]="\"NEON support not enabled\"",
		[d]=l,
		[e]="\"NEON support not enabled\"",
		[f]=k,
		[g]=pb
	},
	["err_unofficial_header_arm_sve_big_endian_not_supported"]={
		[a]="err_unofficial_header_arm_sve_big_endian_not_supported",
		[b]="\"Big endian is currently not supported for %0\"",
		[c]="\"Big endian is currently not supported for A\"",
		[d]=l,
		[e]="\"Big endian is currently not supported for (.*?)\"",
		[f]=k,
		[g]=pb,
		[j]={
			["clang/test/Sema/aarch64-sve-intrinsics/big_endian.cpp"]={"build/lib/clang/17/include/arm_sve.h:15:2: error: \"Big endian is currently not supported for arm_sve.h\""}
		}
	},
	["err_unofficial_header_cxx11_required"]={
		[a]="err_unofficial_header_cxx11_required",
		[b]="This file requires compiler and library support for the ISO C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler options.",
		[c]="This file requires compiler and library support for the ISO C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler options.",
		[d]=l,
		[e]="This file requires compiler and library support for the ISO C\\+\\+ 2011 standard\\. This support must be enabled with the \\-std\\=c\\+\\+11 or \\-std\\=gnu\\+\\+11 compiler options\\.",
		[f]=k,
		[g]=pb
	},
	["err_unofficial_reading_profile"]={
		[a]="err_unofficial_reading_profile",
		[b]="Error in reading profile %0: %1",
		[c]="Error in reading profile A: B",
		[d]=l,
		[e]="Error in reading profile (.*?)\\: (.*?)",
		[f]=k,
		[g]=m,
		[j]={
			["clang/test/Profile/gcc-flag-compatibility.c"]={"error: Error in reading profile build/tools/clang/test/Profile/Output/gcc-flag-compatibility.c.tmp.dir/some/path/default.profdata: No such file or directory"}
		}
	},
	["err_unofficial_requires_hosted"]={
		[a]="err_unofficial_requires_hosted",
		[b]="\"This header is not available in freestanding mode.\"",
		[c]="\"This header is not available in freestanding mode.\"",
		[d]=l,
		[e]="\"This header is not available in freestanding mode\\.\"",
		[f]=k,
		[g]=pb
	},
	["err_unparenthesized_non_primary_expr_in_requires_clause"]={
		[a]={{nil,q,"err_unparenthesized_non_primary_expr_in_requires_clause"}},
		[b]={{nil,q,"parentheses are required around this expression in a requires clause"}},
		[c]={{nil,q,"parentheses are required around this expression in a requires clause"}},
		[d]=l,
		[e]="parentheses are required around this expression in a requires clause",
		[f]=k,
		[g]={{nil,q,s}},
		[h]={"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"},
		[i]={{Eb,281,"/// \\brief Parse a constraint-logical-and-expression.\n///\n/// \\verbatim\n///       C++2a[temp.constr.decl]p1\n///       constraint-logical-and-expression:\n///         primary-expression\n///         constraint-logical-and-expression \'&&\' primary-expression\n///\n/// \\endverbatim\nExprResult Parser::ParseConstraintLogicalAndExpression(bool IsTrailingRequiresClause) {\n  // ...\n  auto ParsePrimary = [&]() {\n    // ...\n    auto RecoverFromNonPrimary = [&](ExprResult E, bool Note) {\n      // ...\n      if (!E.isInvalid())\n        Diag(E.get()->getExprLoc(), Note ? diag::note_unparenthesized_non_primary_expr_in_requires_clause : diag::err_unparenthesized_non_primary_expr_in_requires_clause) << FixItHint::CreateInsertion(E.get()->getBeginLoc(), \"(\") << FixItHint::CreateInsertion(PP.getLocForEndOfToken(E.get()->getEndLoc()), \")\") << E.get()->getSourceRange();"}},
		[j]={
			["clang/test/Parser/cxx-concepts-requires-clause.cpp"]={"clang/test/Parser/cxx-concepts-requires-clause.cpp:90:31: error: parentheses are required around this expression in a requires clause","clang/test/Parser/cxx-concepts-requires-clause.cpp:104:31: error: parentheses are required around this expression in a requires clause","clang/test/Parser/cxx-concepts-requires-clause.cpp:108:41: error: parentheses are required around this expression in a requires clause","clang/test/Parser/cxx-concepts-requires-clause.cpp:112:43: error: parentheses are required around this expression in a requires clause","clang/test/Parser/cxx-concepts-requires-clause.cpp:125:21: error: parentheses are required around this expression in a requires clause","clang/test/Parser/cxx-concepts-requires-clause.cpp:137:21: error: parentheses are required around this expression in a requires clause","clang/test/Parser/cxx-concepts-requires-clause.cpp:141:31: error: parentheses are required around this expression in a requires clause","clang/test/Parser/cxx-concepts-requires-clause.cpp:145:33: error: parentheses are required around this expression in a requires clause"}
		}
	},
	["err_unqualified_pointer_member_function"]={
		[a]="err_unqualified_pointer_member_function",
		[b]="must explicitly qualify name of member function when taking its address",
		[c]="must explicitly qualify name of member function when taking its address",
		[d]=l,
		[e]="must explicitly qualify name of member function when taking its address",
		[f]=k,
		[g]=m,
		[h]={"9a8dd0db89f7",1263225416,"Make Clang complain about taking the address of an unqualified member function. Fixes PR5985.","Make Clang complain about taking the address of an unqualified member function. Fixes PR5985.\n\nllvm-svn: 93150"},
		[i]={{v,14970,"/// CheckAddressOfOperand - The operand of & must be either a function\n/// designator or an lvalue designating an object. If it is an lvalue, the\n/// object cannot be declared with storage class register or be a bit field.\n/// Note: The usual conversions are *not* applied to the operand of the &\n/// operator (C99 6.3.2.1p[2-4]), and its result is never an lvalue.\n/// In C++, the operand might be an overloaded function name, in which case\n/// we allow the \'&\' but retain the overloaded-function type.\nQualType Sema::CheckAddressOfOperand(ExprResult &OrigOp, SourceLocation OpLoc) {\n  // ...\n  if (lval == Expr::LV_ClassTemporary || lval == Expr::LV_ArrayTemporary) {\n  // ...\n  } else if (isa<ObjCSelectorExpr>(op)) {\n  // ...\n  } else if (lval == Expr::LV_MemberFunction) {\n    // ...\n    // The id-expression was parenthesized.\n    if (OrigOp.get() != DRE) {\n    // ...\n    } else if (!DRE->getQualifier()) {\n      if (MD->getParent()->getName().empty())\n        Diag(OpLoc, diag::err_unqualified_pointer_member_function) << op->getSourceRange();"},{v,14978,"/// CheckAddressOfOperand - The operand of & must be either a function\n/// designator or an lvalue designating an object. If it is an lvalue, the\n/// object cannot be declared with storage class register or be a bit field.\n/// Note: The usual conversions are *not* applied to the operand of the &\n/// operator (C99 6.3.2.1p[2-4]), and its result is never an lvalue.\n/// In C++, the operand might be an overloaded function name, in which case\n/// we allow the \'&\' but retain the overloaded-function type.\nQualType Sema::CheckAddressOfOperand(ExprResult &OrigOp, SourceLocation OpLoc) {\n  // ...\n  if (lval == Expr::LV_ClassTemporary || lval == Expr::LV_ArrayTemporary) {\n  // ...\n  } else if (isa<ObjCSelectorExpr>(op)) {\n  // ...\n  } else if (lval == Expr::LV_MemberFunction) {\n    // ...\n    // The id-expression was parenthesized.\n    if (OrigOp.get() != DRE) {\n    // ...\n    } else if (!DRE->getQualifier()) {\n      if (MD->getParent()->getName().empty())\n      // ...\n      else {\n        // ...\n        Diag(OpLoc, diag::err_unqualified_pointer_member_function) << op->getSourceRange() << FixItHint::CreateInsertion(op->getSourceRange().getBegin(), Qual);"}},
		[j]={
			["clang/test/SemaCXX/member-pointer.cpp"]={"clang/test/SemaCXX/member-pointer.cpp:157:11: error: must explicitly qualify name of member function when taking its address"}
		}
	},
	["err_unspecified_size_with_static"]={
		[a]="err_unspecified_size_with_static",
		[b]="\'static\' may not be used without an array size",
		[c]="\'static\' may not be used without an array size",
		[d]=l,
		[e]="\'static\' may not be used without an array size",
		[f]=k,
		[g]=s,
		[h]={"f9834d5fa094",1407482478,"Parser: Array decls with static but without array size are illformed","Parser: Array decls with static but without array size are illformed\n\nArray declarators involving the static keyword take on two forms:\n    D[ static type-qualifier-listopt assignment-expression ]\n    D[ type-qualifier-list static assignment-expression ]\n\nRaise a diagnostic if the assignment-expression is missing.\n\nThis fixes PR20584.\n\nllvm-svn: 215187"},
		[i]={{D,7627,"/// [C90]   direct-declarator \'[\' constant-expression[opt] \']\'\n/// [C99]   direct-declarator \'[\' type-qual-list[opt] assignment-expr[opt] \']\'\n/// [C99]   direct-declarator \'[\' \'static\' type-qual-list[opt] assign-expr \']\'\n/// [C99]   direct-declarator \'[\' type-qual-list \'static\' assignment-expr \']\'\n/// [C99]   direct-declarator \'[\' type-qual-list[opt] \'*\' \']\'\n/// [C++11] direct-declarator \'[\' constant-expression[opt] \']\'\n///                           attribute-specifier-seq[opt]\nvoid Parser::ParseBracketDeclarator(Declarator &D) {\n  // ...\n  // Handle the case where we have \'[*]\' as the array size.  However, a leading\n  // star could be the start of an expression, for example \'X[*p + 4]\'.  Verify\n  // the token after the star is a \']\'.  Since stars in arrays are\n  // infrequent, use of lookahead is not costly here.\n  if (Tok.is(tok::star) && GetLookAheadToken(1).is(tok::r_square)) {\n  // ...\n  } else if (Tok.isNot(tok::r_square)) {\n  // ...\n  } else {\n    if (StaticLoc.isValid()) {\n      Diag(StaticLoc, diag::err_unspecified_size_with_static);"}},
		[j]={
			["clang/test/Parser/declarators.c"]={"clang/test/Parser/declarators.c:10:13: error: \'static\' may not be used without an array size"}
		}
	},
	["err_unspecified_vla_size_with_static"]={
		[a]="err_unspecified_vla_size_with_static",
		[b]="\'static\' may not be used with an unspecified variable length array size",
		[c]="\'static\' may not be used with an unspecified variable length array size",
		[d]=l,
		[e]="\'static\' may not be used with an unspecified variable length array size",
		[f]=k,
		[g]=s,
		[h]={Q,1236199783,M,L},
		[i]={{D,7605,"/// [C90]   direct-declarator \'[\' constant-expression[opt] \']\'\n/// [C99]   direct-declarator \'[\' type-qual-list[opt] assignment-expr[opt] \']\'\n/// [C99]   direct-declarator \'[\' \'static\' type-qual-list[opt] assign-expr \']\'\n/// [C99]   direct-declarator \'[\' type-qual-list \'static\' assignment-expr \']\'\n/// [C99]   direct-declarator \'[\' type-qual-list[opt] \'*\' \']\'\n/// [C++11] direct-declarator \'[\' constant-expression[opt] \']\'\n///                           attribute-specifier-seq[opt]\nvoid Parser::ParseBracketDeclarator(Declarator &D) {\n  // ...\n  // Handle the case where we have \'[*]\' as the array size.  However, a leading\n  // star could be the start of an expression, for example \'X[*p + 4]\'.  Verify\n  // the token after the star is a \']\'.  Since stars in arrays are\n  // infrequent, use of lookahead is not costly here.\n  if (Tok.is(tok::star) && GetLookAheadToken(1).is(tok::r_square)) {\n    // ...\n    if (StaticLoc.isValid()) {\n      Diag(StaticLoc, diag::err_unspecified_vla_size_with_static);"}}
	},
	["err_unsupported_abi_for_opt"]={
		[a]={{nil,X,"err_unsupported_abi_for_opt"}},
		[b]={{nil,X,"\'%0\' can only be used with the \'%1\' ABI"}},
		[c]={{nil,X,"\'A\' can only be used with the \'B\' ABI"}},
		[d]=l,
		[e]="\'(.*?)\' can only be used with the \'(.*?)\' ABI",
		[f]=k,
		[g]={{nil,X,t}},
		[h]={"eb63256095dd",1534929985,"[clang][mips] Set __mips_fpr correctly for -mfpxx","[clang][mips] Set __mips_fpr correctly for -mfpxx\n\nSet __mips_fpr to 0 if o32 ABI is used with either -mfpxx\nor none of -mfp32, -mfpxx, -mfp64 being specified.\n\nIntroduce additional checks:\n-mfpxx is only to be used in conjunction with the o32 ABI.\nreport an error when incompatible options are provided.\n\nFormerly no errors were raised when combining n32/n64 ABIs\nwith -mfp32 and -mfpxx.\n\nThere are other cases when __mips_fpr should be set to 0\nthat are not covered, ex. using o32 on a mips64 cpu\nwhich is valid but not supported in the backend as of yet.\n\nDifferential Revision: https://reviews.llvm.org/D50557\n\nllvm-svn: 340391"},
		[i]={{"clang/lib/Basic/Targets/Mips.cpp",251,"bool MipsTargetInfo::validateTarget(DiagnosticsEngine &Diags) const {\n  // ...\n  // -fpxx is valid only for the o32 ABI\n  if (FPMode == FPXX && (ABI == \"n32\" || ABI == \"n64\")) {\n    Diags.Report(diag::err_unsupported_abi_for_opt) << \"-mfpxx\""}}
	},
	["err_unsupported_ast_node"]={
		[a]="err_unsupported_ast_node",
		[b]="cannot import unsupported AST node %0",
		[c]="cannot import unsupported AST node A",
		[d]=l,
		[e]="cannot import unsupported AST node (.*?)",
		[f]=k,
		[g]=t,
		[h]={"e4c83e4e2e09",1265755713,"Complain about types and declarations that we don\'t know how to import.","Complain about types and declarations that we don\'t know how to import.\n\nllvm-svn: 95706"},
		[i]={{Db,1069,"ExpectedType ASTNodeImporter::VisitType(const Type *T) {\n  Importer.FromDiag(SourceLocation(), diag::err_unsupported_ast_node) << T->getTypeClassName();"},{Db,1718,"//----------------------------------------------------------------------------\n// Import Declarations\n//----------------------------------------------------------------------------\nError ASTNodeImporter::ImportDeclParts(NamedDecl *D, DeclContext *&DC, DeclContext *&LexicalDC, DeclarationName &Name, NamedDecl *&ToD, SourceLocation &Loc) {\n  // ...\n  if (isa<RecordDecl>(D) && (FunDecl = dyn_cast<FunctionDecl>(OrigDC)) && FunDecl->hasBody()) {\n    // ...\n    for (const ParmVarDecl *P : FunDecl->parameters()) {\n      // ...\n      if (RT && RT->getDecl() == D) {\n        Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node) << D->getDeclKindName();"},{Db,2263,"ExpectedDecl ASTNodeImporter::VisitDecl(Decl *D) {\n  Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node) << D->getDeclKindName();"},{Db,2269,"ExpectedDecl ASTNodeImporter::VisitImportDecl(ImportDecl *D) {\n  Importer.FromDiag(D->getLocation(), diag::err_unsupported_ast_node) << D->getDeclKindName();"},{Db,6447,"ExpectedStmt ASTNodeImporter::VisitStmt(Stmt *S) {\n  Importer.FromDiag(S->getBeginLoc(), diag::err_unsupported_ast_node) << S->getStmtClassName();"},{Db,6961,"//----------------------------------------------------------------------------\n// Import Expressions\n//----------------------------------------------------------------------------\nExpectedStmt ASTNodeImporter::VisitExpr(Expr *E) {\n  Importer.FromDiag(E->getBeginLoc(), diag::err_unsupported_ast_node) << E->getStmtClassName();"}},
		[j]={
			["clang/test/ASTMerge/macro/test.m"]={"/var/jenkins/workspace/llvm_stripf_diag_2/misc/llvm-warnings/llvmorg-17.0.6/clang/test/ASTMerge/macro/Inputs/macro1.h:5:33: error: cannot import unsupported AST node Import","/var/jenkins/workspace/llvm_stripf_diag_2/misc/llvm-warnings/llvmorg-17.0.6/clang/test/ASTMerge/macro/Inputs/macro1.m:1:1: error: cannot import unsupported AST node Import"}
		}
	},
	["err_unsupported_bom"]={
		[a]="err_unsupported_bom",
		[b]="%0 byte order mark detected in \'%1\', but encoding is not supported",
		[c]="A byte order mark detected in \'B\', but encoding is not supported",
		[d]="fatal error\\: ",
		[e]="(.*?) byte order mark detected in \'(.*?)\', but encoding is not supported",
		[f]=k,
		[g]=t,
		[h]={"8fbe98b3b6e4",1271787243,"enhance sourcemgr to detect various UTF BOM\'s and emit a fatal error","enhance sourcemgr to detect various UTF BOM\'s and emit a fatal error\nabout it instead of producing tons of garbage from the lexer.\n\nIt would be even better for sourcemgr to dynamically transcode (e.g.\nfrom UTF16 -> UTF8).\n\nllvm-svn: 101924"},
		[i]={{"clang/lib/Basic/SourceManager.cpp",181,"std::optional<llvm::MemoryBufferRef> ContentCache::getBufferOrNone(DiagnosticsEngine &Diag, FileManager &FM, SourceLocation Loc) const {\n  // ...\n  if (InvalidBOM) {\n    Diag.Report(Loc, diag::err_unsupported_bom) << InvalidBOM << ContentsEntry->getName();"}},
		[j]={
			["clang/test/Lexer/utf-16.c"]={"clang/test/Lexer/utf-16.c:6:10: fatal error: UTF-16 (LE) byte order mark detected in \'clang/test/Lexer/utf-16.c.txt\', but encoding is not supported"}
		}
	},
	["err_unsupported_cxx_abi"]={
		[a]={{nil,x,"err_unsupported_cxx_abi"}},
		[b]={{nil,x,"C++ ABI \'%0\' is not supported on target triple \'%1\'"}},
		[c]={{nil,x,"C++ ABI \'A\' is not supported on target triple \'B\'"}},
		[d]=l,
		[e]="C\\+\\+ ABI \'(.*?)\' is not supported on target triple \'(.*?)\'",
		[f]=k,
		[g]={{nil,x,t}},
		[h]={"0687578728ea",1610286626,"[C++20][Modules][HU 2/5] Support searching Header Units in user or system search paths.","[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"},
		[i]={{"clang/lib/Frontend/CompilerInvocation.cpp",4026,"#include \"clang/Driver/Options.inc\"\n  // ...\n  if (!CXXABI.empty()) {\n    if (!TargetCXXABI::isABI(CXXABI)) {\n    // ...\n    } else {\n      // ...\n      if (!TargetCXXABI::isSupportedCXXABI(T, Kind))\n        Diags.Report(diag::err_unsupported_cxx_abi) << CXXABI << T.str();"}}
	},
	["err_unsupported_module_partition"]={
		[a]={{nil,y,"err_unsupported_module_partition"}},
		[b]={{nil,A,"module partitions are only supported for C++20 onwards"},{T,y,"sorry, module partitions are not yet supported"}},
		[c]={{nil,A,"module partitions are only supported for C++20 onwards"},{T,y,"sorry, module partitions are not yet supported"}},
		[d]=l,
		[e]="module partitions are only supported for C\\+\\+20 onwards",
		[f]=k,
		[g]={{nil,y,"Modules Issue"}},
		[h]={"d652bdd05f1c",1555229219,"[c++20] Parsing support for module-declarations, import-declarations,","[c++20] Parsing support for module-declarations, import-declarations,\nand the global and private module fragment.\n\nFor now, the private module fragment introducer is ignored, but use of\nthe global module fragment introducer should be properly enforced.\n\nllvm-svn: 358353"},
		[i]={{Cb,2454,"/// Parse a declaration beginning with the \'module\' keyword or C++20\n/// context-sensitive keyword (optionally preceded by \'export\').\n///\n///   module-declaration:   [C++20]\n///     \'export\'[opt] \'module\' module-name attribute-specifier-seq[opt] \';\'\n///\n///   global-module-fragment:  [C++2a]\n///     \'module\' \';\' top-level-declaration-seq[opt]\n///   module-declaration:      [C++2a]\n///     \'export\'[opt] \'module\' module-name module-partition[opt]\n///            attribute-specifier-seq[opt] \';\'\n///   private-module-fragment: [C++2a]\n///     \'module\' \':\' \'private\' \';\' top-level-declaration-seq[opt]\nParser::DeclGroupPtrTy Parser::ParseModuleDecl(Sema::ModuleImportState &ImportState) {\n  // ...\n  if (Tok.is(tok::colon)) {\n    // ...\n    if (!getLangOpts().CPlusPlusModules)\n      Diag(ColonLoc, diag::err_unsupported_module_partition) << SourceRange(ColonLoc, Partition.back().second);"},{Cb,2519,"/// Parse a module import declaration. This is essentially the same for\n/// Objective-C and C++20 except for the leading \'@\' (in ObjC) and the\n/// trailing optional attributes (in C++).\n///\n/// [ObjC]  @import declaration:\n///           \'@\' \'import\' module-name \';\'\n/// [ModTS] module-import-declaration:\n///           \'import\' module-name attribute-specifier-seq[opt] \';\'\n/// [C++20] module-import-declaration:\n///           \'export\'[opt] \'import\' module-name\n///                   attribute-specifier-seq[opt] \';\'\n///           \'export\'[opt] \'import\' module-partition\n///                   attribute-specifier-seq[opt] \';\'\n///           \'export\'[opt] \'import\' header-name\n///                   attribute-specifier-seq[opt] \';\'\nDecl *Parser::ParseModuleImport(SourceLocation AtLoc, Sema::ModuleImportState &ImportState) {\n  // ...\n  if (Tok.is(tok::header_name)) {\n  // ...\n  } else if (Tok.is(tok::annot_header_unit)) {\n  // ...\n  } else if (Tok.is(tok::colon)) {\n    // ...\n    if (!getLangOpts().CPlusPlusModules)\n      Diag(ColonLoc, diag::err_unsupported_module_partition) << SourceRange(ColonLoc, Path.back().second);"}}
	},
	["err_unsupported_placeholder_constraint"]={
		[a]={{nil,q,"err_unsupported_placeholder_constraint"}},
		[b]={{nil,q,"constrained placeholder types other than simple \'auto\' on non-type template parameters not supported yet"}},
		[c]={{nil,q,"constrained placeholder types other than simple \'auto\' on non-type template parameters not supported yet"}},
		[d]=l,
		[e]="constrained placeholder types other than simple \'auto\' on non\\-type template parameters not supported yet",
		[f]=k,
		[g]={{nil,q,m}},
		[h]={"6d485ff455ea",1576172311,"Improve static checks for sprintf and __builtin___sprintf_chk","Improve static checks for sprintf and __builtin___sprintf_chk\n\nImplement a pessimistic evaluator of the minimal required size for a buffer\nbased on the format string, and couple that with the fortified version to emit a\nwarning when the buffer size is lower than the lower bound computed from the\nformat string.\n\nDifferential Revision: https://reviews.llvm.org/D71566"},
		[i]={{Z,1274,"bool Sema::AttachTypeConstraint(AutoTypeLoc TL, NonTypeTemplateParmDecl *NewConstrainedParm, NonTypeTemplateParmDecl *OrigConstrainedParm, SourceLocation EllipsisLoc) {\n  if (NewConstrainedParm->getType() != TL.getType() || TL.getAutoKeyword() != AutoTypeKeyword::Auto) {\n    Diag(NewConstrainedParm->getTypeSourceInfo()->getTypeLoc().getBeginLoc(), diag::err_unsupported_placeholder_constraint) << NewConstrainedParm->getTypeSourceInfo()->getTypeLoc().getSourceRange();"}},
		[j]={
			["clang/test/CXX/temp/temp.param/p10-2a.cpp"]={"clang/test/CXX/temp/temp.param/p10-2a.cpp:138:10: error: constrained placeholder types other than simple \'auto\' on non-type template parameters not supported yet"}
		}
	},
	["err_unsupported_string_concat"]={
		[a]="err_unsupported_string_concat",
		[b]="unsupported non-standard concatenation of string literals",
		[c]="unsupported non-standard concatenation of string literals",
		[d]=l,
		[e]="unsupported non\\-standard concatenation of string literals",
		[f]=k,
		[g]=I,
		[h]={"fb65e592e05a",1311745230,"Add support for C++0x unicode string and character literals, from Craig Topper!","Add support for C++0x unicode string and character literals, from Craig Topper!\n\nllvm-svn: 136210"},
		[i]={{jb,1964,"void StringLiteralParser::init(ArrayRef<Token> StringToks) {\n  // ...\n  /// (C99 5.1.1.2p1).  The common case is only one string fragment.\n  for (const Token &Tok : StringToks) {\n    // ...\n    // Remember if we see any wide or utf-8/16/32 strings.\n    // Also check for illegal concatenations.\n    if (isUnevaluated() && Tok.getKind() != tok::string_literal) {\n    // ...\n    } else if (Tok.isNot(Kind) && Tok.isNot(tok::string_literal)) {\n      if (isOrdinary()) {\n      // ...\n      } else {\n        if (Diags)\n          Diags->Report(Tok.getLocation(), diag::err_unsupported_string_concat);"}},
		[j]={
			["clang/test/Lexer/string_concat.cpp"]={"clang/test/Lexer/string_concat.cpp:12:27: error: unsupported non-standard concatenation of string literals","clang/test/Lexer/string_concat.cpp:13:27: error: unsupported non-standard concatenation of string literals","clang/test/Lexer/string_concat.cpp:14:27: error: unsupported non-standard concatenation of string literals","clang/test/Lexer/string_concat.cpp:21:30: error: unsupported non-standard concatenation of string literals","clang/test/Lexer/string_concat.cpp:22:30: error: unsupported non-standard concatenation of string literals","clang/test/Lexer/string_concat.cpp:23:30: error: unsupported non-standard concatenation of string literals","clang/test/Lexer/string_concat.cpp:30:30: error: unsupported non-standard concatenation of string literals","clang/test/Lexer/string_concat.cpp:31:30: error: unsupported non-standard concatenation of string literals","clang/test/Lexer/string_concat.cpp:32:30: error: unsupported non-standard concatenation of string literals","clang/test/Lexer/string_concat.cpp:39:29: error: unsupported non-standard concatenation of string literals","clang/test/Lexer/string_concat.cpp:40:29: error: unsupported non-standard concatenation of string literals","clang/test/Lexer/string_concat.cpp:41:29: error: unsupported non-standard concatenation of string literals"}
		}
	},
	["err_unsupported_unknown_any_call"]={
		[a]="err_unsupported_unknown_any_call",
		[b]="call to unsupported expression with unknown type",
		[c]="call to unsupported expression with unknown type",
		[d]=l,
		[e]="call to unsupported expression with unknown type",
		[f]=k,
		[g]=m,
		[h]={"2979fe01da2c",1302568968,"After some discussion with Doug, we decided that it made a lot more sense","After some discussion with Doug, we decided that it made a lot more sense\nfor __unknown_anytype resolution to destructively modify the AST.  So that\'s\nwhat it does now, which significantly simplifies some of the implementation.\nNormal member calls work pretty cleanly now, and I added support for\npropagating unknown-ness through &.\n\nllvm-svn: 129331"},
		[i]={{v,21094,"/// A visitor for rebuilding a call to an __unknown_any expression\n/// to have an appropriate type.\nstruct RebuildUnknownAnyFunction : StmtVisitor<RebuildUnknownAnyFunction, ExprResult> {\n  // ...\n  ExprResult VisitExpr(Expr *E) {\n    S.Diag(E->getExprLoc(), diag::err_unsupported_unknown_any_call) << E->getSourceRange();"}},
		[j]={
			[Lb]={"clang/test/SemaCXX/unknown-anytype.cpp:33:5: error: call to unsupported expression with unknown type"}
		}
	},
	["err_unsupported_unknown_any_decl"]={
		[a]="err_unsupported_unknown_any_decl",
		[b]="%0 has unknown type, which is not supported for this kind of declaration",
		[c]="A has unknown type, which is not supported for this kind of declaration",
		[d]=l,
		[e]="(.*?) has unknown type, which is not supported for this kind of declaration",
		[f]=k,
		[g]=m,
		[h]={"2d2e870745c2",1302505370,"More __unknown_anytype work.","More __unknown_anytype work.\n\nllvm-svn: 129269"},
		[i]={{v,21421,"ExprResult RebuildUnknownAnyExpr::resolveDecl(Expr *E, ValueDecl *VD) {\n  // ...\n  //  - functions\n  if (FunctionDecl *FD = dyn_cast<FunctionDecl>(VD)) {\n  // ...\n  } else if (isa<VarDecl>(VD)) {\n  // ...\n  } else {\n    S.Diag(E->getExprLoc(), diag::err_unsupported_unknown_any_decl) << VD << E->getSourceRange();"}}
	},
	["err_unsupported_unknown_any_expr"]={
		[a]="err_unsupported_unknown_any_expr",
		[b]="unsupported expression with unknown type",
		[c]="unsupported expression with unknown type",
		[d]=l,
		[e]="unsupported expression with unknown type",
		[f]=k,
		[g]=m,
		[h]={"2d2e870745c2",1302505370,"More __unknown_anytype work.","More __unknown_anytype work.\n\nllvm-svn: 129269"},
		[i]={{v,21126,"/// A visitor for rebuilding an expression of type __unknown_anytype\n/// into one which resolves the type directly on the referring\n/// expression.  Strict preservation of the original source\n/// structure is not a goal.\nstruct RebuildUnknownAnyExpr : StmtVisitor<RebuildUnknownAnyExpr, ExprResult> {\n  // ...\n  ExprResult VisitExpr(Expr *E) {\n    S.Diag(E->getExprLoc(), diag::err_unsupported_unknown_any_expr) << E->getSourceRange();"},{v,21537,"static ExprResult diagnoseUnknownAnyExpr(Sema &S, Expr *E) {\n  // ...\n  if (DeclRefExpr *ref = dyn_cast<DeclRefExpr>(E)) {\n  // ...\n  } else if (MemberExpr *mem = dyn_cast<MemberExpr>(E)) {\n  // ...\n  } else if (ObjCMessageExpr *msg = dyn_cast<ObjCMessageExpr>(E)) {\n  // ...\n  } else {\n    S.Diag(E->getExprLoc(), diag::err_unsupported_unknown_any_expr) << E->getSourceRange();"}}
	},
	["err_unterm_macro_invoc"]={
		[a]="err_unterm_macro_invoc",
		[b]="unterminated function-like macro invocation",
		[c]="unterminated function-like macro invocation",
		[d]=l,
		[e]="unterminated function\\-like macro invocation",
		[f]=k,
		[g]=I,
		[h]={Q,1236199783,M,L},
		[i]={{"clang/lib/Lex/PPMacroExpansion.cpp",815,"/// 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    while (true) {\n      // ...\n      if (Tok.isOneOf(tok::eof, tok::eod)) { // \"#if f(<eof>\" & \"#if f(\\n\"\n        if (!ContainsCodeCompletionTok) {\n          Diag(MacroName, diag::err_unterm_macro_invoc);"},{"clang/lib/Lex/PPMacroExpansion.cpp",1322,"/// Process single-argument builtin feature-like macros that return\n/// integer values.\nstatic void EvaluateFeatureLikeBuiltinMacro(llvm::raw_svector_ostream &OS, Token &Tok, IdentifierInfo *II, Preprocessor &PP, bool ExpandArgs, llvm::function_ref<int(Token &Tok, bool &HasLexedNextTok)> Op) {\n  // ...\n  already_lexed:\n    // ...\n    case tok::eof:\n    case tok::eod:\n      // ...\n      PP.Diag(Tok.getLocation(), diag::err_unterm_macro_invoc);"}},
		[j]={
			["clang/test/Preprocessor/invalid-__has_warning1.c"]={"clang/test/Preprocessor/invalid-__has_warning1.c:5:23: error: unterminated function-like macro invocation"}
		}
	},
	["err_unterminated___pragma"]={
		[a]="err_unterminated___pragma",
		[b]="missing terminating \')\' character",
		[c]="missing terminating \')\' character",
		[d]=l,
		[e]="missing terminating \'\\)\' character",
		[f]=k,
		[g]=I,
		[h]={"49039d4afb3f",1283044194,"Complain if a __pragma isn\'t terminated.","Complain if a __pragma isn\'t terminated.\n\nllvm-svn: 112392"},
		[i]={{"clang/lib/Lex/Pragma.cpp",388,"/// HandleMicrosoft__pragma - Like Handle_Pragma except the pragma text\n/// is not enclosed within a string literal.\nvoid Preprocessor::HandleMicrosoft__pragma(Token &Tok) {\n  // ...\n  if (Tok.is(tok::eof)) {\n    Diag(PragmaLoc, diag::err_unterminated___pragma);"}}
	},
	["err_unterminated_block_comment"]={
		[a]="err_unterminated_block_comment",
		[b]="unterminated /* comment",
		[c]="unterminated /* comment",
		[d]=l,
		[e]="unterminated \\/\\* comment",
		[f]=k,
		[g]=I,
		[h]={Q,1236199783,M,L},
		[i]={{kb,2735,"/// We have just read from input the / and * characters that started a comment.\n/// Read until we find the * and / characters that terminate the comment.\n/// Note that we don\'t bother decoding trigraphs or escaped newlines in block\n/// comments, because they cannot cause the comment to end.  The only thing\n/// that can happen is the comment could end with an escaped newline between\n/// the terminating * and /.\n///\n/// If we\'re in KeepCommentMode or any CommentHandler has inserted\n/// some tokens, this will store the first token and return true.\nbool Lexer::SkipBlockComment(Token &Result, const char *CurPtr, bool &TokAtPhysicalStartOfLine) {\n  // ...\n  if (C == 0 && CurPtr == BufferEnd + 1) {\n    if (!isLexingRawMode())\n      Diag(BufferPtr, diag::err_unterminated_block_comment);"},{kb,2881,"#endif\n    // ...\n    FoundSlash:\n    // ...\n    } else if (C == 0 && CurPtr == BufferEnd + 1) {\n      if (!isLexingRawMode())\n        Diag(BufferPtr, diag::err_unterminated_block_comment);"}}
	},
	["err_unterminated_raw_string"]={
		[a]="err_unterminated_raw_string",
		[b]="raw string missing terminating delimiter )%0\"",
		[c]="raw string missing terminating delimiter )A\"",
		[d]=l,
		[e]="raw string missing terminating delimiter \\)(.*?)\"",
		[f]=k,
		[g]=I,
		[h]={"54edccafc5e3",1313035575,"Add support for C++0x raw string literals.","Add support for C++0x raw string literals.\n\nllvm-svn: 137298"},
		[i]={{kb,2198,"/// 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  while (true) {\n    // ...\n    if (C == \')\') {\n    // ...\n    } else if (C == 0 && CurPtr - 1 == BufferEnd) { // End of file.\n      if (!isLexingRawMode())\n        Diag(BufferPtr, diag::err_unterminated_raw_string) << StringRef(Prefix, PrefixLen);"}}
	},
	["err_upcast_to_inaccessible_base"]={
		[a]="err_upcast_to_inaccessible_base",
		[b]="cannot cast %0 to its %select{private|protected}2 base class %1",
		[c]={{nil,nil,{"cannot cast A to its ",{"private","protected"}," base class B"}}},
		[d]=l,
		[e]="cannot cast (.*?) to its (?:private|protected) base class (.*?)",
		[f]=k,
		[g]=m,
		[h]={"5b0829a321d5",1265794272,"Improve access control diagnostics.  Perform access control on member-pointer","Improve access control diagnostics.  Perform access control on member-pointer\nconversions.  Fix an access-control bug where privileges were not considered\nat intermediate points along the inheritance path.  Prepare for friends.\n\nllvm-svn: 95775"},
		[i]={{Hb,1833,"/// TryStaticMemberPointerUpcast - Tests whether a conversion according to\n/// C++ 5.2.9p9 is valid:\n///\n///   An rvalue of type \"pointer to member of D of type cv1 T\" can be\n///   converted to an rvalue of type \"pointer to member of B of type cv2 T\",\n///   where B is a base class of D [...].\n///\nTryCastResult TryStaticMemberPointerUpcast(Sema &Self, ExprResult &SrcExpr, QualType SrcType, QualType DestType, bool CStyle, SourceRange OpRange, unsigned &msg, CastKind &Kind, CXXCastPath &BasePath) {\n  // ...\n  if (!CStyle) {\n    switch (Self.CheckBaseClassAccess(OpRange.getBegin(), DestClass, SrcClass, Paths.front(), diag::err_upcast_to_inaccessible_base)) {"},{r,3166,"bool Sema::CheckDerivedToBaseConversion(QualType Derived, QualType Base, SourceLocation Loc, SourceRange Range, CXXCastPath *BasePath, bool IgnoreAccess) { return CheckDerivedToBaseConversion(Derived, Base, diag::err_upcast_to_inaccessible_base, diag::err_ambiguous_derived_to_base_conv, Loc, Range, DeclarationName(), BasePath, IgnoreAccess); }"},{"clang/lib/Sema/SemaOverload.cpp",3146,"/// CheckPointerConversion - Check the pointer conversion from the\n/// expression From to the type ToType. This routine checks for\n/// ambiguous or inaccessible derived-to-base pointer\n/// conversions for which IsPointerConversion has already returned\n/// true. It returns true and produces a diagnostic if there was an\n/// error, or returns false otherwise.\nbool Sema::CheckPointerConversion(Expr *From, QualType ToType, CastKind &Kind, CXXCastPath &BasePath, bool IgnoreBaseAccess, bool Diagnose) {\n  // ...\n  if (const PointerType *ToPtrType = ToType->getAs<PointerType>()) {\n    if (const PointerType *FromPtrType = FromType->getAs<PointerType>()) {\n      // ...\n      if (FromPointeeType->isRecordType() && ToPointeeType->isRecordType() && !Context.hasSameUnqualifiedType(FromPointeeType, ToPointeeType)) {\n        // ...\n        if (Diagnose) {\n          InaccessibleID = diag::err_upcast_to_inaccessible_base;"}},
		[j]={
			["clang/test/SemaCXX/access-member-pointer.cpp"]={"clang/test/SemaCXX/access-member-pointer.cpp:10:9: error: cannot cast \'B\' to its private base class \'A\'"}
		}
	},
	["err_use_continuation_class"]={
		[a]="err_use_continuation_class",
		[b]="illegal redeclaration of property in class extension %0 (attribute must be \'readwrite\', while its primary must be \'readonly\')",
		[c]="illegal redeclaration of property in class extension A (attribute must be \'readwrite\', while its primary must be \'readonly\')",
		[d]=l,
		[e]="illegal redeclaration of property in class extension (.*?) \\(attribute must be \'readwrite\', while its primary must be \'readonly\'\\)",
		[f]=k,
		[g]=m,
		[h]={Q,1236199783,M,L},
		[i]={{Tb,464,"ObjCPropertyDecl *Sema::HandlePropertyInClassExtension(Scope *S, SourceLocation AtLoc, SourceLocation LParenLoc, FieldDeclarator &FD, Selector GetterSel, SourceLocation GetterNameLoc, Selector SetterSel, SourceLocation SetterNameLoc, const bool isReadWrite, unsigned &Attributes, const unsigned AttributesAsWritten, QualType T, TypeSourceInfo *TSI, tok::ObjCKeywordKind MethodImplKind) {\n  // ...\n  // Check for consistency with the previous declaration, if there is one.\n  if (PIDecl) {\n    // A readonly property declared in the primary class can be refined\n    // by adding a readwrite property within an extension.\n    // Anything else is an error.\n    if (!(PIDecl->isReadOnly() && isReadWrite)) {\n      // ...\n      unsigned diag = (Attributes & ObjCPropertyAttribute::kind_readwrite) && (PIDecl->getPropertyAttributesAsWritten() & ObjCPropertyAttribute::kind_readwrite) ? diag::err_use_continuation_class_redeclaration_readwrite : diag::err_use_continuation_class;"}},
		[j]={
			["clang/test/SemaObjC/continuation-class-err.m"]={"clang/test/SemaObjC/continuation-class-err.m:15:1: error: illegal redeclaration of property in class extension \'ReadOnly\' (attribute must be \'readwrite\', while its primary must be \'readonly\')","clang/test/SemaObjC/continuation-class-err.m:34:1: error: illegal redeclaration of property in class extension \'Bar\' (attribute must be \'readwrite\', while its primary must be \'readonly\')","clang/test/SemaObjC/continuation-class-err.m:35:1: error: illegal redeclaration of property in class extension \'Bar\' (attribute must be \'readwrite\', while its primary must be \'readonly\')"}
		}
	},
	["err_use_continuation_class_redeclaration_readwrite"]={
		[a]="err_use_continuation_class_redeclaration_readwrite",
		[b]="illegal redeclaration of \'readwrite\' property in class extension %0 (perhaps you intended this to be a \'readwrite\' redeclaration of a \'readonly\' public property?)",
		[c]="illegal redeclaration of \'readwrite\' property in class extension A (perhaps you intended this to be a \'readwrite\' redeclaration of a \'readonly\' public property?)",
		[d]=l,
		[e]="illegal redeclaration of \'readwrite\' property in class extension (.*?) \\(perhaps you intended this to be a \'readwrite\' redeclaration of a \'readonly\' public property\\?\\)",
		[f]=k,
		[g]=m,
		[h]={"5ef9ad9907a7",1287686982,"Tweak diagnostics for redeclaration of a @property in a class extension where the redelcaration and ...","Tweak diagnostics for redeclaration of a @property in a class extension where the redelcaration and original\ndeclaration have the \'readwrite\' attribute.  This is a common case, and we can issue a more lucid diagnostic.\n\nFixes <rdar://problem/7629420>.\n\nllvm-svn: 117045"},
		[i]={{Tb,463,"ObjCPropertyDecl *Sema::HandlePropertyInClassExtension(Scope *S, SourceLocation AtLoc, SourceLocation LParenLoc, FieldDeclarator &FD, Selector GetterSel, SourceLocation GetterNameLoc, Selector SetterSel, SourceLocation SetterNameLoc, const bool isReadWrite, unsigned &Attributes, const unsigned AttributesAsWritten, QualType T, TypeSourceInfo *TSI, tok::ObjCKeywordKind MethodImplKind) {\n  // ...\n  // Check for consistency with the previous declaration, if there is one.\n  if (PIDecl) {\n    // A readonly property declared in the primary class can be refined\n    // by adding a readwrite property within an extension.\n    // Anything else is an error.\n    if (!(PIDecl->isReadOnly() && isReadWrite)) {\n      // ...\n      unsigned diag = (Attributes & ObjCPropertyAttribute::kind_readwrite) && (PIDecl->getPropertyAttributesAsWritten() & ObjCPropertyAttribute::kind_readwrite) ? diag::err_use_continuation_class_redeclaration_readwrite : diag::err_use_continuation_class;"}},
		[j]={
			["clang/test/SemaObjC/duplicate-property-class-extension.m"]={"clang/test/SemaObjC/duplicate-property-class-extension.m:12:1: error: illegal redeclaration of \'readwrite\' property in class extension \'Foo\' (perhaps you intended this to be a \'readwrite\' redeclaration of a \'readonly\' public property?)"}
		}
	},
	["err_use_of_default_argument_to_function_declared_later"]={
		[a]="err_use_of_default_argument_to_function_declared_later",
		[b]="use of default argument to function %0 that is declared later in class %1",
		[c]="use of default argument to function A that is declared later in class B",
		[d]=l,
		[e]="use of default argument to function (.*?) that is declared later in class (.*?)",
		[f]=k,
		[g]=m,
		[h]={"84613c4eba08",1244825500,"It\'s an error to use a function declared in a class definition as a default argument before the func...","It\'s an error to use a function declared in a class definition as a default argument before the function has been declared.\n\nllvm-svn: 73234"},
		[i]={{v,6035,"bool Sema::CheckCXXDefaultArgExpr(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param, Expr *RewrittenInit, bool SkipImmediateInvocations) {\n  if (Param->hasUnparsedDefaultArg()) {\n    // ...\n    Diag(CallLoc, diag::err_use_of_default_argument_to_function_declared_later) << FD << cast<CXXRecordDecl>(FD->getDeclContext());"}},
		[j]={
			["clang/test/SemaCXX/default2.cpp"]={"clang/test/SemaCXX/default2.cpp:117:23: error: use of default argument to function \'f\' that is declared later in class \'C2\'","clang/test/SemaCXX/default2.cpp:123:23: error: use of default argument to function \'f\' that is declared later in class \'C3<int>\'"}
		}
	},
	["err_use_of_empty_using_if_exists"]={
		[a]={{nil,x,"err_use_of_empty_using_if_exists"}},
		[b]={{nil,x,"reference to unresolved using declaration"}},
		[c]={{nil,x,"reference to unresolved using declaration"}},
		[d]=l,
		[e]="reference to unresolved using declaration",
		[f]=k,
		[g]={{nil,x,m}},
		[h]={"3dbcea8b957a",1615397021,"Reland [clang] Check unsupported types in expressions","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"},
		[i]={{v,366,"/// 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 (const auto *EmptyD = dyn_cast<UnresolvedUsingIfExistsDecl>(D)) {\n    Diag(Loc, diag::err_use_of_empty_using_if_exists);"}},
		[j]={
			["clang/test/SemaCXX/using-if-exists.cpp"]={"clang/test/SemaCXX/using-if-exists.cpp:9:1: error: reference to unresolved using declaration","clang/test/SemaCXX/using-if-exists.cpp:34:9: error: reference to unresolved using declaration","clang/test/SemaCXX/using-if-exists.cpp:39:1: error: reference to unresolved using declaration","clang/test/SemaCXX/using-if-exists.cpp:73:9: error: reference to unresolved using declaration","clang/test/SemaCXX/using-if-exists.cpp:75:13: error: reference to unresolved using declaration","clang/test/SemaCXX/using-if-exists.cpp:78:17: error: reference to unresolved using declaration","clang/test/SemaCXX/using-if-exists.cpp:81:17: error: reference to unresolved using declaration","clang/test/SemaCXX/using-if-exists.cpp:96:3: error: reference to unresolved using declaration","clang/test/SemaCXX/using-if-exists.cpp:109:3: error: reference to unresolved using declaration","clang/test/SemaCXX/using-if-exists.cpp:138:3: error: reference to unresolved using declaration","clang/test/SemaCXX/using-if-exists.cpp:138:3: error: reference to unresolved using declaration","clang/test/SemaCXX/using-if-exists.cpp:138:3: error: reference to unresolved using declaration","clang/test/SemaCXX/using-if-exists.cpp:169:6: error: reference to unresolved using declaration","clang/test/SemaCXX/using-if-exists.cpp:178:11: error: reference to unresolved using declaration","clang/test/SemaCXX/using-if-exists.cpp:222:15: error: reference to unresolved using declaration","clang/test/SemaCXX/using-if-exists.cpp:223:8: error: reference to unresolved using declaration","clang/test/SemaCXX/using-if-exists.cpp:92:5: error: reference to unresolved using declaration","clang/test/SemaCXX/using-if-exists.cpp:93:5: error: reference to unresolved using declaration"}
		}
	},
	["err_use_of_tag_name_without_tag"]={
		[a]="err_use_of_tag_name_without_tag",
		[b]="must use \'%1\' tag to refer to type %0%select{| in this scope}2",
		[c]={{nil,nil,{"must use \'B\' tag to refer to type A",{k," in this scope"}}}},
		[d]=l,
		[e]="must use \'(.*?)\' tag to refer to type (.*?)(?:| in this scope)",
		[f]=k,
		[g]={{nil,X,t},{"7.1",nil,m}},
		[h]={"ffaa0e6919b0",1239572970,"Diagnose invalid uses of tagged types with a missing tag.  For example, in:","Diagnose invalid uses of tagged types with a missing tag.  For example, in:\n\nstruct xyz { int y; };\nenum abc { ZZZ };\n\nstatic xyz b;\nabc c;\n\nwe used to produce:\n\nt2.c:4:8: error: unknown type name \'xyz\'\nstatic xyz b;\n       ^\nt2.c:5:1: error: unknown type name \'abc\'\nabc c;\n^\n\nwe now produce:\n\nt2.c:4:8: error: use of tagged type \'xyz\' without \'struct\' tag\nstatic xyz b;\n       ^\n       struct\nt2.c:5:1: error: use of tagged type \'abc\' without \'enum\' tag\nabc c;\n^\nenum\n\nGCC produces the normal:\nt2.c:4: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘b’\nt2.c:5: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘c’\n\nrdar://6783347\n\nllvm-svn: 68914"},
		[i]={{D,2823,"/// ParseImplicitInt - This method is called when we have an non-typename\n/// identifier in a declspec (which normally terminates the decl spec) when\n/// the declspec has no type specifier.  In this case, the declspec is either\n/// malformed or is \"implicit int\" (in K&R and C89).\n///\n/// This method handles diagnosing this prettily and returns false if the\n/// declspec is done being processed.  If it recovers and thinks there may be\n/// other pieces of declspec after it, it returns true.\n///\nbool Parser::ParseImplicitInt(DeclSpec &DS, CXXScopeSpec *SS, const ParsedTemplateInfo &TemplateInfo, AccessSpecifier AS, DeclSpecContext DSC, ParsedAttributes &Attrs) {\n  // ...\n  // Otherwise, if we don\'t consume this token, we are going to emit an\n  // error anyway.  Try to recover from various common problems.  Check\n  // to see if this was a reference to a tag name without a tag specified.\n  // This is a common problem in C (saying \'foo\' instead of \'struct foo\').\n  //\n  // C++ doesn\'t need this, and isTagName doesn\'t take SS.\n  if (SS == nullptr) {\n    // ...\n    if (TagName) {\n      // ...\n      Diag(Loc, diag::err_use_of_tag_name_without_tag) << TokenName << TagName << getLangOpts().CPlusPlus << FixItHint::CreateInsertion(Tok.getLocation(), FixitTagName);"},{u,883,"static bool isTagTypeWithMissingTag(Sema &SemaRef, LookupResult &Result, Scope *S, CXXScopeSpec &SS, IdentifierInfo *&Name, SourceLocation NameLoc) {\n  // ...\n  if (TagDecl *Tag = R.getAsSingle<TagDecl>()) {\n    // ...\n    SemaRef.Diag(NameLoc, diag::err_use_of_tag_name_without_tag) << Name << TagName << SemaRef.getLangOpts().CPlusPlus << FixItHint::CreateInsertion(NameLoc, FixItTagName);"}},
		[j]={
			["clang/test/Parser/declarators.c"]={"clang/test/Parser/declarators.c:54:1: error: must use \'struct\' tag to refer to type \'xyz\'","clang/test/Parser/declarators.c:55:1: error: must use \'enum\' tag to refer to type \'myenum\'"}
		}
	},
	["err_use_of_unaddressable_function"]={
		[a]={{nil,A,"err_use_of_unaddressable_function"}},
		[b]={{nil,A,"taking address of non-addressable standard library function"}},
		[c]={{nil,A,"taking address of non-addressable standard library function"}},
		[d]=l,
		[e]="taking address of non\\-addressable standard library function",
		[f]=k,
		[g]={{nil,A,m}},
		[h]={"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"},
		[i]={{v,21597,"/// 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);"}},
		[j]={
			["clang/test/SemaCXX/builtin-std-move.cpp"]={"clang/test/SemaCXX/builtin-std-move.cpp:119:20: error: taking address of non-addressable standard library function","clang/test/SemaCXX/builtin-std-move.cpp:120:31: error: taking address of non-addressable standard library function","clang/test/SemaCXX/builtin-std-move.cpp:121:24: error: taking address of non-addressable standard library function","clang/test/SemaCXX/builtin-std-move.cpp:122:28: error: taking address of non-addressable standard library function","clang/test/SemaCXX/builtin-std-move.cpp:123:29: error: taking address of non-addressable standard library function","clang/test/SemaCXX/builtin-std-move.cpp:124:25: error: taking address of non-addressable standard library function","clang/test/SemaCXX/builtin-std-move.cpp:125:35: error: taking address of non-addressable standard library function","clang/test/SemaCXX/builtin-std-move.cpp:129:20: error: taking address of non-addressable standard library function","clang/test/SemaCXX/builtin-std-move.cpp:130:23: error: taking address of non-addressable standard library function"}
		}
	},
	["err_use_with_wrong_tag"]={
		[a]="err_use_with_wrong_tag",
		[b]="use of %0 with tag type that does not match previous declaration",
		[c]="use of A with tag type that does not match previous declaration",
		[d]=l,
		[e]="use of (.*?) with tag type that does not match previous declaration",
		[f]=k,
		[g]=m,
		[h]={O,1237025389,N,P},
		[i]={{u,17241,"/// This is invoked when we see \'struct foo\' or \'struct {\'.  In the\n/// former case, Name will be non-null.  In the later case, Name will be null.\n/// TagSpec indicates what kind of tag this is. TUK indicates whether this is a\n/// reference/declaration/definition of a tag.\n///\n/// \\param IsTypeSpecifier \\c true if this is a type-specifier (or\n/// trailing-type-specifier) other than one in an alias-declaration.\n///\n/// \\param SkipBody If non-null, will be set to indicate if the caller should\n/// skip the definition of this tag and treat it as if it were a declaration.\nDeclResult Sema::ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc, CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, const ParsedAttributesView &Attrs, AccessSpecifier AS, SourceLocation ModulePrivateLoc, MultiTemplateParamsArg TemplateParameterLists, bool &OwnedDecl, bool &IsDependent, SourceLocation ScopedEnumKWLoc, bool ScopedEnumUsesClassTag, TypeResult UnderlyingType, bool IsTypeSpecifier, bool IsTemplateParamOrArg, OffsetOfKind OOK, SkipBodyInfo *SkipBody) {\n  // ...\n  if (!Previous.empty()) {\n    // ...\n    if (TagDecl *PrevTagDecl = dyn_cast<TagDecl>(PrevDecl)) {\n      // If this is a use of a previous tag, or if the tag is already declared\n      // in the same scope (so that the definition/declaration completes or\n      // rementions the tag), reuse the decl.\n      if (TUK == TUK_Reference || TUK == TUK_Friend || isDeclInScope(DirectPrevDecl, SearchDC, S, SS.isNotEmpty() || isMemberSpecialization)) {\n        // Make sure that this wasn\'t declared as an enum and now used as a\n        // struct or something similar.\n        if (!isAcceptableTagRedeclaration(PrevTagDecl, Kind, TUK == TUK_Definition, KWLoc, Name)) {\n          // ...\n          if (SafeToContinue)\n            Diag(KWLoc, diag::err_use_with_wrong_tag) << Name << FixItHint::CreateReplacement(SourceRange(KWLoc), PrevTagDecl->getKindName());"},{u,17246,"/// This is invoked when we see \'struct foo\' or \'struct {\'.  In the\n/// former case, Name will be non-null.  In the later case, Name will be null.\n/// TagSpec indicates what kind of tag this is. TUK indicates whether this is a\n/// reference/declaration/definition of a tag.\n///\n/// \\param IsTypeSpecifier \\c true if this is a type-specifier (or\n/// trailing-type-specifier) other than one in an alias-declaration.\n///\n/// \\param SkipBody If non-null, will be set to indicate if the caller should\n/// skip the definition of this tag and treat it as if it were a declaration.\nDeclResult Sema::ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc, CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, const ParsedAttributesView &Attrs, AccessSpecifier AS, SourceLocation ModulePrivateLoc, MultiTemplateParamsArg TemplateParameterLists, bool &OwnedDecl, bool &IsDependent, SourceLocation ScopedEnumKWLoc, bool ScopedEnumUsesClassTag, TypeResult UnderlyingType, bool IsTypeSpecifier, bool IsTemplateParamOrArg, OffsetOfKind OOK, SkipBodyInfo *SkipBody) {\n  // ...\n  if (!Previous.empty()) {\n    // ...\n    if (TagDecl *PrevTagDecl = dyn_cast<TagDecl>(PrevDecl)) {\n      // If this is a use of a previous tag, or if the tag is already declared\n      // in the same scope (so that the definition/declaration completes or\n      // rementions the tag), reuse the decl.\n      if (TUK == TUK_Reference || TUK == TUK_Friend || isDeclInScope(DirectPrevDecl, SearchDC, S, SS.isNotEmpty() || isMemberSpecialization)) {\n        // Make sure that this wasn\'t declared as an enum and now used as a\n        // struct or something similar.\n        if (!isAcceptableTagRedeclaration(PrevTagDecl, Kind, TUK == TUK_Definition, KWLoc, Name)) {\n          // ...\n          if (SafeToContinue)\n          // ...\n          else\n            Diag(KWLoc, diag::err_use_with_wrong_tag) << Name;"},{Z,2006,"DeclResult Sema::CheckClassTemplate(Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc, CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, const ParsedAttributesView &Attr, TemplateParameterList *TemplateParams, AccessSpecifier AS, SourceLocation ModulePrivateLoc, SourceLocation FriendLoc, unsigned NumOuterTemplateParamLists, TemplateParameterList **OuterTemplateParamLists, SkipBodyInfo *SkipBody) {\n  // ...\n  if (PrevClassTemplate) {\n    // ...\n    if (!isAcceptableTagRedeclaration(PrevRecordDecl, Kind, TUK == TUK_Definition, KWLoc, Name)) {\n      Diag(KWLoc, diag::err_use_with_wrong_tag) << Name << FixItHint::CreateReplacement(KWLoc, PrevRecordDecl->getKindName());"},{Z,4302,"TypeResult Sema::ActOnTagTemplateIdType(TagUseKind TUK, TypeSpecifierType TagSpec, SourceLocation TagLoc, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, TemplateTy TemplateD, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgsIn, SourceLocation RAngleLoc) {\n  // ...\n  // Check the tag kind\n  if (const RecordType *RT = Result->getAs<RecordType>()) {\n    // ...\n    if (!isAcceptableTagRedeclaration(D, TagKind, TUK == TUK_Definition, TagLoc, Id)) {\n      Diag(TagLoc, diag::err_use_with_wrong_tag) << Result << FixItHint::CreateReplacement(SourceRange(TagLoc), D->getKindName());"},{Z,8714,"DeclResult Sema::ActOnClassTemplateSpecialization(Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc, SourceLocation ModulePrivateLoc, CXXScopeSpec &SS, TemplateIdAnnotation &TemplateId, const ParsedAttributesView &Attr, MultiTemplateParamsArg TemplateParameterLists, SkipBodyInfo *SkipBody) {\n  // ...\n  if (!isAcceptableTagRedeclaration(ClassTemplate->getTemplatedDecl(), Kind, TUK == TUK_Definition, KWLoc, ClassTemplate->getIdentifier())) {\n    Diag(KWLoc, diag::err_use_with_wrong_tag) << ClassTemplate << FixItHint::CreateReplacement(KWLoc, ClassTemplate->getTemplatedDecl()->getKindName());"},{Z,9971,"// Explicit instantiation of a class template specialization\nDeclResult Sema::ActOnExplicitInstantiation(Scope *S, SourceLocation ExternLoc, SourceLocation TemplateLoc, unsigned TagSpec, SourceLocation KWLoc, const CXXScopeSpec &SS, TemplateTy TemplateD, SourceLocation TemplateNameLoc, SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgsIn, SourceLocation RAngleLoc, const ParsedAttributesView &Attr) {\n  // ...\n  if (!isAcceptableTagRedeclaration(ClassTemplate->getTemplatedDecl(), Kind, /*isDefinition*/ false, KWLoc, ClassTemplate->getIdentifier())) {\n    Diag(KWLoc, diag::err_use_with_wrong_tag) << ClassTemplate << FixItHint::CreateReplacement(KWLoc, ClassTemplate->getTemplatedDecl()->getKindName());"},{"clang/lib/Sema/SemaTemplateInstantiate.cpp",1683,"QualType TemplateInstantiator::RebuildElaboratedType(SourceLocation KeywordLoc, ElaboratedTypeKeyword Keyword, NestedNameSpecifierLoc QualifierLoc, QualType T) {\n  if (const TagType *TT = T->getAs<TagType>()) {\n    // ...\n    // TODO: should we even warn on struct/class mismatches for this?  Seems\n    // like it\'s likely to produce a lot of spurious errors.\n    if (Id && Keyword != ETK_None && Keyword != ETK_Typename) {\n      // ...\n      if (!SemaRef.isAcceptableTagRedeclaration(TD, Kind, /*isDefinition*/ false, TagLocation, Id)) {\n        SemaRef.Diag(TagLocation, diag::err_use_with_wrong_tag) << Id << FixItHint::CreateReplacement(SourceRange(TagLocation), TD->getKindName());"}},
		[j]={
			["clang/test/CXX/basic/basic.lookup/basic.lookup.elab/templateid.cpp"]={"clang/test/CXX/basic/basic.lookup/basic.lookup.elab/templateid.cpp:18:1: error: use of \'Ident<int>\' with tag type that does not match previous declaration"}
		}
	},
	["err_using_attribute_ns_conflict"]={
		[a]="err_using_attribute_ns_conflict",
		[b]="attribute with scope specifier cannot follow default scope specifier",
		[c]="attribute with scope specifier cannot follow default scope specifier",
		[d]=l,
		[e]="attribute with scope specifier cannot follow default scope specifier",
		[f]=k,
		[g]=s,
		[h]={"b7d7a046d8e0",1466770512,"Using for attributes voted into C++17.","Using for attributes voted into C++17.\n\nllvm-svn: 273666"},
		[i]={{Y,4594,"/// 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  while (!Tok.isOneOf(tok::r_square, tok::semi, tok::eof)) {\n    // ...\n    if (CommonScopeName) {\n      if (ScopeName) {\n        Diag(ScopeLoc, diag::err_using_attribute_ns_conflict) << SourceRange(CommonScopeLoc);"}},
		[j]={
			["clang/test/CXX/dcl.dcl/dcl.attr/dcl.attr.grammar/p2-1z.cpp"]={"clang/test/CXX/dcl.dcl/dcl.attr/dcl.attr.grammar/p2-1z.cpp:13:15: error: attribute with scope specifier cannot follow default scope specifier"}
		}
	},
	["err_using_decl_can_not_refer_to_class_member"]={
		[a]="err_using_decl_can_not_refer_to_class_member",
		[b]="using declaration cannot refer to class member",
		[c]="using declaration cannot refer to class member",
		[d]=l,
		[e]="using declaration cannot refer to class member",
		[f]=k,
		[g]=m,
		[h]={"5a9c5acf0f49",1251430518,"More work on using declarations.","More work on using declarations.\n\nllvm-svn: 80333"},
		[i]={{r,13057,"/// 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();"}},
		[j]={
			["clang/test/CXX/special/class.inhctor/elsewhere.cpp"]={"clang/test/CXX/special/class.inhctor/elsewhere.cpp:12:11: error: using declaration cannot refer to class member"}
		}
	},
	["err_using_decl_can_not_refer_to_namespace"]={
		[a]="err_using_decl_can_not_refer_to_namespace",
		[b]="using declaration cannot refer to a namespace",
		[c]="using declaration cannot refer to a namespace",
		[d]=l,
		[e]="using declaration cannot refer to a namespace",
		[f]=k,
		[g]=m,
		[h]={"5a9c5acf0f49",1251430518,"More work on using declarations.","More work on using declarations.\n\nllvm-svn: 80333"},
		[i]={{r,12795,"/// Builds a using declaration.\n///\n/// \\param IsInstantiation - Whether this call arises from an\n///   instantiation of an unresolved using declaration.  We treat\n///   the lookup differently for these declarations.\nNamedDecl *Sema::BuildUsingDeclaration(Scope *S, AccessSpecifier AS, SourceLocation UsingLoc, bool HasTypenameKeyword, SourceLocation TypenameLoc, CXXScopeSpec &SS, DeclarationNameInfo NameInfo, SourceLocation EllipsisLoc, const ParsedAttributesView &AttrList, bool IsInstantiation, bool IsUsingIfExists) {\n  // ...\n  // C++14 [namespace.udecl]p6:\n  // A using-declaration shall not name a namespace.\n  if (R.getAsSingle<NamespaceDecl>()) {\n    Diag(IdentLoc, diag::err_using_decl_can_not_refer_to_namespace) << SS.getRange();"}},
		[j]={
			["clang/test/CXX/dcl.dcl/basic.namespace/namespace.udecl/p6-cxx11.cpp"]={"clang/test/CXX/dcl.dcl/basic.namespace/namespace.udecl/p6-cxx11.cpp:7:10: error: using declaration cannot refer to a namespace"}
		}
	},
	["err_using_decl_conflict"]={
		[a]="err_using_decl_conflict",
		[b]="target of using declaration conflicts with declaration already in scope",
		[c]="target of using declaration conflicts with declaration already in scope",
		[d]=l,
		[e]="target of using declaration conflicts with declaration already in scope",
		[f]=k,
		[g]=m,
		[h]={"84d8767c1582",1260438112,"Implement redeclaration checking and hiding semantics for using declarations.  There","Implement redeclaration checking and hiding semantics for using declarations.  There\nare a couple of O(n^2) operations in this, some analogous to the usual O(n^2)\nredeclaration problem and some not.  In particular, retroactively removing\nshadow declarations when they\'re hidden by later decls is pretty unfortunate.\nI\'m not yet convinced it\'s worse than the alternative, though.\n\nllvm-svn: 91045"},
		[i]={{r,12276,"/// Determines whether to create a using shadow decl for a particular\n/// decl, given the set of decls existing prior to this using lookup.\nbool Sema::CheckUsingShadowDecl(BaseUsingDecl *BUD, NamedDecl *Orig, const LookupResult &Previous, UsingShadowDecl *&PrevShadow) {\n  // ...\n  // Always emit a diagnostic for a mismatch between an unresolved\n  // using_if_exists and a resolved using declaration in either direction.\n  if (isa<UnresolvedUsingIfExistsDecl>(Target) != (isa_and_nonnull<UnresolvedUsingIfExistsDecl>(NonTag))) {\n    // ...\n    Diag(BUD->getLocation(), diag::err_using_decl_conflict);"},{r,12292,"/// Determines whether to create a using shadow decl for a particular\n/// decl, given the set of decls existing prior to this using lookup.\nbool Sema::CheckUsingShadowDecl(BaseUsingDecl *BUD, NamedDecl *Orig, const LookupResult &Previous, UsingShadowDecl *&PrevShadow) {\n  // ...\n  if (FunctionDecl *FD = Target->getAsFunction()) {\n    // ...\n    case Ovl_NonFunction:\n      Diag(BUD->getLocation(), diag::err_using_decl_conflict);"},{r,12304,"/// Determines whether to create a using shadow decl for a particular\n/// decl, given the set of decls existing prior to this using lookup.\nbool Sema::CheckUsingShadowDecl(BaseUsingDecl *BUD, NamedDecl *Orig, const LookupResult &Previous, UsingShadowDecl *&PrevShadow) {\n  // ...\n  if (FunctionDecl *FD = Target->getAsFunction()) {\n    // ...\n    // We found a decl with the exact signature.\n    case Ovl_Match:\n      // ...\n      Diag(BUD->getLocation(), diag::err_using_decl_conflict);"},{r,12320,"/// Determines whether to create a using shadow decl for a particular\n/// decl, given the set of decls existing prior to this using lookup.\nbool Sema::CheckUsingShadowDecl(BaseUsingDecl *BUD, NamedDecl *Orig, const LookupResult &Previous, UsingShadowDecl *&PrevShadow) {\n  // ...\n  if (isa<TagDecl>(Target)) {\n    // ...\n    Diag(BUD->getLocation(), diag::err_using_decl_conflict);"},{r,12330,"/// Determines whether to create a using shadow decl for a particular\n/// decl, given the set of decls existing prior to this using lookup.\nbool Sema::CheckUsingShadowDecl(BaseUsingDecl *BUD, NamedDecl *Orig, const LookupResult &Previous, UsingShadowDecl *&PrevShadow) {\n  // ...\n  Diag(BUD->getLocation(), diag::err_using_decl_conflict);"}},
		[j]={
			["clang/test/Parser/cxx1z-using-declaration.cpp"]={"clang/test/Parser/cxx1z-using-declaration.cpp:25:12: error: target of using declaration conflicts with declaration already in scope","clang/test/Parser/cxx1z-using-declaration.cpp:33:12: error: target of using declaration conflicts with declaration already in scope"}
		}
	},
	["err_using_decl_conflict_reverse"]={
		[a]="err_using_decl_conflict_reverse",
		[b]="declaration conflicts with target of using declaration already in scope",
		[c]="declaration conflicts with target of using declaration already in scope",
		[d]=l,
		[e]="declaration conflicts with target of using declaration already in scope",
		[f]=k,
		[g]=m,
		[h]={"e29c5cd2398c",1260474663,"Improve the diagnostic when a new declaration conflicts with a using shadow","Improve the diagnostic when a new declaration conflicts with a using shadow\ndeclaration.  Rename note_using_decl to note_using, which is possibly less confusing.\nAdd a test for non-class-scope using decl collisions and be sure to note the case\nwe can\'t diagnose yet.\n\nllvm-svn: 91057"},
		[i]={{u,3554,"/// Check whether a redeclaration of an entity introduced by a\n/// using-declaration is valid, given that we know it\'s not an overload\n/// (nor a hidden tag declaration).\ntemplate <typename ExpectedDecl> static bool checkUsingShadowRedecl(Sema &S, UsingShadowDecl *OldS, ExpectedDecl *New) {\n  // ...\n  if (!Old) {\n    S.Diag(New->getLocation(), diag::err_using_decl_conflict_reverse);"},{u,17214,"/// This is invoked when we see \'struct foo\' or \'struct {\'.  In the\n/// former case, Name will be non-null.  In the later case, Name will be null.\n/// TagSpec indicates what kind of tag this is. TUK indicates whether this is a\n/// reference/declaration/definition of a tag.\n///\n/// \\param IsTypeSpecifier \\c true if this is a type-specifier (or\n/// trailing-type-specifier) other than one in an alias-declaration.\n///\n/// \\param SkipBody If non-null, will be set to indicate if the caller should\n/// skip the definition of this tag and treat it as if it were a declaration.\nDeclResult Sema::ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc, CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, const ParsedAttributesView &Attrs, AccessSpecifier AS, SourceLocation ModulePrivateLoc, MultiTemplateParamsArg TemplateParameterLists, bool &OwnedDecl, bool &IsDependent, SourceLocation ScopedEnumKWLoc, bool ScopedEnumUsesClassTag, TypeResult UnderlyingType, bool IsTypeSpecifier, bool IsTemplateParamOrArg, OffsetOfKind OOK, SkipBodyInfo *SkipBody) {\n  // ...\n  if (!Previous.empty()) {\n    // ...\n    // If this is a redeclaration of a using shadow declaration, it must\n    // declare a tag in the same context. In MSVC mode, we allow a\n    // redefinition if either context is within the other.\n    if (auto *Shadow = dyn_cast<UsingShadowDecl>(DirectPrevDecl)) {\n      // ...\n      if (SS.isEmpty() && TUK != TUK_Reference && TUK != TUK_Friend && isDeclInScope(Shadow, SearchDC, S, isMemberSpecialization) && !(OldTag && isAcceptableTagRedeclContext(*this, OldTag->getDeclContext(), SearchDC))) {\n        Diag(KWLoc, diag::err_using_decl_conflict_reverse);"},{Z,1978,"DeclResult Sema::CheckClassTemplate(Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc, CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, const ParsedAttributesView &Attr, TemplateParameterList *TemplateParams, AccessSpecifier AS, SourceLocation ModulePrivateLoc, SourceLocation FriendLoc, unsigned NumOuterTemplateParamLists, TemplateParameterList **OuterTemplateParamLists, SkipBodyInfo *SkipBody) {\n  // ...\n  if (auto *Shadow = dyn_cast_or_null<UsingShadowDecl>(PrevDecl ? Previous.getRepresentativeDecl() : nullptr)) {\n    if (SS.isEmpty() && !(PrevClassTemplate && PrevClassTemplate->getDeclContext()->getRedeclContext()->Equals(SemanticContext->getRedeclContext()))) {\n      Diag(KWLoc, diag::err_using_decl_conflict_reverse);"}},
		[j]={
			["clang/test/SemaCXX/lookup-member.cpp"]={"clang/test/SemaCXX/lookup-member.cpp:8:1: error: declaration conflicts with target of using declaration already in scope"}
		}
	},
	["err_using_decl_constructor"]={
		[a]="err_using_decl_constructor",
		[b]="using declaration cannot refer to a constructor",
		[c]="using declaration cannot refer to a constructor",
		[d]=l,
		[e]="using declaration cannot refer to a constructor",
		[f]=k,
		[g]=m,
		[h]={"220f4277bd2a",1257352206,"Switch parsing of using declarations over to ParseUnqualifiedId.","Switch parsing of using declarations over to ParseUnqualifiedId.\n\nllvm-svn: 86027"},
		[i]={{r,12040,"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();"}}
	},
	["err_using_decl_constructor_not_in_direct_base"]={
		[a]="err_using_decl_constructor_not_in_direct_base",
		[b]="%0 is not a direct base of %1, cannot inherit constructors",
		[c]="A is not a direct base of B, cannot inherit constructors",
		[d]=l,
		[e]="(.*?) is not a direct base of (.*?), cannot inherit constructors",
		[f]=k,
		[g]=m,
		[h]={"0890502f44a1",1296933799,"Basic implementation of inherited constructors. Only generates declarations, and probably only works...","Basic implementation of inherited constructors. Only generates declarations, and probably only works for very basic use cases.\n\nllvm-svn: 124970"},
		[i]={{r,12905,"/// Additional checks for a using declaration referring to a constructor name.\nbool Sema::CheckInheritingConstructorUsingDecl(UsingDecl *UD) {\n  // ...\n  if (!Base && !AnyDependentBases) {\n    Diag(UD->getUsingLoc(), diag::err_using_decl_constructor_not_in_direct_base) << UD->getNameInfo().getSourceRange() << QualType(SourceType, 0) << TargetClass;"}},
		[j]={
			["clang/test/CXX/special/class.inhctor/elsewhere.cpp"]={"clang/test/CXX/special/class.inhctor/elsewhere.cpp:30:3: error: \'B1\' is not a direct base of \'D1\', cannot inherit constructors","clang/test/CXX/special/class.inhctor/elsewhere.cpp:50:3: error: \'A<bool>\' is not a direct base of \'E<bool>\', cannot inherit constructors","clang/test/CXX/special/class.inhctor/elsewhere.cpp:55:3: error: \'A<bool>\' is not a direct base of \'F<bool>\', cannot inherit constructors"}
		}
	},
	["err_using_decl_destructor"]={
		[a]="err_using_decl_destructor",
		[b]="using declaration cannot refer to a destructor",
		[c]="using declaration cannot refer to a destructor",
		[d]=l,
		[e]="using declaration cannot refer to a destructor",
		[f]=k,
		[g]=m,
		[h]={"220f4277bd2a",1257352206,"Switch parsing of using declarations over to ParseUnqualifiedId.","Switch parsing of using declarations over to ParseUnqualifiedId.\n\nllvm-svn: 86027"},
		[i]={{r,12048,"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_DestructorName:\n    Diag(Name.getBeginLoc(), diag::err_using_decl_destructor) << SS.getRange();"}}
	},
	["err_using_decl_friend"]={
		[a]="err_using_decl_friend",
		[b]="cannot befriend target of using declaration",
		[c]="cannot befriend target of using declaration",
		[d]=l,
		[e]="cannot befriend target of using declaration",
		[f]=k,
		[g]=m,
		[h]={"c70fca60dab4",1365023987,"Complain about attempts to befriend declarations via a using","Complain about attempts to befriend declarations via a using\ndeclaration.  Patch by Stephen Lin!\n\nllvm-svn: 178698"},
		[i]={{u,3638,"/// MergeFunctionDecl - We just parsed a function \'New\' from\n/// declarator D which has the same name and scope as a previous\n/// declaration \'Old\'.  Figure out how to resolve this situation,\n/// merging decls or emitting diagnostics as appropriate.\n///\n/// In C++, New and Old must be declarations that are not\n/// overloaded. Use IsOverload to determine whether New and Old are\n/// overloaded, and to select the Old declaration that New should be\n/// merged with.\n///\n/// Returns true if there was an error, false otherwise.\nbool Sema::MergeFunctionDecl(FunctionDecl *New, NamedDecl *&OldD, Scope *S, bool MergeTypeWithOld, bool NewDeclIsDefn) {\n  // ...\n  if (!Old) {\n    if (UsingShadowDecl *Shadow = dyn_cast<UsingShadowDecl>(OldD)) {\n      if (New->getFriendObjectKind()) {\n        Diag(New->getLocation(), diag::err_using_decl_friend);"}},
		[j]={
			["clang/test/CXX/special/class.inhctor/p3.cpp"]={"clang/test/CXX/special/class.inhctor/p3.cpp:48:19: error: cannot befriend target of using declaration","clang/test/CXX/special/class.inhctor/p3.cpp:49:19: error: cannot befriend target of using declaration","clang/test/CXX/special/class.inhctor/p3.cpp:50:19: error: cannot befriend target of using declaration","clang/test/CXX/special/class.inhctor/p3.cpp:51:19: error: cannot befriend target of using declaration","clang/test/CXX/special/class.inhctor/p3.cpp:52:19: error: cannot befriend target of using declaration","clang/test/CXX/special/class.inhctor/p3.cpp:53:19: error: cannot befriend target of using declaration"}
		}
	},
	["err_using_decl_nested_name_specifier_is_current_class"]={
		[a]="err_using_decl_nested_name_specifier_is_current_class",
		[b]="using declaration refers to its own class",
		[c]="using declaration refers to its own class",
		[d]=l,
		[e]="using declaration refers to its own class",
		[f]=k,
		[g]=m,
		[h]={"3969e30d3831",1260258378,"Correctly implement the C++03 and 0x restrictions on class-member using","Correctly implement the C++03 and 0x restrictions on class-member using\ndeclarations.\n\nllvm-svn: 90843"},
		[i]={{r,12201,"/// Determines whether to create a using shadow decl for a particular\n/// decl, given the set of decls existing prior to this using lookup.\nbool Sema::CheckUsingShadowDecl(BaseUsingDecl *BUD, NamedDecl *Orig, const LookupResult &Previous, UsingShadowDecl *&PrevShadow) {\n  // Diagnose finding a decl which is not from a base class of the\n  // current class.  We do this now because there are cases where this\n  // function will silently decide not to build a shadow decl, which\n  // will pre-empt further diagnostics.\n  //\n  // We don\'t need to do this in C++11 because we do the check once on\n  // the qualifier.\n  //\n  // FIXME: diagnose the following if we care enough:\n  //   struct A { int foo; };\n  //   struct B : A { using A::foo; };\n  //   template <class T> struct C : A {};\n  //   template <class T> struct D : C<T> { using B::foo; } // <---\n  // This is invalid (during instantiation) in C++03 because B::foo\n  // resolves to the using decl in B, which is not a base class of D<T>.\n  // We can\'t diagnose it immediately because C<T> is an unknown\n  // specialization. The UsingShadowDecl in D<T> then points directly\n  // to A::foo, which will look well-formed when we instantiate.\n  // The right solution is to not collapse the shadow-decl chain.\n  if (!getLangOpts().CPlusPlus11 && CurContext->isRecord())\n    if (auto *Using = dyn_cast<UsingDecl>(BUD)) {\n      // ...\n      if (cast<CXXRecordDecl>(CurContext)->isProvablyNotDerivedFrom(OrigRec)) {\n        if (OrigDC == CurContext) {\n          Diag(Using->getLocation(), diag::err_using_decl_nested_name_specifier_is_current_class) << Using->getQualifierLoc().getSourceRange();"},{r,13171,"/// 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      // ...\n      if (CurContext == NamedContext) {\n        Diag(SS.getBeginLoc(), diag::err_using_decl_nested_name_specifier_is_current_class) << SS.getRange();"}},
		[j]={
			["clang/test/CXX/class.access/class.access.dcl/p1.cpp"]={"clang/test/CXX/class.access/class.access.dcl/p1.cpp:321:5: error: using declaration refers to its own class","clang/test/CXX/class.access/class.access.dcl/p1.cpp:341:5: error: using declaration refers to its own class"}
		}
	},
	["err_using_decl_nested_name_specifier_is_not_base_class"]={
		[a]="err_using_decl_nested_name_specifier_is_not_base_class",
		[b]="using declaration refers into \'%0\', which is not a base class of %1",
		[c]="using declaration refers into \'A\', which is not a base class of B",
		[d]=l,
		[e]="using declaration refers into \'(.*?)\', which is not a base class of (.*?)",
		[f]=k,
		[g]=m,
		[h]={"3969e30d3831",1260258378,"Correctly implement the C++03 and 0x restrictions on class-member using","Correctly implement the C++03 and 0x restrictions on class-member using\ndeclarations.\n\nllvm-svn: 90843"},
		[i]={{r,12209,"/// Determines whether to create a using shadow decl for a particular\n/// decl, given the set of decls existing prior to this using lookup.\nbool Sema::CheckUsingShadowDecl(BaseUsingDecl *BUD, NamedDecl *Orig, const LookupResult &Previous, UsingShadowDecl *&PrevShadow) {\n  // Diagnose finding a decl which is not from a base class of the\n  // current class.  We do this now because there are cases where this\n  // function will silently decide not to build a shadow decl, which\n  // will pre-empt further diagnostics.\n  //\n  // We don\'t need to do this in C++11 because we do the check once on\n  // the qualifier.\n  //\n  // FIXME: diagnose the following if we care enough:\n  //   struct A { int foo; };\n  //   struct B : A { using A::foo; };\n  //   template <class T> struct C : A {};\n  //   template <class T> struct D : C<T> { using B::foo; } // <---\n  // This is invalid (during instantiation) in C++03 because B::foo\n  // resolves to the using decl in B, which is not a base class of D<T>.\n  // We can\'t diagnose it immediately because C<T> is an unknown\n  // specialization. The UsingShadowDecl in D<T> then points directly\n  // to A::foo, which will look well-formed when we instantiate.\n  // The right solution is to not collapse the shadow-decl chain.\n  if (!getLangOpts().CPlusPlus11 && CurContext->isRecord())\n    if (auto *Using = dyn_cast<UsingDecl>(BUD)) {\n      // ...\n      if (cast<CXXRecordDecl>(CurContext)->isProvablyNotDerivedFrom(OrigRec)) {\n        // ...\n        Diag(Using->getQualifierLoc().getBeginLoc(), diag::err_using_decl_nested_name_specifier_is_not_base_class) << Using->getQualifier() << cast<CXXRecordDecl>(CurContext) << Using->getQualifierLoc().getSourceRange();"},{r,13178,"/// 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      // ...\n      if (!cast<CXXRecordDecl>(NamedContext)->isInvalidDecl()) {\n        Diag(SS.getBeginLoc(), diag::err_using_decl_nested_name_specifier_is_not_base_class) << SS.getScopeRep() << cast<CXXRecordDecl>(CurContext) << SS.getRange();"},{r,13224,"/// 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  Diag(SS.getRange().getBegin(), diag::err_using_decl_nested_name_specifier_is_not_base_class) << SS.getScopeRep() << cast<CXXRecordDecl>(CurContext) << SS.getRange();"}},
		[j]={
			["clang/test/SemaCXX/using-decl-templates.cpp"]={"clang/test/SemaCXX/using-decl-templates.cpp:13:9: error: using declaration refers into \'A<double>::\', which is not a base class of \'B<int>\'"}
		}
	},
	["err_using_decl_nested_name_specifier_is_not_class"]={
		[a]="err_using_decl_nested_name_specifier_is_not_class",
		[b]="using declaration in class refers into \'%0\', which is not a class",
		[c]="using declaration in class refers into \'A\', which is not a class",
		[d]=l,
		[e]="using declaration in class refers into \'(.*?)\', which is not a class",
		[f]=k,
		[g]=m,
		[h]={"3969e30d3831",1260258378,"Correctly implement the C++03 and 0x restrictions on class-member using","Correctly implement the C++03 and 0x restrictions on class-member using\ndeclarations.\n\nllvm-svn: 90843"},
		[i]={{r,13141,"/// 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();"}},
		[j]={
			["clang/test/CXX/dcl.dcl/basic.namespace/namespace.udecl/p7-cxx20.cpp"]={"clang/test/CXX/dcl.dcl/basic.namespace/namespace.udecl/p7-cxx20.cpp:81:9: error: using declaration in class refers into \'Three::\', which is not a class"}
		}
	},
	["err_using_decl_redeclaration"]={
		[a]="err_using_decl_redeclaration",
		[b]="redeclaration of using declaration",
		[c]="redeclaration of using declaration",
		[d]=l,
		[e]="redeclaration of using declaration",
		[f]=k,
		[g]=m,
		[h]={"84d8767c1582",1260438112,"Implement redeclaration checking and hiding semantics for using declarations.  There","Implement redeclaration checking and hiding semantics for using declarations.  There\nare a couple of O(n^2) operations in this, some analogous to the usual O(n^2)\nredeclaration problem and some not.  In particular, retroactively removing\nshadow declarations when they\'re hidden by later decls is pretty unfortunate.\nI\'m not yet convinced it\'s worse than the alternative, though.\n\nllvm-svn: 91045"},
		[i]={{r,12988,"/// Checks that the given using declaration is not an invalid\n/// redeclaration.  Note that this is checking only for the using decl\n/// itself, not for any ill-formedness among the UsingShadowDecls.\nbool Sema::CheckUsingDeclRedeclaration(SourceLocation UsingLoc, bool HasTypenameKeyword, const CXXScopeSpec &SS, SourceLocation NameLoc, const LookupResult &Prev) {\n  // ...\n  for (LookupResult::iterator I = Prev.begin(), E = Prev.end(); I != E; ++I) {\n    // ...\n    Diag(NameLoc, diag::err_using_decl_redeclaration) << SS.getRange();"}},
		[j]={
			["clang/test/Parser/cxx1z-using-declaration.cpp"]={"clang/test/Parser/cxx1z-using-declaration.cpp:23:12: error: redeclaration of using declaration"}
		}
	},
	["err_using_decl_redeclaration_expansion"]={
		[a]="err_using_decl_redeclaration_expansion",
		[b]="using declaration pack expansion at block scope produces multiple values",
		[c]="using declaration pack expansion at block scope produces multiple values",
		[d]=l,
		[e]="using declaration pack expansion at block scope produces multiple values",
		[f]=k,
		[g]=m,
		[h]={"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"},
		[i]={{Ob,3412,"template <typename T> Decl *TemplateDeclInstantiator::instantiateUnresolvedUsingDecl(T *D, bool InstantiatingPackElement) {\n  // If this is a pack expansion, expand it now.\n  if (D->isPackExpansion() && !InstantiatingPackElement) {\n    // ...\n    // Within a function, we don\'t have any normal way to check for conflicts\n    // between shadow declarations from different using declarations in the\n    // same pack expansion, but this is always ill-formed because all expansions\n    // must produce (conflicting) enumerators.\n    //\n    // Sadly we can\'t just reject this in the template definition because it\n    // could be valid if the pack is empty or has exactly one expansion.\n    if (D->getDeclContext()->isFunctionOrMethod() && *NumExpansions > 1) {\n      SemaRef.Diag(D->getEllipsisLoc(), diag::err_using_decl_redeclaration_expansion);"}},
		[j]={
			["clang/test/SemaTemplate/cxx1z-using-declaration.cpp"]={"clang/test/SemaTemplate/cxx1z-using-declaration.cpp:130:14: error: using declaration pack expansion at block scope produces multiple values","clang/test/SemaTemplate/cxx1z-using-declaration.cpp:130:14: error: using declaration pack expansion at block scope produces multiple values"}
		}
	},
	["err_using_decl_template_id"]={
		[a]="err_using_decl_template_id",
		[b]="using declaration cannot refer to a template specialization",
		[c]="using declaration cannot refer to a template specialization",
		[d]=l,
		[e]="using declaration cannot refer to a template specialization",
		[f]=k,
		[g]=m,
		[h]={"220f4277bd2a",1257352206,"Switch parsing of using declarations over to ParseUnqualifiedId.","Switch parsing of using declarations over to ParseUnqualifiedId.\n\nllvm-svn: 86027"},
		[i]={{r,12052,"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_TemplateId:\n    Diag(Name.getBeginLoc(), diag::err_using_decl_template_id) << SourceRange(Name.TemplateId->LAngleLoc, Name.TemplateId->RAngleLoc);"}},
		[j]={
			["clang/test/Parser/cxx-using-declaration.cpp"]={"clang/test/Parser/cxx-using-declaration.cpp:36:10: error: using declaration cannot refer to a template specialization"}
		}
	},
	["err_using_dependent_value_is_type"]={
		[a]="err_using_dependent_value_is_type",
		[b]="dependent using declaration resolved to type without \'typename\'",
		[c]="dependent using declaration resolved to type without \'typename\'",
		[d]=l,
		[e]="dependent using declaration resolved to type without \'typename\'",
		[f]=k,
		[g]=m,
		[h]={"e61f2ba7e44a",1258511779,"Incremental progress on using declarations.  Split UnresolvedUsingDecl into","Incremental progress on using declarations.  Split UnresolvedUsingDecl into\ntwo classes, one for typenames and one for values;  this seems to have some\nsupport from Doug if not necessarily from the extremely-vague-on-this-point\nstandard.  Track the location of the \'typename\' keyword in a using-typename\ndecl.  Make a new lookup result for unresolved values and deal with it in\nmost places.\n\nllvm-svn: 89184"},
		[i]={{r,12786,"/// Builds a using declaration.\n///\n/// \\param IsInstantiation - Whether this call arises from an\n///   instantiation of an unresolved using declaration.  We treat\n///   the lookup differently for these declarations.\nNamedDecl *Sema::BuildUsingDeclaration(Scope *S, AccessSpecifier AS, SourceLocation UsingLoc, bool HasTypenameKeyword, SourceLocation TypenameLoc, CXXScopeSpec &SS, DeclarationNameInfo NameInfo, SourceLocation EllipsisLoc, const ParsedAttributesView &AttrList, bool IsInstantiation, bool IsUsingIfExists) {\n  // ...\n  if (HasTypenameKeyword) {\n  // ...\n  } else {\n    // If we asked for a non-typename and we got a type, error out,\n    // but only if this is an instantiation of an unresolved using\n    // decl.  Otherwise just silently find the type name.\n    if (IsInstantiation && R.getAsSingle<TypeDecl>()) {\n      Diag(IdentLoc, diag::err_using_dependent_value_is_type);"}},
		[j]={
			["clang/test/SemaCXX/using-decl-templates.cpp"]={"clang/test/SemaCXX/using-decl-templates.cpp:10:15: error: dependent using declaration resolved to type without \'typename\'"}
		}
	},
	["err_using_directive_member_suggest"]={
		[a]="err_using_directive_member_suggest",
		[b]="no namespace named %0 in %1; did you mean %select{|simply }2%3?",
		[c]={{nil,nil,{"no namespace named A in B; did you mean ",{k,"simply "},"D?"}}},
		[d]=l,
		[e]="no namespace named (.*?) in (.*?); did you mean (?:|simply )(.*?)\\?",
		[f]=k,
		[g]=m,
		[h]={"cdf87024edb7",1277834026,"Allow a using directive to refer to the implicitly-defined namespace","Allow a using directive to refer to the implicitly-defined namespace\n\"std\", with a warning, to improve GCC compatibility. Fixes PR7517.\n\nAs a drive-by, add typo correction for using directives.\n\nllvm-svn: 107172"},
		[i]={{r,11903,"static bool TryNamespaceTypoCorrection(Sema &S, LookupResult &R, Scope *Sc, CXXScopeSpec &SS, SourceLocation IdentLoc, IdentifierInfo *Ident) {\n  // ...\n  if (TypoCorrection Corrected = S.CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), Sc, &SS, CCC, Sema::CTK_ErrorRecovery)) {\n    if (DeclContext *DC = S.computeDeclContext(SS, false)) {\n      // ...\n      S.diagnoseTypo(Corrected, S.PDiag(diag::err_using_directive_member_suggest) << Ident << DC << DroppedSpecifier << SS.getRange(), S.PDiag(diag::note_namespace_defined_here));"},{"clang/unittests/Sema/ExternalSemaSourceTest.cpp",60,"/// Counts the number of typo-correcting diagnostics correcting from one name to\n/// another while still passing all diagnostics along a chain of consumers.\nclass DiagnosticWatcher : public clang::DiagnosticConsumer {\n  // ...\n  void HandleDiagnostic(DiagnosticsEngine::Level DiagLevel, const Diagnostic &Info) override {\n    // ...\n    if (Info.getID() - 1 == diag::err_using_directive_member_suggest) {"}},
		[j]={
			["clang/test/Parser/cxx-using-directive.cpp"]={"clang/test/Parser/cxx-using-directive.cpp:23:19: error: no namespace named \'A\' in namespace \'D::B\'; did you mean \'::B::A\'?","clang/test/Parser/cxx-using-directive.cpp:26:19: error: no namespace named \'C\' in namespace \'D\'; did you mean simply \'C\'?","clang/test/Parser/cxx-using-directive.cpp:31:17: error: no namespace named \'A\' in the global namespace; did you mean \'B::A\'?"}
		}
	},
	["err_using_directive_suggest"]={
		[a]="err_using_directive_suggest",
		[b]="no namespace named %0; did you mean %1?",
		[c]="no namespace named A; did you mean B?",
		[d]=l,
		[e]="no namespace named (.*?); did you mean (.*?)\\?",
		[f]=k,
		[g]=m,
		[h]={"cdf87024edb7",1277834026,"Allow a using directive to refer to the implicitly-defined namespace","Allow a using directive to refer to the implicitly-defined namespace\n\"std\", with a warning, to improve GCC compatibility. Fixes PR7517.\n\nAs a drive-by, add typo correction for using directives.\n\nllvm-svn: 107172"},
		[i]={{r,11908,"static bool TryNamespaceTypoCorrection(Sema &S, LookupResult &R, Scope *Sc, CXXScopeSpec &SS, SourceLocation IdentLoc, IdentifierInfo *Ident) {\n  // ...\n  if (TypoCorrection Corrected = S.CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), Sc, &SS, CCC, Sema::CTK_ErrorRecovery)) {\n    if (DeclContext *DC = S.computeDeclContext(SS, false)) {\n    // ...\n    } else {\n      S.diagnoseTypo(Corrected, S.PDiag(diag::err_using_directive_suggest) << Ident, S.PDiag(diag::note_namespace_defined_here));"}},
		[j]={
			["clang/test/Parser/cxx-using-directive.cpp"]={"clang/test/Parser/cxx-using-directive.cpp:30:17: error: no namespace named \'A\'; did you mean \'B::A\'?"}
		}
	},
	["err_using_enum_decl_redeclaration"]={
		[a]={{nil,x,"err_using_enum_decl_redeclaration"}},
		[b]={{nil,x,"redeclaration of using-enum declaration"}},
		[c]={{nil,x,"redeclaration of using-enum declaration"}},
		[d]=l,
		[e]="redeclaration of using\\-enum declaration",
		[f]=k,
		[g]={{nil,x,m}},
		[h]={"3dbcea8b957a",1615397021,"Reland [clang] Check unsupported types in expressions","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"},
		[i]={{r,12840,"NamedDecl *Sema::BuildUsingEnumDeclaration(Scope *S, AccessSpecifier AS, SourceLocation UsingLoc, SourceLocation EnumLoc, SourceLocation NameLoc, TypeSourceInfo *EnumType, EnumDecl *ED) {\n  // ...\n  if (CurContext->getRedeclContext()->isRecord()) {\n    // ...\n    for (NamedDecl *D : Previous)\n      if (UsingEnumDecl *UED = dyn_cast<UsingEnumDecl>(D))\n        if (UED->getEnumDecl() == ED) {\n          Diag(UsingLoc, diag::err_using_enum_decl_redeclaration) << SourceRange(EnumLoc, NameLoc);"}},
		[j]={
			["clang/test/SemaCXX/cxx20-using-enum.cpp"]={"clang/test/SemaCXX/cxx20-using-enum.cpp:230:3: error: redeclaration of using-enum declaration","clang/test/SemaCXX/cxx20-using-enum.cpp:236:3: error: redeclaration of using-enum declaration"}
		}
	},
	["err_using_enum_expect_identifier"]={
		[a]={{nil,B,"err_using_enum_expect_identifier"}},
		[b]={{nil,B,"using enum %select{requires an enum or typedef name|does not permit an elaborated enum specifier}0"}},
		[c]={{nil,B,{"using enum ",{"requires an enum or typedef name","does not permit an elaborated enum specifier"}}}},
		[d]=l,
		[e]="using enum (?:requires an enum or typedef name|does not permit an elaborated enum specifier)",
		[f]=k,
		[g]={{nil,B,s}},
		[h]={"3d2080683f1d",1663177354,"[clang][DR2621] using enum NAME lookup fix","[clang][DR2621] using enum NAME lookup fix\n\nAlthough using-enum\'s grammar is \'using elaborated-enum-specifier\',\nthe lookup for the enum is ordinary lookup (and not the tagged-type\nlookup that normally occurs wth an tagged-type specifier).  Thus (a)\nwe can find typedefs and (b) do not find enum tags hidden by a non-tag\nname (the struct stat thing).\n\nThis reimplements that part of using-enum handling, to address DR2621,\nwhere clang\'s behaviour does not match std intent (and other\ncompilers).\n\nReviewed By: aaron.ballman\n\nDifferential Revision: https://reviews.llvm.org/D134283"},
		[i]={{Y,733,"/// 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    if (!Tok.is(tok::identifier)) {\n      Diag(Tok.getLocation(), diag::err_using_enum_expect_identifier) << Tok.is(tok::kw_enum);"}},
		[j]={
			["clang/test/Parser/cxx20-using-enum.cpp"]={"clang/test/Parser/cxx20-using-enum.cpp:7:17: error: using enum requires an enum or typedef name","clang/test/Parser/cxx20-using-enum.cpp:8:13: error: using enum requires an enum or typedef name","clang/test/Parser/cxx20-using-enum.cpp:9:14: error: using enum requires an enum or typedef name","clang/test/Parser/cxx20-using-enum.cpp:10:14: error: using enum does not permit an elaborated enum specifier"}
		}
	},
	["err_using_enum_is_dependent"]={
		[a]={{nil,x,"err_using_enum_is_dependent"}},
		[b]={{nil,x,"using-enum cannot name a dependent type"}},
		[c]={{nil,x,"using-enum cannot name a dependent type"}},
		[d]=l,
		[e]="using\\-enum cannot name a dependent type",
		[f]=k,
		[g]={{nil,x,m}},
		[h]={"3dbcea8b957a",1615397021,"Reland [clang] Check unsupported types in expressions","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"},
		[i]={{r,12112,"Decl *Sema::ActOnUsingEnumDeclaration(Scope *S, AccessSpecifier AS, SourceLocation UsingLoc, SourceLocation EnumLoc, SourceLocation IdentLoc, IdentifierInfo &II, CXXScopeSpec *SS) {\n  // ...\n  if (EnumTy.isNull()) {\n    Diag(IdentLoc, SS && isDependentScopeSpecifier(*SS) ? diag::err_using_enum_is_dependent : diag::err_unknown_typename) << II.getName() << SourceRange(SS ? SS->getBeginLoc() : IdentLoc, IdentLoc);"}},
		[j]={
			["clang/test/SemaCXX/cxx20-using-enum.cpp"]={"clang/test/SemaCXX/cxx20-using-enum.cpp:116:22: error: using-enum cannot name a dependent type"}
		}
	},
	["err_using_enum_not_enum"]={
		[a]={{nil,B,"err_using_enum_not_enum"}},
		[b]={{nil,B,"%0 is not an enumerated type"}},
		[c]={{nil,B,"A is not an enumerated type"}},
		[d]=l,
		[e]="(.*?) is not an enumerated type",
		[f]=k,
		[g]={{nil,B,m}},
		[h]={F,1625925174,G,H},
		[i]={{r,12121,"Decl *Sema::ActOnUsingEnumDeclaration(Scope *S, AccessSpecifier AS, SourceLocation UsingLoc, SourceLocation EnumLoc, SourceLocation IdentLoc, IdentifierInfo &II, CXXScopeSpec *SS) {\n  // ...\n  if (!Enum) {\n    Diag(IdentLoc, diag::err_using_enum_not_enum) << EnumTy;"}},
		[j]={
			["clang/test/SemaCXX/cxx20-using-enum.cpp"]={"clang/test/SemaCXX/cxx20-using-enum.cpp:27:17: error: \'Bob::C\' is not an enumerated type"}
		}
	},
	["err_using_if_exists_on_ctor"]={
		[a]={{nil,x,"err_using_if_exists_on_ctor"}},
		[b]={{nil,x,"\'using_if_exists\' attribute cannot be applied to an inheriting constructor"}},
		[c]={{nil,x,"\'using_if_exists\' attribute cannot be applied to an inheriting constructor"}},
		[d]=l,
		[e]="\'using_if_exists\' attribute cannot be applied to an inheriting constructor",
		[f]=k,
		[g]={{nil,x,m}},
		[h]={"3dbcea8b957a",1615397021,"Reland [clang] Check unsupported types in expressions","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"},
		[i]={{r,12625,"/// Builds a using declaration.\n///\n/// \\param IsInstantiation - Whether this call arises from an\n///   instantiation of an unresolved using declaration.  We treat\n///   the lookup differently for these declarations.\nNamedDecl *Sema::BuildUsingDeclaration(Scope *S, AccessSpecifier AS, SourceLocation UsingLoc, bool HasTypenameKeyword, SourceLocation TypenameLoc, CXXScopeSpec &SS, DeclarationNameInfo NameInfo, SourceLocation EllipsisLoc, const ParsedAttributesView &AttrList, bool IsInstantiation, bool IsUsingIfExists) {\n  // ...\n  // \'using_if_exists\' doesn\'t make sense on an inherited constructor.\n  if (IsUsingIfExists && UsingName.getName().getNameKind() == DeclarationName::CXXConstructorName) {\n    Diag(UsingLoc, diag::err_using_if_exists_on_ctor);"}},
		[j]={
			["clang/test/SemaCXX/using-if-exists.cpp"]={"clang/test/SemaCXX/using-if-exists.cpp:66:3: error: \'using_if_exists\' attribute cannot be applied to an inheriting constructor"}
		}
	},
	["err_using_namespace_in_class"]={
		[a]="err_using_namespace_in_class",
		[b]="\'using namespace\' is not allowed in classes",
		[c]="\'using namespace\' is not allowed in classes",
		[d]=l,
		[e]="\'using namespace\' is not allowed in classes",
		[f]=k,
		[g]=s,
		[h]={"fec52635f0d5",1245459114,"Parsing and AST support for using declarations, from John Thompson!","Parsing and AST support for using declarations, from John Thompson!\n\nllvm-svn: 73812"},
		[i]={{Y,2802,"/// 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  if (Tok.is(tok::kw_using)) {\n    // ...\n    if (Tok.is(tok::kw_namespace)) {\n      Diag(UsingLoc, diag::err_using_namespace_in_class);"}},
		[j]={
			["clang/test/SemaCXX/using-directive.cpp"]={"clang/test/SemaCXX/using-directive.cpp:63:3: error: \'using namespace\' is not allowed in classes"}
		}
	},
	["err_using_pack_expansion_empty"]={
		[a]="err_using_pack_expansion_empty",
		[b]="%select{|member}0 using declaration %1 instantiates to an empty pack",
		[c]={{nil,nil,{{k,"member"}," using declaration B instantiates to an empty pack"}}},
		[d]=l,
		[e]="(?:|member) using declaration (.*?) instantiates to an empty pack",
		[f]=k,
		[g]=m,
		[h]={"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"},
		[j]={
			["clang/test/SemaTemplate/cxx1z-using-declaration.cpp"]={"clang/test/SemaTemplate/cxx1z-using-declaration.cpp:164:23: error: member using declaration \'f\' instantiates to an empty pack","clang/test/SemaTemplate/cxx1z-using-declaration.cpp:165:18: error: member using declaration \'type\' instantiates to an empty pack","clang/test/SemaTemplate/cxx1z-using-declaration.cpp:26:26: error: member using declaration \'h\' instantiates to an empty pack","clang/test/SemaTemplate/cxx1z-using-declaration.cpp:108:14: error: member using declaration \'type\' instantiates to an empty pack","clang/test/SemaTemplate/cxx1z-using-declaration.cpp:132:10: error:  using declaration \'e\' instantiates to an empty pack"}
		}
	},
	["err_using_requires_qualname"]={
		[a]="err_using_requires_qualname",
		[b]="using declaration requires a qualified name",
		[c]="using declaration requires a qualified name",
		[d]=l,
		[e]="using declaration requires a qualified name",
		[f]=k,
		[g]=m,
		[h]={"fec52635f0d5",1245459114,"Parsing and AST support for using declarations, from John Thompson!","Parsing and AST support for using declarations, from John Thompson!\n\nllvm-svn: 73812"},
		[i]={{r,12022,"Decl *Sema::ActOnUsingDeclaration(Scope *S, AccessSpecifier AS, SourceLocation UsingLoc, SourceLocation TypenameLoc, CXXScopeSpec &SS, UnqualifiedId &Name, SourceLocation EllipsisLoc, const ParsedAttributesView &AttrList) {\n  // ...\n  if (SS.isEmpty()) {\n    Diag(Name.getBeginLoc(), diag::err_using_requires_qualname);"}},
		[j]={
			["clang/test/SemaCXX/using-decl-1.cpp"]={"clang/test/SemaCXX/using-decl-1.cpp:405:34: error: using declaration requires a qualified name"}
		}
	},
	["err_using_typename_non_type"]={
		[a]="err_using_typename_non_type",
		[b]="\'typename\' keyword used on a non-type",
		[c]="\'typename\' keyword used on a non-type",
		[d]=l,
		[e]="\'typename\' keyword used on a non\\-type",
		[f]=k,
		[g]=m,
		[h]={"fec52635f0d5",1245459114,"Parsing and AST support for using declarations, from John Thompson!","Parsing and AST support for using declarations, from John Thompson!\n\nllvm-svn: 73812"},
		[i]={{r,12775,"/// Builds a using declaration.\n///\n/// \\param IsInstantiation - Whether this call arises from an\n///   instantiation of an unresolved using declaration.  We treat\n///   the lookup differently for these declarations.\nNamedDecl *Sema::BuildUsingDeclaration(Scope *S, AccessSpecifier AS, SourceLocation UsingLoc, bool HasTypenameKeyword, SourceLocation TypenameLoc, CXXScopeSpec &SS, DeclarationNameInfo NameInfo, SourceLocation EllipsisLoc, const ParsedAttributesView &AttrList, bool IsInstantiation, bool IsUsingIfExists) {\n  // ...\n  if (HasTypenameKeyword) {\n    // If we asked for a typename and got a non-type decl, error out.\n    if (!R.getAsSingle<TypeDecl>() && !R.getAsSingle<UnresolvedUsingIfExistsDecl>()) {\n      Diag(IdentLoc, diag::err_using_typename_non_type);"}},
		[j]={
			["clang/test/CXX/dcl.dcl/basic.namespace/namespace.udecl/p1.cpp"]={"clang/test/CXX/dcl.dcl/basic.namespace/namespace.udecl/p1.cpp:68:23: error: \'typename\' keyword used on a non-type"}
		}
	},
	["err_uuidof_with_multiple_guids"]={
		[a]="err_uuidof_with_multiple_guids",
		[b]="cannot call operator __uuidof on a type with multiple GUIDs",
		[c]="cannot call operator __uuidof on a type with multiple GUIDs",
		[d]=l,
		[e]="cannot call operator __uuidof on a type with multiple GUIDs",
		[f]=k,
		[g]=m,
		[h]={"59c0ec23966a",1378537186,"AST: __uuidof should leak through templated types","AST: __uuidof should leak through templated types\n\nSummary:\n__uuidof on templated types should exmaine if any of its template\nparameters have a uuid declspec.  If exactly one does, then take it.\nOtherwise, issue an appropriate error.\n\nReviewers: rsmith, thakis, rnk\n\nCC: cfe-commits\n\nDifferential Revision: http://llvm-reviews.chandlerc.com/D1419\n\nllvm-svn: 190240"},
		[i]={{R,760,"/// Build a Microsoft __uuidof expression with a type operand.\nExprResult Sema::BuildCXXUuidof(QualType Type, SourceLocation TypeidLoc, TypeSourceInfo *Operand, SourceLocation RParenLoc) {\n  // ...\n  if (!Operand->getType()->isDependentType()) {\n    // ...\n    if (UuidAttrs.size() > 1)\n      return ExprError(Diag(TypeidLoc, diag::err_uuidof_with_multiple_guids));"},{R,782,"/// Build a Microsoft __uuidof expression with an expression operand.\nExprResult Sema::BuildCXXUuidof(QualType Type, SourceLocation TypeidLoc, Expr *E, SourceLocation RParenLoc) {\n  // ...\n  if (!E->getType()->isDependentType()) {\n    if (E->isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNull)) {\n    // ...\n    } else {\n      // ...\n      if (UuidAttrs.size() > 1)\n        return ExprError(Diag(TypeidLoc, diag::err_uuidof_with_multiple_guids));"}},
		[j]={
			["clang/test/Parser/MicrosoftExtensions.cpp"]={"clang/test/Parser/MicrosoftExtensions.cpp:164:26: error: cannot call operator __uuidof on a type with multiple GUIDs","clang/test/Parser/MicrosoftExtensions.cpp:166:26: error: cannot call operator __uuidof on a type with multiple GUIDs"}
		}
	},
	["err_uuidof_without_guid"]={
		[a]="err_uuidof_without_guid",
		[b]="cannot call operator __uuidof on a type with no GUID",
		[c]="cannot call operator __uuidof on a type with no GUID",
		[d]=l,
		[e]="cannot call operator __uuidof on a type with no GUID",
		[f]=k,
		[g]=m,
		[h]={"9dddd40a1caf",1292817063,"Emit an error if operator __uuidof() is called on a type with no associated GUID.","Emit an error if operator __uuidof() is called on a type with no associated GUID.\n\nllvm-svn: 122226"},
		[i]={{R,758,"/// Build a Microsoft __uuidof expression with a type operand.\nExprResult Sema::BuildCXXUuidof(QualType Type, SourceLocation TypeidLoc, TypeSourceInfo *Operand, SourceLocation RParenLoc) {\n  // ...\n  if (!Operand->getType()->isDependentType()) {\n    // ...\n    if (UuidAttrs.empty())\n      return ExprError(Diag(TypeidLoc, diag::err_uuidof_without_guid));"},{R,780,"/// Build a Microsoft __uuidof expression with an expression operand.\nExprResult Sema::BuildCXXUuidof(QualType Type, SourceLocation TypeidLoc, Expr *E, SourceLocation RParenLoc) {\n  // ...\n  if (!E->getType()->isDependentType()) {\n    if (E->isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNull)) {\n    // ...\n    } else {\n      // ...\n      if (UuidAttrs.empty())\n        return ExprError(Diag(TypeidLoc, diag::err_uuidof_without_guid));"}},
		[j]={
			["clang/test/Parser/MicrosoftExtensions.cpp"]={"clang/test/Parser/MicrosoftExtensions.cpp:90:4: error: cannot call operator __uuidof on a type with no GUID","clang/test/Parser/MicrosoftExtensions.cpp:92:4: error: cannot call operator __uuidof on a type with no GUID","clang/test/Parser/MicrosoftExtensions.cpp:94:4: error: cannot call operator __uuidof on a type with no GUID","clang/test/Parser/MicrosoftExtensions.cpp:96:4: error: cannot call operator __uuidof on a type with no GUID","clang/test/Parser/MicrosoftExtensions.cpp:99:4: error: cannot call operator __uuidof on a type with no GUID","clang/test/Parser/MicrosoftExtensions.cpp:101:4: error: cannot call operator __uuidof on a type with no GUID","clang/test/Parser/MicrosoftExtensions.cpp:103:4: error: cannot call operator __uuidof on a type with no GUID","clang/test/Parser/MicrosoftExtensions.cpp:105:4: error: cannot call operator __uuidof on a type with no GUID","clang/test/Parser/MicrosoftExtensions.cpp:108:4: error: cannot call operator __uuidof on a type with no GUID","clang/test/Parser/MicrosoftExtensions.cpp:110:4: error: cannot call operator __uuidof on a type with no GUID","clang/test/Parser/MicrosoftExtensions.cpp:112:4: error: cannot call operator __uuidof on a type with no GUID","clang/test/Parser/MicrosoftExtensions.cpp:115:4: error: cannot call operator __uuidof on a type with no GUID","clang/test/Parser/MicrosoftExtensions.cpp:162:26: error: cannot call operator __uuidof on a type with no GUID"}
		}
	},
	["err_va_arg_in_device"]={
		[a]="err_va_arg_in_device",
		[b]="CUDA device code does not support va_arg",
		[c]="CUDA device code does not support va_arg",
		[d]=l,
		[e]="CUDA device code does not support va_arg",
		[f]=k,
		[g]=m,
		[h]={"6644e366b01e",1453249620,"[CUDA] Bail, rather than crash, on va_arg in device code.","[CUDA] Bail, rather than crash, on va_arg in device code.\n\nReviewers: tra\n\nSubscribers: echristo, jhen, cfe-commits\n\nDifferential Revision: http://reviews.llvm.org/D16331\n\nllvm-svn: 258264"},
		[i]={{v,17165,"ExprResult Sema::BuildVAArgExpr(SourceLocation BuiltinLoc, Expr *E, TypeSourceInfo *TInfo, SourceLocation RPLoc) {\n  // ...\n  // CUDA device code does not support varargs.\n  if (getLangOpts().CUDA && getLangOpts().CUDAIsDevice) {\n    if (const FunctionDecl *F = dyn_cast<FunctionDecl>(CurContext)) {\n      // ...\n      if (T == CFT_Global || T == CFT_Device || T == CFT_HostDevice)\n        return ExprError(Diag(E->getBeginLoc(), diag::err_va_arg_in_device));"},{v,17215,"ExprResult Sema::BuildVAArgExpr(SourceLocation BuiltinLoc, Expr *E, TypeSourceInfo *TInfo, SourceLocation RPLoc) {\n  // ...\n  // NVPTX does not support va_arg expression.\n  if (getLangOpts().OpenMP && getLangOpts().OpenMPIsTargetDevice && Context.getTargetInfo().getTriple().isNVPTX())\n    targetDiag(E->getBeginLoc(), diag::err_va_arg_in_device);"}},
		[j]={
			["clang/test/SemaCUDA/vararg.cu"]={"clang/test/SemaCUDA/vararg.cu:15:10: error: CUDA device code does not support va_arg"}
		}
	},
	["err_va_start_captured_stmt"]={
		[a]={{nil,E,"err_va_start_captured_stmt"}},
		[b]={{nil,E,"\'va_start\' cannot be used in a captured statement"}},
		[c]={{nil,E,"\'va_start\' cannot be used in a captured statement"}},
		[d]=l,
		[e]="\'va_start\' cannot be used in a captured statement",
		[f]=k,
		[g]={{nil,E,m}},
		[h]={"f1deb837eee3",1493927465,"Fix bugs checking va_start in lambdas and erroneous contexts","Fix bugs checking va_start in lambdas and erroneous contexts\n\nSummary:\nFirst, getCurFunction looks through blocks and lambdas, which is wrong.\nInside a lambda, va_start should refer to the lambda call operator\nprototype. This fixes PR32737.\n\nSecond, we shouldn\'t use any of the getCur* methods, because they look\nthrough contexts that we don\'t want to look through (EnumDecl,\nCapturedStmtDecl). We can use CurContext directly as the calling\ncontext.\n\nFinally, this code assumed that CallExprs would never appear outside of\ncode contexts (block, function, obj-c method), which is wrong. Struct\nmember initializers are an easy way to create and parse exprs in a\nnon-code context.\n\nReviewers: rsmith\n\nSubscribers: cfe-commits\n\nDifferential Revision: https://reviews.llvm.org/D32761\n\nllvm-svn: 302188"},
		[i]={{K,8082,"static bool checkVAStartIsInVariadicFunction(Sema &S, Expr *Fn, ParmVarDecl **LastParam = nullptr) {\n  // ...\n  if (auto *Block = dyn_cast<BlockDecl>(Caller)) {\n  // ...\n  } else if (auto *FD = dyn_cast<FunctionDecl>(Caller)) {\n  // ...\n  } else if (auto *MD = dyn_cast<ObjCMethodDecl>(Caller)) {\n  // ...\n  } else if (isa<CapturedDecl>(Caller)) {\n    // ...\n    S.Diag(Fn->getBeginLoc(), diag::err_va_start_captured_stmt);"}},
		[j]={
			["clang/test/OpenMP/varargs.cpp"]={"clang/test/OpenMP/varargs.cpp:9:5: error: \'va_start\' cannot be used in a captured statement"}
		}
	},
	["err_va_start_fixed_function"]={
		[a]={{nil,E,"err_va_start_fixed_function"}},
		[b]={{nil,E,"\'va_start\' used in function with fixed args"}},
		[c]={{nil,E,"\'va_start\' used in function with fixed args"}},
		[d]=l,
		[e]="\'va_start\' used in function with fixed args",
		[f]=k,
		[g]={{nil,E,m}},
		[h]={"f1deb837eee3",1493927465,"Fix bugs checking va_start in lambdas and erroneous contexts","Fix bugs checking va_start in lambdas and erroneous contexts\n\nSummary:\nFirst, getCurFunction looks through blocks and lambdas, which is wrong.\nInside a lambda, va_start should refer to the lambda call operator\nprototype. This fixes PR32737.\n\nSecond, we shouldn\'t use any of the getCur* methods, because they look\nthrough contexts that we don\'t want to look through (EnumDecl,\nCapturedStmtDecl). We can use CurContext directly as the calling\ncontext.\n\nFinally, this code assumed that CallExprs would never appear outside of\ncode contexts (block, function, obj-c method), which is wrong. Struct\nmember initializers are an easy way to create and parse exprs in a\nnon-code context.\n\nReviewers: rsmith\n\nSubscribers: cfe-commits\n\nDifferential Revision: https://reviews.llvm.org/D32761\n\nllvm-svn: 302188"},
		[i]={{K,8091,"static bool checkVAStartIsInVariadicFunction(Sema &S, Expr *Fn, ParmVarDecl **LastParam = nullptr) {\n  // ...\n  if (!IsVariadic) {\n    S.Diag(Fn->getBeginLoc(), diag::err_va_start_fixed_function);"}},
		[j]={
			["clang/test/Sema/varargs-x86-64.c"]={"clang/test/Sema/varargs-x86-64.c:18:3: error: \'va_start\' used in function with fixed args","clang/test/Sema/varargs-x86-64.c:38:3: error: \'va_start\' used in function with fixed args"}
		}
	},
	["err_va_start_outside_function"]={
		[a]={{nil,E,"err_va_start_outside_function"}},
		[b]={{nil,E,"\'va_start\' cannot be used outside a function"}},
		[c]={{nil,E,"\'va_start\' cannot be used outside a function"}},
		[d]=l,
		[e]="\'va_start\' cannot be used outside a function",
		[f]=k,
		[g]={{nil,E,m}},
		[h]={"f1deb837eee3",1493927465,"Fix bugs checking va_start in lambdas and erroneous contexts","Fix bugs checking va_start in lambdas and erroneous contexts\n\nSummary:\nFirst, getCurFunction looks through blocks and lambdas, which is wrong.\nInside a lambda, va_start should refer to the lambda call operator\nprototype. This fixes PR32737.\n\nSecond, we shouldn\'t use any of the getCur* methods, because they look\nthrough contexts that we don\'t want to look through (EnumDecl,\nCapturedStmtDecl). We can use CurContext directly as the calling\ncontext.\n\nFinally, this code assumed that CallExprs would never appear outside of\ncode contexts (block, function, obj-c method), which is wrong. Struct\nmember initializers are an easy way to create and parse exprs in a\nnon-code context.\n\nReviewers: rsmith\n\nSubscribers: cfe-commits\n\nDifferential Revision: https://reviews.llvm.org/D32761\n\nllvm-svn: 302188"},
		[i]={{K,8086,"static bool checkVAStartIsInVariadicFunction(Sema &S, Expr *Fn, ParmVarDecl **LastParam = nullptr) {\n  // ...\n  if (auto *Block = dyn_cast<BlockDecl>(Caller)) {\n  // ...\n  } else if (auto *FD = dyn_cast<FunctionDecl>(Caller)) {\n  // ...\n  } else if (auto *MD = dyn_cast<ObjCMethodDecl>(Caller)) {\n  // ...\n  } else if (isa<CapturedDecl>(Caller)) {\n  // ...\n  } else {\n    // ...\n    S.Diag(Fn->getBeginLoc(), diag::err_va_start_outside_function);"}},
		[j]={
			["clang/test/SemaCXX/varargs.cpp"]={"clang/test/SemaCXX/varargs.cpp:27:31: error: \'va_start\' cannot be used outside a function","clang/test/SemaCXX/varargs.cpp:86:14: error: \'va_start\' cannot be used outside a function"}
		}
	},
	["err_va_start_used_in_wrong_abi_function"]={
		[a]="err_va_start_used_in_wrong_abi_function",
		[b]="\'va_start\' used in %select{System V|Win64}0 ABI function",
		[c]={{nil,nil,{"\'va_start\' used in ",{"System V","Win64"}," ABI function"}}},
		[d]=l,
		[e]="\'va_start\' used in (?:System V|Win64) ABI function",
		[f]=k,
		[g]=m,
		[h]={"c7d5c94f78c7",1442523333,"Support __builtin_ms_va_list.","Support __builtin_ms_va_list.\n\nSummary:\nThis change adds support for `__builtin_ms_va_list`, a GCC extension for\nvariadic `ms_abi` functions. The existing `__builtin_va_list` support is\ninadequate for this because `va_list` is defined differently in the Win64\nABI vs. the System V/AMD64 ABI.\n\nDepends on D1622.\n\nReviewers: rsmith, rnk, rjmccall\n\nCC: cfe-commits\n\nDifferential Revision: http://reviews.llvm.org/D1623\n\nllvm-svn: 247941"},
		[i]={{K,8052,"/// Check that the user is calling the appropriate va_start builtin for the\n/// target and calling convention.\nstatic bool checkVAStartABI(Sema &S, unsigned BuiltinID, Expr *Fn) {\n  // ...\n  if (IsX64 || IsAArch64) {\n    // ...\n    if (IsMSVAStart) {\n    // ...\n    } else {\n      // On x86-64/AArch64 Unix, don\'t allow this in Win64 ABI functions.\n      // On x64 Windows, don\'t allow this in System V ABI functions.\n      // (Yes, that means there\'s no corresponding way to support variadic\n      // System V ABI functions on Windows.)\n      if ((IsWindows && CC == CC_X86_64SysV) || (!IsWindows && CC == CC_Win64))\n        return S.Diag(Fn->getBeginLoc(), diag::err_va_start_used_in_wrong_abi_function) << !IsWindows;"}},
		[j]={
			["clang/test/Sema/varargs-aarch64.c"]={"clang/test/Sema/varargs-aarch64.c:10:3: error: \'va_start\' used in Win64 ABI function"}
		}
	},
	["err_value_init_for_array_type"]={
		[a]="err_value_init_for_array_type",
		[b]="array types cannot be value-initialized",
		[c]="array types cannot be value-initialized",
		[d]=l,
		[e]="array types cannot be value\\-initialized",
		[f]=k,
		[g]=m,
		[h]={O,1237025389,N,P},
		[i]={{R,1565,"ExprResult Sema::BuildCXXTypeConstructExpr(TypeSourceInfo *TInfo, SourceLocation LParenOrBraceLoc, MultiExprArg Exprs, SourceLocation RParenOrBraceLoc, bool ListInitialization) {\n  // ...\n  if (Ty->isArrayType()) {\n    if (!ListInitialization)\n      return ExprError(Diag(TyBeginLoc, diag::err_value_init_for_array_type) << FullRange);"}},
		[j]={
			["clang/test/CXX/class.derived/class.abstract/p3.cpp"]={"clang/test/CXX/class.derived/class.abstract/p3.cpp:68:3: error: array types cannot be value-initialized"}
		}
	},
	["err_vaopt_paste_at_end"]={
		[a]={{nil,z,"err_vaopt_paste_at_end"}},
		[b]={{nil,z,"\'##\' cannot appear at end of __VA_OPT__ argument"}},
		[c]={{nil,z,"\'##\' cannot appear at end of __VA_OPT__ argument"}},
		[d]=l,
		[e]="\'\\#\\#\' cannot appear at end of __VA_OPT__ argument",
		[f]=k,
		[g]={{nil,z,I}},
		[h]={"1826842865f1",1508030786,"[c++2a] Implement P0306 __VA_OPT__ (Comma omission and comma deletion)","[c++2a] Implement P0306 __VA_OPT__ (Comma omission and comma deletion)\n\nThis patch implements an extension to the preprocessor:\n\n__VA_OPT__(contents) --> which expands into its contents if variadic arguments are supplied to the parent macro, or behaves as an empty token if none.\n\n  - Currently this feature is only enabled for C++2a (this could be enabled, with some careful tweaks, for other dialects with the appropriate extension or compatibility warnings)\n\n  - The patch was reviewed here: https://reviews.llvm.org/D35782 and asides from the above (and moving some of the definition and expansion recognition logic into the corresponding state machines), I believe I incorporated all of Richard\'s suggestions.\n\nA few technicalities (most of which were clarified through private correspondence between rsmith, hubert and thomas) are worth mentioning.  Given:\n\n    #define F(a,...) a #__VA_OPT__(a ## a)  a ## __VA_OPT__(__VA_ARGS__)\n\n    - The call F(,) Does not supply any tokens for the variadic arguments and hence VA_OPT behaves as a placeholder.\n    - When expanding VA_OPT (for e.g. F(,1) token pasting occurs eagerly within its contents if the contents need to be stringified.\n    - A hash or a hashhash prior to VA_OPT does not inhibit expansion of arguments if they are the first token within VA_OPT.\n    - When a variadic argument is supplied, argument substitution occurs within the contents as does stringification - and these resulting tokens are inserted back into the macro expansions token stream just prior to the entire stream being rescanned and concatenated.\n\nSee wg21.link/P0306 for further details on the feature.\n\n\nAcknowledgment: This patch would have been poorer if not for Richard Smith\'s usual thoughtful analysis and feedback.\nllvm-svn: 315840"},
		[i]={{zb,2934,"MacroInfo *Preprocessor::ReadOptionalMacroParameterListAndBody(const Token &MacroNameTok, const bool ImmediatelyAfterHeaderGuard) {\n  // ...\n  // Read the rest of the macro body.\n  if (MI->isObjectLike()) {\n  // ...\n  } else {\n    // ...\n    while (Tok.isNot(tok::eod)) {\n      // ...\n      if (!Tok.isOneOf(tok::hash, tok::hashat, tok::hashhash)) {\n        // ...\n        if (VAOCtx.isVAOptToken(Tok)) {\n        // ...\n        } else if (VAOCtx.isInVAOpt()) {\n          if (Tok.is(tok::r_paren)) {\n            if (VAOCtx.sawClosingParen()) {\n              // ...\n              if (Tokens[Tokens.size() - 2].is(tok::hashhash)) {\n                Diag(Tok, diag::err_vaopt_paste_at_end);"}},
		[j]={
			["clang/test/Preprocessor/macro_vaopt_check.cpp"]={"clang/test/Preprocessor/macro_vaopt_check.cpp:41:36: error: \'##\' cannot appear at end of __VA_OPT__ argument"}
		}
	},
	["err_vaopt_paste_at_start"]={
		[a]={{nil,z,"err_vaopt_paste_at_start"}},
		[b]={{nil,z,"\'##\' cannot appear at start of __VA_OPT__ argument"}},
		[c]={{nil,z,"\'##\' cannot appear at start of __VA_OPT__ argument"}},
		[d]=l,
		[e]="\'\\#\\#\' cannot appear at start of __VA_OPT__ argument",
		[f]=k,
		[g]={{nil,z,I}},
		[h]={"1826842865f1",1508030786,"[c++2a] Implement P0306 __VA_OPT__ (Comma omission and comma deletion)","[c++2a] Implement P0306 __VA_OPT__ (Comma omission and comma deletion)\n\nThis patch implements an extension to the preprocessor:\n\n__VA_OPT__(contents) --> which expands into its contents if variadic arguments are supplied to the parent macro, or behaves as an empty token if none.\n\n  - Currently this feature is only enabled for C++2a (this could be enabled, with some careful tweaks, for other dialects with the appropriate extension or compatibility warnings)\n\n  - The patch was reviewed here: https://reviews.llvm.org/D35782 and asides from the above (and moving some of the definition and expansion recognition logic into the corresponding state machines), I believe I incorporated all of Richard\'s suggestions.\n\nA few technicalities (most of which were clarified through private correspondence between rsmith, hubert and thomas) are worth mentioning.  Given:\n\n    #define F(a,...) a #__VA_OPT__(a ## a)  a ## __VA_OPT__(__VA_ARGS__)\n\n    - The call F(,) Does not supply any tokens for the variadic arguments and hence VA_OPT behaves as a placeholder.\n    - When expanding VA_OPT (for e.g. F(,1) token pasting occurs eagerly within its contents if the contents need to be stringified.\n    - A hash or a hashhash prior to VA_OPT does not inhibit expansion of arguments if they are the first token within VA_OPT.\n    - When a variadic argument is supplied, argument substitution occurs within the contents as does stringification - and these resulting tokens are inserted back into the macro expansions token stream just prior to the entire stream being rescanned and concatenated.\n\nSee wg21.link/P0306 for further details on the feature.\n\n\nAcknowledgment: This patch would have been poorer if not for Richard Smith\'s usual thoughtful analysis and feedback.\nllvm-svn: 315840"},
		[i]={{zb,2923,"MacroInfo *Preprocessor::ReadOptionalMacroParameterListAndBody(const Token &MacroNameTok, const bool ImmediatelyAfterHeaderGuard) {\n  // ...\n  // Read the rest of the macro body.\n  if (MI->isObjectLike()) {\n  // ...\n  } else {\n    // ...\n    while (Tok.isNot(tok::eod)) {\n      // ...\n      if (!Tok.isOneOf(tok::hash, tok::hashat, tok::hashhash)) {\n        // ...\n        if (VAOCtx.isVAOptToken(Tok)) {\n          // ...\n          if (Tok.is(tok::hashhash)) {\n            Diag(Tok, diag::err_vaopt_paste_at_start);"}},
		[j]={
			["clang/test/Preprocessor/macro_vaopt_check.cpp"]={"clang/test/Preprocessor/macro_vaopt_check.cpp:33:30: error: \'##\' cannot appear at start of __VA_OPT__ argument","clang/test/Preprocessor/macro_vaopt_check.cpp:37:30: error: \'##\' cannot appear at start of __VA_OPT__ argument","clang/test/Preprocessor/macro_vaopt_check.cpp:52:30: error: \'##\' cannot appear at start of __VA_OPT__ argument","clang/test/Preprocessor/macro_vaopt_check.cpp:56:51: error: \'##\' cannot appear at start of __VA_OPT__ argument"}
		}
	},
	["err_var_partial_spec_redeclared"]={
		[a]="err_var_partial_spec_redeclared",
		[b]="variable template partial specialization %0 cannot be redefined",
		[c]="variable template partial specialization A cannot be redefined",
		[d]=l,
		[e]="variable template partial specialization (.*?) cannot be redefined",
		[f]=k,
		[g]=m,
		[h]={"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"},
		[i]={{Ob,4367,"/// Instantiate the declaration of a variable template partial\n/// specialization.\n///\n/// \\param VarTemplate the (instantiated) variable template that is partially\n/// specialized by the instantiation of \\p PartialSpec.\n///\n/// \\param PartialSpec the (uninstantiated) variable template partial\n/// specialization that we are instantiating.\n///\n/// \\returns The instantiated partial specialization, if successful; otherwise,\n/// NULL to indicate an error.\nVarTemplatePartialSpecializationDecl *TemplateDeclInstantiator::InstantiateVarTemplatePartialSpecialization(VarTemplateDecl *VarTemplate, VarTemplatePartialSpecializationDecl *PartialSpec) {\n  // ...\n  if (PrevDecl) {\n    // ...\n    SemaRef.Diag(PartialSpec->getLocation(), diag::err_var_partial_spec_redeclared) << WrittenTy->getType();"}}
	},
	["err_var_spec_no_template"]={
		[a]="err_var_spec_no_template",
		[b]="no variable template matches%select{| partial}0 specialization",
		[c]={{nil,nil,{"no variable template matches",{k," partial"}," specialization"}}},
		[d]=l,
		[e]="no variable template matches(?:| partial) specialization",
		[f]=k,
		[g]=m,
		[h]={"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"},
		[i]={{Z,4544,"DeclResult Sema::ActOnVarTemplateSpecialization(Scope *S, Declarator &D, TypeSourceInfo *DI, SourceLocation TemplateKWLoc, TemplateParameterList *TemplateParams, StorageClass SC, bool IsPartialSpecialization) {\n  // ...\n  if (!VarTemplate) {\n    // ...\n    return Diag(D.getIdentifierLoc(), diag::err_var_spec_no_template) << IsPartialSpecialization;"}},
		[j]={
			["clang/test/CXX/temp/temp.spec/temp.expl.spec/p17.cpp"]={"clang/test/CXX/temp/temp.spec/temp.expl.spec/p17.cpp:42:14: error: no variable template matches specialization"}
		}
	},
	["err_var_spec_no_template_but_method"]={
		[a]="err_var_spec_no_template_but_method",
		[b]="no variable template matches specialization; did you mean to use %0 as function template instead?",
		[c]="no variable template matches specialization; did you mean to use A as function template instead?",
		[d]=l,
		[e]="no variable template matches specialization; did you mean to use (.*?) as function template instead\\?",
		[f]=k,
		[g]=m,
		[h]={"967c13d3fbfa",1399554980,"Fix PR19169 [Crash on invalid attempting to specialize a template method as a template variable].","Fix PR19169 [Crash on invalid attempting to specialize a template method as a template variable].\nA template declaration of a template name can be null in case we have a dependent name or a set of function templates.\nHence use dyn_cast_or_null instead of dyn_cast. Also improve the diagnostic emitted in this case.\n\nllvm-svn: 208313"},
		[i]={{Z,4542,"DeclResult Sema::ActOnVarTemplateSpecialization(Scope *S, Declarator &D, TypeSourceInfo *DI, SourceLocation TemplateKWLoc, TemplateParameterList *TemplateParams, StorageClass SC, bool IsPartialSpecialization) {\n  // ...\n  if (!VarTemplate) {\n    // ...\n    if (FnTemplate)\n      return Diag(D.getIdentifierLoc(), diag::err_var_spec_no_template_but_method) << FnTemplate->getDeclName();"}},
		[j]={
			["clang/test/SemaCXX/cxx1y-variable-templates_top_level.cpp"]={"clang/test/SemaCXX/cxx1y-variable-templates_top_level.cpp:453:18: error: no variable template matches specialization; did you mean to use \'f\' as function template instead?","clang/test/SemaCXX/cxx1y-variable-templates_top_level.cpp:456:18: error: no variable template matches specialization; did you mean to use \'g\' as function template instead?"}
		}
	},
	["err_variable_instantiates_to_function"]={
		[a]="err_variable_instantiates_to_function",
		[b]="%select{variable|static data member}0 instantiated with function type %1",
		[c]={{nil,nil,{{"variable","static data member"}," instantiated with function type B"}}},
		[d]=l,
		[e]="(?:variable|static data member) instantiated with function type (.*?)",
		[f]=k,
		[g]=m,
		[h]={"6162334ce0f1",1284277044,"Diagnose the instantiation of variables (including static data","Diagnose the instantiation of variables (including static data\nmembers) with function type. Fixes PR8047.\n\nllvm-svn: 113723"},
		[i]={{Ob,1139,"Decl *TemplateDeclInstantiator::VisitVarDecl(VarDecl *D, bool InstantiatingVarTemplate, ArrayRef<BindingDecl *> *Bindings) {\n  // ...\n  if (DI->getType()->isFunctionType()) {\n    SemaRef.Diag(D->getLocation(), diag::err_variable_instantiates_to_function) << D->isStaticDataMember() << DI->getType();"},{Ob,3963,"Decl *TemplateDeclInstantiator::VisitVarTemplateSpecializationDecl(VarTemplateDecl *VarTemplate, VarDecl *D, const TemplateArgumentListInfo &TemplateArgsInfo, ArrayRef<TemplateArgument> Converted, VarTemplateSpecializationDecl *PrevDecl) {\n  // ...\n  if (DI->getType()->isFunctionType()) {\n    SemaRef.Diag(D->getLocation(), diag::err_variable_instantiates_to_function) << D->isStaticDataMember() << DI->getType();"},{Ob,4383,"/// Instantiate the declaration of a variable template partial\n/// specialization.\n///\n/// \\param VarTemplate the (instantiated) variable template that is partially\n/// specialized by the instantiation of \\p PartialSpec.\n///\n/// \\param PartialSpec the (uninstantiated) variable template partial\n/// specialization that we are instantiating.\n///\n/// \\returns The instantiated partial specialization, if successful; otherwise,\n/// NULL to indicate an error.\nVarTemplatePartialSpecializationDecl *TemplateDeclInstantiator::InstantiateVarTemplatePartialSpecialization(VarTemplateDecl *VarTemplate, VarTemplatePartialSpecializationDecl *PartialSpec) {\n  // ...\n  if (DI->getType()->isFunctionType()) {\n    SemaRef.Diag(PartialSpec->getLocation(), diag::err_variable_instantiates_to_function) << PartialSpec->isStaticDataMember() << DI->getType();"}},
		[j]={
			["clang/test/CXX/temp/temp.arg/temp.arg.type/p2.cpp"]={"clang/test/CXX/temp/temp.arg/temp.arg.type/p2.cpp:6:12: error: static data member instantiated with function type \'int ()\'","clang/test/CXX/temp/temp.arg/temp.arg.type/p2.cpp:12:11: error: variable instantiated with function type \'int ()\'"}
		}
	},
	["err_variable_object_no_init"]={
		[a]="err_variable_object_no_init",
		[b]="variable-sized object may not be initialized",
		[c]="variable-sized object may not be initialized",
		[d]=l,
		[e]="variable\\-sized object may not be initialized",
		[f]=k,
		[g]=m,
		[h]={O,1237025389,N,P},
		[i]={{v,7679,"ExprResult Sema::BuildCompoundLiteralExpr(SourceLocation LParenLoc, TypeSourceInfo *TInfo, SourceLocation RParenLoc, Expr *LiteralExpr) {\n  // ...\n  if (literalType->isArrayType()) {\n    // ...\n    if (literalType->isVariableArrayType()) {\n      // ...\n      if ((LangOpts.CPlusPlus || NumInits.value_or(0)) && !tryToFixVariablyModifiedVarType(TInfo, literalType, LParenLoc, diag::err_variable_object_no_init))"},{nb,1996,"void InitListChecker::CheckArrayType(const InitializedEntity &Entity, InitListExpr *IList, QualType &DeclType, llvm::APSInt elementIndex, bool SubobjectIsDesignatorContext, unsigned &Index, InitListExpr *StructuredList, unsigned &StructuredIndex) {\n  // ...\n  if (const VariableArrayType *VAT = dyn_cast<VariableArrayType>(arrayType)) {\n    // ...\n    if (!VerifyOnly) {\n      // C2x 6.7.9p4: An entity of variable length array type shall not be\n      // initialized except by an empty initializer.\n      //\n      // The C extension warnings are issued from ParseBraceInitializer() and\n      // do not need to be issued here. However, we continue to issue an error\n      // in the case there are initializers or we are compiling C++. We allow\n      // use of VLAs in C++, but it\'s not clear we want to allow {} to zero\n      // init a VLA in C++ in all cases (such as with non-trivial constructors).\n      // FIXME: should we allow this construct in C++ when it makes sense to do\n      // so?\n      if (HasErr)\n        SemaRef.Diag(VAT->getSizeExpr()->getBeginLoc(), diag::err_variable_object_no_init) << VAT->getSizeExpr()->getSourceRange();"},{nb,5480,"static void TryOrBuildParenListInitialization(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, ArrayRef<Expr *> Args, InitializationSequence &Sequence, bool VerifyOnly, ExprResult *Result = nullptr) {\n  // ...\n  if (const ArrayType *AT = S.getASTContext().getAsArrayType(Entity.getType())) {\n    // ...\n    // C++ [dcl.init]p16.5\n    //   if the destination type is an array, the object is initialized as\n    //   follows. Let x1, . . . , xk be the elements of the expression-list. If\n    //   the destination type is an array of unknown bound, it is defined as\n    //   having k elements.\n    if (const ConstantArrayType *CAT = S.getASTContext().getAsConstantArrayType(Entity.getType())) {\n    // ...\n    } else if (const VariableArrayType *VAT = S.getASTContext().getAsVariableArrayType(Entity.getType())) {\n      // ...\n      S.Diag(SE->getBeginLoc(), diag::err_variable_object_no_init) << SE->getSourceRange();"},{nb,9619,"bool InitializationSequence::Diagnose(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, ArrayRef<Expr *> Args) {\n  // ...\n  case FK_VariableLengthArrayHasInitializer:\n    S.Diag(Kind.getLocation(), diag::err_variable_object_no_init) << Args[0]->getSourceRange();"}},
		[j]={
			[Ab]={"clang/test/Sema/vla.c:56:26: error: variable-sized object may not be initialized"}
		}
	},
	["err_variably_modified_new_type"]={
		[a]="err_variably_modified_new_type",
		[b]="\'new\' cannot allocate object of variably modified type %0",
		[c]="\'new\' cannot allocate object of variably modified type A",
		[d]=l,
		[e]="\'new\' cannot allocate object of variably modified type (.*?)",
		[f]=k,
		[g]=m,
		[h]={"3999e15d93d4",1286380831,"Reject the allocation of variably-modified types in C++ \'new\'","Reject the allocation of variably-modified types in C++ \'new\'\nexpressions. Fixes PR8209 in the narrowest way possible. I\'m still\nconsidering whether I want to implement the extension that permits the\nuse of VLA types in a \'new\' expression.\n\nllvm-svn: 115790"},
		[i]={{R,2471,"/// Checks that a type is suitable as the allocated type\n/// in a new-expression.\nbool Sema::CheckAllocatedType(QualType AllocType, SourceLocation Loc, SourceRange R) {\n  // C++ 5.3.4p1: \"[The] type shall be a complete object type, but not an\n  //   abstract class type or array thereof.\n  if (AllocType->isFunctionType())\n  // ...\n  else if (AllocType->isReferenceType())\n  // ...\n  else if (!AllocType->isDependentType() && RequireCompleteSizedType(Loc, AllocType, diag::err_new_incomplete_or_sizeless_type, R))\n  // ...\n  else if (RequireNonAbstractType(Loc, AllocType, diag::err_allocation_of_abstract_type))\n  // ...\n  else if (AllocType->isVariablyModifiedType())\n    return Diag(Loc, diag::err_variably_modified_new_type) << AllocType;"}},
		[j]={
			["clang/test/SemaCXX/new-delete-0x.cpp"]={"clang/test/SemaCXX/new-delete-0x.cpp:24:17: error: \'new\' cannot allocate object of variably modified type \'int (*)[[] {"}
		}
	},
	["err_variably_modified_nontype_template_param"]={
		[a]="err_variably_modified_nontype_template_param",
		[b]="non-type template parameter of variably modified type %0",
		[c]="non-type template parameter of variably modified type A",
		[d]=l,
		[e]="non\\-type template parameter of variably modified type (.*?)",
		[f]=k,
		[g]=m,
		[h]={"959d5a0cbd78",1274545050,"Implement support for variable length arrays in C++. VLAs are limited","Implement support for variable length arrays in C++. VLAs are limited\nin several important ways:\n\n  - VLAs of non-POD types are not permitted.\n  - VLAs cannot be used in conjunction with C++ templates.\n\nThese restrictions are intended to keep VLAs out of the parts of the\nC++ type system where they cause the most trouble. Fixes PR5678 and\n<rdar://problem/8013618>.\n\nllvm-svn: 104443"},
		[i]={{Z,1431,"QualType Sema::CheckNonTypeTemplateParameterType(QualType T, SourceLocation Loc) {\n  // We don\'t allow variably-modified types as the type of non-type template\n  // parameters.\n  if (T->isVariablyModifiedType()) {\n    Diag(Loc, diag::err_variably_modified_nontype_template_param) << T;"}},
		[j]={
			["clang/test/SemaCXX/c99-variable-length-array.cpp"]={"clang/test/SemaCXX/c99-variable-length-array.cpp:60:18: error: non-type template parameter of variably modified type \'int (&)[HasNonConstantValue::value]\'"}
		}
	},
	["err_variably_modified_template_arg"]={
		[a]="err_variably_modified_template_arg",
		[b]="variably modified type %0 cannot be used as a template argument",
		[c]="variably modified type A cannot be used as a template argument",
		[d]=l,
		[e]="variably modified type (.*?) cannot be used as a template argument",
		[f]=k,
		[g]=m,
		[h]={"959d5a0cbd78",1274545050,"Implement support for variable length arrays in C++. VLAs are limited","Implement support for variable length arrays in C++. VLAs are limited\nin several important ways:\n\n  - VLAs of non-POD types are not permitted.\n  - VLAs cannot be used in conjunction with C++ templates.\n\nThese restrictions are intended to keep VLAs out of the parts of the\nC++ type system where they cause the most trouble. Fixes PR5678 and\n<rdar://problem/8013618>.\n\nllvm-svn: 104443"},
		[i]={{Z,6509,"/// Check a template argument against its corresponding\n/// template type parameter.\n///\n/// This routine implements the semantics of C++ [temp.arg.type]. It\n/// returns true if an error occurred, and false otherwise.\nbool Sema::CheckTemplateArgument(TypeSourceInfo *ArgInfo) {\n  // ...\n  if (CanonArg->isVariablyModifiedType()) {\n    return Diag(SR.getBegin(), diag::err_variably_modified_template_arg) << Arg;"}},
		[j]={
			["clang/test/SemaCXX/c99-variable-length-array.cpp"]={"clang/test/SemaCXX/c99-variable-length-array.cpp:55:6: error: variably modified type \'typeof (array)\' (aka \'int[N]\') cannot be used as a template argument"}
		}
	},
	["err_variably_modified_typeid"]={
		[a]="err_variably_modified_typeid",
		[b]="\'typeid\' of variably modified type %0",
		[c]="\'typeid\' of variably modified type A",
		[d]=l,
		[e]="\'typeid\' of variably modified type (.*?)",
		[f]=k,
		[g]=m,
		[h]={"6f3150a7d262",1416604152,"Sema: Don\'t permit variably modified types in typeid","Sema: Don\'t permit variably modified types in typeid\n\nGCC and ICC both reject this and the \'Runtime-sized arrays with\nautomatic storage duration\' (N3639) paper forbade this as well.\nPreviously, we would crash on our way to mangling.\n\nThis fixes PR21632.\n\nllvm-svn: 222569"},
		[i]={{R,564,"/// Build a C++ typeid expression with a type operand.\nExprResult Sema::BuildCXXTypeId(QualType TypeInfoType, SourceLocation TypeidLoc, TypeSourceInfo *Operand, SourceLocation RParenLoc) {\n  // ...\n  if (T->isVariablyModifiedType())\n    return ExprError(Diag(TypeidLoc, diag::err_variably_modified_typeid) << T);"},{R,634,"/// Build a C++ typeid expression with an expression operand.\nExprResult Sema::BuildCXXTypeId(QualType TypeInfoType, SourceLocation TypeidLoc, Expr *E, SourceLocation RParenLoc) {\n  // ...\n  if (E->getType()->isVariablyModifiedType())\n    return ExprError(Diag(TypeidLoc, diag::err_variably_modified_typeid) << E->getType());"}},
		[j]={
			["clang/test/SemaCXX/typeid.cpp"]={"clang/test/SemaCXX/typeid.cpp:27:3: error: \'typeid\' of variably modified type \'char[i]\'","clang/test/SemaCXX/typeid.cpp:28:3: error: \'typeid\' of variably modified type \'char[i]\'"}
		}
	},
	["err_variadic_device_fn"]={
		[a]="err_variadic_device_fn",
		[b]="CUDA device code does not support variadic functions",
		[c]="CUDA device code does not support variadic functions",
		[d]=l,
		[e]="CUDA device code does not support variadic functions",
		[f]=k,
		[g]=m,
		[h]={"e48cd6c5304d",1453584497,"[CUDA] Disallow variadic functions other than printf in device code.","[CUDA] Disallow variadic functions other than printf in device code.\n\nReviewers: tra\n\nSubscribers: cfe-commits, echristo, jhen\n\nDifferential Revision: http://reviews.llvm.org/D16484\n\nllvm-svn: 258643"},
		[i]={{u,10680,"NamedDecl *Sema::ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamListsRef, bool &AddToScope) {\n  // ...\n  if (getLangOpts().CUDA) {\n    // ...\n    // Variadic functions, other than a *declaration* of printf, are not allowed\n    // in device-side CUDA code, unless someone passed\n    // -fcuda-allow-variadic-functions.\n    if (!getLangOpts().CUDAAllowVariadicFunctions && NewFD->isVariadic() && (NewFD->hasAttr<CUDADeviceAttr>() || NewFD->hasAttr<CUDAGlobalAttr>()) && !(II && II->isStr(\"printf\") && NewFD->isExternC() && !D.isFunctionDefinition())) {\n      Diag(NewFD->getLocation(), diag::err_variadic_device_fn);"}},
		[j]={
			["clang/test/SemaCUDA/vararg.cu"]={"clang/test/SemaCUDA/vararg.cu:33:17: error: CUDA device code does not support variadic functions","clang/test/SemaCUDA/vararg.cu:39:17: error: CUDA device code does not support variadic functions","clang/test/SemaCUDA/vararg.cu:47:27: error: CUDA device code does not support variadic functions","clang/test/SemaCUDA/vararg.cu:53:16: error: CUDA device code does not support variadic functions"}
		}
	},
	["err_vec_builtin_incompatible_vector"]={
		[a]={{nil,E,"err_vec_builtin_incompatible_vector"}},
		[b]={{nil,E,"first two arguments to %0 must have the same type"}},
		[c]={{nil,E,"first two arguments to A must have the same type"}},
		[d]=l,
		[e]="first two arguments to (.*?) must have the same type",
		[f]=k,
		[g]={{nil,E,m}},
		[h]={"edc7849b1bdd",1495637157,"Generalize two diagnostic messages to take function name as parameter.","Generalize two diagnostic messages to take function name as parameter.\n\nllvm-svn: 303753"},
		[i]={{K,8422,"// Customized Sema Checking for VSX builtins that have the following signature:\n// vector [...] builtinName(vector [...], vector [...], const int);\n// Which takes the same type of vectors (any legal vector type) for the first\n// two arguments and takes compile time constant for the third argument.\n// Example builtins are :\n// vector double vec_xxpermdi(vector double, vector double, int);\n// vector short vec_xxsldwi(vector short, vector short, int);\nbool Sema::SemaBuiltinVSX(CallExpr *TheCall) {\n  // ...\n  // Check the first two arguments are the same type.\n  if (!Context.hasSameUnqualifiedType(Arg1Ty, Arg2Ty)) {\n    return Diag(BuiltinLoc, diag::err_vec_builtin_incompatible_vector) << TheCall->getDirectCallee() << SourceRange(TheCall->getArg(0)->getBeginLoc(), TheCall->getArg(1)->getEndLoc());"},{K,8473,"/// SemaBuiltinShuffleVector - Handle __builtin_shufflevector.\n// This is declared to take (...), so we have to check everything.\nExprResult Sema::SemaBuiltinShuffleVector(CallExpr *TheCall) {\n  // ...\n  if (!TheCall->getArg(0)->isTypeDependent() && !TheCall->getArg(1)->isTypeDependent()) {\n    // ...\n    // Check to see if we have a call with 2 vector arguments, the unary shuffle\n    // with mask.  If so, verify that RHS is an integer vector type with the\n    // same number of elts as lhs.\n    if (TheCall->getNumArgs() == 2) {\n      if (!RHSType->hasIntegerRepresentation() || RHSType->castAs<VectorType>()->getNumElements() != numElements)\n        return ExprError(Diag(TheCall->getBeginLoc(), diag::err_vec_builtin_incompatible_vector) << TheCall->getDirectCallee() << SourceRange(TheCall->getArg(1)->getBeginLoc(), TheCall->getArg(1)->getEndLoc()));"},{K,8479,"/// SemaBuiltinShuffleVector - Handle __builtin_shufflevector.\n// This is declared to take (...), so we have to check everything.\nExprResult Sema::SemaBuiltinShuffleVector(CallExpr *TheCall) {\n  // ...\n  if (!TheCall->getArg(0)->isTypeDependent() && !TheCall->getArg(1)->isTypeDependent()) {\n    // ...\n    // Check to see if we have a call with 2 vector arguments, the unary shuffle\n    // with mask.  If so, verify that RHS is an integer vector type with the\n    // same number of elts as lhs.\n    if (TheCall->getNumArgs() == 2) {\n    // ...\n    } else if (!Context.hasSameUnqualifiedType(LHSType, RHSType)) {\n      return ExprError(Diag(TheCall->getBeginLoc(), diag::err_vec_builtin_incompatible_vector) << TheCall->getDirectCallee() << SourceRange(TheCall->getArg(0)->getBeginLoc(), TheCall->getArg(1)->getEndLoc()));"}},
		[j]={
			["clang/test/CodeGen/PowerPC/builtins-ppc-error.c"]={"clang/test/CodeGen/PowerPC/builtins-ppc-error.c:36:3: error: first two arguments to \'__builtin_vsx_xxpermdi\' must have the same type","clang/test/CodeGen/PowerPC/builtins-ppc-error.c:44:3: error: first two arguments to \'__builtin_vsx_xxsldwi\' must have the same type"}
		}
	},
	["err_vec_builtin_non_vector"]={
		[a]={{nil,E,"err_vec_builtin_non_vector"}},
		[b]={{nil,E,"first two arguments to %0 must be vectors"}},
		[c]={{nil,E,"first two arguments to A must be vectors"}},
		[d]=l,
		[e]="first two arguments to (.*?) must be vectors",
		[f]=k,
		[g]={{nil,E,m}},
		[h]={"edc7849b1bdd",1495637157,"Generalize two diagnostic messages to take function name as parameter.","Generalize two diagnostic messages to take function name as parameter.\n\nllvm-svn: 303753"},
		[i]={{K,8414,"// Customized Sema Checking for VSX builtins that have the following signature:\n// vector [...] builtinName(vector [...], vector [...], const int);\n// Which takes the same type of vectors (any legal vector type) for the first\n// two arguments and takes compile time constant for the third argument.\n// Example builtins are :\n// vector double vec_xxpermdi(vector double, vector double, int);\n// vector short vec_xxsldwi(vector short, vector short, int);\nbool Sema::SemaBuiltinVSX(CallExpr *TheCall) {\n  // ...\n  if ((!Arg1Ty->isVectorType() && !Arg1Ty->isDependentType()) || (!Arg2Ty->isVectorType() && !Arg2Ty->isDependentType())) {\n    return Diag(BuiltinLoc, diag::err_vec_builtin_non_vector) << TheCall->getDirectCallee() << SourceRange(TheCall->getArg(0)->getBeginLoc(), TheCall->getArg(1)->getEndLoc());"},{K,8458,"/// SemaBuiltinShuffleVector - Handle __builtin_shufflevector.\n// This is declared to take (...), so we have to check everything.\nExprResult Sema::SemaBuiltinShuffleVector(CallExpr *TheCall) {\n  // ...\n  if (!TheCall->getArg(0)->isTypeDependent() && !TheCall->getArg(1)->isTypeDependent()) {\n    // ...\n    if (!LHSType->isVectorType() || !RHSType->isVectorType())\n      return ExprError(Diag(TheCall->getBeginLoc(), diag::err_vec_builtin_non_vector) << TheCall->getDirectCallee() << SourceRange(TheCall->getArg(0)->getBeginLoc(), TheCall->getArg(1)->getEndLoc()));"}},
		[j]={
			["clang/test/CodeGen/PowerPC/builtins-ppc-error.c"]={"clang/test/CodeGen/PowerPC/builtins-ppc-error.c:35:3: error: first two arguments to \'__builtin_vsx_xxpermdi\' must be vectors","clang/test/CodeGen/PowerPC/builtins-ppc-error.c:43:3: error: first two arguments to \'__builtin_vsx_xxsldwi\' must be vectors"}
		}
	},
	["err_vecstep_non_scalar_vector_type"]={
		[a]="err_vecstep_non_scalar_vector_type",
		[b]="\'vec_step\' requires built-in scalar or vector type, %0 invalid",
		[c]="\'vec_step\' requires built-in scalar or vector type, A invalid",
		[d]=l,
		[e]="\'vec_step\' requires built\\-in scalar or vector type, (.*?) invalid",
		[f]=k,
		[g]=m,
		[h]={"e190dee7a548",1299871489,"Add support for the OpenCL vec_step operator, by generalising and","Add support for the OpenCL vec_step operator, by generalising and\nextending the existing support for sizeof and alignof.  Original\npatch by Guy Benyei.\n\nllvm-svn: 127475"},
		[i]={{v,4302,"static bool CheckVecStepTraitOperandType(Sema &S, QualType T, SourceLocation Loc, SourceRange ArgRange) {\n  // [OpenCL 1.1 6.11.12] \"The vec_step built-in function takes a built-in\n  // scalar or vector data type argument...\"\n  // Every built-in scalar type (OpenCL 1.1 6.1.1) is either an arithmetic\n  // type (C99 6.2.5p18) or void.\n  if (!(T->isArithmeticType() || T->isVoidType() || T->isVectorType())) {\n    S.Diag(Loc, diag::err_vecstep_non_scalar_vector_type) << T << ArgRange;"}},
		[j]={
			["clang/test/SemaOpenCL/vec_step.cl"]={"clang/test/SemaOpenCL/vec_step.cl:29:24: error: \'vec_step\' requires built-in scalar or vector type, \'__private struct S\' invalid","clang/test/SemaOpenCL/vec_step.cl:30:15: error: \'vec_step\' requires built-in scalar or vector type, \'__private int16 *\' invalid","clang/test/SemaOpenCL/vec_step.cl:31:15: error: \'vec_step\' requires built-in scalar or vector type, \'void (void)\' invalid"}
		}
	},
	["err_vector_incorrect_num_initializers"]={
		[a]="err_vector_incorrect_num_initializers",
		[b]="%select{too many|too few}0 elements in vector initialization (expected %1 elements, have %2)",
		[c]={{nil,nil,{{"too many","too few"}," elements in vector initialization (expected B elements, have C)"}}},
		[d]=l,
		[e]="(?:too many|too few) elements in vector initialization \\(expected (.*?) elements, have (.*?)\\)",
		[f]=k,
		[g]=m,
		[h]={"a96114ed087b",1249840544,"AltiVec-style vector initializer syntax, vec4 a = (vec4)(a, b, c, d);","AltiVec-style vector initializer syntax, vec4 a = (vec4)(a, b, c, d);\n\nIn addition to being defined by the AltiVec PIM, this is also the vector\ninitializer syntax used by OpenCL, so that vector literals are compatible\nwith macro arguments.\n\nllvm-svn: 78535"},
		[i]={{nb,1908,"void InitListChecker::CheckVectorType(const InitializedEntity &Entity, InitListExpr *IList, QualType DeclType, unsigned &Index, InitListExpr *StructuredList, unsigned &StructuredIndex) {\n  // ...\n  // OpenCL and HLSL require all elements to be initialized.\n  if (numEltsInit != maxElements) {\n    if (!VerifyOnly)\n      SemaRef.Diag(IList->getBeginLoc(), diag::err_vector_incorrect_num_initializers) << (numEltsInit < maxElements) << maxElements << numEltsInit;"}},
		[j]={
			["clang/test/SemaHLSL/BuiltIns/vector-constructors-erros.hlsl"]={"clang/test/SemaHLSL/BuiltIns/vector-constructors-erros.hlsl:14:32: error: too few elements in vector initialization (expected 3 elements, have 2)","clang/test/SemaHLSL/BuiltIns/vector-constructors-erros.hlsl:21:32: error: too few elements in vector initialization (expected 2 elements, have 1)"}
		}
	},
	["err_verify_ambiguous_marker"]={
		[a]={{nil,y,"err_verify_ambiguous_marker"}},
		[b]={{nil,y,"reference to marker \'%0\' is ambiguous"}},
		[c]={{nil,y,"reference to marker \'A\' is ambiguous"}},
		[d]=l,
		[e]="reference to marker \'(.*?)\' is ambiguous",
		[f]=k,
		[g]={{nil,y,t}},
		[h]={"4e8144a0d140",1555130019,"[verify] Add support for location markers in directives.","[verify] Add support for location markers in directives.\n\nA marker (matching /#[A-Za-z0-9_-]/) is specified by attaching a comment\ncontaining the marker to the line at which the diagnostic is expected,\nand then can be referenced from an expected-* directive after an @:\n\n  foo // #1\n  // expected-error@#1 {{undeclared identifier \'foo\'}}\n\nThe intent is for markers to be used in situations where relative line\nnumbers are currently used, to avoid the need to renumber when the test\ncase is rearranged.\n\nllvm-svn: 358326"},
		[i]={{V,386,"// Tracker for markers in the input files. A marker is a comment of the form\n//\n//   n = 123; // #123\n//\n// ... that can be referred to by a later expected-* directive:\n//\n//   // expected-error@#123 {{undeclared identifier \'n\'}}\n//\n// Marker declarations must be at the start of a comment or preceded by\n// whitespace to distinguish them from uses of markers in directives.\nclass VerifyDiagnosticConsumer::MarkerTracker {\n  // ...\n  // Ensure we have no remaining deferred directives, and no\n  // multiply-defined-and-used markers.\n  void finalize() {\n    for (auto &MarkerInfo : Markers) {\n      // ...\n      if (M.RedefLoc.isValid() && M.UseLoc.isValid()) {\n        Diags.Report(M.UseLoc, diag::err_verify_ambiguous_marker) << Name;"}}
	},
	["err_verify_inconsistent_diags"]={
		[a]="err_verify_inconsistent_diags",
		[b]="\'%0\' diagnostics %select{expected|seen}1 but not %select{seen|expected}1: %2",
		[c]={{nil,nil,{"\'A\' diagnostics ",{"expected","seen"}," but not ",{"seen","expected"},": C"}}},
		[d]=l,
		[e]="\'(.*?)\' diagnostics (?:expected|seen) but not (?:seen|expected)\\: (.*?)",
		[f]=k,
		[g]=t,
		[h]={"348185548eb2",1258168999,"Add VerifyDiagnosticsClient, to replace old -verify.","Add VerifyDiagnosticsClient, to replace old -verify.\n - This reimplements -verify as just another DiagnosticClient, which buffers the diagnostics and checks them when the source file is complete. There are some hacks to make this work, but they are all internal, and this exposes a better external interface.\n\n - This also tweaks a few things:\n   o Errors are now just regular diagnostics.\n   o Frontend diagnostics are now caught (for example, errors in command line arguments), although there isn\'t yet a way to specify that they are expected. That would be nice though.\n\n - Not yet used.\n\nllvm-svn: 88748"},
		[i]={{V,880,"/// Takes a list of diagnostics that have been generated but not matched\n/// by an expected-* directive and produces a diagnostic to the user from this.\nstatic unsigned PrintUnexpected(DiagnosticsEngine &Diags, SourceManager *SourceMgr, const_diag_iterator diag_begin, const_diag_iterator diag_end, const char *Kind) {\n  // ...\n  Diags.Report(diag::err_verify_inconsistent_diags).setForceEmit() << Kind << /*Unexpected=*/true << OS.str();"},{V,911,"/// Takes a list of diagnostics that were expected to have been generated\n/// but were not and produces a diagnostic to the user from this.\nstatic unsigned PrintExpected(DiagnosticsEngine &Diags, SourceManager &SourceMgr, std::vector<Directive *> &DL, const char *Kind) {\n  // ...\n  Diags.Report(diag::err_verify_inconsistent_diags).setForceEmit() << Kind << /*Unexpected=*/false << OS.str();"}}
	},
	["err_verify_invalid_content"]={
		[a]="err_verify_invalid_content",
		[b]="invalid expected %0: %1",
		[c]="invalid expected A: B",
		[d]=l,
		[e]="invalid expected (.*?)\\: (.*?)",
		[f]=k,
		[g]=t,
		[h]={"e82411b47f76",1272484950,"add regex support for -verify mode.  You can now do things like","add regex support for -verify mode.  You can now do things like\nexpected-error-re {{someregex}}\n\nPatch by mike-m!\n\nllvm-svn: 102516"},
		[i]={{V,308,"// Attach the specified directive to the line of code indicated by\n// \\p ExpectedLoc.\nvoid attachDirective(DiagnosticsEngine &Diags, const UnattachedDirective &UD, SourceLocation ExpectedLoc, bool MatchAnyFileAndLine = false, bool MatchAnyLine = false) {\n  // ...\n  if (!D->isValid(Error)) {\n    Diags.Report(UD.ContentBegin, diag::err_verify_invalid_content) << (UD.RegexKind ? \"regex\" : \"string\") << Error;"}}
	},
	["err_verify_invalid_no_diags"]={
		[a]="err_verify_invalid_no_diags",
		[b]="%select{expected|\'expected-no-diagnostics\'}0 directive cannot follow %select{\'expected-no-diagnostics\' directive|other expected directives}0",
		[c]={{nil,nil,{{"expected","\'expected-no-diagnostics\'"}," directive cannot follow ",{"\'expected-no-diagnostics\' directive","other expected directives"}}}},
		[d]=l,
		[e]="(?:expected|\'expected\\-no\\-diagnostics\') directive cannot follow (?:\'expected\\-no\\-diagnostics\' directive|other expected directives)",
		[f]=k,
		[g]=t,
		[h]={"0fea04509a64",1350650972,"Change VerifyDiagnosticConsumer so that it *must* contain at least one \"expected-*\" directive.  As a...","Change VerifyDiagnosticConsumer so that it *must* contain at least one \"expected-*\" directive.  As a result, for test-cases that are not expected to generate any diagnostics, an additional directive \"expected-no-diagnostics\" has been implemented which can then be included in such test-cases.  This new directive may not be used in conjunction with any other \"expected-*\" directive.\n\nThis change was initially proposed as a solution to the problem highlighted by check-in r164677, i.e. that -verify will not cause a test-case failure where the compile command does not actually reference the file.\n\nPatch reviewed by David Blaikie.\n\nllvm-svn: 166281"},
		[i]={{V,483,"/// ParseDirective - Go through the comment and see if it indicates expected\n/// diagnostics. If so, then put them in the appropriate directive list.\n///\n/// Returns true if any valid directives were found.\nstatic bool ParseDirective(StringRef S, ExpectedData *ED, SourceManager &SM, Preprocessor *PP, SourceLocation Pos, VerifyDiagnosticConsumer::DirectiveStatus &Status, VerifyDiagnosticConsumer::MarkerTracker &Markers) {\n  // ...\n  for (ParseHelper PH(S); !PH.Done();) {\n    // ...\n    if (NoDiag) {\n      if (Status == VerifyDiagnosticConsumer::HasOtherExpectedDirectives)\n        Diags.Report(Pos, diag::err_verify_invalid_no_diags) << /*IsExpectedNoDiagnostics=*/true;"},{V,490,"/// ParseDirective - Go through the comment and see if it indicates expected\n/// diagnostics. If so, then put them in the appropriate directive list.\n///\n/// Returns true if any valid directives were found.\nstatic bool ParseDirective(StringRef S, ExpectedData *ED, SourceManager &SM, Preprocessor *PP, SourceLocation Pos, VerifyDiagnosticConsumer::DirectiveStatus &Status, VerifyDiagnosticConsumer::MarkerTracker &Markers) {\n  // ...\n  for (ParseHelper PH(S); !PH.Done();) {\n    // ...\n    if (Status == VerifyDiagnosticConsumer::HasExpectedNoDiagnostics) {\n      Diags.Report(Pos, diag::err_verify_invalid_no_diags) << /*IsExpectedNoDiagnostics=*/false;"}}
	},
	["err_verify_invalid_range"]={
		[a]="err_verify_invalid_range",
		[b]="invalid range following \'-\' in expected %0",
		[c]="invalid range following \'-\' in expected A",
		[d]=l,
		[e]="invalid range following \'\\-\' in expected (.*?)",
		[f]=k,
		[g]=t,
		[h]={"b8b2ca6ffbfb",1341889046,"Allow -verify directives to specify a min and max count, not just \"+\".","Allow -verify directives to specify a min and max count, not just \"+\".\n\n  void f(); // expected-note 0+ {{previous declaration is here}}\n  void g(); // expected-note 0-1 {{previous declaration is here}}\n\nThe old \"+\" syntax is still an alias for \"1+\", and single numbers still work.\n\nPatch by Andy Gibbs!\n\nllvm-svn: 159979"},
		[i]={{V,594,"/// ParseDirective - Go through the comment and see if it indicates expected\n/// diagnostics. If so, then put them in the appropriate directive list.\n///\n/// Returns true if any valid directives were found.\nstatic bool ParseDirective(StringRef S, ExpectedData *ED, SourceManager &SM, Preprocessor *PP, SourceLocation Pos, VerifyDiagnosticConsumer::DirectiveStatus &Status, VerifyDiagnosticConsumer::MarkerTracker &Markers) {\n  // ...\n  for (ParseHelper PH(S); !PH.Done();) {\n    // ...\n    // Next optional token: positive integer or a \'+\'.\n    if (PH.Next(D.Min)) {\n      // ...\n      // A positive integer can be followed by a \'+\' meaning min\n      // or more, or by a \'-\' meaning a range from min to max.\n      if (PH.Next(\"+\")) {\n      // ...\n      } else if (PH.Next(\"-\")) {\n        // ...\n        if (!PH.Next(D.Max) || D.Max < D.Min) {\n          Diags.Report(Pos.getLocWithOffset(PH.C - PH.Begin), diag::err_verify_invalid_range) << KindStr;"}}
	},
	["err_verify_missing_end"]={
		[a]="err_verify_missing_end",
		[b]="cannot find end (\'}}\') of expected %0",
		[c]="cannot find end (\'}}\') of expected A",
		[d]=l,
		[e]="cannot find end \\(\'\\}\\}\'\\) of expected (.*?)",
		[f]=k,
		[g]=t,
		[h]={"348185548eb2",1258168999,"Add VerifyDiagnosticsClient, to replace old -verify.","Add VerifyDiagnosticsClient, to replace old -verify.\n - This reimplements -verify as just another DiagnosticClient, which buffers the diagnostics and checks them when the source file is complete. There are some hacks to make this work, but they are all internal, and this exposes a better external interface.\n\n - This also tweaks a few things:\n   o Errors are now just regular diagnostics.\n   o Frontend diagnostics are now caught (for example, errors in command line arguments), although there isn\'t yet a way to specify that they are expected. That would be nice though.\n\n - Not yet used.\n\nllvm-svn: 88748"},
		[i]={{V,621,"/// ParseDirective - Go through the comment and see if it indicates expected\n/// diagnostics. If so, then put them in the appropriate directive list.\n///\n/// Returns true if any valid directives were found.\nstatic bool ParseDirective(StringRef S, ExpectedData *ED, SourceManager &SM, Preprocessor *PP, SourceLocation Pos, VerifyDiagnosticConsumer::DirectiveStatus &Status, VerifyDiagnosticConsumer::MarkerTracker &Markers) {\n  // ...\n  for (ParseHelper PH(S); !PH.Done();) {\n    // ...\n    // Search for token: }}\n    if (!PH.SearchClosingBrace(\"{{\", \"}}\")) {\n      Diags.Report(Pos.getLocWithOffset(PH.C - PH.Begin), diag::err_verify_missing_end) << KindStr;"}}
	},
	["err_verify_missing_file"]={
		[a]="err_verify_missing_file",
		[b]="file \'%0\' could not be located in expected %1",
		[c]="file \'A\' could not be located in expected B",
		[d]=l,
		[e]="file \'(.*?)\' could not be located in expected (.*?)",
		[f]=k,
		[g]=t,
		[h]={"fcc699aee8db",1366186006,"Extended VerifyDiagnosticConsumer to also verify source file for diagnostic.","Extended VerifyDiagnosticConsumer to also verify source file for diagnostic.\n\nVerifyDiagnosticConsumer previously would not check that the diagnostic and\nits matching directive referenced the same source file.  Common practice was\nto create directives that referenced other files but only by line number,\nand this led to problems such as when the file containing the directive\ndidn\'t have enough lines to match the location of the diagnostic in the\nother file, leading to bizarre file formatting and other oddities.\n\nThis patch causes VerifyDiagnosticConsumer to match source files as well as\nline numbers.  Therefore, a new syntax is made available for directives, for\nexample:\n\n// expected-error@file:line {{diagnostic message}}\n\nThis extends the @line feature where \"file\" is the file where the diagnostic\nis generated.  The @line syntax is still available and uses the current file\nfor the diagnostic.  \"file\" can be specified either as a relative or absolute\npath - although the latter has less usefulness, I think!  The #include search\npaths will be used to locate the file and if it is not found an error will be\ngenerated.\n\nThe new check is not optional: if the directive is in a different file to the\ndiagnostic, the file must be specified.  Therefore, a number of test-cases\nhave been updated with regard to this.\n\nThis closes out PR15613.\n\nllvm-svn: 179677"},
		[i]={{V,550,"/// ParseDirective - Go through the comment and see if it indicates expected\n/// diagnostics. If so, then put them in the appropriate directive list.\n///\n/// Returns true if any valid directives were found.\nstatic bool ParseDirective(StringRef S, ExpectedData *ED, SourceManager &SM, Preprocessor *PP, SourceLocation Pos, VerifyDiagnosticConsumer::DirectiveStatus &Status, VerifyDiagnosticConsumer::MarkerTracker &Markers) {\n  // ...\n  for (ParseHelper PH(S); !PH.Done();) {\n    // ...\n    if (!PH.Next(\"@\")) {\n    // ...\n    } else {\n      // ...\n      if (FoundPlus || PH.Next(\"-\")) {\n      // ...\n      } else if (PH.Next(Line)) {\n      // ...\n      } else if (PH.NextMarker()) {\n      // ...\n      } else if (PP && PH.Search(\":\")) {\n        // ...\n        if (Filename == \"*\") {\n        // ...\n        } else {\n          // ...\n          if (!File) {\n            Diags.Report(Pos.getLocWithOffset(PH.C - PH.Begin), diag::err_verify_missing_file) << Filename << KindStr;"}}
	},
	["err_verify_missing_line"]={
		[a]="err_verify_missing_line",
		[b]="missing or invalid line number following \'@\' in expected %0",
		[c]="missing or invalid line number following \'@\' in expected A",
		[d]=l,
		[e]="missing or invalid line number following \'@\' in expected (.*?)",
		[f]=k,
		[g]=t,
		[h]={"e1572eb3e27c",1341889023,"Allow line numbers on -verify directives.","Allow line numbers on -verify directives.\n\n// expected-warning@10 {{some text}}\n\nThe line number may be absolute (as above), or relative to the current\nline by prefixing the number with either \'+\' or \'-\'.\n\nPatch by Andy Gibbs!\n\nllvm-svn: 159978"},
		[i]={{V,537,"/// ParseDirective - Go through the comment and see if it indicates expected\n/// diagnostics. If so, then put them in the appropriate directive list.\n///\n/// Returns true if any valid directives were found.\nstatic bool ParseDirective(StringRef S, ExpectedData *ED, SourceManager &SM, Preprocessor *PP, SourceLocation Pos, VerifyDiagnosticConsumer::DirectiveStatus &Status, VerifyDiagnosticConsumer::MarkerTracker &Markers) {\n  // ...\n  for (ParseHelper PH(S); !PH.Done();) {\n    // ...\n    if (!PH.Next(\"@\")) {\n    // ...\n    } else {\n      // ...\n      if (FoundPlus || PH.Next(\"-\")) {\n      // ...\n      } else if (PH.Next(Line)) {\n      // ...\n      } else if (PH.NextMarker()) {\n      // ...\n      } else if (PP && PH.Search(\":\")) {\n        // ...\n        if (Filename == \"*\") {\n          // ...\n          if (!PH.Next(\"*\")) {\n            Diags.Report(Pos.getLocWithOffset(PH.C - PH.Begin), diag::err_verify_missing_line) << \"\'*\'\";"},{V,573,"/// ParseDirective - Go through the comment and see if it indicates expected\n/// diagnostics. If so, then put them in the appropriate directive list.\n///\n/// Returns true if any valid directives were found.\nstatic bool ParseDirective(StringRef S, ExpectedData *ED, SourceManager &SM, Preprocessor *PP, SourceLocation Pos, VerifyDiagnosticConsumer::DirectiveStatus &Status, VerifyDiagnosticConsumer::MarkerTracker &Markers) {\n  // ...\n  for (ParseHelper PH(S); !PH.Done();) {\n    // ...\n    if (!PH.Next(\"@\")) {\n    // ...\n    } else {\n      // ...\n      if (ExpectedLoc.isInvalid() && !MatchAnyLine && Marker.empty()) {\n        Diags.Report(Pos.getLocWithOffset(PH.C - PH.Begin), diag::err_verify_missing_line) << KindStr;"}}
	},
	["err_verify_missing_regex"]={
		[a]="err_verify_missing_regex",
		[b]="cannot find start of regex (\'{{\') in %0",
		[c]="cannot find start of regex (\'{{\') in A",
		[d]=l,
		[e]="cannot find start of regex \\(\'\\{\\{\'\\) in (.*?)",
		[f]=k,
		[g]=t,
		[h]={"cda4b6dd007c",1386805250,"Change semantics of regex expectations in the diagnostic verifier","Change semantics of regex expectations in the diagnostic verifier\n\nPreviously, a line like\n\n  // expected-error-re {{foo}}\n\ntreats the entirety of foo as a regex. This is inconvenient when matching type\nnames containing regex characters. For example, to match\n\"void *(class test8::A::*)(void)\" inside such a regex, one would have to type\n\"void \\*\\(class test8::A::\\*\\)\\(void\\)\".\n\nThis patch changes the semantics of expected-error-re to only treat the parts\nof the directive wrapped in double curly braces as regexes. This avoids the\nescaping problem and leads to nicer patterns for those cases; see e.g. the\nchange to test/Sema/format-strings-scanf.c.\n\n(The balanced search for closing }} of a directive also makes us handle the\nfull directive in test\\SemaCXX\\constexpr-printing.cpp:41 and :53.)\n\nDifferential Revision: http://llvm-reviews.chandlerc.com/D2388\n\nllvm-svn: 197092"},
		[i]={{V,645,"/// ParseDirective - Go through the comment and see if it indicates expected\n/// diagnostics. If so, then put them in the appropriate directive list.\n///\n/// Returns true if any valid directives were found.\nstatic bool ParseDirective(StringRef S, ExpectedData *ED, SourceManager &SM, Preprocessor *PP, SourceLocation Pos, VerifyDiagnosticConsumer::DirectiveStatus &Status, VerifyDiagnosticConsumer::MarkerTracker &Markers) {\n  // ...\n  for (ParseHelper PH(S); !PH.Done();) {\n    // ...\n    // Check that regex directives contain at least one regex.\n    if (D.RegexKind && D.Text.find(\"{{\") == StringRef::npos) {\n      Diags.Report(D.ContentBegin, diag::err_verify_missing_regex) << D.Text;"}}
	},
	["err_verify_missing_start"]={
		[a]="err_verify_missing_start",
		[b]="cannot find start (\'{{\') of expected %0",
		[c]="cannot find start (\'{{\') of expected A",
		[d]=l,
		[e]="cannot find start \\(\'\\{\\{\'\\) of expected (.*?)",
		[f]=k,
		[g]=t,
		[h]={"348185548eb2",1258168999,"Add VerifyDiagnosticsClient, to replace old -verify.","Add VerifyDiagnosticsClient, to replace old -verify.\n - This reimplements -verify as just another DiagnosticClient, which buffers the diagnostics and checks them when the source file is complete. There are some hacks to make this work, but they are all internal, and this exposes a better external interface.\n\n - This also tweaks a few things:\n   o Errors are now just regular diagnostics.\n   o Frontend diagnostics are now caught (for example, errors in command line arguments), although there isn\'t yet a way to specify that they are expected. That would be nice though.\n\n - Not yet used.\n\nllvm-svn: 88748"},
		[i]={{V,613,"/// ParseDirective - Go through the comment and see if it indicates expected\n/// diagnostics. If so, then put them in the appropriate directive list.\n///\n/// Returns true if any valid directives were found.\nstatic bool ParseDirective(StringRef S, ExpectedData *ED, SourceManager &SM, Preprocessor *PP, SourceLocation Pos, VerifyDiagnosticConsumer::DirectiveStatus &Status, VerifyDiagnosticConsumer::MarkerTracker &Markers) {\n  // ...\n  for (ParseHelper PH(S); !PH.Done();) {\n    // ...\n    // Next token: {{\n    if (!PH.Next(\"{{\")) {\n      Diags.Report(Pos.getLocWithOffset(PH.C - PH.Begin), diag::err_verify_missing_start) << KindStr;"}}
	},
	["err_verify_no_directives"]={
		[a]="err_verify_no_directives",
		[b]="no expected directives found: consider use of \'expected-no-diagnostics\'",
		[c]="no expected directives found: consider use of \'expected-no-diagnostics\'",
		[d]=l,
		[e]="no expected directives found\\: consider use of \'expected\\-no\\-diagnostics\'",
		[f]=k,
		[g]=t,
		[h]={"0fea04509a64",1350650972,"Change VerifyDiagnosticConsumer so that it *must* contain at least one \"expected-*\" directive.  As a...","Change VerifyDiagnosticConsumer so that it *must* contain at least one \"expected-*\" directive.  As a result, for test-cases that are not expected to generate any diagnostics, an additional directive \"expected-no-diagnostics\" has been implemented which can then be included in such test-cases.  This new directive may not be used in conjunction with any other \"expected-*\" directive.\n\nThis change was initially proposed as a solution to the problem highlighted by check-in r164677, i.e. that -verify will not cause a test-case failure where the compile command does not actually reference the file.\n\nPatch reviewed by David Blaikie.\n\nllvm-svn: 166281"},
		[i]={{V,1099,"#endif // !NDEBUG\n  if (SrcManager) {\n    // Produce an error if no expected-* directives could be found in the\n    // source file(s) processed.\n    if (Status == HasNoDirectives) {\n      Diags.Report(diag::err_verify_no_directives).setForceEmit();"}}
	},
	["err_verify_no_such_marker"]={
		[a]={{nil,y,"err_verify_no_such_marker"}},
		[b]={{nil,y,"use of undefined marker \'%0\'"}},
		[c]={{nil,y,"use of undefined marker \'A\'"}},
		[d]=l,
		[e]="use of undefined marker \'(.*?)\'",
		[f]=k,
		[g]={{nil,y,t}},
		[h]={"4e8144a0d140",1555130019,"[verify] Add support for location markers in directives.","[verify] Add support for location markers in directives.\n\nA marker (matching /#[A-Za-z0-9_-]/) is specified by attaching a comment\ncontaining the marker to the line at which the diagnostic is expected,\nand then can be referenced from an expected-* directive after an @:\n\n  foo // #1\n  // expected-error@#1 {{undeclared identifier \'foo\'}}\n\nThe intent is for markers to be used in situations where relative line\nnumbers are currently used, to avoid the need to renumber when the test\ncase is rearranged.\n\nllvm-svn: 358326"},
		[i]={{V,394,"// Tracker for markers in the input files. A marker is a comment of the form\n//\n//   n = 123; // #123\n//\n// ... that can be referred to by a later expected-* directive:\n//\n//   // expected-error@#123 {{undeclared identifier \'n\'}}\n//\n// Marker declarations must be at the start of a comment or preceded by\n// whitespace to distinguish them from uses of markers in directives.\nclass VerifyDiagnosticConsumer::MarkerTracker {\n  // ...\n  // Ensure we have no remaining deferred directives, and no\n  // multiply-defined-and-used markers.\n  void finalize() {\n    // ...\n    for (auto &DeferredPair : DeferredDirectives) {\n      Diags.Report(DeferredPair.second.front().DirectivePos, diag::err_verify_no_such_marker) << DeferredPair.first();"}}
	},
	["err_verify_nonconst_addrspace"]={
		[a]={{nil,x,"err_verify_nonconst_addrspace"}},
		[b]={{nil,x,"qualifier \'const\' is needed for variables in address space \'%0\'"}},
		[c]={{nil,x,"qualifier \'const\' is needed for variables in address space \'A\'"}},
		[d]=l,
		[e]="qualifier \'const\' is needed for variables in address space \'(.*?)\'",
		[f]=k,
		[g]={{nil,x,t}},
		[h]={"b714f73defc8",1611802254,"Frontend: Add -f{,no-}implicit-modules-uses-lock and -Rmodule-lock","Frontend: Add -f{,no-}implicit-modules-uses-lock and -Rmodule-lock\n\nAdd -cc1 flags `-fmodules-uses-lock` and `-fno-modules-uses-lock` to\nallow the lock manager to be turned off when building implicit modules.\n\nAdd `-Rmodule-lock` so that we can see when it\'s being used.\n\nDifferential Revision: https://reviews.llvm.org/D95583"},
		[i]={{"clang/lib/CodeGen/Targets/AVR.cpp",128,"class AVRTargetCodeGenInfo : public TargetCodeGenInfo {\n  // ...\n  LangAS getGlobalVarAddressSpace(CodeGenModule &CGM, const VarDecl *D) const override {\n    // Check if global/static variable is defined in address space\n    // 1~6 (__flash, __flash1, __flash2, __flash3, __flash4, __flash5)\n    // but not constant.\n    if (D) {\n      // ...\n      if (isTargetAddressSpace(AS) && 1 <= toTargetAddressSpace(AS) && toTargetAddressSpace(AS) <= 6 && !D->getType().isConstQualified())\n        CGM.getDiags().Report(D->getLocation(), diag::err_verify_nonconst_addrspace) << \"__flash*\";"}}
	},
	["err_vftable_ambiguous_component"]={
		[a]="err_vftable_ambiguous_component",
		[b]="ambiguous vftable component for %0 introduced via covariant thunks; this is an inherent limitation of the ABI",
		[c]="ambiguous vftable component for A introduced via covariant thunks; this is an inherent limitation of the ABI",
		[d]=l,
		[e]="ambiguous vftable component for (.*?) introduced via covariant thunks; this is an inherent limitation of the ABI",
		[f]=k,
		[g]="VTable ABI Issue",
		[h]={"70e6a00170a4",1430516145,"[MS ABI] Detect and diagnose vftables which cannot be created","[MS ABI] Detect and diagnose vftables which cannot be created\n\nThe MSVC ABI has a bug introduced by appending to the end of vftables\nwhich come from virtual bases: covariant thunks introduces via\nnon-overlapping regions of the inheritance lattice both append to the\nsame slot in the vftable.\n\nIt is possible to generate correct vftables in cases where one node in\nthe lattice completely dominates the other on the way to the base with\nthe vfptr; in all other cases, we must raise a diagnostic in order to\nprevent the illusion that we succeeded in laying out the vftable.\n\nThis fixes PR16759.\n\nllvm-svn: 236354"},
		[i]={{"clang/lib/AST/VTableBuilder.cpp",3553,"// We want to select the path which introduces the most covariant overrides.  If\n// two paths introduce overrides which the other path doesn\'t contain, issue a\n// diagnostic.\nstatic const FullPathTy *selectBestPath(ASTContext &Context, const CXXRecordDecl *RD, const VPtrInfo &Info, std::list<FullPathTy> &FullPaths) {\n  // ...\n  for (const FullPathTy &SpecificPath : FullPaths) {\n    // ...\n    if (MissingOverrides.empty()) {\n    // ...\n    } else {\n      // ...\n      Diags.Report(RD->getLocation(), diag::err_vftable_ambiguous_component) << RD;"}}
	},
	["err_virt_specifier_outside_class"]={
		[a]={{nil,T,"err_virt_specifier_outside_class"}},
		[b]={{nil,T,"\'%0\' specifier is not allowed outside a class definition"}},
		[c]={{nil,T,"\'A\' specifier is not allowed outside a class definition"}},
		[d]=l,
		[e]="\'(.*?)\' specifier is not allowed outside a class definition",
		[f]=k,
		[g]={{nil,T,s}},
		[h]={rb,1612659633,qb,ub},
		[i]={{D,2174,"/// ParseDeclGroup - Having concluded that this is either a function\n/// definition or a group of object declarations, actually parse the\n/// result.\nParser::DeclGroupPtrTy Parser::ParseDeclGroup(ParsingDeclSpec &DS, DeclaratorContext Context, ParsedAttributes &Attrs, SourceLocation *DeclEnd, ForRangeInit *FRI) {\n  // ...\n  if (D.isFunctionDeclarator()) {\n    // ...\n    // We\'re at the point where the parsing of function declarator is finished.\n    //\n    // A common error is that users accidently add a virtual specifier\n    // (e.g. override) in an out-line method definition.\n    // We attempt to recover by stripping all these specifiers coming after\n    // the declarator.\n    while (auto Specifier = isCXX11VirtSpecifier()) {\n      Diag(Tok, diag::err_virt_specifier_outside_class) << VirtSpecifiers::getSpecifierName(Specifier) << FixItHint::CreateRemoval(Tok.getLocation());"}},
		[j]={
			["clang/test/Parser/cxx-extra-virtual-specifiers.cpp"]={"clang/test/Parser/cxx-extra-virtual-specifiers.cpp:10:15: error: \'override\' specifier is not allowed outside a class definition","clang/test/Parser/cxx-extra-virtual-specifiers.cpp:13:11: error: \'override\' specifier is not allowed outside a class definition","clang/test/Parser/cxx-extra-virtual-specifiers.cpp:15:11: error: \'override\' specifier is not allowed outside a class definition","clang/test/Parser/cxx-extra-virtual-specifiers.cpp:18:12: error: \'override\' specifier is not allowed outside a class definition"}
		}
	},
	["err_virtual_in_union"]={
		[a]="err_virtual_in_union",
		[b]="unions cannot have virtual functions",
		[c]="unions cannot have virtual functions",
		[d]=l,
		[e]="unions cannot have virtual functions",
		[f]=k,
		[g]=m,
		[h]={"43899d44c2f4",1435432735,"[Sema] Unions cannot have virtual functions.","[Sema] Unions cannot have virtual functions.\n\nPR:		PR23931\nDifferential Revision:	http://reviews.llvm.org/D10752\nReviewed by:  rsmith\n\nllvm-svn: 240889"},
		[i]={{u,9756,"NamedDecl *Sema::ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamListsRef, bool &AddToScope) {\n  // ...\n  if (getLangOpts().CPlusPlus) {\n    // ...\n    // If this is a method defined in an __interface, and is not a constructor\n    // or an overloaded operator, then set the pure flag (isVirtual will already\n    // return true).\n    if (const CXXRecordDecl *Parent = dyn_cast<CXXRecordDecl>(NewFD->getDeclContext())) {\n      // ...\n      // C++ [class.union]p2\n      //   A union can have member functions, but not virtual functions.\n      if (isVirtual && Parent->isUnion()) {\n        Diag(D.getDeclSpec().getVirtualSpecLoc(), diag::err_virtual_in_union);"}},
		[j]={
			["clang/test/SemaCXX/virtual-function-in-union.cpp"]={"clang/test/SemaCXX/virtual-function-in-union.cpp:5:3: error: unions cannot have virtual functions"}
		}
	},
	["err_virtual_member_function_template"]={
		[a]="err_virtual_member_function_template",
		[b]="\'virtual\' cannot be specified on member function templates",
		[c]="\'virtual\' cannot be specified on member function templates",
		[d]=l,
		[e]="\'virtual\' cannot be specified on member function templates",
		[f]=k,
		[g]=m,
		[h]={"e973899f4687",1295707436,"A member function template cannot be virtual.","A member function template cannot be virtual.\n\nllvm-svn: 124031"},
		[i]={{u,9889,"NamedDecl *Sema::ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamListsRef, bool &AddToScope) {\n  // ...\n  if (getLangOpts().CPlusPlus) {\n    // ...\n    // C++ [dcl.fct.spec]p5:\n    //   The virtual specifier shall only be used in declarations of\n    //   nonstatic class member functions that appear within a\n    //   member-specification of a class declaration; see 10.3.\n    //\n    if (isVirtual && !NewFD->isInvalidDecl()) {\n      if (!isVirtualOkay) {\n      // ...\n      } else if (!CurContext->isRecord()) {\n      // ...\n      } else if (NewFD->getDescribedFunctionTemplate()) {\n        // ...\n        Diag(D.getDeclSpec().getVirtualSpecLoc(), diag::err_virtual_member_function_template) << FixItHint::CreateRemoval(D.getDeclSpec().getVirtualSpecLoc());"}},
		[j]={
			["clang/test/CXX/temp/temp.decls/temp.mem/p3.cpp"]={"clang/test/CXX/temp/temp.decls/temp.mem/p3.cpp:4:22: error: \'virtual\' cannot be specified on member function templates"}
		}
	},
	["err_virtual_non_function"]={
		[a]="err_virtual_non_function",
		[b]="\'virtual\' can only appear on non-static member functions",
		[c]="\'virtual\' can only appear on non-static member functions",
		[d]=l,
		[e]="\'virtual\' can only appear on non\\-static member functions",
		[f]=k,
		[g]=m,
		[h]={Q,1236199783,M,L},
		[i]={{u,6645,"/// Diagnose function specifiers on a declaration of an identifier that\n/// does not identify a function.\nvoid Sema::DiagnoseFunctionSpecifiers(const DeclSpec &DS) {\n  // FIXME: We should probably indicate the identifier in question to avoid\n  // confusion for constructs like \"virtual int a(), b;\"\n  if (DS.isVirtualSpecified())\n    Diag(DS.getVirtualSpecLoc(), diag::err_virtual_non_function);"},{u,9879,"NamedDecl *Sema::ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamListsRef, bool &AddToScope) {\n  // ...\n  if (getLangOpts().CPlusPlus) {\n    // ...\n    // C++ [dcl.fct.spec]p5:\n    //   The virtual specifier shall only be used in declarations of\n    //   nonstatic class member functions that appear within a\n    //   member-specification of a class declaration; see 10.3.\n    //\n    if (isVirtual && !NewFD->isInvalidDecl()) {\n      if (!isVirtualOkay) {\n        Diag(D.getDeclSpec().getVirtualSpecLoc(), diag::err_virtual_non_function);"}},
		[j]={
			["clang/test/CXX/temp/temp.deduct.guide/p1.cpp"]={"clang/test/CXX/temp/temp.deduct.guide/p1.cpp:73:1: error: \'virtual\' can only appear on non-static member functions"}
		}
	},
	["err_virtual_out_of_class"]={
		[a]="err_virtual_out_of_class",
		[b]="\'virtual\' can only be specified inside the class definition",
		[c]="\'virtual\' can only be specified inside the class definition",
		[d]=l,
		[e]="\'virtual\' can only be specified inside the class definition",
		[f]=k,
		[g]=m,
		[h]={O,1237025389,N,P},
		[i]={{u,9883,"NamedDecl *Sema::ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamListsRef, bool &AddToScope) {\n  // ...\n  if (getLangOpts().CPlusPlus) {\n    // ...\n    // C++ [dcl.fct.spec]p5:\n    //   The virtual specifier shall only be used in declarations of\n    //   nonstatic class member functions that appear within a\n    //   member-specification of a class declaration; see 10.3.\n    //\n    if (isVirtual && !NewFD->isInvalidDecl()) {\n      if (!isVirtualOkay) {\n      // ...\n      } else if (!CurContext->isRecord()) {\n        // ...\n        Diag(D.getDeclSpec().getVirtualSpecLoc(), diag::err_virtual_out_of_class) << FixItHint::CreateRemoval(D.getDeclSpec().getVirtualSpecLoc());"}},
		[j]={
			["clang/test/SemaCXX/virtuals.cpp"]={"clang/test/SemaCXX/virtuals.cpp:18:1: error: \'virtual\' can only be specified inside the class definition"}
		}
	},
	["err_vla_decl_has_extern_linkage"]={
		[a]="err_vla_decl_has_extern_linkage",
		[b]="variable length array declaration cannot have \'extern\' linkage",
		[c]="variable length array declaration cannot have \'extern\' linkage",
		[d]=l,
		[e]="variable length array declaration cannot have \'extern\' linkage",
		[f]=k,
		[g]=m,
		[h]={O,1237025389,N,P},
		[i]={{u,8710,"void Sema::CheckVariableDeclarationType(VarDecl *NewVD) {\n  // ...\n  if ((isVM && NewVD->hasLinkage()) || (T->isVariableArrayType() && NewVD->hasGlobalStorage())) {\n    // ...\n    if ((!FixedTInfo || FixedT.isNull()) && T->isVariableArrayType()) {\n      // ...\n      if (NewVD->isFileVarDecl())\n      // ...\n      else if (NewVD->isStaticLocal())\n      // ...\n      else\n        Diag(NewVD->getLocation(), diag::err_vla_decl_has_extern_linkage) << SizeRange;"}},
		[j]={
			[Ab]={"clang/test/Sema/vla.c:22:14: error: variable length array declaration cannot have \'extern\' linkage","clang/test/Sema/vla.c:38:14: error: variable length array declaration cannot have \'extern\' linkage"}
		}
	},
	["err_vla_decl_has_static_storage"]={
		[a]="err_vla_decl_has_static_storage",
		[b]="variable length array declaration cannot have \'static\' storage duration",
		[c]="variable length array declaration cannot have \'static\' storage duration",
		[d]=l,
		[e]="variable length array declaration cannot have \'static\' storage duration",
		[f]=k,
		[g]=m,
		[h]={O,1237025389,N,P},
		[i]={{u,8707,"void Sema::CheckVariableDeclarationType(VarDecl *NewVD) {\n  // ...\n  if ((isVM && NewVD->hasLinkage()) || (T->isVariableArrayType() && NewVD->hasGlobalStorage())) {\n    // ...\n    if ((!FixedTInfo || FixedT.isNull()) && T->isVariableArrayType()) {\n      // ...\n      if (NewVD->isFileVarDecl())\n      // ...\n      else if (NewVD->isStaticLocal())\n        Diag(NewVD->getLocation(), diag::err_vla_decl_has_static_storage) << SizeRange;"}},
		[j]={
			[Ab]={"clang/test/Sema/vla.c:37:14: error: variable length array declaration cannot have \'static\' storage duration"}
		}
	},
	["err_vla_decl_in_file_scope"]={
		[a]="err_vla_decl_in_file_scope",
		[b]="variable length array declaration not allowed at file scope",
		[c]="variable length array declaration not allowed at file scope",
		[d]=l,
		[e]="variable length array declaration not allowed at file scope",
		[f]=k,
		[g]=m,
		[h]={O,1237025389,N,P},
		[i]={{u,6728,"void Sema::CheckTypedefForVariablyModifiedType(Scope *S, TypedefNameDecl *NewTD) {\n  // ...\n  if (T->isVariablyModifiedType()) {\n    // ...\n    if (S->getFnParent() == nullptr) {\n      // ...\n      if (FixedTInfo) {\n      // ...\n      } else {\n        if (SizeIsNegative)\n        // ...\n        else if (T->isVariableArrayType())\n          Diag(NewTD->getLocation(), diag::err_vla_decl_in_file_scope);"},{u,8704,"void Sema::CheckVariableDeclarationType(VarDecl *NewVD) {\n  // ...\n  if ((isVM && NewVD->hasLinkage()) || (T->isVariableArrayType() && NewVD->hasGlobalStorage())) {\n    // ...\n    if ((!FixedTInfo || FixedT.isNull()) && T->isVariableArrayType()) {\n      // ...\n      if (NewVD->isFileVarDecl())\n        Diag(NewVD->getLocation(), diag::err_vla_decl_in_file_scope) << SizeRange;"}},
		[j]={
			["clang/test/CXX/dcl.dcl/dcl.spec/dcl.typedef/p2-0x.cpp"]={"clang/test/CXX/dcl.dcl/dcl.spec/dcl.typedef/p2-0x.cpp:38:9: error: variable length array declaration not allowed at file scope"}
		}
	},
	["err_vla_in_sfinae"]={
		[a]="err_vla_in_sfinae",
		[b]="variable length array cannot be formed during template argument deduction",
		[c]="variable length array cannot be formed during template argument deduction",
		[d]=l,
		[e]="variable length array cannot be formed during template argument deduction",
		[f]=k,
		[g]=m,
		[h]={"a09387df9ffb",1274644621,"It turns out that people love using VLAs in templates, too. Weaken our","It turns out that people love using VLAs in templates, too. Weaken our\nVLA restrictions so that one can use VLAs in templates (even\naccidentally), but not as part of a non-type template parameter (which\nwould be very bad).\n\nllvm-svn: 104471"},
		[i]={{U,2586,"/// Build an array type.\n///\n/// \\param T The type of each element in the array.\n///\n/// \\param ASM C99 array size modifier (e.g., \'*\', \'static\').\n///\n/// \\param ArraySize Expression describing the size of the array.\n///\n/// \\param Brackets The range from the opening \'[\' to the closing \']\'.\n///\n/// \\param Entity The name of the entity that involves the array\n/// type, if known.\n///\n/// \\returns A suitable array type, if there are no errors. Otherwise,\n/// returns a NULL type.\nQualType Sema::BuildArrayType(QualType T, ArrayType::ArraySizeModifier ASM, Expr *ArraySize, unsigned Quals, SourceRange Brackets, DeclarationName Entity) {\n  // ...\n  if (getLangOpts().OpenCL) {\n  // ...\n  } else if (getLangOpts().C99) {\n  // ...\n  } else if (isSFINAEContext()) {\n    VLADiag = diag::err_vla_in_sfinae;"}}
	},
	["err_vla_unsupported"]={
		[a]={{nil,z,"err_vla_unsupported"}},
		[b]={{nil,B,"variable length arrays are not supported for %select{the current target|\'%1\'}0"},{A,z,"variable length arrays are not supported for the current target"}},
		[c]={{nil,B,{"variable length arrays are not supported for ",{"the current target","\'B\'"}}},{A,z,"variable length arrays are not supported for the current target"}},
		[d]=l,
		[e]="variable length arrays are not supported for (?:the current target|\'(.*?)\')",
		[f]=k,
		[g]={{nil,z,m}},
		[h]={"87d44269885f",1511038846,"[OpenMP] Show error if VLAs are not supported","[OpenMP] Show error if VLAs are not supported\n\nSome target devices (e.g. Nvidia GPUs) don\'t support dynamic stack\nallocation and hence no VLAs. Print errors with description instead\nof failing in the backend or generating code that doesn\'t work.\n\nThis patch handles explicit uses of VLAs (local variable in target\nor declare target region) or implicitly generated (private) VLAs\nfor reductions on VLAs or on array sections with non-constant size.\n\nDifferential Revision: https://reviews.llvm.org/D39505\n\nllvm-svn: 318601"},
		[i]={{R,4990,"static bool EvaluateUnaryTypeTrait(Sema &Self, TypeTrait UTT, SourceLocation KeyLoc, QualType T) {\n  // ...\n  case UTT_IsBoundedArray:\n    // ...\n    Self.Diag(KeyLoc, diag::err_vla_unsupported) << 1 << tok::kw___is_bounded_array;"},{R,4998,"static bool EvaluateUnaryTypeTrait(Sema &Self, TypeTrait UTT, SourceLocation KeyLoc, QualType T) {\n  // ...\n  case UTT_IsUnboundedArray:\n    // ...\n    Self.Diag(KeyLoc, diag::err_vla_unsupported) << 1 << tok::kw___is_unbounded_array;"},{U,2673,"/// Build an array type.\n///\n/// \\param T The type of each element in the array.\n///\n/// \\param ASM C99 array size modifier (e.g., \'*\', \'static\').\n///\n/// \\param ArraySize Expression describing the size of the array.\n///\n/// \\param Brackets The range from the opening \'[\' to the closing \']\'.\n///\n/// \\param Entity The name of the entity that involves the array\n/// type, if known.\n///\n/// \\returns A suitable array type, if there are no errors. Otherwise,\n/// returns a NULL type.\nQualType Sema::BuildArrayType(QualType T, ArrayType::ArraySizeModifier ASM, Expr *ArraySize, unsigned Quals, SourceRange Brackets, DeclarationName Entity) {\n  // ...\n  if (T->isVariableArrayType() && !Context.getTargetInfo().isVLASupported()) {\n    // ...\n    targetDiag(Loc, IsCUDADevice ? diag::err_cuda_vla : diag::err_vla_unsupported) << (IsCUDADevice ? CurrentCUDATarget() : 0);"}},
		[j]={
			["clang/test/OpenMP/target_vla_messages.cpp"]={"clang/test/OpenMP/target_vla_messages.cpp:24:10: error: variable length arrays are not supported for the current target","clang/test/OpenMP/target_vla_messages.cpp:62:12: error: variable length arrays are not supported for the current target","clang/test/OpenMP/target_vla_messages.cpp:72:14: error: variable length arrays are not supported for the current target","clang/test/OpenMP/target_vla_messages.cpp:52:10: error: variable length arrays are not supported for the current target"}
		}
	},
	["err_vm_decl_has_extern_linkage"]={
		[a]="err_vm_decl_has_extern_linkage",
		[b]="variably modified type declaration cannot have \'extern\' linkage",
		[c]="variably modified type declaration cannot have \'extern\' linkage",
		[d]=l,
		[e]="variably modified type declaration cannot have \'extern\' linkage",
		[f]=k,
		[g]=m,
		[h]={O,1237025389,N,P},
		[i]={{u,8720,"void Sema::CheckVariableDeclarationType(VarDecl *NewVD) {\n  // ...\n  if ((isVM && NewVD->hasLinkage()) || (T->isVariableArrayType() && NewVD->hasGlobalStorage())) {\n    // ...\n    if (!FixedTInfo) {\n      if (NewVD->isFileVarDecl())\n      // ...\n      else\n        Diag(NewVD->getLocation(), diag::err_vm_decl_has_extern_linkage);"}},
		[j]={
			[Ab]={"clang/test/Sema/vla.c:40:16: error: variably modified type declaration cannot have \'extern\' linkage"}
		}
	},
	["err_vm_decl_in_file_scope"]={
		[a]="err_vm_decl_in_file_scope",
		[b]="variably modified type declaration not allowed at file scope",
		[c]="variably modified type declaration not allowed at file scope",
		[d]=l,
		[e]="variably modified type declaration not allowed at file scope",
		[f]=k,
		[g]=m,
		[h]={O,1237025389,N,P},
		[i]={{u,6733,"void Sema::CheckTypedefForVariablyModifiedType(Scope *S, TypedefNameDecl *NewTD) {\n  // ...\n  if (T->isVariablyModifiedType()) {\n    // ...\n    if (S->getFnParent() == nullptr) {\n      // ...\n      if (FixedTInfo) {\n      // ...\n      } else {\n        if (SizeIsNegative)\n        // ...\n        else if (T->isVariableArrayType())\n        // ...\n        else if (Oversized.getBoolValue())\n        // ...\n        else\n          Diag(NewTD->getLocation(), diag::err_vm_decl_in_file_scope);"},{u,8718,"void Sema::CheckVariableDeclarationType(VarDecl *NewVD) {\n  // ...\n  if ((isVM && NewVD->hasLinkage()) || (T->isVariableArrayType() && NewVD->hasGlobalStorage())) {\n    // ...\n    if (!FixedTInfo) {\n      if (NewVD->isFileVarDecl())\n        Diag(NewVD->getLocation(), diag::err_vm_decl_in_file_scope);"}},
		[j]={
			[Ab]={"clang/test/Sema/vla.c:30:5: error: variably modified type declaration not allowed at file scope","clang/test/Sema/vla.c:33:7: error: variably modified type declaration not allowed at file scope"}
		}
	},
	["err_vm_func_decl"]={
		[a]="err_vm_func_decl",
		[b]="function declaration cannot have variably modified type",
		[c]="function declaration cannot have variably modified type",
		[d]=l,
		[e]="function declaration cannot have variably modified type",
		[f]=k,
		[g]=m,
		[h]={"4f8b8ed2ac98",1242482280,"Missing change for r71941 (PR2044).","Missing change for r71941 (PR2044).\n\nllvm-svn: 71947"},
		[i]={{u,10198,"NamedDecl *Sema::ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamListsRef, bool &AddToScope) {\n  // ...\n  // Functions returning a variably modified type violate C99 6.7.5.2p2\n  // because all functions have linkage.\n  if (!NewFD->isInvalidDecl() && NewFD->getReturnType()->isVariablyModifiedType()) {\n    Diag(NewFD->getLocation(), diag::err_vm_func_decl);"}},
		[j]={
			[Ab]={"clang/test/Sema/vla.c:51:26: error: function declaration cannot have variably modified type","clang/test/Sema/vla.c:53:7: error: function declaration cannot have variably modified type"}
		}
	},
	["err_void_only_param"]={
		[a]="err_void_only_param",
		[b]="\'void\' must be the first and only parameter if specified",
		[c]="\'void\' must be the first and only parameter if specified",
		[d]=l,
		[e]="\'void\' must be the first and only parameter if specified",
		[f]=k,
		[g]=m,
		[h]={Q,1236199783,M,L},
		[i]={{U,5503,"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      // OpenCL disallows functions without a prototype, but it doesn\'t enforce\n      // strict prototypes as in C2x because it allows a function definition to\n      // have an identifier list. See OpenCL 3.0 6.11/g for more details.\n      if (!FTI.NumParams && !FTI.isVariadic && !LangOpts.requiresStrictPrototypes() && !LangOpts.OpenCL) {\n      // ...\n      } else {\n        // ...\n        for (unsigned i = 0, e = FTI.NumParams; i != e; ++i) {\n          // ...\n          // Look for \'void\'.  void is allowed only as a single parameter to a\n          // function with no other parameters (C99 6.7.5.3p10).  We record\n          // int(void) as a FunctionProtoType with an empty parameter list.\n          if (ParamTy->isVoidType()) {\n            // If this is something like \'float(int, void)\', reject it.  \'void\'\n            // is an incomplete type (C99 6.2.5p19) and function decls cannot\n            // have parameters of incomplete type.\n            if (FTI.NumParams != 1 || FTI.isVariadic) {\n              S.Diag(FTI.Params[i].IdentLoc, diag::err_void_only_param);"}},
		[j]={
			["clang/test/Sema/void_arg.c"]={"clang/test/Sema/void_arg.c:10:28: error: \'void\' must be the first and only parameter if specified","clang/test/Sema/void_arg.c:11:23: error: \'void\' must be the first and only parameter if specified","clang/test/Sema/void_arg.c:14:28: error: \'void\' must be the first and only parameter if specified","clang/test/Sema/void_arg.c:15:23: error: \'void\' must be the first and only parameter if specified"}
		}
	},
	["err_void_param_qualified"]={
		[a]="err_void_param_qualified",
		[b]="\'void\' as parameter must not have type qualifiers",
		[c]="\'void\' as parameter must not have type qualifiers",
		[d]=l,
		[e]="\'void\' as parameter must not have type qualifiers",
		[f]=k,
		[g]=m,
		[h]={Q,1236199783,M,L},
		[i]={{U,5514,"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      // OpenCL disallows functions without a prototype, but it doesn\'t enforce\n      // strict prototypes as in C2x because it allows a function definition to\n      // have an identifier list. See OpenCL 3.0 6.11/g for more details.\n      if (!FTI.NumParams && !FTI.isVariadic && !LangOpts.requiresStrictPrototypes() && !LangOpts.OpenCL) {\n      // ...\n      } else {\n        // ...\n        for (unsigned i = 0, e = FTI.NumParams; i != e; ++i) {\n          // ...\n          // Look for \'void\'.  void is allowed only as a single parameter to a\n          // function with no other parameters (C99 6.7.5.3p10).  We record\n          // int(void) as a FunctionProtoType with an empty parameter list.\n          if (ParamTy->isVoidType()) {\n            // If this is something like \'float(int, void)\', reject it.  \'void\'\n            // is an incomplete type (C99 6.2.5p19) and function decls cannot\n            // have parameters of incomplete type.\n            if (FTI.NumParams != 1 || FTI.isVariadic) {\n            // ...\n            } else if (FTI.Params[i].Ident) {\n            // ...\n            } else {\n              // Reject, but continue to parse \'float(const void)\'.\n              if (ParamTy.hasQualifiers())\n                S.Diag(DeclType.Loc, diag::err_void_param_qualified);"}},
		[j]={
			["clang/test/Sema/void_arg.c"]={"clang/test/Sema/void_arg.c:26:7: error: \'void\' as parameter must not have type qualifiers"}
		}
	},
	["err_volatile_comparison_operator"]={
		[a]="err_volatile_comparison_operator",
		[b]="defaulted comparison function must not be volatile",
		[c]="defaulted comparison function must not be volatile",
		[d]=l,
		[e]="defaulted comparison function must not be volatile",
		[f]=k,
		[g]=m,
		[h]={F,1625925174,G,H},
		[i]={{r,8742,"bool Sema::CheckExplicitlyDefaultedComparison(Scope *S, FunctionDecl *FD, DefaultedComparisonKind DCK) {\n  // ...\n  if (IsMethod) {\n    // ...\n    if (MD->isVolatile()) {\n      Diag(MD->getLocation(), diag::err_volatile_comparison_operator);"}},
		[j]={
			["clang/test/CXX/class/class.compare/class.compare.default/p1.cpp"]={"clang/test/CXX/class/class.compare/class.compare.default/p1.cpp:19:8: error: defaulted comparison function must not be volatile"}
		}
	},
	["err_vsx_builtin_nonconstant_argument"]={
		[a]={{nil,E,"err_vsx_builtin_nonconstant_argument"}},
		[b]={{nil,E,"argument %0 to %1 must be a 2-bit unsigned literal (i.e. 0, 1, 2 or 3)"}},
		[c]={{nil,E,"argument A to B must be a 2-bit unsigned literal (i.e. 0, 1, 2 or 3)"}},
		[d]=l,
		[e]="argument (.*?) to (.*?) must be a 2\\-bit unsigned literal \\(i\\.e\\. 0, 1, 2 or 3\\)",
		[f]=k,
		[g]={{nil,E,m}},
		[h]={"bbc48e91643b",1495638812,"[PowerPC] Implement vec_xxpermdi builtin.","[PowerPC] Implement vec_xxpermdi builtin.\n\nThe vec_xxpermdi builtin is missing from altivec.h. This has been requested by\ndevelopers working on libvpx for VP9 support for Google.\n\nThe patch fixes PR: https://bugs.llvm.org/show_bug.cgi?id=32653\nDifferential Revision: https://reviews.llvm.org/D33053\n\nllvm-svn: 303760"},
		[i]={{K,8402,"// Customized Sema Checking for VSX builtins that have the following signature:\n// vector [...] builtinName(vector [...], vector [...], const int);\n// Which takes the same type of vectors (any legal vector type) for the first\n// two arguments and takes compile time constant for the third argument.\n// Example builtins are :\n// vector double vec_xxpermdi(vector double, vector double, int);\n// vector short vec_xxsldwi(vector short, vector short, int);\nbool Sema::SemaBuiltinVSX(CallExpr *TheCall) {\n  // ...\n  // Check the third argument is a compile time constant\n  if (!TheCall->getArg(2)->isIntegerConstantExpr(Context))\n    return Diag(TheCall->getBeginLoc(), diag::err_vsx_builtin_nonconstant_argument) << 3 /* argument index */ << TheCall->getDirectCallee() << SourceRange(TheCall->getArg(2)->getBeginLoc(), TheCall->getArg(2)->getEndLoc());"}},
		[j]={
			["clang/test/CodeGen/PowerPC/builtins-ppc-error.c"]={"clang/test/CodeGen/PowerPC/builtins-ppc-error.c:34:3: error: argument 3 to \'__builtin_vsx_xxpermdi\' must be a 2-bit unsigned literal (i.e. 0, 1, 2 or 3)","clang/test/CodeGen/PowerPC/builtins-ppc-error.c:42:3: error: argument 3 to \'__builtin_vsx_xxsldwi\' must be a 2-bit unsigned literal (i.e. 0, 1, 2 or 3)"}
		}
	},
	["err_wasm_builtin_arg_must_be_integer_type"]={
		[a]="err_wasm_builtin_arg_must_be_integer_type",
		[b]="%ordinal0 argument must be an integer",
		[c]="A argument must be an integer",
		[d]=l,
		[e]="(.*?) argument must be an integer",
		[f]=k,
		[g]=t,
		[h]={F,1625925174,G,H},
		[i]={{K,19017,"/// Checks the argument at the given index is an integer.\nstatic bool CheckWasmBuiltinArgIsInteger(Sema &S, CallExpr *E, unsigned ArgIndex) {\n  // ...\n  if (!ArgExpr->getType()->isIntegerType()) {\n    return S.Diag(ArgExpr->getBeginLoc(), diag::err_wasm_builtin_arg_must_be_integer_type) << ArgIndex + 1 << ArgExpr->getSourceRange();"}},
		[j]={
			["clang/test/Sema/builtins-wasm.c"]={"clang/test/Sema/builtins-wasm.c:28:41: error: 3rd argument must be an integer","clang/test/Sema/builtins-wasm.c:37:36: error: 2nd argument must be an integer","clang/test/Sema/builtins-wasm.c:39:48: error: 4th argument must be an integer","clang/test/Sema/builtins-wasm.c:48:43: error: 3rd argument must be an integer","clang/test/Sema/builtins-wasm.c:49:52: error: 4th argument must be an integer","clang/test/Sema/builtins-wasm.c:50:61: error: 5th argument must be an integer"}
		}
	},
	["err_wasm_builtin_arg_must_be_table_type"]={
		[a]="err_wasm_builtin_arg_must_be_table_type",
		[b]="%ordinal0 argument must be a WebAssembly table",
		[c]="A argument must be a WebAssembly table",
		[d]=l,
		[e]="(.*?) argument must be a WebAssembly table",
		[f]=k,
		[g]=t,
		[h]={F,1625925174,G,H},
		[i]={{K,19004,"/// Checks the argument at the given index is a WebAssembly table and if it\n/// is, sets ElTy to the element type.\nstatic bool CheckWasmBuiltinArgIsTable(Sema &S, CallExpr *E, unsigned ArgIndex, QualType &ElTy) {\n  // ...\n  if (!ATy || !ATy->getElementType().isWebAssemblyReferenceType()) {\n    return S.Diag(ArgExpr->getBeginLoc(), diag::err_wasm_builtin_arg_must_be_table_type) << ArgIndex + 1 << ArgExpr->getSourceRange();"}},
		[j]={
			["clang/test/Sema/builtins-wasm.c"]={"clang/test/Sema/builtins-wasm.c:14:29: error: 1st argument must be a WebAssembly table","clang/test/Sema/builtins-wasm.c:15:29: error: 1st argument must be a WebAssembly table","clang/test/Sema/builtins-wasm.c:16:29: error: 1st argument must be a WebAssembly table","clang/test/Sema/builtins-wasm.c:17:29: error: 1st argument must be a WebAssembly table","clang/test/Sema/builtins-wasm.c:26:29: error: 1st argument must be a WebAssembly table","clang/test/Sema/builtins-wasm.c:36:29: error: 1st argument must be a WebAssembly table","clang/test/Sema/builtins-wasm.c:46:29: error: 1st argument must be a WebAssembly table","clang/test/Sema/builtins-wasm.c:47:36: error: 2nd argument must be a WebAssembly table"}
		}
	},
	["err_wasm_builtin_arg_must_match_table_element_type"]={
		[a]="err_wasm_builtin_arg_must_match_table_element_type",
		[b]="%ordinal0 argument must match the element type of the WebAssembly table in the %ordinal1 argument",
		[c]="A argument must match the element type of the WebAssembly table in the B argument",
		[d]=l,
		[e]="(.*?) argument must match the element type of the WebAssembly table in the (.*?) argument",
		[f]=k,
		[g]=t,
		[h]={F,1625925174,G,H},
		[i]={{K,19091,"/// Check that the first argument is a WebAssembly table, the second is the\n/// value to use for new elements (of a type matching the table type), the\n/// third value is an integer.\nbool Sema::BuiltinWasmTableGrow(CallExpr *TheCall) {\n  // ...\n  if (!Context.hasSameType(ElTy, NewElemArg->getType())) {\n    return Diag(NewElemArg->getBeginLoc(), diag::err_wasm_builtin_arg_must_match_table_element_type) << 2 << 1 << NewElemArg->getSourceRange();"},{K,19118,"/// Check that the first argument is a WebAssembly table, the second is an\n/// integer, the third is the value to use to fill the table (of a type\n/// matching the table type), and the fourth is an integer.\nbool Sema::BuiltinWasmTableFill(CallExpr *TheCall) {\n  // ...\n  if (!Context.hasSameType(ElTy, NewElemArg->getType())) {\n    return Diag(NewElemArg->getBeginLoc(), diag::err_wasm_builtin_arg_must_match_table_element_type) << 3 << 1 << NewElemArg->getSourceRange();"},{K,19146,"/// Check that the first argument is a WebAssembly table, the second is also a\n/// WebAssembly table (of the same element type), and the third to fifth\n/// arguments are integers.\nbool Sema::BuiltinWasmTableCopy(CallExpr *TheCall) {\n  // ...\n  if (!Context.hasSameType(XElTy, YElTy)) {\n    return Diag(TableYArg->getBeginLoc(), diag::err_wasm_builtin_arg_must_match_table_element_type) << 2 << 1 << TableYArg->getSourceRange();"}},
		[j]={
			["clang/test/Sema/builtins-wasm.c"]={"clang/test/Sema/builtins-wasm.c:27:36: error: 2nd argument must match the element type of the WebAssembly table in the 1st argument","clang/test/Sema/builtins-wasm.c:38:43: error: 3rd argument must match the element type of the WebAssembly table in the 1st argument"}
		}
	},
	["err_wasm_ca_reference"]={
		[a]="err_wasm_ca_reference",
		[b]="cannot %select{capture|take address of}0 WebAssembly reference",
		[c]={{nil,nil,{"cannot ",{"capture","take address of"}," WebAssembly reference"}}},
		[d]=l,
		[e]="cannot (?:capture|take address of) WebAssembly reference",
		[f]=k,
		[g]=t,
		[h]={F,1625925174,G,H},
		[i]={{v,15078,"/// CheckAddressOfOperand - The operand of & must be either a function\n/// designator or an lvalue designating an object. If it is an lvalue, the\n/// object cannot be declared with storage class register or be a bit field.\n/// Note: The usual conversions are *not* applied to the operand of the &\n/// operator (C99 6.3.2.1p[2-4]), and its result is never an lvalue.\n/// In C++, the operand might be an overloaded function name, in which case\n/// we allow the \'&\' but retain the overloaded-function type.\nQualType Sema::CheckAddressOfOperand(ExprResult &OrigOp, SourceLocation OpLoc) {\n  // ...\n  // Cannot take the address of WebAssembly references or tables.\n  if (Context.getTargetInfo().getTriple().isWasm()) {\n    // ...\n    if (OpTy.isWebAssemblyReferenceType()) {\n      Diag(OpLoc, diag::err_wasm_ca_reference) << 1 << OrigOp.get()->getSourceRange();"},{v,19393,"/// Capture the given variable in the lambda.\nstatic bool captureInLambda(LambdaScopeInfo *LSI, ValueDecl *Var, SourceLocation Loc, const bool BuildAndDiagnose, QualType &CaptureType, QualType &DeclRefType, const bool RefersToCapturedVariable, const Sema::TryCaptureKind Kind, SourceLocation EllipsisLoc, const bool IsTopScope, Sema &S, bool Invalid) {\n  // ...\n  if (BuildAndDiagnose && S.Context.getTargetInfo().getTriple().isWasm() && CaptureType.getNonReferenceType().isWebAssemblyReferenceType()) {\n    S.Diag(Loc, diag::err_wasm_ca_reference) << 0;"}},
		[j]={
			[lb]={"clang/test/Sema/wasm-refs-and-tables.c:62:3: error: cannot take address of WebAssembly reference"}
		}
	},
	["err_wasm_cast_table"]={
		[a]="err_wasm_cast_table",
		[b]="cannot cast %select{to|from}0 a WebAssembly table",
		[c]={{nil,nil,{"cannot cast ",{"to","from"}," a WebAssembly table"}}},
		[d]=l,
		[e]="cannot cast (?:to|from) a WebAssembly table",
		[f]=k,
		[g]=t,
		[h]={F,1625925174,G,H},
		[i]={{Hb,2780,"void CastOperation::CheckCXXCStyleCast(bool FunctionalStyle, bool ListInitialization) {\n  // ...\n  if (SrcType->isWebAssemblyTableType()) {\n    Self.Diag(OpRange.getBegin(), diag::err_wasm_cast_table) << 1 << SrcExpr.get()->getSourceRange();"},{Hb,2962,"/// Check the semantics of a C-style cast operation, in C.\nvoid CastOperation::CheckCStyleCast() {\n  // ...\n  if (SrcType->isWebAssemblyTableType()) {\n    Self.Diag(OpRange.getBegin(), diag::err_wasm_cast_table) << 1 << SrcExpr.get()->getSourceRange();"}},
		[j]={
			[lb]={"clang/test/Sema/wasm-refs-and-tables.c:101:3: error: cannot cast from a WebAssembly table"}
		}
	},
	["err_wasm_funcref_not_wasm"]={
		[a]="err_wasm_funcref_not_wasm",
		[b]="invalid use of \'__funcref\' keyword outside the WebAssembly triple",
		[c]="invalid use of \'__funcref\' keyword outside the WebAssembly triple",
		[d]=l,
		[e]="invalid use of \'__funcref\' keyword outside the WebAssembly triple",
		[f]=k,
		[g]=t,
		[h]={F,1625925174,G,H},
		[i]={{D,863,"void Parser::ParseWebAssemblyFuncrefTypeAttribute(ParsedAttributes &attrs) {\n  // ...\n  if (!getTargetInfo().getTriple().isWasm()) {\n    // ...\n    Diag(StartLoc, diag::err_wasm_funcref_not_wasm);"}},
		[j]={
			["clang/test/Parser/wasm-funcref.c"]={"clang/test/Parser/wasm-funcref.c:5:16: error: invalid use of \'__funcref\' keyword outside the WebAssembly triple","clang/test/Parser/wasm-funcref.c:6:15: error: invalid use of \'__funcref\' keyword outside the WebAssembly triple"}
		}
	},
	["err_wasm_reference_pr"]={
		[a]="err_wasm_reference_pr",
		[b]="%select{pointer|reference}0 to WebAssembly reference type is not allowed",
		[c]={{nil,nil,{{"pointer","reference"}," to WebAssembly reference type is not allowed"}}},
		[d]=l,
		[e]="(?:pointer|reference) to WebAssembly reference type is not allowed",
		[f]=k,
		[g]=t,
		[h]={F,1625925174,G,H},
		[i]={{U,2210,"/// Build a pointer type.\n///\n/// \\param T The type to which we\'ll be building a pointer.\n///\n/// \\param Loc The location of the entity whose type involves this\n/// pointer type or, if there is no such entity, the location of the\n/// type that will have pointer type.\n///\n/// \\param Entity The name of the entity that involves the pointer\n/// type, if known.\n///\n/// \\returns A suitable pointer type, if there are no\n/// errors. Otherwise, returns a NULL type.\nQualType Sema::BuildPointerType(QualType T, SourceLocation Loc, DeclarationName Entity) {\n  // ...\n  // In WebAssembly, pointers to reference types and pointers to tables are\n  // illegal.\n  if (getASTContext().getTargetInfo().getTriple().isWasm()) {\n    if (T.isWebAssemblyReferenceType()) {\n      Diag(Loc, diag::err_wasm_reference_pr) << 0;"},{U,2299,"/// Build a reference type.\n///\n/// \\param T The type to which we\'ll be building a reference.\n///\n/// \\param Loc The location of the entity whose type involves this\n/// reference type or, if there is no such entity, the location of the\n/// type that will have reference type.\n///\n/// \\param Entity The name of the entity that involves the reference\n/// type, if known.\n///\n/// \\returns A suitable reference type, if there are no\n/// errors. Otherwise, returns a NULL type.\nQualType Sema::BuildReferenceType(QualType T, bool SpelledAsLValue, SourceLocation Loc, DeclarationName Entity) {\n  // ...\n  // In WebAssembly, references to reference types and tables are illegal.\n  if (getASTContext().getTargetInfo().getTriple().isWasm() && T.isWebAssemblyReferenceType()) {\n    Diag(Loc, diag::err_wasm_reference_pr) << 1;"}},
		[j]={
			[lb]={"clang/test/Sema/wasm-refs-and-tables.c:12:15: error: pointer to WebAssembly reference type is not allowed","clang/test/Sema/wasm-refs-and-tables.c:13:15: error: pointer to WebAssembly reference type is not allowed","clang/test/Sema/wasm-refs-and-tables.c:14:15: error: pointer to WebAssembly reference type is not allowed","clang/test/Sema/wasm-refs-and-tables.c:31:17: error: pointer to WebAssembly reference type is not allowed","clang/test/Sema/wasm-refs-and-tables.c:32:17: error: pointer to WebAssembly reference type is not allowed","clang/test/Sema/wasm-refs-and-tables.c:41:17: error: pointer to WebAssembly reference type is not allowed","clang/test/Sema/wasm-refs-and-tables.c:42:17: error: pointer to WebAssembly reference type is not allowed","clang/test/Sema/wasm-refs-and-tables.c:48:39: error: pointer to WebAssembly reference type is not allowed","clang/test/Sema/wasm-refs-and-tables.c:49:39: error: pointer to WebAssembly reference type is not allowed","clang/test/Sema/wasm-refs-and-tables.c:53:15: error: pointer to WebAssembly reference type is not allowed","clang/test/Sema/wasm-refs-and-tables.c:54:15: error: pointer to WebAssembly reference type is not allowed","clang/test/Sema/wasm-refs-and-tables.c:64:18: error: pointer to WebAssembly reference type is not allowed","clang/test/Sema/wasm-refs-and-tables.c:65:18: error: pointer to WebAssembly reference type is not allowed","clang/test/Sema/wasm-refs-and-tables.c:71:24: error: pointer to WebAssembly reference type is not allowed","clang/test/Sema/wasm-refs-and-tables.c:72:24: error: pointer to WebAssembly reference type is not allowed","clang/test/Sema/wasm-refs-and-tables.c:80:26: error: pointer to WebAssembly reference type is not allowed","clang/test/Sema/wasm-refs-and-tables.c:81:26: error: pointer to WebAssembly reference type is not allowed"}
		}
	},
	["err_wasm_reftype_exception_spec"]={
		[a]="err_wasm_reftype_exception_spec",
		[b]="WebAssembly reference type not allowed in exception specification",
		[c]="WebAssembly reference type not allowed in exception specification",
		[d]=l,
		[e]="WebAssembly reference type not allowed in exception specification",
		[f]=k,
		[g]=t,
		[h]={F,1625925174,G,H},
		[i]={{"clang/lib/Sema/SemaExceptionSpec.cpp",178,"/// CheckSpecifiedExceptionType - Check if the given type is valid in an\n/// exception specification. Incomplete types, or pointers to incomplete types\n/// other than void are not allowed.\n///\n/// \\param[in,out] T  The exception type. This will be decayed to a pointer type\n///                   when the input is an array or a function type.\nbool Sema::CheckSpecifiedExceptionType(QualType &T, SourceRange Range) {\n  // ...\n  // WebAssembly reference types can\'t be used in exception specifications.\n  if (PointeeT.isWebAssemblyReferenceType()) {\n    Diag(Range.getBegin(), diag::err_wasm_reftype_exception_spec);"}}
	},
	["err_wasm_reftype_multidimensional_array"]={
		[a]="err_wasm_reftype_multidimensional_array",
		[b]="multi-dimensional arrays of WebAssembly references are not allowed",
		[c]="multi-dimensional arrays of WebAssembly references are not allowed",
		[d]=l,
		[e]="multi\\-dimensional arrays of WebAssembly references are not allowed",
		[f]=k,
		[g]=t,
		[h]={F,1625925174,G,H},
		[i]={{U,2520,"/// Build an array type.\n///\n/// \\param T The type of each element in the array.\n///\n/// \\param ASM C99 array size modifier (e.g., \'*\', \'static\').\n///\n/// \\param ArraySize Expression describing the size of the array.\n///\n/// \\param Brackets The range from the opening \'[\' to the closing \']\'.\n///\n/// \\param Entity The name of the entity that involves the array\n/// type, if known.\n///\n/// \\returns A suitable array type, if there are no errors. Otherwise,\n/// returns a NULL type.\nQualType Sema::BuildArrayType(QualType T, ArrayType::ArraySizeModifier ASM, Expr *ArraySize, unsigned Quals, SourceRange Brackets, DeclarationName Entity) {\n  // ...\n  // Multi-dimensional arrays of WebAssembly references are not allowed.\n  if (Context.getTargetInfo().getTriple().isWasm() && T->isArrayType()) {\n    // ...\n    if (ATy && ATy->getElementType().isWebAssemblyReferenceType()) {\n      Diag(Loc, diag::err_wasm_reftype_multidimensional_array);"}},
		[j]={
			[lb]={"clang/test/Sema/wasm-refs-and-tables.c:19:24: error: multi-dimensional arrays of WebAssembly references are not allowed","clang/test/Sema/wasm-refs-and-tables.c:30:19: error: multi-dimensional arrays of WebAssembly references are not allowed","clang/test/Sema/wasm-refs-and-tables.c:40:19: error: multi-dimensional arrays of WebAssembly references are not allowed","clang/test/Sema/wasm-refs-and-tables.c:47:44: error: multi-dimensional arrays of WebAssembly references are not allowed","clang/test/Sema/wasm-refs-and-tables.c:70:23: error: multi-dimensional arrays of WebAssembly references are not allowed","clang/test/Sema/wasm-refs-and-tables.c:79:25: error: multi-dimensional arrays of WebAssembly references are not allowed","clang/test/Sema/wasm-refs-and-tables.c:86:27: error: multi-dimensional arrays of WebAssembly references are not allowed"}
		}
	},
	["err_wasm_reftype_tc"]={
		[a]="err_wasm_reftype_tc",
		[b]="cannot %select{throw|catch}0 a WebAssembly reference type",
		[c]={{nil,nil,{"cannot ",{"throw","catch"}," a WebAssembly reference type"}}},
		[d]=l,
		[e]="cannot (?:throw|catch) a WebAssembly reference type",
		[f]=k,
		[g]=t,
		[h]={F,1625925174,G,H},
		[i]={{r,16650,"/// Perform semantic analysis for the variable declaration that\n/// occurs within a C++ catch clause, returning the newly-created\n/// variable.\nVarDecl *Sema::BuildExceptionDeclaration(Scope *S, TypeSourceInfo *TInfo, SourceLocation StartLoc, SourceLocation Loc, IdentifierInfo *Name) {\n  // ...\n  if (!Invalid && BaseType.isWebAssemblyReferenceType()) {\n    Diag(Loc, diag::err_wasm_reftype_tc) << 1;"},{R,988,"/// CheckCXXThrowOperand - Validate the operand of a throw.\nbool Sema::CheckCXXThrowOperand(SourceLocation ThrowLoc, QualType ExceptionObjectTy, Expr *E) {\n  // ...\n  // Cannot throw WebAssembly reference type.\n  if (Ty.isWebAssemblyReferenceType()) {\n    Diag(ThrowLoc, diag::err_wasm_reftype_tc) << 0 << E->getSourceRange();"}},
		[j]={
			["clang/test/SemaCXX/wasm-refs-and-tables.cpp"]={"clang/test/SemaCXX/wasm-refs-and-tables.cpp:22:3: error: cannot throw a WebAssembly reference type","clang/test/SemaCXX/wasm-refs-and-tables.cpp:23:3: error: cannot throw a WebAssembly reference type","clang/test/SemaCXX/wasm-refs-and-tables.cpp:25:24: error: cannot catch a WebAssembly reference type"}
		}
	},
	["err_wasm_table_art"]={
		[a]="err_wasm_table_art",
		[b]="cannot %select{assign|return|throw|subscript}0 a WebAssembly table",
		[c]={{nil,nil,{"cannot ",{"assign","return","throw","subscript"}," a WebAssembly table"}}},
		[d]=l,
		[e]="cannot (?:assign|return|throw|subscript) a WebAssembly table",
		[f]=k,
		[g]=t,
		[h]={F,1625925174,G,H},
		[i]={{K,12965,"void Sema::CheckReturnValExpr(Expr *RetValExp, QualType lhsType, SourceLocation ReturnLoc, bool isObjCMethod, const AttrVec *Attrs, const FunctionDecl *FD) {\n  // ...\n  if (RetValExp && RetValExp->getType()->isWebAssemblyTableType()) {\n    Diag(ReturnLoc, diag::err_wasm_table_art) << 1;"},{u,13148,"/// AddInitializerToDecl - Adds the initializer Init to the\n/// declaration dcl. If DirectInit is true, this is C++ direct\n/// initialization rather than copy initialization.\nvoid Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, bool DirectInit) {\n  // ...\n  // WebAssembly tables can\'t be used to initialise a variable.\n  if (Init && !Init->getType().isNull() && Init->getType()->isWebAssemblyTableType()) {\n    Diag(Init->getExprLoc(), diag::err_wasm_table_art) << 0;"},{v,5052,"ExprResult Sema::ActOnArraySubscriptExpr(Scope *S, Expr *base, SourceLocation lbLoc, MultiExprArg ArgExprs, SourceLocation rbLoc) {\n  // ...\n  if (base->getType()->isWebAssemblyTableType()) {\n    Diag(base->getExprLoc(), diag::err_wasm_table_art) << SourceRange(base->getBeginLoc(), rbLoc) << 3;"},{v,14482,"// C99 6.5.16.1\nQualType Sema::CheckAssignmentOperands(Expr *LHSExpr, ExprResult &RHS, SourceLocation Loc, QualType CompoundType, BinaryOperatorKind Opc) {\n  // ...\n  // WebAssembly tables can\'t be used on RHS of an assignment expression.\n  if (RHSType->isWebAssemblyTableType()) {\n    Diag(Loc, diag::err_wasm_table_art) << 0;"},{R,994,"/// CheckCXXThrowOperand - Validate the operand of a throw.\nbool Sema::CheckCXXThrowOperand(SourceLocation ThrowLoc, QualType ExceptionObjectTy, Expr *E) {\n  // ...\n  // Cannot throw WebAssembly table.\n  if (isPointer && Ty.isWebAssemblyReferenceType()) {\n    Diag(ThrowLoc, diag::err_wasm_table_art) << 2 << E->getSourceRange();"},{"clang/lib/Sema/SemaStmt.cpp",3991,"StmtResult Sema::BuildReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp, bool AllowRecovery) {\n  // ...\n  if (RetValExp) {\n    // ...\n    if (ATy && ATy->getElementType().isWebAssemblyReferenceType()) {\n      Diag(ReturnLoc, diag::err_wasm_table_art) << 1;"}},
		[j]={
			["clang/test/SemaCXX/wasm-refs-and-tables.cpp"]={"clang/test/SemaCXX/wasm-refs-and-tables.cpp:29:3: error: cannot return a WebAssembly table"}
		}
	},
	["err_wasm_table_as_function_parameter"]={
		[a]="err_wasm_table_as_function_parameter",
		[b]="cannot use WebAssembly table as a function parameter",
		[c]="cannot use WebAssembly table as a function parameter",
		[d]=l,
		[e]="cannot use WebAssembly table as a function parameter",
		[f]=k,
		[g]=t,
		[h]={F,1625925174,G,H},
		[i]={{K,16708,"/// CheckParmsForFunctionDef - Check that the parameters of the given\n/// function are appropriate for the definition of a function. This\n/// takes care of any checks that cannot be performed on the\n/// declaration itself, e.g., that the types of each of the function\n/// parameters are complete.\nbool Sema::CheckParmsForFunctionDef(ArrayRef<ParmVarDecl *> Parameters, bool CheckParameterNames) {\n  // ...\n  for (ParmVarDecl *Param : Parameters) {\n    // ...\n    if (!Param->isInvalidDecl() && Param->getOriginalType()->isWebAssemblyTableType()) {\n      // ...\n      Diag(Param->getLocation(), diag::err_wasm_table_as_function_parameter);"},{u,10755,"NamedDecl *Sema::ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamListsRef, bool &AddToScope) {\n  // ...\n  for (const ParmVarDecl *Param : NewFD->parameters()) {\n    // ...\n    // WebAssembly tables can\'t be used as function parameters.\n    if (Context.getTargetInfo().getTriple().isWasm()) {\n      if (PT->getUnqualifiedDesugaredType()->isWebAssemblyTableType()) {\n        Diag(Param->getTypeSpecStartLoc(), diag::err_wasm_table_as_function_parameter);"},{v,7533,"/// BuildResolvedCallExpr - Build a call to a resolved expression,\n/// i.e. an expression not of \\p OverloadTy.  The expression should\n/// unary-convert to an expression of function-pointer or\n/// block-pointer type.\n///\n/// \\param NDecl the declaration being called, if available\nExprResult Sema::BuildResolvedCallExpr(Expr *Fn, NamedDecl *NDecl, SourceLocation LParenLoc, ArrayRef<Expr *> Args, SourceLocation RParenLoc, Expr *Config, bool IsExecConfig, ADLCallKind UsesADL) {\n  // ...\n  // WebAssembly tables can\'t be used as arguments.\n  if (Context.getTargetInfo().getTriple().isWasm()) {\n    for (const Expr *Arg : Args) {\n      if (Arg && Arg->getType()->isWebAssemblyTableType()) {\n        return ExprError(Diag(Arg->getExprLoc(), diag::err_wasm_table_as_function_parameter));"},{U,3034,"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    if (ParamType->isVoidType()) {\n    // ...\n    } else if (ParamType->isHalfType() && !getLangOpts().NativeHalfArgsAndReturns && !Context.getTargetInfo().allowHalfArgsAndReturns()) {\n    // ...\n    } else if (ParamType->isWebAssemblyTableType()) {\n      Diag(Loc, diag::err_wasm_table_as_function_parameter);"}},
		[j]={
			[lb]={"clang/test/Sema/wasm-refs-and-tables.c:46:25: error: cannot use WebAssembly table as a function parameter","clang/test/Sema/wasm-refs-and-tables.c:51:25: error: cannot use WebAssembly table as a function parameter","clang/test/Sema/wasm-refs-and-tables.c:91:14: error: cannot use WebAssembly table as a function parameter"}
		}
	},
	["err_wasm_table_conditional_expression"]={
		[a]="err_wasm_table_conditional_expression",
		[b]="cannot use a WebAssembly table within a branch of a conditional expression",
		[c]="cannot use a WebAssembly table within a branch of a conditional expression",
		[d]=l,
		[e]="cannot use a WebAssembly table within a branch of a conditional expression",
		[f]=k,
		[g]=t,
		[h]={F,1625925174,G,H},
		[i]={{v,9124,"/// Note that LHS is not null here, even if this is the gnu \"x ?: y\" extension.\n/// In that case, LHS = cond.\n/// C99 6.5.15\nQualType Sema::CheckConditionalOperands(ExprResult &Cond, ExprResult &LHS, ExprResult &RHS, ExprValueKind &VK, ExprObjectKind &OK, SourceLocation QuestionLoc) {\n  // ...\n  if (LHSTy->isWebAssemblyTableType() || RHSTy->isWebAssemblyTableType()) {\n    Diag(QuestionLoc, diag::err_wasm_table_conditional_expression) << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();"},{R,6604,"/// Check the operands of ?: under C++ semantics.\n///\n/// See C++ [expr.cond]. Note that LHS is never null, even for the GNU x ?: y\n/// extension. In this case, LHS == Cond. (But they\'re not aliases.)\n///\n/// This function also implements GCC\'s vector extension and the\n/// OpenCL/ext_vector_type extension for conditionals. The vector extensions\n/// permit the use of a?b:c where the type of a is that of a integer vector with\n/// the same number of elements and size as the vectors of b and c. If one of\n/// either b or c is a scalar it is implicitly converted to match the type of\n/// the vector. Otherwise the expression is ill-formed. If both b and c are\n/// scalars, then b and c are checked and converted to the type of a if\n/// possible.\n///\n/// The expressions are evaluated differently for GCC\'s and OpenCL\'s extensions.\n/// For the GCC extension, the ?: operator is evaluated as\n///   (a[0] != 0 ? b[0] : c[0], .. , a[n] != 0 ? b[n] : c[n]).\n/// For the OpenCL extensions, the ?: operator is evaluated as\n///   (most-significant-bit-set(a[0])  ? b[0] : c[0], .. ,\n///    most-significant-bit-set(a[n]) ? b[n] : c[n]).\nQualType Sema::CXXCheckConditionalOperands(ExprResult &Cond, ExprResult &LHS, ExprResult &RHS, ExprValueKind &VK, ExprObjectKind &OK, SourceLocation QuestionLoc) {\n  // ...\n  // WebAssembly tables are not allowed as conditional LHS or RHS.\n  if (LTy->isWebAssemblyTableType() || RTy->isWebAssemblyTableType()) {\n    Diag(QuestionLoc, diag::err_wasm_table_conditional_expression) << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();"}},
		[j]={
			[lb]={"clang/test/Sema/wasm-refs-and-tables.c:99:5: error: cannot use a WebAssembly table within a branch of a conditional expression","clang/test/Sema/wasm-refs-and-tables.c:100:9: error: cannot use a WebAssembly table within a branch of a conditional expression"}
		}
	},
	["err_wasm_table_in_function"]={
		[a]="err_wasm_table_in_function",
		[b]="WebAssembly table cannot be declared within a function",
		[c]="WebAssembly table cannot be declared within a function",
		[d]=l,
		[e]="WebAssembly table cannot be declared within a function",
		[f]=k,
		[g]=t,
		[h]={F,1625925174,G,H},
		[i]={{u,8659,"void Sema::CheckVariableDeclarationType(VarDecl *NewVD) {\n  // ...\n  // WebAssembly tables must be static with a zero length and can\'t be\n  // declared within functions.\n  if (T->isWebAssemblyTableType()) {\n    if (getCurScope()->getParent()) { // Parent is null at top-level\n      Diag(NewVD->getLocation(), diag::err_wasm_table_in_function);"}},
		[j]={
			[lb]={"clang/test/Sema/wasm-refs-and-tables.c:84:17: error: WebAssembly table cannot be declared within a function","clang/test/Sema/wasm-refs-and-tables.c:85:24: error: WebAssembly table cannot be declared within a function","clang/test/Sema/wasm-refs-and-tables.c:112:17: error: WebAssembly table cannot be declared within a function","clang/test/Sema/wasm-refs-and-tables.c:118:24: error: WebAssembly table cannot be declared within a function","clang/test/Sema/wasm-refs-and-tables.c:120:26: error: WebAssembly table cannot be declared within a function","clang/test/Sema/wasm-refs-and-tables.c:122:28: error: WebAssembly table cannot be declared within a function","clang/test/Sema/wasm-refs-and-tables.c:126:26: error: WebAssembly table cannot be declared within a function"}
		}
	},
	["err_wasm_table_invalid_uett_operand"]={
		[a]="err_wasm_table_invalid_uett_operand",
		[b]="invalid application of \'%0\' to WebAssembly table",
		[c]="invalid application of \'A\' to WebAssembly table",
		[d]=l,
		[e]="invalid application of \'(.*?)\' to WebAssembly table",
		[f]=k,
		[g]=t,
		[h]={F,1625925174,G,H},
		[i]={{v,4411,"/// Check the constraints on expression operands to unary type expression\n/// and type traits.\n///\n/// Completes any types necessary and validates the constraints on the operand\n/// expression. The logic mostly mirrors the type-based overload, but may modify\n/// the expression as it completes the type for that expression through template\n/// instantiation, etc.\nbool Sema::CheckUnaryExprOrTypeTraitOperand(Expr *E, UnaryExprOrTypeTrait ExprKind) {\n  // ...\n  // WebAssembly tables are always illegal operands to unary expressions and\n  // type traits.\n  if (Context.getTargetInfo().getTriple().isWasm() && E->getType()->isWebAssemblyTableType()) {\n    Diag(E->getExprLoc(), diag::err_wasm_table_invalid_uett_operand) << getTraitSpelling(ExprKind);"},{v,4782,"/// Check the constraints on operands to unary expression and type\n/// traits.\n///\n/// This will complete any types necessary, and validate the various constraints\n/// on those operands.\n///\n/// The UsualUnaryConversions() function is *not* called by this routine.\n/// C99 6.3.2.1p[2-4] all state:\n///   Except when it is the operand of the sizeof operator ...\n///\n/// C++ [expr.sizeof]p4\n///   The lvalue-to-rvalue, array-to-pointer, and function-to-pointer\n///   standard conversions are not applied to the operand of sizeof.\n///\n/// This policy is followed for all of the unary trait expressions.\nbool Sema::CheckUnaryExprOrTypeTraitOperand(QualType ExprType, SourceLocation OpLoc, SourceRange ExprRange, UnaryExprOrTypeTrait ExprKind, StringRef KWName) {\n  // ...\n  // WebAssembly tables are always illegal operands to unary expressions and\n  // type traits.\n  if (Context.getTargetInfo().getTriple().isWasm() && ExprType->isWebAssemblyTableType()) {\n    Diag(OpLoc, diag::err_wasm_table_invalid_uett_operand) << getTraitSpelling(ExprKind);"}},
		[j]={
			[lb]={"clang/test/Sema/wasm-refs-and-tables.c:68:3: error: invalid application of \'sizeof\' to WebAssembly table","clang/test/Sema/wasm-refs-and-tables.c:69:9: error: invalid application of \'sizeof\' to WebAssembly table","clang/test/Sema/wasm-refs-and-tables.c:78:11: error: invalid application of \'alignof\' to WebAssembly table"}
		}
	},
	["err_wasm_table_must_be_static"]={
		[a]="err_wasm_table_must_be_static",
		[b]="WebAssembly table must be static",
		[c]="WebAssembly table must be static",
		[d]=l,
		[e]="WebAssembly table must be static",
		[f]=k,
		[g]=t,
		[h]={F,1625925174,G,H},
		[i]={{u,8664,"void Sema::CheckVariableDeclarationType(VarDecl *NewVD) {\n  // ...\n  // WebAssembly tables must be static with a zero length and can\'t be\n  // declared within functions.\n  if (T->isWebAssemblyTableType()) {\n    // ...\n    if (NewVD->getStorageClass() != SC_Static) {\n      Diag(NewVD->getLocation(), diag::err_wasm_table_must_be_static);"}},
		[j]={
			[lb]={"clang/test/Sema/wasm-refs-and-tables.c:18:15: error: WebAssembly table must be static"}
		}
	},
	["err_wasm_table_pr"]={
		[a]="err_wasm_table_pr",
		[b]="cannot form a %select{pointer|reference}0 to a WebAssembly table",
		[c]={{nil,nil,{"cannot form a ",{"pointer","reference"}," to a WebAssembly table"}}},
		[d]=l,
		[e]="cannot form a (?:pointer|reference) to a WebAssembly table",
		[f]=k,
		[g]=t,
		[h]={F,1625925174,G,H},
		[i]={{v,15141,"/// CheckAddressOfOperand - The operand of & must be either a function\n/// designator or an lvalue designating an object. If it is an lvalue, the\n/// object cannot be declared with storage class register or be a bit field.\n/// Note: The usual conversions are *not* applied to the operand of the &\n/// operator (C99 6.3.2.1p[2-4]), and its result is never an lvalue.\n/// In C++, the operand might be an overloaded function name, in which case\n/// we allow the \'&\' but retain the overloaded-function type.\nQualType Sema::CheckAddressOfOperand(ExprResult &OrigOp, SourceLocation OpLoc) {\n  // ...\n  // Cannot take the address of WebAssembly references or tables.\n  if (Context.getTargetInfo().getTriple().isWasm()) {\n    // ...\n    if (OpTy->isWebAssemblyTableType()) {\n      Diag(OpLoc, diag::err_wasm_table_pr) << 1 << OrigOp.get()->getSourceRange();"},{U,2216,"/// Build a pointer type.\n///\n/// \\param T The type to which we\'ll be building a pointer.\n///\n/// \\param Loc The location of the entity whose type involves this\n/// pointer type or, if there is no such entity, the location of the\n/// type that will have pointer type.\n///\n/// \\param Entity The name of the entity that involves the pointer\n/// type, if known.\n///\n/// \\returns A suitable pointer type, if there are no\n/// errors. Otherwise, returns a NULL type.\nQualType Sema::BuildPointerType(QualType T, SourceLocation Loc, DeclarationName Entity) {\n  // ...\n  // In WebAssembly, pointers to reference types and pointers to tables are\n  // illegal.\n  if (getASTContext().getTargetInfo().getTriple().isWasm()) {\n    // ...\n    // We need to desugar the type here in case T is a ParenType.\n    if (T->getUnqualifiedDesugaredType()->isWebAssemblyTableType()) {\n      Diag(Loc, diag::err_wasm_table_pr) << 0;"},{U,2303,"/// Build a reference type.\n///\n/// \\param T The type to which we\'ll be building a reference.\n///\n/// \\param Loc The location of the entity whose type involves this\n/// reference type or, if there is no such entity, the location of the\n/// type that will have reference type.\n///\n/// \\param Entity The name of the entity that involves the reference\n/// type, if known.\n///\n/// \\returns A suitable reference type, if there are no\n/// errors. Otherwise, returns a NULL type.\nQualType Sema::BuildReferenceType(QualType T, bool SpelledAsLValue, SourceLocation Loc, DeclarationName Entity) {\n  // ...\n  if (T->isWebAssemblyTableType()) {\n    Diag(Loc, diag::err_wasm_table_pr) << 1;"}},
		[j]={
			[lb]={"clang/test/Sema/wasm-refs-and-tables.c:20:23: error: cannot form a pointer to a WebAssembly table","clang/test/Sema/wasm-refs-and-tables.c:33:18: error: cannot form a pointer to a WebAssembly table","clang/test/Sema/wasm-refs-and-tables.c:43:18: error: cannot form a pointer to a WebAssembly table","clang/test/Sema/wasm-refs-and-tables.c:50:40: error: cannot form a pointer to a WebAssembly table","clang/test/Sema/wasm-refs-and-tables.c:55:16: error: cannot form a pointer to a WebAssembly table","clang/test/Sema/wasm-refs-and-tables.c:87:24: error: cannot form a pointer to a WebAssembly table","clang/test/Sema/wasm-refs-and-tables.c:105:3: error: cannot form a reference to a WebAssembly table"}
		}
	},
	["err_weak_property"]={
		[a]="err_weak_property",
		[b]="existing instance variable %1 for __weak property %0 must be __weak",
		[c]="existing instance variable B for __weak property A must be __weak",
		[d]=l,
		[e]="existing instance variable (.*?) for __weak property (.*?) must be __weak",
		[f]=k,
		[g]=m,
		[h]={"f881267db9a9",1480718311,"Mass-rename the handful of error_* diagnostics to err_*.","Mass-rename the handful of error_* diagnostics to err_*.\n\nllvm-svn: 288545"},
		[i]={{Tb,771,"static void checkARCPropertyImpl(Sema &S, SourceLocation propertyImplLoc, ObjCPropertyDecl *property, ObjCIvarDecl *ivar) {\n  // ...\n  case Qualifiers::OCL_Weak:\n    S.Diag(ivar->getLocation(), diag::err_weak_property) << property->getDeclName() << ivar->getDeclName();"},{Tb,1401,"/// ActOnPropertyImplDecl - This routine performs semantic checks and\n/// builds the AST node for a property implementation declaration; declared\n/// as \\@synthesize or \\@dynamic.\n///\nDecl *Sema::ActOnPropertyImplDecl(Scope *S, SourceLocation AtLoc, SourceLocation PropertyLoc, bool Synthesize, IdentifierInfo *PropertyId, IdentifierInfo *PropertyIvar, SourceLocation PropertyIvarLoc, ObjCPropertyQueryKind QueryKind) {\n  // ...\n  // Check that we have a valid, previously declared ivar for @synthesize\n  if (Synthesize) {\n    // ...\n    // Check that type of property and its ivar are type compatible.\n    if (!Context.hasSameType(PropertyIvarType, IvarType)) {\n      // ...\n      // __weak is explicit. So it works on Canonical type.\n      if ((PropType.isObjCGCWeak() && !IvarType.isObjCGCWeak() && getLangOpts().getGC() != LangOptions::NonGC)) {\n        Diag(PropertyDiagLoc, diag::err_weak_property) << property->getDeclName() << Ivar->getDeclName();"}},
		[j]={
			["clang/test/SemaObjC/mrc-weak.m"]={"clang/test/SemaObjC/mrc-weak.m:20:6: error: existing instance variable \'_wa\' for __weak property \'wa\' must be __weak","clang/test/SemaObjC/mrc-weak.m:22:26: error: existing instance variable \'_wc\' for __weak property \'wc\' must be __weak"}
		}
	},
	["err_while_loop_outside_of_a_function"]={
		[a]={{nil,A,"err_while_loop_outside_of_a_function"}},
		[b]={{nil,A,"while loop outside of a function"}},
		[c]={{nil,A,"while loop outside of a function"}},
		[d]=l,
		[e]="while loop outside of a function",
		[f]=k,
		[g]={{nil,A,s}},
		[h]={"edaae251cca0",1657642332,"[clang] better error message for while loops outside of control flow","[clang] better error message for while loops outside of control flow\n\nreport an error when encountering \'while\' token parsing declarator\n\n```\nclang/test/Parser/while-loop-outside-function.c:3:1: error: while loop outside of a function\nwhile // expected-error {{while loop outside of a function}}\n^\nclang/test/Parser/while-loop-outside-function.c:7:1: error: while loop outside of a function\nwhile // expected-error {{while loop outside of a function}}\n^\n```\n\nFixes: https://github.com/llvm/llvm-project/issues/34462\n\nDifferential Revision: https://reviews.llvm.org/D129573"},
		[i]={{D,6618,"/// ParseDirectDeclarator\n///       direct-declarator: [C99 6.7.5]\n/// [C99]   identifier\n///         \'(\' declarator \')\'\n/// [GNU]   \'(\' attributes declarator \')\'\n/// [C90]   direct-declarator \'[\' constant-expression[opt] \']\'\n/// [C99]   direct-declarator \'[\' type-qual-list[opt] assignment-expr[opt] \']\'\n/// [C99]   direct-declarator \'[\' \'static\' type-qual-list[opt] assign-expr \']\'\n/// [C99]   direct-declarator \'[\' type-qual-list \'static\' assignment-expr \']\'\n/// [C99]   direct-declarator \'[\' type-qual-list[opt] \'*\' \']\'\n/// [C++11] direct-declarator \'[\' constant-expression[opt] \']\'\n///                    attribute-specifier-seq[opt]\n///         direct-declarator \'(\' parameter-type-list \')\'\n///         direct-declarator \'(\' identifier-list[opt] \')\'\n/// [GNU]   direct-declarator \'(\' parameter-forward-declarations\n///                    parameter-type-list[opt] \')\'\n/// [C++]   direct-declarator \'(\' parameter-declaration-clause \')\'\n///                    cv-qualifier-seq[opt] exception-specification[opt]\n/// [C++11] direct-declarator \'(\' parameter-declaration-clause \')\'\n///                    attribute-specifier-seq[opt] cv-qualifier-seq[opt]\n///                    ref-qualifier[opt] exception-specification[opt]\n/// [C++]   declarator-id\n/// [C++11] declarator-id attribute-specifier-seq[opt]\n///\n///       declarator-id: [C++ 8]\n///         \'...\'[opt] id-expression\n///         \'::\'[opt] nested-name-specifier[opt] type-name\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/// C++17 adds the following, which we also handle here:\n///\n///       simple-declaration:\n///         <decl-spec> \'[\' identifier-list \']\' brace-or-equal-initializer \';\'\n///\n/// Note, any additional constructs added here may need corresponding changes\n/// in isConstructorDeclarator.\nvoid Parser::ParseDirectDeclarator(Declarator &D) {\n  // ...\n  if (Tok.is(tok::l_paren)) {\n  // ...\n  } else if (D.mayOmitIdentifier()) {\n  // ...\n  } else {\n    // ...\n    if (D.getContext() == DeclaratorContext::Member) {\n    // ...\n    } else {\n      if (Tok.getKind() == tok::TokenKind::kw_while) {\n        Diag(Tok, diag::err_while_loop_outside_of_a_function);"}},
		[j]={
			["clang/test/Parser/while-loop-outside-function.cpp"]={"clang/test/Parser/while-loop-outside-function.cpp:3:1: error: while loop outside of a function","clang/test/Parser/while-loop-outside-function.cpp:7:1: error: while loop outside of a function","clang/test/Parser/while-loop-outside-function.cpp:14:1: error: while loop outside of a function"}
		}
	},
	["err_wrong_sampler_addressspace"]={
		[a]="err_wrong_sampler_addressspace",
		[b]="sampler type cannot be used with the __local and __global address space qualifiers",
		[c]="sampler type cannot be used with the __local and __global address space qualifiers",
		[d]=l,
		[e]="sampler type cannot be used with the __local and __global address space qualifiers",
		[f]=k,
		[g]=m,
		[h]={"610541989a52",1360234547,"Add OpenCL samplers as Clang builtin types and check sampler related restrictions.","Add OpenCL samplers as Clang builtin types and check sampler related restrictions.\n\nllvm-svn: 174601"},
		[i]={{u,7384,"/// Returns true if there hasn\'t been any invalid type diagnosed.\nstatic bool diagnoseOpenCLTypes(Sema &Se, VarDecl *NewVD) {\n  // ...\n  if (R->isSamplerT()) {\n    // OpenCL v1.2 s6.9.b p4:\n    // The sampler type cannot be used with the __local and __global address\n    // space qualifiers.\n    if (R.getAddressSpace() == LangAS::opencl_local || R.getAddressSpace() == LangAS::opencl_global) {\n      Se.Diag(NewVD->getLocation(), diag::err_wrong_sampler_addressspace);"}},
		[j]={
			["clang/test/SemaOpenCL/sampler_t.cl"]={"clang/test/SemaOpenCL/sampler_t.cl:18:18: error: sampler type cannot be used with the __local and __global address space qualifiers","clang/test/SemaOpenCL/sampler_t.cl:19:24: error: sampler type cannot be used with the __local and __global address space qualifiers","clang/test/SemaOpenCL/sampler_t.cl:56:19: error: sampler type cannot be used with the __local and __global address space qualifiers"}
		}
	},
	["err_x86_builtin_invalid_rounding"]={
		[a]="err_x86_builtin_invalid_rounding",
		[b]="invalid rounding argument",
		[c]="invalid rounding argument",
		[d]=l,
		[e]="invalid rounding argument",
		[f]=k,
		[g]=m,
		[h]={"a7e253e8fb06",1474606111,"[AVX-512] Add initial support for checking rounding mode arguments of builtins.","[AVX-512] Add initial support for checking rounding mode arguments of builtins.\n\nThe backend can\'t encode all possible values of the argument and will fail isel. Checking in the frontend presents a friendlier experience to the user.\n\nI started with builtins that can only take _MM_CUR_DIRECTION or _MM_NO_EXC. More builtins coming in the future.\n\nllvm-svn: 282228"},
		[i]={{K,5790,"// Check if the rounding mode is legal.\nbool Sema::CheckX86BuiltinRoundingOrSAE(unsigned BuiltinID, CallExpr *TheCall) {\n  // ...\n  return Diag(TheCall->getBeginLoc(), diag::err_x86_builtin_invalid_rounding) << Arg->getSourceRange();"}},
		[j]={
			["clang/test/Sema/builtins-x86.c"]={"clang/test/Sema/builtins-x86.c:81:10: error: invalid rounding argument","clang/test/Sema/builtins-x86.c:98:10: error: invalid rounding argument","clang/test/Sema/builtins-x86.c:102:10: error: invalid rounding argument"}
		}
	},
	["err_x86_builtin_invalid_scale"]={
		[a]={{nil,E,"err_x86_builtin_invalid_scale"}},
		[b]={{nil,E,"scale argument must be 1, 2, 4, or 8"}},
		[c]={{nil,E,"scale argument must be 1, 2, 4, or 8"}},
		[d]=l,
		[e]="scale argument must be 1, 2, 4, or 8",
		[f]=k,
		[g]={{nil,E,m}},
		[h]={"df5beb2d6f83",1489425410,"[X86] Add checking of the scale argument to scatter/gather builtins","[X86] Add checking of the scale argument to scatter/gather builtins\n\nThe only valid values for scale immediate of scatter/gather builtins are 1, 2, 4, or 8. This patch enforces this in the frontend otherwise we generate invalid instruction encodings in the backend.\n\nDifferential Revision: https://reviews.llvm.org/D30875\n\nllvm-svn: 297642"},
		[i]={{K,5893,"// Check if the gather/scatter scale is legal.\nbool Sema::CheckX86BuiltinGatherScatterScale(unsigned BuiltinID, CallExpr *TheCall) {\n  // ...\n  return Diag(TheCall->getBeginLoc(), diag::err_x86_builtin_invalid_scale) << Arg->getSourceRange();"}},
		[j]={
			["clang/test/Sema/builtins-x86.c"]={"clang/test/Sema/builtins-x86.c:106:10: error: scale argument must be 1, 2, 4, or 8","clang/test/Sema/builtins-x86.c:110:3: error: scale argument must be 1, 2, 4, or 8"}
		}
	},
	["err_x86_builtin_tile_arg_duplicate"]={
		[a]={{nil,C,"err_x86_builtin_tile_arg_duplicate"}},
		[b]={{nil,C,"tile arguments must refer to different tiles"}},
		[c]={{nil,C,"tile arguments must refer to different tiles"}},
		[d]=l,
		[e]="tile arguments must refer to different tiles",
		[f]=k,
		[g]={{nil,C,m}},
		[h]={"14f6bfcb52e7",1582847864,"[clang] Implement objc_non_runtime_protocol to remove protocol metadata","[clang] Implement objc_non_runtime_protocol to remove protocol metadata\n\nSummary:\nMotivated by the new objc_direct attribute, this change adds a new\nattribute that remotes metadata from Protocols that the programmer knows\nisn\'t going to be used at runtime. We simply have the frontend skip\ngenerating any protocol metadata entries (e.g. OBJC_CLASS_NAME,\n_OBJC_$_PROTOCOL_INSTANCE_METHDOS, _OBJC_PROTOCOL, etc) for a protocol\nmarked with `__attribute__((objc_non_runtime_protocol))`.\n\nThere are a few APIs used to retrieve a protocol at runtime.\n`@protocol(SomeProtocol)` will now error out of the requested protocol\nis marked with attribute. `objc_getProtocol` will return `NULL` which\nis consistent with the behavior of a non-existing protocol.\n\nSubscribers: cfe-commits\n\nTags: #clang\n\nDifferential Revision: https://reviews.llvm.org/D75574"},
		[i]={{K,5926,"bool Sema::CheckX86BuiltinTileDuplicate(CallExpr *TheCall, ArrayRef<int> ArgNums) {\n  // ...\n  for (int ArgNum : ArgNums) {\n    // ...\n    if (ArgValues.test(ArgExtValue))\n      return Diag(TheCall->getBeginLoc(), diag::err_x86_builtin_tile_arg_duplicate) << TheCall->getArg(ArgNum)->getSourceRange();"}},
		[j]={
			["clang/test/CodeGen/X86/amxcomplex-errors.c"]={"clang/test/CodeGen/X86/amxcomplex-errors.c:10:3: error: tile arguments must refer to different tiles","clang/test/CodeGen/X86/amxcomplex-errors.c:17:3: error: tile arguments must refer to different tiles"}
		}
	},
	["err_zero_version"]={
		[a]="err_zero_version",
		[b]="version number must have non-zero major, minor, or sub-minor version",
		[c]="version number must have non-zero major, minor, or sub-minor version",
		[d]=l,
		[e]="version number must have non\\-zero major, minor, or sub\\-minor version",
		[f]=k,
		[g]=s,
		[h]={"20b2ebd78586",1300841403,"Implement a new \'availability\' attribute, that allows one to specify","Implement a new \'availability\' attribute, that allows one to specify\nwhich versions of an OS provide a certain facility. For example,\n\n  void foo()\n  __attribute__((availability(macosx,introduced=10.2,deprecated=10.4,obsoleted=10.6)));\n\nsays that the function \"foo\" was introduced in 10.2, deprecated in\n10.4, and completely obsoleted in 10.6. This attribute ties in with\nthe deployment targets (e.g., -mmacosx-version-min=10.1 specifies that\nwe want to deploy back to Mac OS X 10.1). There are several concrete\nbehaviors that this attribute enables, as illustrated with the\nfunction foo() above:\n\n  - If we choose a deployment target >= Mac OS X 10.4, uses of \"foo\"\n    will result in a deprecation warning, as if we had placed\n    attribute((deprecated)) on it (but with a better diagnostic)\n  - If we choose a deployment target >= Mac OS X 10.6, uses of \"foo\"\n    will result in an \"unavailable\" warning (in C)/error (in C++), as\n    if we had placed attribute((unavailable)) on it\n  - If we choose a deployment target prior to 10.2, foo() is\n    weak-imported (if it is a kind of entity that can be weak\n    imported), as if we had placed the weak_import attribute on it.\n\nNaturally, there can be multiple availability attributes on a\ndeclaration, for different platforms; only the current platform\nmatters when checking availability attributes.\n\nThe only platforms this attribute currently works for are \"ios\" and\n\"macosx\", since we already have -mxxxx-version-min flags for them and we\nhave experience there with macro tricks translating down to the\ndeprecated/unavailable/weak_import attributes. The end goal is to open\nthis up to other platforms, and even extension to other \"platforms\"\nthat are really libraries (say, through a #pragma clang\ndefine_system), but that hasn\'t yet been designed and we may want to\nshake out more issues with this narrower problem first.\n\nAddresses <rdar://problem/6690412>.\n\nAs a drive-by bug-fix, if an entity is both deprecated and\nunavailable, we only emit the \"unavailable\" diagnostic.\n\nllvm-svn: 128127"},
		[i]={{D,1037,"/// Parse a version number.\n///\n/// version:\n///   simple-integer\n///   simple-integer \'.\' simple-integer\n///   simple-integer \'_\' simple-integer\n///   simple-integer \'.\' simple-integer \'.\' simple-integer\n///   simple-integer \'_\' simple-integer \'_\' simple-integer\nVersionTuple Parser::ParseVersionTuple(SourceRange &Range) {\n  // ...\n  if (AfterMajor == ActualLength) {\n    // ...\n    // We only had a single version component.\n    if (Major == 0) {\n      Diag(Tok, diag::err_zero_version);"},{D,1066,"/// Parse a version number.\n///\n/// version:\n///   simple-integer\n///   simple-integer \'.\' simple-integer\n///   simple-integer \'_\' simple-integer\n///   simple-integer \'.\' simple-integer \'.\' simple-integer\n///   simple-integer \'_\' simple-integer \'_\' simple-integer\nVersionTuple Parser::ParseVersionTuple(SourceRange &Range) {\n  // ...\n  if (AfterMinor == ActualLength) {\n    // ...\n    // We had major.minor.\n    if (Major == 0 && Minor == 0) {\n      Diag(Tok, diag::err_zero_version);"}}
	},
	["error_cconv_unsupported"]={
		[a]={{nil,q,"error_cconv_unsupported"}},
		[b]={{nil,q,"%0 calling convention is not supported %select{for this target|on variadic function|on constructor/destructor|on builtin function}1"}},
		[c]={{nil,q,{"A calling convention is not supported ",{"for this target","on variadic function","on constructor/destructor","on builtin function"}}}},
		[d]=l,
		[e]="(.*?) calling convention is not supported (?:for this target|on variadic function|on constructor\\/destructor|on builtin function)",
		[f]=k,
		[g]={{nil,q,m}},
		[h]={"f4038e75d202",1563572314,"Disallow most calling convention attributes on PS4","Disallow most calling convention attributes on PS4\n\nPS4 now only allows \"cdecl\", and its equivalent on PS4, \"sysv_abi\".\n\nDifferential Revision: https://reviews.llvm.org/D64780\n\nllvm-svn: 366617"},
		[i]={{xb,5448,"bool Sema::CheckCallingConvAttr(const ParsedAttr &Attrs, CallingConv &CC, const FunctionDecl *FD) {\n  // ...\n  case TargetInfo::CCCR_Error:\n    Diag(Attrs.getLoc(), diag::error_cconv_unsupported) << Attrs << (int)CallingConventionIgnoredReason::ForThisTarget;"}},
		[j]={
			["clang/test/Sema/no_callconv.cpp"]={"clang/test/Sema/no_callconv.cpp:7:6: error: \'__vectorcall\' calling convention is not supported for this target","clang/test/Sema/no_callconv.cpp:8:6: error: \'__regcall\' calling convention is not supported for this target","clang/test/Sema/no_callconv.cpp:9:21: error: \'vectorcall\' calling convention is not supported for this target","clang/test/Sema/no_callconv.cpp:10:21: error: \'regcall\' calling convention is not supported for this target","clang/test/Sema/no_callconv.cpp:11:21: error: \'ms_abi\' calling convention is not supported for this target","clang/test/Sema/no_callconv.cpp:12:21: error: \'intel_ocl_bicc\' calling convention is not supported for this target","clang/test/Sema/no_callconv.cpp:13:21: error: \'swiftcall\' calling convention is not supported for this target","clang/test/Sema/no_callconv.cpp:14:21: error: \'swiftasynccall\' calling convention is not supported for this target","clang/test/Sema/no_callconv.cpp:15:21: error: \'pascal\' calling convention is not supported for this target","clang/test/Sema/no_callconv.cpp:16:21: error: \'preserve_most\' calling convention is not supported for this target","clang/test/Sema/no_callconv.cpp:17:21: error: \'preserve_all\' calling convention is not supported for this target","clang/test/Sema/no_callconv.cpp:18:21: error: \'stdcall\' calling convention is not supported for this target","clang/test/Sema/no_callconv.cpp:19:21: error: \'fastcall\' calling convention is not supported for this target","clang/test/Sema/no_callconv.cpp:20:21: error: \'thiscall\' calling convention is not supported for this target"}
		}
	},
	["error_duplicate_asm_operand_name"]={
		[a]={{nil,y,"error_duplicate_asm_operand_name"}},
		[b]={{nil,y,"duplicate use of asm operand name \"%0\""}},
		[c]={{nil,y,"duplicate use of asm operand name \"A\""}},
		[d]=l,
		[e]="duplicate use of asm operand name \"(.*?)\"",
		[f]=k,
		[g]={{nil,y,"Inline Assembly Issue"}},
		[h]={"954ec09aed4f",1559178346,"clang support gnu asm goto.","clang support gnu asm goto.\nSyntax:\n  asm [volatile] goto ( AssemblerTemplate\n                      :\n                      : InputOperands\n                      : Clobbers\n                      : GotoLabels)\n\nhttps://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html\n\nNew llvm IR is \"callbr\" for inline asm goto instead \"call\" for inline asm\nFor:\nasm goto(\"testl %0, %0; jne %l1;\" :: \"r\"(cond)::label_true, loop);\nIR:\ncallbr void asm sideeffect \"testl $0, $0; jne ${1:l};\", \"r,X,X,~{dirflag},~{fpsr},~{flags}\"(i32 %0, i8* blockaddress(@foo, %label_true), i8* blockaddress(@foo, %loop)) #1\n          to label %asm.fallthrough [label %label_true, label %loop], !srcloc !3\n\nasm.fallthrough:                                \n\nCompiler need to generate:\n1> a dummy constarint \'X\' for each label.\n2> an unique fallthrough label for each asm goto stmt \" asm.fallthrough%number\".\n\n\nDiagnostic \n1>	duplicate asm operand name are used in output, input and label.\n2>	goto out of scope.\n\nllvm-svn: 362045"},
		[i]={{"clang/lib/Sema/SemaStmtAsm.cpp",736,"StmtResult Sema::ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, bool IsVolatile, unsigned NumOutputs, unsigned NumInputs, IdentifierInfo **Names, MultiExprArg constraints, MultiExprArg Exprs, Expr *asmString, MultiExprArg clobbers, unsigned NumLabels, SourceLocation RParenLoc) {\n  // ...\n  if (Found != NamedOperandList.end()) {\n    Diag((Found + 1)->second->getBeginLoc(), diag::error_duplicate_asm_operand_name) << (Found + 1)->first;"}},
		[j]={
			["clang/test/Sema/asm.c"]={"clang/test/Sema/asm.c:300:29: error: duplicate use of asm operand name \"lab\"","clang/test/Sema/asm.c:303:69: error: duplicate use of asm operand name \"lab\"","clang/test/Sema/asm.c:309:40: error: duplicate use of asm operand name \"lab\"","clang/test/Sema/asm.c:312:42: error: duplicate use of asm operand name \"lab\""}
		}
	},
	["error_inoutput_conflict_with_clobber"]={
		[a]="error_inoutput_conflict_with_clobber",
		[b]="asm-specifier for input or output variable conflicts with asm clobber list",
		[c]="asm-specifier for input or output variable conflicts with asm clobber list",
		[d]=l,
		[e]="asm\\-specifier for input or output variable conflicts with asm clobber list",
		[f]=k,
		[g]=t,
		[h]={"c42fd03bf854",1482755022,"[inline-asm]No error for conflict between inputs\\outputs and clobber list","[inline-asm]No error for conflict between inputs\\outputs and clobber list\n\nAccording to extended asm syntax, a case where the clobber list includes a variable from the inputs or outputs should be an error - conflict.\nfor example:\n\nconst long double a = 0.0;\nint main()\n{\n\nchar b;\ndouble t1 = a;\n__asm__ (\"fucompp\": \"=a\" (b) : \"u\" (t1), \"t\" (t1) : \"cc\", \"st\", \"st(1)\");\n\nreturn 0;\n}\n\nThis should conflict with the output - t1 which is st, and st which is st aswell.\nThe patch fixes it.\n\nCommit on behald of Ziv Izhar.\n\nDifferential Revision: https://reviews.llvm.org/D15075\n\nllvm-svn: 290539"},
		[i]={{"clang/lib/Sema/SemaStmtAsm.cpp",717,"StmtResult Sema::ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, bool IsVolatile, unsigned NumOutputs, unsigned NumInputs, IdentifierInfo **Names, MultiExprArg constraints, MultiExprArg Exprs, Expr *asmString, MultiExprArg clobbers, unsigned NumLabels, SourceLocation RParenLoc) {\n  // ...\n  if (ConstraintLoc.isValid())\n    targetDiag(ConstraintLoc, diag::error_inoutput_conflict_with_clobber);"}},
		[j]={
			["clang/test/Sema/arm64-inline-asm.c"]={"clang/test/Sema/arm64-inline-asm.c:13:34: error: asm-specifier for input or output variable conflicts with asm clobber list","clang/test/Sema/arm64-inline-asm.c:14:35: error: asm-specifier for input or output variable conflicts with asm clobber list"}
		}
	},
	["error_subscript_overload"]={
		[a]={{nil,A,"error_subscript_overload"}},
		[b]="overloaded %0 cannot have %select{no|a defaulted|more than one}1 parameter before C++23",
		[c]={{nil,nil,{"overloaded A cannot have ",{"no","a defaulted","more than one"}," parameter before C++23"}},{B,A,{"overloaded A cannot have ",{"no","a defaulted","more than one"}," parameter before C++2b"}}},
		[d]=l,
		[e]="overloaded (.*?) cannot have (?:no|a defaulted|more than one) parameter before C\\+\\+23",
		[f]=k,
		[g]={{nil,A,m}},
		[h]={"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"},
		[i]={{r,16193,"/// 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]p8:\n  //   An operator function cannot have default arguments (8.3.6),\n  //   except where explicitly stated below.\n  //\n  // Only the function-call operator (C++ [over.call]p1) and the subscript\n  // operator (CWG2507) allow default arguments.\n  if (Op != OO_Call) {\n    // ...\n    if (FirstDefaultedParam) {\n      if (Op == OO_Subscript) {\n        Diag(FnDecl->getLocation(), LangOpts.CPlusPlus23 ? diag::ext_subscript_overload : diag::error_subscript_overload) << FnDecl->getDeclName() << 1 << FirstDefaultedParam->getDefaultArgRange();"},{r,16244,"#include \"clang/Basic/OperatorKinds.def\"\n  // ...\n  if (Op == OO_Subscript && NumParams != 2) {\n    Diag(FnDecl->getLocation(), LangOpts.CPlusPlus23 ? diag::ext_subscript_overload : diag::error_subscript_overload) << FnDecl->getDeclName() << (NumParams == 1 ? 0 : 2);"}},
		[j]={
			["clang/test/Parser/cxx2b-subscript.cpp"]={"clang/test/Parser/cxx2b-subscript.cpp:10:17: error: overloaded \'operator[]\' cannot have more than one parameter before C++23","clang/test/Parser/cxx2b-subscript.cpp:13:17: error: overloaded \'operator[]\' cannot have no parameter before C++23","clang/test/Parser/cxx2b-subscript.cpp:19:17: error: overloaded \'operator[]\' cannot have a defaulted parameter before C++23","clang/test/Parser/cxx2b-subscript.cpp:22:17: error: overloaded \'operator[]\' cannot have a defaulted parameter before C++23","clang/test/Parser/cxx2b-subscript.cpp:22:17: error: overloaded \'operator[]\' cannot have more than one parameter before C++23","clang/test/Parser/cxx2b-subscript.cpp:30:18: error: overloaded \'operator[]\' cannot have no parameter before C++23","clang/test/Parser/cxx2b-subscript.cpp:30:18: error: overloaded \'operator[]\' cannot have more than one parameter before C++23"}
		}
	},
	["escaped_newline_block_comment_end"]={
		[n]={"CL4","all","comment","comments","most"},
		[o]="comment",
		[a]="escaped_newline_block_comment_end",
		[b]="escaped newline between */ characters at block comment end",
		[c]="escaped newline between */ characters at block comment end",
		[d]=p,
		[e]="escaped newline between \\*\\/ characters at block comment end",
		[f]=" \\[(?:\\-Werror,)?\\-Wcomment[^\\]]*\\]",
		[g]=I,
		[h]={Q,1236199783,M,L},
		[i]={{kb,2695,"/// isBlockCommentEndOfEscapedNewLine - Return true if the specified newline\n/// character (either \\\\n or \\\\r) is part of an escaped newline sequence.  Issue\n/// a diagnostic if so.  We know that the newline is inside of a block comment.\nstatic bool isEndOfBlockCommentWithEscapedNewLine(const char *CurPtr, Lexer *L, bool Trigraphs) {\n  // ...\n  // Warn about having an escaped newline between the */ characters.\n  if (!L->isLexingRawMode())\n    L->Diag(CurPtr + 1, diag::escaped_newline_block_comment_end);"}},
		[j]={
			["clang/test/Lexer/comment-escape.c"]={"clang/test/Lexer/comment-escape.c:9:6: warning: escaped newline between */ characters at block comment end [-Wcomment]","clang/test/Lexer/comment-escape.c:14:6: warning: escaped newline between */ characters at block comment end [-Wcomment]","clang/test/Lexer/comment-escape.c:21:5: warning: escaped newline between */ characters at block comment end [-Wcomment]","clang/test/Lexer/comment-escape.c:26:5: warning: escaped newline between */ characters at block comment end [-Wcomment]"}
		}
	},
	["ext_abstract_pack_declarator_parens"]={
		[n]={"anonymous-pack-parens"},
		[o]="anonymous-pack-parens",
		[a]="ext_abstract_pack_declarator_parens",
		[b]="ISO C++11 requires a parenthesized pack declaration to have a name",
		[c]="ISO C++11 requires a parenthesized pack declaration to have a name",
		[d]=p,
		[e]="ISO C\\+\\+11 requires a parenthesized pack declaration to have a name",
		[f]=" \\[(?:\\-Werror,)?\\-Wanonymous\\-pack\\-parens[^\\]]*\\]",
		[g]=s,
		[h]={"b19337fbe474",1361391567,"PR15311: Finish implementation of the suggested resolution of core issue 1488,","PR15311: Finish implementation of the suggested resolution of core issue 1488,\nwhich allows grouping parens in an abstract-pack-declarator. This was already\nmostly implemented, but missed some cases. Add an ExtWarn for use of this\nextension until CWG ratifies it.\n\nllvm-svn: 175660"},
		[i]={{D,6590,"/// ParseDirectDeclarator\n///       direct-declarator: [C99 6.7.5]\n/// [C99]   identifier\n///         \'(\' declarator \')\'\n/// [GNU]   \'(\' attributes declarator \')\'\n/// [C90]   direct-declarator \'[\' constant-expression[opt] \']\'\n/// [C99]   direct-declarator \'[\' type-qual-list[opt] assignment-expr[opt] \']\'\n/// [C99]   direct-declarator \'[\' \'static\' type-qual-list[opt] assign-expr \']\'\n/// [C99]   direct-declarator \'[\' type-qual-list \'static\' assignment-expr \']\'\n/// [C99]   direct-declarator \'[\' type-qual-list[opt] \'*\' \']\'\n/// [C++11] direct-declarator \'[\' constant-expression[opt] \']\'\n///                    attribute-specifier-seq[opt]\n///         direct-declarator \'(\' parameter-type-list \')\'\n///         direct-declarator \'(\' identifier-list[opt] \')\'\n/// [GNU]   direct-declarator \'(\' parameter-forward-declarations\n///                    parameter-type-list[opt] \')\'\n/// [C++]   direct-declarator \'(\' parameter-declaration-clause \')\'\n///                    cv-qualifier-seq[opt] exception-specification[opt]\n/// [C++11] direct-declarator \'(\' parameter-declaration-clause \')\'\n///                    attribute-specifier-seq[opt] cv-qualifier-seq[opt]\n///                    ref-qualifier[opt] exception-specification[opt]\n/// [C++]   declarator-id\n/// [C++11] declarator-id attribute-specifier-seq[opt]\n///\n///       declarator-id: [C++ 8]\n///         \'...\'[opt] id-expression\n///         \'::\'[opt] nested-name-specifier[opt] type-name\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/// C++17 adds the following, which we also handle here:\n///\n///       simple-declaration:\n///         <decl-spec> \'[\' identifier-list \']\' brace-or-equal-initializer \';\'\n///\n/// Note, any additional constructs added here may need corresponding changes\n/// in isConstructorDeclarator.\nvoid Parser::ParseDirectDeclarator(Declarator &D) {\n  // ...\n  if (Tok.is(tok::l_paren)) {\n  // ...\n  } else if (D.mayOmitIdentifier()) {\n    // ...\n    // The grammar for abstract-pack-declarator does not allow grouping parens.\n    // FIXME: Revisit this once core issue 1488 is resolved.\n    if (D.hasEllipsis() && D.hasGroupingParens())\n      Diag(PP.getLocForEndOfToken(D.getEllipsisLoc()), diag::ext_abstract_pack_declarator_parens);"}},
		[j]={
			["clang/test/Parser/cxx0x-ambig.cpp"]={"clang/test/Parser/cxx0x-ambig.cpp:125:17: warning: ISO C++11 requires a parenthesized pack declaration to have a name [-Wanonymous-pack-parens]","clang/test/Parser/cxx0x-ambig.cpp:140:20: warning: ISO C++11 requires a parenthesized pack declaration to have a name [-Wanonymous-pack-parens]","clang/test/Parser/cxx0x-ambig.cpp:141:20: warning: ISO C++11 requires a parenthesized pack declaration to have a name [-Wanonymous-pack-parens]","clang/test/Parser/cxx0x-ambig.cpp:142:28: warning: ISO C++11 requires a parenthesized pack declaration to have a name [-Wanonymous-pack-parens]"}
		}
	},
	["ext_adl_only_template_id"]={
		[n]={J,cb},
		[o]=J,
		[a]={{nil,y,"ext_adl_only_template_id"}},
		[b]={{nil,q,"use of function template name with no prior declaration in function call with explicit template arguments is a C++20 extension"},{y,y,"use of function template name with no prior declaration in function call with explicit template arguments is a C++2a extension"}},
		[c]={{nil,q,"use of function template name with no prior declaration in function call with explicit template arguments is a C++20 extension"},{y,y,"use of function template name with no prior declaration in function call with explicit template arguments is a C++2a extension"}},
		[d]=p,
		[e]="use of function template name with no prior declaration in function call with explicit template arguments is a C\\+\\+20 extension",
		[f]=mb,
		[g]={{nil,y,m}},
		[h]={"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"},
		[i]={{v,7080,"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();"}},
		[j]={
			["clang/test/CXX/basic/basic.lookup/basic.lookup.unqual/p3.cpp"]={"clang/test/CXX/basic/basic.lookup/basic.lookup.unqual/p3.cpp:44:11: warning: use of function template name with no prior declaration in function call with explicit template arguments is a C++20 extension [-Wc++20-extensions]"}
		}
	},
	["ext_aggregate_init_not_constant"]={
		[n]={W,w},
		[o]=W,
		[a]="ext_aggregate_init_not_constant",
		[b]="initializer for aggregate is not a compile-time constant",
		[c]="initializer for aggregate is not a compile-time constant",
		[d]=p,
		[e]="initializer for aggregate is not a compile\\-time constant",
		[f]=vb,
		[g]=m,
		[h]={"1aac546d3108",1374490706,"Implement the part of C89 6.5.7 p3 requiring a constant initializer list","Implement the part of C89 6.5.7 p3 requiring a constant initializer list\nwhen initializing aggregate/union types, no matter if static or not.\n\nllvm-svn: 186817"},
		[i]={{u,13435,"/// AddInitializerToDecl - Adds the initializer Init to the\n/// declaration dcl. If DirectInit is true, this is C++ direct\n/// initialization rather than copy initialization.\nvoid Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, bool DirectInit) {\n  // ...\n  if (VDecl->isLocalVarDecl()) {\n    // Don\'t check the initializer if the declaration is malformed.\n    if (VDecl->isInvalidDecl()) {\n    // ...\n    } else if (VDecl->getType().getAddressSpace() == LangAS::opencl_constant) {\n    // ...\n    } else if (getLangOpts().CPlusPlus) {\n    // ...\n    } else if (VDecl->getStorageClass() == SC_Static) {\n    // ...\n    } else if (!getLangOpts().C99 && VDecl->getType()->isAggregateType() && isa<InitListExpr>(Init)) {\n      // ...\n      if (!Init->isConstantInitializer(Context, false, &Culprit)) {\n        Diag(Culprit->getExprLoc(), diag::ext_aggregate_init_not_constant) << Culprit->getSourceRange();"}},
		[j]={
			["clang/test/Sema/c89.c"]={"clang/test/Sema/c89.c:121:16: warning: initializer for aggregate is not a compile-time constant [-Wc99-extensions]","clang/test/Sema/c89.c:122:24: warning: initializer for aggregate is not a compile-time constant [-Wc99-extensions]"}
		}
	},
	["ext_alias_declaration"]={
		[n]={Kb,hb},
		[o]=hb,
		[a]="ext_alias_declaration",
		[b]="alias declarations are a C++11 extension",
		[c]="alias declarations are a C++11 extension",
		[d]=p,
		[e]="alias declarations are a C\\+\\+11 extension",
		[f]=Mb,
		[g]=s,
		[h]={"dda56e4b4a9c",1302877477,"Support for C++11 (non-template) alias declarations.","Support for C++11 (non-template) alias declarations.\n\nllvm-svn: 129567"},
		[i]={{Y,879,"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);"}},
		[j]={
			["clang/test/SemaHLSL/group_shared.hlsl"]={"clang/test/SemaHLSL/group_shared.hlsl:62:14: warning: alias declarations are a C++11 extension [-Wc++11-extensions]"}
		}
	},
	["ext_alias_in_init_statement"]={
		[n]={S,sb},
		[o]=S,
		[a]={{nil,T,"ext_alias_in_init_statement"}},
		[b]="alias declaration in this context is a C++23 extension",
		[c]="alias declaration in this context is a C++23 extension",
		[d]=p,
		[e]="alias declaration in this context is a C\\+\\+23 extension",
		[f]=ob,
		[g]={{nil,T,s}},
		[h]={rb,1612659633,qb,ub},
		[i]={{tb,2003,"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);"}},
		[j]={
			["clang/test/Parser/cxx2b-init-statement.cpp"]={"clang/test/Parser/cxx2b-init-statement.cpp:10:10: warning: alias declaration in this context is a C++23 extension [-Wc++23-extensions]","clang/test/Parser/cxx2b-init-statement.cpp:12:12: warning: alias declaration in this context is a C++23 extension [-Wc++23-extensions]","clang/test/Parser/cxx2b-init-statement.cpp:16:8: warning: alias declaration in this context is a C++23 extension [-Wc++23-extensions]"}
		}
	},
	["ext_alignof_expr"]={
		[n]={"gnu","gnu-alignof-expression"},
		[o]="gnu-alignof-expression",
		[a]="ext_alignof_expr",
		[b]="%0 applied to an expression is a GNU extension",
		[c]="A applied to an expression is a GNU extension",
		[d]=p,
		[e]="(.*?) applied to an expression is a GNU extension",
		[f]=" \\[(?:\\-Werror,)?\\-Wgnu\\-alignof\\-expression[^\\]]*\\]",
		[g]=s,
		[h]={"7dd5fe5ce60c",1359454698,"Produce a diagnostic if alignas is applied to an expression. Neither C11 nor","Produce a diagnostic if alignas is applied to an expression. Neither C11 nor\nC++11 allows that.\n\nllvm-svn: 173789"},
		[i]={{Eb,2529,"/// 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 (OpTok.isOneOf(tok::kw_alignof, tok::kw__Alignof))\n    Diag(OpTok, diag::ext_alignof_expr) << OpTok.getIdentifierInfo();"}},
		[j]={
			["clang/test/SemaCXX/alignof-sizeof-reference.cpp"]={"clang/test/SemaCXX/alignof-sizeof-reference.cpp:7:17: warning: \'alignof\' applied to an expression is a GNU extension [-Wgnu-alignof-expression]","clang/test/SemaCXX/alignof-sizeof-reference.cpp:23:9: warning: \'alignof\' applied to an expression is a GNU extension [-Wgnu-alignof-expression]"}
		}
	},
	["ext_anonymous_record_with_anonymous_type"]={
		[n]={"nested-anon-types",w},
		[o]="nested-anon-types",
		[a]="ext_anonymous_record_with_anonymous_type",
		[b]="anonymous types declared in an anonymous %select{struct|union}0 are an extension",
		[c]={{nil,nil,{"anonymous types declared in an anonymous ",{"struct","union"}," are an extension"}}},
		[d]=p,
		[e]="anonymous types declared in an anonymous (?:struct|union) are an extension",
		[f]=" \\[(?:\\-Werror,)?\\-Wnested\\-anon\\-types[^\\]]*\\]",
		[g]=m,
		[h]={"254d2666e435",1359334445,"Add a -pedantic warning: an anonymous union within an anonymous union is not","Add a -pedantic warning: an anonymous union within an anonymous union is not\npermitted in standard C++, despite being silently accepted by many (all?) major\nC++ implementations.\n\nllvm-svn: 173643"},
		[i]={{u,5635,"/// BuildAnonymousStructOrUnion - Handle the declaration of an\n/// anonymous structure or union. Anonymous unions are a C++ feature\n/// (C++ [class.union]) and a C11 feature; anonymous structures\n/// are a C11 feature and GNU C++ extension.\nDecl *Sema::BuildAnonymousStructOrUnion(Scope *S, DeclSpec &DS, AccessSpecifier AS, RecordDecl *Record, const PrintingPolicy &Policy) {\n  // ...\n  if (getLangOpts().CPlusPlus) {\n    // ...\n    // C++ [class.union]p2:\n    //   The member-specification of an anonymous union shall only\n    //   define non-static data members. [Note: nested types and\n    //   functions cannot be declared within an anonymous union. ]\n    for (auto *Mem : Record->decls()) {\n      // ...\n      if (auto *FD = dyn_cast<FieldDecl>(Mem)) {\n      // ...\n      } else if (Mem->isImplicit()) {\n      // ...\n      } else if (isa<TagDecl>(Mem) && Mem->getDeclContext() != Record) {\n      // ...\n      } else if (auto *MemRecord = dyn_cast<RecordDecl>(Mem)) {\n        if (!MemRecord->isAnonymousStructOrUnion() && MemRecord->getDeclName()) {\n        // ...\n        } else {\n          // ...\n          Diag(MemRecord->getLocation(), diag::ext_anonymous_record_with_anonymous_type) << Record->isUnion();"}},
		[j]={
			["clang/test/SemaCXX/anonymous-union.cpp"]={"clang/test/SemaCXX/anonymous-union.cpp:12:5: warning: anonymous types declared in an anonymous union are an extension [-Wnested-anon-types]","clang/test/SemaCXX/anonymous-union.cpp:113:5: warning: anonymous types declared in an anonymous union are an extension [-Wnested-anon-types]","clang/test/SemaCXX/anonymous-union.cpp:140:7: warning: anonymous types declared in an anonymous struct are an extension [-Wnested-anon-types]","clang/test/SemaCXX/anonymous-union.cpp:148:7: warning: anonymous types declared in an anonymous union are an extension [-Wnested-anon-types]","clang/test/SemaCXX/anonymous-union.cpp:199:7: warning: anonymous types declared in an anonymous union are an extension [-Wnested-anon-types]"}
		}
	},
	["ext_anonymous_record_with_type"]={
		[n]={Ub,"microsoft-anon-tag",w},
		[o]="microsoft-anon-tag",
		[a]="ext_anonymous_record_with_type",
		[b]="types declared in an anonymous %select{struct|union}0 are a Microsoft extension",
		[c]={{nil,nil,{"types declared in an anonymous ",{"struct","union"}," are a Microsoft extension"}}},
		[d]=p,
		[e]="types declared in an anonymous (?:struct|union) are a Microsoft extension",
		[f]=" \\[(?:\\-Werror,)?\\-Wmicrosoft\\-anon\\-tag[^\\]]*\\]",
		[g]=m,
		[h]={"4ad4b5863947",1283945545,"Allow type definitions inside anonymous struct/union in Microsoft mode.","Allow type definitions inside anonymous struct/union in Microsoft mode.\n\nllvm-svn: 113354"},
		[i]={{u,5622,"/// BuildAnonymousStructOrUnion - Handle the declaration of an\n/// anonymous structure or union. Anonymous unions are a C++ feature\n/// (C++ [class.union]) and a C11 feature; anonymous structures\n/// are a C11 feature and GNU C++ extension.\nDecl *Sema::BuildAnonymousStructOrUnion(Scope *S, DeclSpec &DS, AccessSpecifier AS, RecordDecl *Record, const PrintingPolicy &Policy) {\n  // ...\n  if (getLangOpts().CPlusPlus) {\n    // ...\n    // C++ [class.union]p2:\n    //   The member-specification of an anonymous union shall only\n    //   define non-static data members. [Note: nested types and\n    //   functions cannot be declared within an anonymous union. ]\n    for (auto *Mem : Record->decls()) {\n      // ...\n      if (auto *FD = dyn_cast<FieldDecl>(Mem)) {\n      // ...\n      } else if (Mem->isImplicit()) {\n      // ...\n      } else if (isa<TagDecl>(Mem) && Mem->getDeclContext() != Record) {\n      // ...\n      } else if (auto *MemRecord = dyn_cast<RecordDecl>(Mem)) {\n        if (!MemRecord->isAnonymousStructOrUnion() && MemRecord->getDeclName()) {\n          // Visual C++ allows type definition in anonymous struct or union.\n          if (getLangOpts().MicrosoftExt)\n            Diag(MemRecord->getLocation(), diag::ext_anonymous_record_with_type) << Record->isUnion();"},{u,5656,"/// BuildAnonymousStructOrUnion - Handle the declaration of an\n/// anonymous structure or union. Anonymous unions are a C++ feature\n/// (C++ [class.union]) and a C11 feature; anonymous structures\n/// are a C11 feature and GNU C++ extension.\nDecl *Sema::BuildAnonymousStructOrUnion(Scope *S, DeclSpec &DS, AccessSpecifier AS, RecordDecl *Record, const PrintingPolicy &Policy) {\n  // ...\n  if (getLangOpts().CPlusPlus) {\n    // ...\n    // C++ [class.union]p2:\n    //   The member-specification of an anonymous union shall only\n    //   define non-static data members. [Note: nested types and\n    //   functions cannot be declared within an anonymous union. ]\n    for (auto *Mem : Record->decls()) {\n      // ...\n      if (auto *FD = dyn_cast<FieldDecl>(Mem)) {\n      // ...\n      } else if (Mem->isImplicit()) {\n      // ...\n      } else if (isa<TagDecl>(Mem) && Mem->getDeclContext() != Record) {\n      // ...\n      } else if (auto *MemRecord = dyn_cast<RecordDecl>(Mem)) {\n      // ...\n      } else if (isa<AccessSpecDecl>(Mem)) {\n      // ...\n      } else if (isa<StaticAssertDecl>(Mem)) {\n      // ...\n      } else {\n        // ...\n        // Visual C++ allows type definition in anonymous struct or union.\n        if (getLangOpts().MicrosoftExt && DK == diag::err_anonymous_record_with_type)\n          Diag(Mem->getLocation(), diag::ext_anonymous_record_with_type) << Record->isUnion();"}},
		[j]={
			["clang/test/SemaCXX/MicrosoftExtensions.cpp"]={"clang/test/SemaCXX/MicrosoftExtensions.cpp:15:12: warning: types declared in an anonymous union are a Microsoft extension [-Wmicrosoft-anon-tag]","clang/test/SemaCXX/MicrosoftExtensions.cpp:20:11: warning: types declared in an anonymous union are a Microsoft extension [-Wmicrosoft-anon-tag]","clang/test/SemaCXX/MicrosoftExtensions.cpp:26:17: warning: types declared in an anonymous union are a Microsoft extension [-Wmicrosoft-anon-tag]","clang/test/SemaCXX/MicrosoftExtensions.cpp:27:12: warning: types declared in an anonymous union are a Microsoft extension [-Wmicrosoft-anon-tag]","clang/test/SemaCXX/MicrosoftExtensions.cpp:34:12: warning: types declared in an anonymous struct are a Microsoft extension [-Wmicrosoft-anon-tag]","clang/test/SemaCXX/MicrosoftExtensions.cpp:39:8: warning: types declared in an anonymous struct are a Microsoft extension [-Wmicrosoft-anon-tag]","clang/test/SemaCXX/MicrosoftExtensions.cpp:45:17: warning: types declared in an anonymous struct are a Microsoft extension [-Wmicrosoft-anon-tag]","clang/test/SemaCXX/MicrosoftExtensions.cpp:46:12: warning: types declared in an anonymous struct are a Microsoft extension [-Wmicrosoft-anon-tag]"}
		}
	},
	["ext_anonymous_struct_union_qualified"]={
		[n]={w},
		[o]=w,
		[a]="ext_anonymous_struct_union_qualified",
		[b]="anonymous %select{struct|union}0 cannot be \'%1\'",
		[c]={{nil,nil,{"anonymous ",{"struct","union"}," cannot be \'B\'"}}},
		[d]=p,
		[e]="anonymous (?:struct|union) cannot be \'(.*?)\'",
		[f]=" \\[(?:\\-Werror,)?\\-Wpedantic[^\\]]*\\]",
		[g]=m,
		[h]={"0f8bc97abd6d",1304982333,"Ignore const/volatile/restrict qualifiers on anonymous structs and","Ignore const/volatile/restrict qualifiers on anonymous structs and\nunions. Fixes PR8326.\n\nllvm-svn: 131109"},
		[i]={{u,5556,"/// BuildAnonymousStructOrUnion - Handle the declaration of an\n/// anonymous structure or union. Anonymous unions are a C++ feature\n/// (C++ [class.union]) and a C11 feature; anonymous structures\n/// are a C11 feature and GNU C++ extension.\nDecl *Sema::BuildAnonymousStructOrUnion(Scope *S, DeclSpec &DS, AccessSpecifier AS, RecordDecl *Record, const PrintingPolicy &Policy) {\n  // ...\n  if (getLangOpts().CPlusPlus) {\n    // ...\n    // Ignore const/volatile/restrict qualifiers.\n    if (DS.getTypeQualifiers()) {\n      if (DS.getTypeQualifiers() & DeclSpec::TQ_const)\n        Diag(DS.getConstSpecLoc(), diag::ext_anonymous_struct_union_qualified) << Record->isUnion() << \"const\" << FixItHint::CreateRemoval(DS.getConstSpecLoc());"},{u,5561,"/// BuildAnonymousStructOrUnion - Handle the declaration of an\n/// anonymous structure or union. Anonymous unions are a C++ feature\n/// (C++ [class.union]) and a C11 feature; anonymous structures\n/// are a C11 feature and GNU C++ extension.\nDecl *Sema::BuildAnonymousStructOrUnion(Scope *S, DeclSpec &DS, AccessSpecifier AS, RecordDecl *Record, const PrintingPolicy &Policy) {\n  // ...\n  if (getLangOpts().CPlusPlus) {\n    // ...\n    // Ignore const/volatile/restrict qualifiers.\n    if (DS.getTypeQualifiers()) {\n      // ...\n      if (DS.getTypeQualifiers() & DeclSpec::TQ_volatile)\n        Diag(DS.getVolatileSpecLoc(), diag::ext_anonymous_struct_union_qualified) << Record->isUnion() << \"volatile\" << FixItHint::CreateRemoval(DS.getVolatileSpecLoc());"},{u,5566,"/// BuildAnonymousStructOrUnion - Handle the declaration of an\n/// anonymous structure or union. Anonymous unions are a C++ feature\n/// (C++ [class.union]) and a C11 feature; anonymous structures\n/// are a C11 feature and GNU C++ extension.\nDecl *Sema::BuildAnonymousStructOrUnion(Scope *S, DeclSpec &DS, AccessSpecifier AS, RecordDecl *Record, const PrintingPolicy &Policy) {\n  // ...\n  if (getLangOpts().CPlusPlus) {\n    // ...\n    // Ignore const/volatile/restrict qualifiers.\n    if (DS.getTypeQualifiers()) {\n      // ...\n      if (DS.getTypeQualifiers() & DeclSpec::TQ_restrict)\n        Diag(DS.getRestrictSpecLoc(), diag::ext_anonymous_struct_union_qualified) << Record->isUnion() << \"restrict\" << FixItHint::CreateRemoval(DS.getRestrictSpecLoc());"},{u,5571,"/// BuildAnonymousStructOrUnion - Handle the declaration of an\n/// anonymous structure or union. Anonymous unions are a C++ feature\n/// (C++ [class.union]) and a C11 feature; anonymous structures\n/// are a C11 feature and GNU C++ extension.\nDecl *Sema::BuildAnonymousStructOrUnion(Scope *S, DeclSpec &DS, AccessSpecifier AS, RecordDecl *Record, const PrintingPolicy &Policy) {\n  // ...\n  if (getLangOpts().CPlusPlus) {\n    // ...\n    // Ignore const/volatile/restrict qualifiers.\n    if (DS.getTypeQualifiers()) {\n      // ...\n      if (DS.getTypeQualifiers() & DeclSpec::TQ_atomic)\n        Diag(DS.getAtomicSpecLoc(), diag::ext_anonymous_struct_union_qualified) << Record->isUnion() << \"_Atomic\" << FixItHint::CreateRemoval(DS.getAtomicSpecLoc());"},{u,5576,"/// BuildAnonymousStructOrUnion - Handle the declaration of an\n/// anonymous structure or union. Anonymous unions are a C++ feature\n/// (C++ [class.union]) and a C11 feature; anonymous structures\n/// are a C11 feature and GNU C++ extension.\nDecl *Sema::BuildAnonymousStructOrUnion(Scope *S, DeclSpec &DS, AccessSpecifier AS, RecordDecl *Record, const PrintingPolicy &Policy) {\n  // ...\n  if (getLangOpts().CPlusPlus) {\n    // ...\n    // Ignore const/volatile/restrict qualifiers.\n    if (DS.getTypeQualifiers()) {\n      // ...\n      if (DS.getTypeQualifiers() & DeclSpec::TQ_unaligned)\n        Diag(DS.getUnalignedSpecLoc(), diag::ext_anonymous_struct_union_qualified) << Record->isUnion() << \"__unaligned\" << FixItHint::CreateRemoval(DS.getUnalignedSpecLoc());"}},
		[j]={
			["clang/test/SemaCXX/anonymous-union.cpp"]={"clang/test/SemaCXX/anonymous-union.cpp:198:5: warning: anonymous union cannot be \'const\' [-Wpedantic]"}
		}
	},
	["ext_anonymous_union"]={
		[n]={Fb,w},
		[o]=Fb,
		[a]="ext_anonymous_union",
		[b]="anonymous unions are a C11 extension",
		[c]="anonymous unions are a C11 extension",
		[d]=p,
		[e]="anonymous unions are a C11 extension",
		[f]=" \\[(?:\\-Werror,)?\\-Wc11\\-extensions[^\\]]*\\]",
		[g]=m,
		[h]={O,1237025389,N,P},
		[i]={{u,5508,"/// BuildAnonymousStructOrUnion - Handle the declaration of an\n/// anonymous structure or union. Anonymous unions are a C++ feature\n/// (C++ [class.union]) and a C11 feature; anonymous structures\n/// are a C11 feature and GNU C++ extension.\nDecl *Sema::BuildAnonymousStructOrUnion(Scope *S, DeclSpec &DS, AccessSpecifier AS, RecordDecl *Record, const PrintingPolicy &Policy) {\n  // ...\n  // Diagnose whether this anonymous struct/union is an extension.\n  if (Record->isUnion() && !getLangOpts().CPlusPlus && !getLangOpts().C11)\n    Diag(Record->getLocation(), diag::ext_anonymous_union);"}},
		[j]={
			["clang/test/Sema/anonymous-struct-union-c11.c"]={"clang/test/Sema/anonymous-struct-union-c11.c:16:3: warning: anonymous unions are a C11 extension [-Wc11-extensions]"}
		}
	},
	["ext_array_init_copy"]={
		[n]={"gnu","gnu-compound-literal-initializer",w},
		[o]="gnu-compound-literal-initializer",
		[a]="ext_array_init_copy",
		[b]="initialization of an array %diff{of type $ from a compound literal of type $|from a compound literal}0,1 is a GNU extension",
		[c]={{nil,nil,{"initialization of an array ",{"of type A from a compound literal of type B","from a compound literal"}," is a GNU extension"}}},
		[d]=p,
		[e]="initialization of an array (?:of type (.*?) from a compound literal of type (.*?)|from a compound literal) is a GNU extension",
		[f]=" \\[(?:\\-Werror,)?\\-Wgnu\\-compound\\-literal\\-initializer[^\\]]*\\]",
		[g]=m,
		[h]={"e2f943b5cb44",1298399391,"Implement the GNU C extension which permits the initialization of an","Implement the GNU C extension which permits the initialization of an\narray from a constant array compound literal. Fixes PR9261.\n\nllvm-svn: 126230"},
		[i]={{nb,9223,"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_GNUArrayInit:\n      // ...\n      S.Diag(Kind.getLocation(), diag::ext_array_init_copy) << Step->Type << CurInit.get()->getType() << CurInit.get()->getSourceRange();"}},
		[j]={
			["clang/test/Sema/array-init.c"]={"clang/test/Sema/array-init.c:284:5: warning: initialization of an array of type \'int[5]\' from a compound literal of type \'int[5]\' is a GNU extension [-Wgnu-compound-literal-initializer]","clang/test/Sema/array-init.c:285:5: warning: initialization of an array of type \'int[5]\' from a compound literal of type \'int[5]\' is a GNU extension [-Wgnu-compound-literal-initializer]","clang/test/Sema/array-init.c:286:5: warning: initialization of an array of type \'int[]\' from a compound literal of type \'int[5]\' is a GNU extension [-Wgnu-compound-literal-initializer]","clang/test/Sema/array-init.c:287:5: warning: initialization of an array of type \'int[]\' from a compound literal of type \'int[5]\' is a GNU extension [-Wgnu-compound-literal-initializer]","clang/test/Sema/array-init.c:288:5: warning: initialization of an array of type \'int[]\' from a compound literal of type \'int5\' (aka \'int[5]\') is a GNU extension [-Wgnu-compound-literal-initializer]"}
		}
	},
	["ext_array_init_parens"]={
		[n]={"gnu-array-member-paren-init"},
		[o]="gnu-array-member-paren-init",
		[a]="ext_array_init_parens",
		[b]="parenthesized initialization of a member array is a GNU extension",
		[c]="parenthesized initialization of a member array is a GNU extension",
		[d]="(?:error|warning|fatal error)\\: ",
		[e]="parenthesized initialization of a member array is a GNU extension",
		[f]=" \\[[^\\]]*\\-Wgnu\\-array\\-member\\-paren\\-init[^\\]]*\\]",
		[g]=m,
		[h]={"ebeed415870b",1329345489,"Support GCC\'s bug^Wextension allowing class array members to be initalized by a","Support GCC\'s bug^Wextension allowing class array members to be initalized by a\nparenthesized braced-init-list in the base/member initialization list.\n\nllvm-svn: 150625"},
		[i]={{nb,9249,"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_ParenthesizedArrayInit:\n      // ...\n      S.Diag(Kind.getLocation(), diag::ext_array_init_parens) << CurInit.get()->getSourceRange();"}},
		[j]={
			["clang/test/SemaCXX/cxx0x-initializer-aggregates.cpp"]={"clang/test/SemaCXX/cxx0x-initializer-aggregates.cpp:73:28: error: parenthesized initialization of a member array is a GNU extension [-Wgnu-array-member-paren-init]"}
		}
	},
	["ext_array_size_conversion"]={
		[n]={Kb,hb,w},
		[o]=hb,
		[a]="ext_array_size_conversion",
		[b]="implicit conversion from array size expression of type %0 to %select{integral|enumeration}1 type %2 is a C++11 extension",
		[c]={{nil,nil,{"implicit conversion from array size expression of type A to ",{"integral","enumeration"}," type C is a C++11 extension"}}},
		[d]=p,
		[e]="implicit conversion from array size expression of type (.*?) to (?:integral|enumeration) type (.*?) is a C\\+\\+11 extension",
		[f]=Mb,
		[g]=m,
		[h]={"4799d03ce841",1277857243,"Implement C++ DR299, which allows an implicit conversion from a class","Implement C++ DR299, which allows an implicit conversion from a class\ntype to an integral or enumeration type in the size of an array new\nexpression, e.g.,\n\n  new int[ConvertibleToInt(10)];\n\nThis is a GNU and C++0x extension.\n\nllvm-svn: 107229"},
		[i]={{R,2187,"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; }"}},
		[j]={
			["clang/test/SemaCXX/new-array-size-conv.cpp"]={"clang/test/SemaCXX/new-array-size-conv.cpp:25:9: warning: implicit conversion from array size expression of type \'ValueInt\' to integral type \'int\' is a C++11 extension [-Wc++11-extensions]","clang/test/SemaCXX/new-array-size-conv.cpp:30:9: warning: implicit conversion from array size expression of type \'ValueEnum\' to enumeration type \'E\' is a C++11 extension [-Wc++11-extensions]"}
		}
	},
	["ext_auto_new_list_init"]={
		[n]={ib,Ib,w},
		[o]=ib,
		[a]={{nil,z,"ext_auto_new_list_init"}},
		[b]={{nil,z,"ISO C++ standards before C++17 do not allow new expression for type %0 to use list-initialization"}},
		[c]={{nil,z,"ISO C++ standards before C++17 do not allow new expression for type A to use list-initialization"}},
		[d]=p,
		[e]="ISO C\\+\\+ standards before C\\+\\+17 do not allow new expression for type (.*?) to use list\\-initialization",
		[f]=Nb,
		[g]={{nil,z,m}},
		[h]={"00c9dfdfd094",1513016994,"P0620 follow-up: deducing `auto` from braced-init-list in new expr","P0620 follow-up: deducing `auto` from braced-init-list in new expr\n\nSummary:\nThis is a side-effect brought in by p0620r0, which allows other placeholder types (derived from `auto` and `decltype(auto)`) to be usable in a `new` expression with a single-clause //braced-init-list// as its initializer (8.3.4 [expr.new]/2).  N3922 defined its semantics.\n\nReferences:\n http://wg21.link/p0620r0\n http://wg21.link/n3922\n\nReviewers: rsmith, aaron.ballman\n\nReviewed By: rsmith\n\nSubscribers: cfe-commits\n\nDifferential Revision: https://reviews.llvm.org/D39451\n\nllvm-svn: 320401"},
		[i]={{R,2060,"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 (Deduced && !Deduced->isDeduced() && isa<DeducedTemplateSpecializationType>(Deduced)) {\n  // ...\n  } else if (Deduced && !Deduced->isDeduced()) {\n    // ...\n    if (Braced && !getLangOpts().CPlusPlus17)\n      Diag(Initializer->getBeginLoc(), diag::ext_auto_new_list_init) << AllocType << TypeRange;"}},
		[j]={
			["clang/test/CXX/expr/expr.unary/expr.new/p2-cxx14.cpp"]={"clang/test/CXX/expr/expr.unary/expr.new/p2-cxx14.cpp:5:12: warning: ISO C++ standards before C++17 do not allow new expression for type \'auto\' to use list-initialization [-Wc++17-extensions]"}
		}
	},
	["ext_auto_storage_class"]={
		[n]={"auto-storage-class"},
		[o]="auto-storage-class",
		[a]="ext_auto_storage_class",
		[b]="\'auto\' storage class specifier is not permitted in C++11, and will not be supported in future releases",
		[c]="\'auto\' storage class specifier is not permitted in C++11, and will not be supported in future releases",
		[d]=p,
		[e]="\'auto\' storage class specifier is not permitted in C\\+\\+11, and will not be supported in future releases",
		[f]=" \\[(?:\\-Werror,)?\\-Wauto\\-storage\\-class[^\\]]*\\]",
		[g]=s,
		[h]={"58c743370994",1315166054,"PR10458: Finesse behaviour of C++0x features when in pre-0x mode. Accept for-range and auto with an ...","PR10458: Finesse behaviour of C++0x features when in pre-0x mode. Accept for-range and auto with an ExtWarn, and produce a -Wc++0x-compat warning in C++98 mode when auto is used as a storage class.\n\nllvm-svn: 139102"},
		[i]={{D,3969,"/// 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_auto:\n      if (getLangOpts().CPlusPlus11) {\n        if (isKnownToBeTypeSpecifier(GetLookAheadToken(1))) {\n          // ...\n          if (!isInvalid)\n            Diag(Tok, diag::ext_auto_storage_class) << FixItHint::CreateRemoval(DS.getStorageClassSpecLoc());"}},
		[j]={
			["clang/test/SemaCXX/auto-cxx0x.cpp"]={"clang/test/SemaCXX/auto-cxx0x.cpp:4:3: warning: \'auto\' storage class specifier is not permitted in C++11, and will not be supported in future releases [-Wauto-storage-class]"}
		}
	},
	["ext_auto_type"]={
		[n]={"gnu","gnu-auto-type",w},
		[o]="gnu-auto-type",
		[a]="ext_auto_type",
		[b]="\'__auto_type\' is a GNU extension",
		[c]="\'__auto_type\' is a GNU extension",
		[d]=p,
		[e]="\'__auto_type\' is a GNU extension",
		[f]=" \\[(?:\\-Werror,)?\\-Wgnu\\-auto\\-type[^\\]]*\\]",
		[g]=s,
		[h]={"e301ba2b4891",1447207335,"Add support for GCC\'s \'__auto_type\' extension, per the GCC manual:","Add support for GCC\'s \'__auto_type\' extension, per the GCC manual:\nhttps://gcc.gnu.org/onlinedocs/gcc/Typeof.html\n\nDifferences from the GCC extension:\n * __auto_type is also permitted in C++ (but only in places where\n   it could appear in C), allowing its use in headers that might\n   be shared across C and C++, or used from C++98\n * __auto_type can be combined with a declarator, as with C++ auto\n   (for instance, \"__auto_type *p\")\n * multiple variables can be declared in a single __auto_type\n   declaration, with the C++ semantics (the deduced type must be\n   the same in each case)\n\nThis patch also adds a missing restriction on applying typeof to\na bit-field, which GCC has historically rejected in C (due to\nlack of clarity as to whether the operand should be promoted).\nThe same restriction also applies to __auto_type in C (in both\nGCC and Clang).\n\nThis also fixes PR25449.\n\nPatch by Nicholas Allegra!\n\nllvm-svn: 252690"},
		[i]={{D,3980,"/// 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___auto_type:\n      Diag(Tok, diag::ext_auto_type);"}},
		[j]={
			["clang/test/Sema/auto-type.c"]={"clang/test/Sema/auto-type.c:3:1: warning: \'__auto_type\' is a GNU extension [-Wgnu-auto-type]"}
		}
	},
	["ext_auto_type_specifier"]={
		[n]={Kb,hb},
		[o]=hb,
		[a]="ext_auto_type_specifier",
		[b]="\'auto\' type specifier is a C++11 extension",
		[c]="\'auto\' type specifier is a C++11 extension",
		[d]=p,
		[e]="\'auto\' type specifier is a C\\+\\+11 extension",
		[f]=Mb,
		[g]=m,
		[h]={"58c743370994",1315166054,"PR10458: Finesse behaviour of C++0x features when in pre-0x mode. Accept for-range and auto with an ...","PR10458: Finesse behaviour of C++0x features when in pre-0x mode. Accept for-range and auto with an ExtWarn, and produce a -Wc++0x-compat warning in C++98 mode when auto is used as a storage class.\n\nllvm-svn: 139102"},
		[i]={{"clang/lib/Sema/DeclSpec.cpp",1369,"/// 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  // Diagnose if we\'ve recovered from an ill-formed \'auto\' storage class\n  // specifier in a pre-C++11 dialect of C++.\n  if (!S.getLangOpts().CPlusPlus11 && TypeSpecType == TST_auto)\n    S.Diag(TSTLoc, diag::ext_auto_type_specifier);"}},
		[j]={
			["clang/test/SemaHLSL/group_shared.hlsl"]={"clang/test/SemaHLSL/group_shared.hlsl:77:1: warning: \'auto\' type specifier is a C++11 extension [-Wc++11-extensions]"}
		}
	},
	["ext_bad_cxx_cast_qualifiers_away_incoherent"]={
		[n]={"cast-qual-unrelated"},
		[o]="cast-qual-unrelated",
		[a]={{nil,bb,"ext_bad_cxx_cast_qualifiers_away_incoherent"}},
		[b]={{nil,C,"ISO C++ does not allow %select{const_cast|static_cast|reinterpret_cast|dynamic_cast|C-style cast|functional-style cast|}0 from %1 to %2 because it casts away qualifiers, even though the source and destination types are unrelated"},{q,bb,"ISO C++ does not allow %select{const_cast|static_cast|reinterpret_cast|dynamic_cast|C-style cast|functional-style cast}0 from %1 to %2 because it casts away qualifiers, even though the source and destination types are unrelated"}},
		[c]={{nil,C,{"ISO C++ does not allow ",{"const_cast","static_cast","reinterpret_cast","dynamic_cast","C-style cast","functional-style cast",k}," from B to C because it casts away qualifiers, even though the source and destination types are unrelated"}},{q,bb,{"ISO C++ does not allow ",{"const_cast","static_cast","reinterpret_cast","dynamic_cast","C-style cast","functional-style cast"}," from B to C because it casts away qualifiers, even though the source and destination types are unrelated"}}},
		[d]=p,
		[e]="ISO C\\+\\+ does not allow (?:const_cast|static_cast|reinterpret_cast|dynamic_cast|C\\-style cast|functional\\-style cast|) from (.*?) to (.*?) because it casts away qualifiers, even though the source and destination types are unrelated",
		[f]=" \\[(?:\\-Werror,)?\\-Wcast\\-qual\\-unrelated[^\\]]*\\]",
		[g]={{nil,bb,m}},
		[h]={"f276e2dc4618",1531263875,"Fix determination of whether a reinterpret_cast casts away constness.","Fix determination of whether a reinterpret_cast casts away constness.\n\nThe \"casts away constness\" check doesn\'t care at all how the different\nlayers of the source and destination type were formed: for example, if\nthe source is a pointer and the destination is a pointer-to-member, the\ntypes are still decomposed and their pointee qualifications are still\nchecked.\n\nThis rule is bizarre and somewhat ridiculous, so as an extension we\naccept code making use of such reinterpret_casts with a warning outside\nof SFINAE contexts.\n\nllvm-svn: 336738"},
		[i]={{Hb,771,"static TryCastResult getCastAwayConstnessCastKind(CastAwayConstnessKind CACK, unsigned &DiagID) {\n  // ...\n  case CastAwayConstnessKind::CACK_Incoherent:\n    DiagID = diag::ext_bad_cxx_cast_qualifiers_away_incoherent;"}},
		[j]={
			["clang/test/CXX/expr/expr.post/expr.reinterpret.cast/p2.cpp"]={"clang/test/CXX/expr/expr.post/expr.reinterpret.cast/p2.cpp:15:9: warning: ISO C++ does not allow reinterpret_cast from \'const int *X::*Y::**\' to \'double Y::*X::***\' because it casts away qualifiers, even though the source and destination types are unrelated [-Wcast-qual-unrelated]","clang/test/CXX/expr/expr.post/expr.reinterpret.cast/p2.cpp:18:9: warning: ISO C++ does not allow reinterpret_cast from \'const int *X::*Y::**\' to \'const volatile double Y::*X::***\' because it casts away qualifiers, even though the source and destination types are unrelated [-Wcast-qual-unrelated]","clang/test/CXX/expr/expr.post/expr.reinterpret.cast/p2.cpp:19:9: warning: ISO C++ does not allow reinterpret_cast from \'const int *X::*Y::**\' to \'const volatile double Y::*const X::*const **\' because it casts away qualifiers, even though the source and destination types are unrelated [-Wcast-qual-unrelated]","clang/test/CXX/expr/expr.post/expr.reinterpret.cast/p2.cpp:20:9: warning: ISO C++ does not allow reinterpret_cast from \'const int *X::*Y::**\' to \'const volatile double Y::*const X::**const *\' because it casts away qualifiers, even though the source and destination types are unrelated [-Wcast-qual-unrelated]","clang/test/CXX/expr/expr.post/expr.reinterpret.cast/p2.cpp:21:9: warning: ISO C++ does not allow reinterpret_cast from \'const int *X::*Y::**\' to \'const volatile double Y::*X::*const *const *\' because it casts away qualifiers, even though the source and destination types are unrelated [-Wcast-qual-unrelated]","clang/test/CXX/expr/expr.post/expr.reinterpret.cast/p2.cpp:24:9: warning: ISO C++ does not allow reinterpret_cast from \'const int *X::*Y::**\' to \'const double Y::*volatile X::**const *\' because it casts away qualifiers, even though the source and destination types are unrelated [-Wcast-qual-unrelated]"}
		}
	},
	["ext_binary_literal"]={
		[n]={"binary-literal","gnu","gnu-binary-literal",w},
		[o]="gnu-binary-literal",
		[a]="ext_binary_literal",
		[b]="binary integer literals are a GNU extension",
		[c]="binary integer literals are a GNU extension",
		[d]=p,
		[e]="binary integer literals are a GNU extension",
		[f]=" \\[(?:\\-Werror,)?\\-Wgnu\\-binary\\-literal[^\\]]*\\]",
		[g]=I,
		[h]={Q,1236199783,M,L},
		[i]={{jb,1349,"/// 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);"}},
		[j]={
			["clang/test/Lexer/gnu-flags.c"]={"clang/test/Lexer/gnu-flags.c:45:9: warning: binary integer literals are a GNU extension [-Wgnu-binary-literal]"}
		}
	},
	["ext_binary_literal_cxx14"]={
		[n]={"binary-literal","c++14-binary-literal",db,wb,w},
		[o]="c++14-binary-literal",
		[a]="ext_binary_literal_cxx14",
		[b]="binary integer literals are a C++14 extension",
		[c]="binary integer literals are a C++14 extension",
		[d]=p,
		[e]="binary integer literals are a C\\+\\+14 extension",
		[f]=" \\[(?:\\-Werror,)?\\-Wc\\+\\+14\\-binary\\-literal[^\\]]*\\]",
		[g]=I,
		[h]={"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"},
		[i]={{jb,1348,"/// 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);"}},
		[j]={
			["clang/test/Lexer/warn_binary_literals.cpp"]={"clang/test/Lexer/warn_binary_literals.cpp:4:9: warning: binary integer literals are a C++14 extension [-Wc++14-binary-literal]"}
		}
	},
	["ext_bit_int"]={
		[n]={"bit-int-extension",w},
		[o]="bit-int-extension",
		[a]={{nil,T,"ext_bit_int"}},
		[b]={{nil,T,"\'_BitInt\' in %select{C17 and earlier|C++}0 is a Clang extension"}},
		[c]={{nil,T,{"\'_BitInt\' in ",{"C17 and earlier","C++"}," is a Clang extension"}}},
		[d]=p,
		[e]="\'_BitInt\' in (?:C17 and earlier|C\\+\\+) is a Clang extension",
		[f]=" \\[(?:\\-Werror,)?\\-Wbit\\-int\\-extension[^\\]]*\\]",
		[g]={{nil,T,s}},
		[h]={rb,1612659633,qb,ub},
		[i]={{D,7962,"void Parser::DiagnoseBitIntUse(const Token &Tok) {\n  // ...\n  if (Tok.is(tok::kw__ExtInt)) {\n  // ...\n  } else {\n    // In C2x mode, diagnose that the use is not compatible with pre-C2x modes.\n    // Otherwise, diagnose that the use is a Clang extension.\n    if (getLangOpts().C2x)\n    // ...\n    else\n      Diag(Loc, diag::ext_bit_int) << getLangOpts().CPlusPlus;"}},
		[j]={
			["clang/test/Sema/builtins-elementwise-math.c"]={"clang/test/Sema/builtins-elementwise-math.c:80:3: warning: \'_BitInt\' in C17 and earlier is a Clang extension [-Wbit-int-extension]","clang/test/Sema/builtins-elementwise-math.c:138:3: warning: \'_BitInt\' in C17 and earlier is a Clang extension [-Wbit-int-extension]","clang/test/Sema/builtins-elementwise-math.c:193:3: warning: \'_BitInt\' in C17 and earlier is a Clang extension [-Wbit-int-extension]","clang/test/Sema/builtins-elementwise-math.c:248:3: warning: \'_BitInt\' in C17 and earlier is a Clang extension [-Wbit-int-extension]","clang/test/Sema/builtins-elementwise-math.c:665:3: warning: \'_BitInt\' in C17 and earlier is a Clang extension [-Wbit-int-extension]"}
		}
	},
	["ext_bitfield_member_init"]={
		[n]={J,cb},
		[o]=J,
		[a]={{nil,z,"ext_bitfield_member_init"}},
		[b]={{nil,q,"default member initializer for bit-field is a C++20 extension"},{y,z,"default member initializer for bit-field is a C++2a extension"}},
		[c]={{nil,q,"default member initializer for bit-field is a C++20 extension"},{y,z,"default member initializer for bit-field is a C++2a extension"}},
		[d]=p,
		[e]="default member initializer for bit\\-field is a C\\+\\+20 extension",
		[f]=mb,
		[g]={{nil,z,s}},
		[h]={"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"},
		[i]={{Y,3037,"/// 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);"}},
		[j]={
			["clang/test/SemaCXX/member-init.cpp"]={"clang/test/SemaCXX/member-init.cpp:4:13: warning: default member initializer for bit-field is a C++20 extension [-Wc++20-extensions]"}
		}
	},
	["ext_c11_anonymous_struct"]={
		[n]={Fb,w},
		[o]=Fb,
		[a]="ext_c11_anonymous_struct",
		[b]="anonymous structs are a C11 extension",
		[c]="anonymous structs are a C11 extension",
		[d]=p,
		[e]="anonymous structs are a C11 extension",
		[f]=" \\[(?:\\-Werror,)?\\-Wc11\\-extensions[^\\]]*\\]",
		[g]=m,
		[h]={"b64a1fa65ca1",1328284024,"Don\'t warn about anonymous struct/union in C11.","Don\'t warn about anonymous struct/union in C11.\n\nAlso, in C, call this a C11 extension rather than a GNU extension.\n\nllvm-svn: 149695"},
		[i]={{u,5512,"/// BuildAnonymousStructOrUnion - Handle the declaration of an\n/// anonymous structure or union. Anonymous unions are a C++ feature\n/// (C++ [class.union]) and a C11 feature; anonymous structures\n/// are a C11 feature and GNU C++ extension.\nDecl *Sema::BuildAnonymousStructOrUnion(Scope *S, DeclSpec &DS, AccessSpecifier AS, RecordDecl *Record, const PrintingPolicy &Policy) {\n  // ...\n  // Diagnose whether this anonymous struct/union is an extension.\n  if (Record->isUnion() && !getLangOpts().CPlusPlus && !getLangOpts().C11)\n  // ...\n  else if (!Record->isUnion() && getLangOpts().CPlusPlus)\n  // ...\n  else if (!Record->isUnion() && !getLangOpts().C11)\n    Diag(Record->getLocation(), diag::ext_c11_anonymous_struct);"}},
		[j]={
			["clang/test/Sema/anonymous-struct-union-c11.c"]={"clang/test/Sema/anonymous-struct-union-c11.c:9:3: warning: anonymous structs are a C11 extension [-Wc11-extensions]"}
		}
	},
	["ext_c11_feature"]={
		[n]={Fb,w},
		[o]=Fb,
		[a]={{nil,q,"ext_c11_feature"}},
		[b]={{nil,q,"\'%0\' is a C11 extension"}},
		[c]={{nil,q,"\'A\' is a C11 extension"}},
		[d]=p,
		[e]="\'(.*?)\' is a C11 extension",
		[f]=" \\[(?:\\-Werror,)?\\-Wc11\\-extensions[^\\]]*\\]",
		[g]={{nil,q,s}},
		[h]={"774bd6ef1c93",1566848647,"Diagnose use of _Thread_local as an extension when not in C11 mode.","Diagnose use of _Thread_local as an extension when not in C11 mode.\n\nllvm-svn: 369954"},
		[i]={{D,4015,"/// 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__Thread_local:\n      if (!getLangOpts().C11)\n        Diag(Tok, diag::ext_c11_feature) << Tok.getName();"},{D,4072,"/// 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__Noreturn:\n      if (!getLangOpts().C11)\n        Diag(Tok, diag::ext_c11_feature) << Tok.getName();"},{D,4079,"/// 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    // alignment-specifier\n    case tok::kw__Alignas:\n      if (!getLangOpts().C11)\n        Diag(Tok, diag::ext_c11_feature) << Tok.getName();"},{D,4409,"#include \"clang/Basic/TransformTypeTraits.def\"\n    // ...\n    case tok::kw__Atomic:\n      // C11 6.7.2.4/4:\n      //   If the _Atomic keyword is immediately followed by a left parenthesis,\n      //   it is interpreted as a type specifier (with a type name), not as a\n      //   type qualifier.\n      if (!getLangOpts().C11)\n        Diag(Tok, diag::ext_c11_feature) << Tok.getName();"},{D,5967,"/// ParseTypeQualifierListOpt\n///          type-qualifier-list: [C99 6.7.5]\n///            type-qualifier\n/// [vendor]   attributes\n///              [ only if AttrReqs & AR_VendorAttributesParsed ]\n///            type-qualifier-list type-qualifier\n/// [vendor]   type-qualifier-list attributes\n///              [ only if AttrReqs & AR_VendorAttributesParsed ]\n/// [C++0x]    attribute-specifier[opt] is allowed before cv-qualifier-seq\n///              [ only if AttReqs & AR_CXX11AttributesParsed ]\n/// Note: vendor can be GNU, MS, etc and can be explicitly controlled via\n/// AttrRequirements bitmask values.\nvoid Parser::ParseTypeQualifierListOpt(DeclSpec &DS, unsigned AttrReqs, bool AtomicAllowed, bool IdentifierRequired, std::optional<llvm::function_ref<void()>> CodeCompletionHandler) {\n  // ...\n  while (true) {\n    // ...\n    case tok::kw__Atomic:\n      // ...\n      if (!getLangOpts().C11)\n        Diag(Tok, diag::ext_c11_feature) << Tok.getName();"},{Y,972,"/// 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) && !getLangOpts().C11)\n    Diag(Tok, diag::ext_c11_feature) << Tok.getName();"},{Eb,1437,"#include \"clang/Basic/TransformTypeTraits.def\"\n  // ...\n  case tok::kw__Alignof: // unary-expression: \'_Alignof\' \'(\' type-name \')\'\n    if (!getLangOpts().C11)\n      Diag(Tok, diag::ext_c11_feature) << Tok.getName();"},{Eb,3315,"/// ParseGenericSelectionExpression - Parse a C11 generic-selection\n/// [C11 6.5.1.1].\n///\n/// \\verbatim\n///    generic-selection:\n///           _Generic ( assignment-expression , generic-assoc-list )\n///    generic-assoc-list:\n///           generic-association\n///           generic-assoc-list , generic-association\n///    generic-association:\n///           type-name : assignment-expression\n///           default : assignment-expression\n/// \\endverbatim\n///\n/// As an extension, Clang also accepts:\n/// \\verbatim\n///   generic-selection:\n///          _Generic ( type-name, generic-assoc-list )\n/// \\endverbatim\nExprResult Parser::ParseGenericSelectionExpression() {\n  // ...\n  if (!getLangOpts().C11)\n    Diag(Tok, diag::ext_c11_feature) << Tok.getName();"}},
		[j]={
			["clang/test/SemaOpenCLCXX/restricted.clcpp"]={"clang/test/SemaOpenCLCXX/restricted.clcpp:32:12: warning: \'_Thread_local\' is a C11 extension [-Wc11-extensions]"}
		}
	},
	["ext_c2x_bitint_suffix"]={
		[n]={eb},
		[o]=eb,
		[a]={{nil,A,"ext_c2x_bitint_suffix"}},
		[b]={{nil,A,"\'_BitInt\' suffix for literals is a C2x extension"}},
		[c]={{nil,A,"\'_BitInt\' suffix for literals is a C2x extension"}},
		[d]=p,
		[e]="\'_BitInt\' suffix for literals is a C2x extension",
		[f]=Gb,
		[g]={{nil,A,t}},
		[h]={"8cba72177dcd",1647264157,"Implement literal suffixes for _BitInt","Implement literal suffixes for _BitInt\n\nWG14 adopted N2775 (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2775.pdf)\nat our Feb 2022 meeting. This paper adds a literal suffix for\nbit-precise types that automatically sizes the bit-precise type to be\nthe smallest possible legal _BitInt type that can represent the literal\nvalue. The suffix chosen is wb (for a signed bit-precise type) which\ncan be combined with the u suffix (for an unsigned bit-precise type).\n\nThe preprocessor continues to operate as-if all integer types were\nintmax_t/uintmax_t, including bit-precise integer types. It is a\nconstraint violation if the bit-precise literal is too large to fit\nwithin that type in the context of the preprocessor (when still using\na pp-number preprocessing token), but it is not a constraint violation\nin other circumstances. This allows you to make bit-precise integer\nliterals that are wider than what the preprocessor currently supports\nin order to initialize variables, etc."},
		[i]={{"clang/lib/Lex/PPExpressions.cpp",341,"/// 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    // \'wb/uwb\' literals are a C2x feature. We explicitly do not support the\n    // suffix in C++ as an extension because a library-based UDL that resolves\n    // to a library type may be more appropriate there.\n    if (Literal.isBitInt)\n      PP.Diag(PeekTok, PP.getLangOpts().C2x ? diag::warn_c2x_compat_bitint_suffix : diag::ext_c2x_bitint_suffix);"},{v,4069,"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    // \'wb/uwb\' literals are a C2x feature. We support _BitInt as a type in C++,\n    // but we do not currently support the suffix in C++ mode because it\'s not\n    // entirely clear whether WG21 will prefer this suffix to return a library\n    // type such as std::bit_int instead of returning a _BitInt.\n    if (Literal.isBitInt && !getLangOpts().CPlusPlus)\n      PP.Diag(Tok.getLocation(), getLangOpts().C2x ? diag::warn_c2x_compat_bitint_suffix : diag::ext_c2x_bitint_suffix);"}},
		[j]={
			["clang/test/Lexer/bitint-constants-compat.c"]={"clang/test/Lexer/bitint-constants-compat.c:5:5: warning: \'_BitInt\' suffix for literals is a C2x extension [-Wc2x-extensions]","clang/test/Lexer/bitint-constants-compat.c:11:3: warning: \'_BitInt\' suffix for literals is a C2x extension [-Wc2x-extensions]"}
		}
	},
	["ext_c2x_pp_directive"]={
		[n]={eb},
		[o]=eb,
		[a]={{nil,A,"ext_c2x_pp_directive"}},
		[b]={{nil,A,"use of a \'#%select{<BUG IF SEEN>|elifdef|elifndef}0\' directive is a C2x extension"}},
		[c]={{nil,A,{"use of a \'#",{"elifdef","elifndef"},"\' directive is a C2x extension"}}},
		[d]=p,
		[e]="use of a \'\\#(?:elifdef|elifndef)\' directive is a C2x extension",
		[f]=Gb,
		[g]={{nil,A,I}},
		[h]={F,1625925174,G,H},
		[i]={{zb,772,"/// 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        // ...\n        else\n          DiagID = LangOpts.C2x ? diag::warn_c2x_compat_pp_directive : diag::ext_c2x_pp_directive;"},{zb,3458,"/// 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    // ...\n    else\n      DiagID = LangOpts.C2x ? diag::warn_c2x_compat_pp_directive : diag::ext_c2x_pp_directive;"}},
		[j]={
			["clang/test/Preprocessor/if_warning.c"]={"clang/test/Preprocessor/if_warning.c:10:2: warning: use of a \'#elifdef\' directive is a C2x extension [-Wc2x-extensions]","clang/test/Preprocessor/if_warning.c:21:2: warning: use of a \'#elifdef\' directive is a C2x extension [-Wc2x-extensions]"}
		}
	},
	["ext_c99_array_usage"]={
		[n]={W,w},
		[o]=W,
		[a]="ext_c99_array_usage",
		[b]="%select{qualifier in |static |}0array size %select{||\'[*] \'}0is a C99 feature",
		[c]={{nil,nil,{{"qualifier in ","static ",k},"array size ",{k,k,"\'[*] \'"},"is a C99 feature"}}},
		[d]=p,
		[e]="(?:qualifier in |static |)array size (?:||\'\\[\\*\\] \')is a C99 feature",
		[f]=vb,
		[g]=m,
		[h]={O,1237025389,N,P},
		[i]={{U,2681,"/// Build an array type.\n///\n/// \\param T The type of each element in the array.\n///\n/// \\param ASM C99 array size modifier (e.g., \'*\', \'static\').\n///\n/// \\param ArraySize Expression describing the size of the array.\n///\n/// \\param Brackets The range from the opening \'[\' to the closing \']\'.\n///\n/// \\param Entity The name of the entity that involves the array\n/// type, if known.\n///\n/// \\returns A suitable array type, if there are no errors. Otherwise,\n/// returns a NULL type.\nQualType Sema::BuildArrayType(QualType T, ArrayType::ArraySizeModifier ASM, Expr *ArraySize, unsigned Quals, SourceRange Brackets, DeclarationName Entity) {\n  // ...\n  // If this is not C99, diagnose array size modifiers on non-VLAs.\n  if (!getLangOpts().C99 && !T->isVariableArrayType() && (ASM != ArrayType::Normal || Quals != 0)) {\n    Diag(Loc, getLangOpts().CPlusPlus ? diag::err_c99_array_usage_cxx : diag::ext_c99_array_usage) << ASM;"}},
		[j]={
			["clang/test/Sema/c89.c"]={"clang/test/Sema/c89.c:61:19: warning: static array size is a C99 feature [-Wc99-extensions]","clang/test/Sema/c89.c:63:19: warning: qualifier in array size is a C99 feature [-Wc99-extensions]"}
		}
	},
	["ext_c99_compound_literal"]={
		[n]={W,w},
		[o]=W,
		[a]="ext_c99_compound_literal",
		[b]="compound literals are a C99-specific feature",
		[c]="compound literals are a C99-specific feature",
		[d]=p,
		[e]="compound literals are a C99\\-specific feature",
		[f]=vb,
		[g]=s,
		[h]={Q,1236199783,M,L},
		[i]={{Eb,3243,"/// ParseCompoundLiteralExpression - We have parsed the parenthesized type-name\n/// and we are at the left brace.\n///\n/// \\verbatim\n///       postfix-expression: [C99 6.5.2]\n///         \'(\' type-name \')\' \'{\' initializer-list \'}\'\n///         \'(\' type-name \')\' \'{\' initializer-list \',\' \'}\'\n/// \\endverbatim\nExprResult Parser::ParseCompoundLiteralExpression(ParsedType Ty, SourceLocation LParenLoc, SourceLocation RParenLoc) {\n  // ...\n  if (!getLangOpts().C99) // Compound literals don\'t exist in C90.\n    Diag(LParenLoc, diag::ext_c99_compound_literal);"}},
		[j]={
			["clang/test/Sema/vector-gcc-compat.cpp"]={"clang/test/Sema/vector-gcc-compat.cpp:39:19: warning: compound literals are a C99-specific feature [-Wc99-extensions]","clang/test/Sema/vector-gcc-compat.cpp:62:19: warning: compound literals are a C99-specific feature [-Wc99-extensions]","clang/test/Sema/vector-gcc-compat.cpp:81:19: warning: compound literals are a C99-specific feature [-Wc99-extensions]","clang/test/Sema/vector-gcc-compat.cpp:82:19: warning: compound literals are a C99-specific feature [-Wc99-extensions]","clang/test/Sema/vector-gcc-compat.cpp:83:19: warning: compound literals are a C99-specific feature [-Wc99-extensions]"}
		}
	},
	["ext_c99_feature"]={
		[n]={W,w},
		[o]=W,
		[a]={{nil,q,"ext_c99_feature"}},
		[b]={{nil,q,"\'%0\' is a C99 extension"}},
		[c]={{nil,q,"\'A\' is a C99 extension"}},
		[d]=p,
		[e]="\'(.*?)\' is a C99 extension",
		[f]=vb,
		[g]={{nil,q,s}},
		[h]={"9fac4a5d3522",1566933324,"Diagnose both _Complex and _Imaginary as C99 extensions.","Diagnose both _Complex and _Imaginary as C99 extensions.\n\nllvm-svn: 370100"},
		[i]={{D,4140,"/// 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__Complex:\n      if (!getLangOpts().C99)\n        Diag(Tok, diag::ext_c99_feature) << Tok.getName();"},{D,4146,"/// 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__Imaginary:\n      if (!getLangOpts().C99)\n        Diag(Tok, diag::ext_c99_feature) << Tok.getName();"},{D,4249,"/// 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__Bool:\n      if (Tok.is(tok::kw__Bool) && !getLangOpts().C99)\n        Diag(Tok, diag::ext_c99_feature) << Tok.getName();"}},
		[j]={
			["clang/test/SemaCXX/complex-init-list.cpp"]={"clang/test/SemaCXX/complex-init-list.cpp:13:1: warning: \'_Complex\' is a C99 extension [-Wc99-extensions]"}
		}
	},
	["ext_c99_flexible_array_member"]={
		[n]={W,w},
		[o]=W,
		[a]="ext_c99_flexible_array_member",
		[b]="flexible array members are a C99 feature",
		[c]="flexible array members are a C99 feature",
		[d]=p,
		[e]="flexible array members are a C99 feature",
		[f]=vb,
		[g]=m,
		[h]={"07518f249f91",1331900137,"Warn on flexible array members when in C89 mode, with -pedantic.","Warn on flexible array members when in C89 mode, with -pedantic.\nThis fixes PR 4307.\n\nPatch by Eitan Adler!\n\nllvm-svn: 152918"},
		[i]={{u,18823,"void Sema::ActOnFields(Scope *S, SourceLocation RecLoc, Decl *EnclosingDecl, ArrayRef<Decl *> Fields, SourceLocation LBrac, SourceLocation RBrac, const ParsedAttributesView &Attrs) {\n  // ...\n  for (ArrayRef<Decl *>::iterator i = Fields.begin(), end = Fields.end(); i != end; ++i) {\n    // ...\n    if (FDTy->isFunctionType()) {\n    // ...\n    } else if (FDTy->isIncompleteArrayType() && (Record || isa<ObjCContainerDecl>(EnclosingDecl))) {\n      if (Record) {\n        // ...\n        if (!getLangOpts().C99)\n          Diag(FD->getLocation(), diag::ext_c99_flexible_array_member) << FD->getDeclName() << Record->getTagKind();"}},
		[j]={
			["clang/test/Sema/c89.c"]={"clang/test/Sema/c89.c:89:18: warning: flexible array members are a C99 feature [-Wc99-extensions]"}
		}
	},
	["ext_c99_longlong"]={
		[n]={"long-long",w},
		[o]="long-long",
		[a]="ext_c99_longlong",
		[b]="\'long long\' is an extension when C99 mode is not enabled",
		[c]="\'long long\' is an extension when C99 mode is not enabled",
		[d]=p,
		[e]="\'long long\' is an extension when C99 mode is not enabled",
		[f]=" \\[(?:\\-Werror,)?\\-Wlong\\-long[^\\]]*\\]",
		[g]=t,
		[h]={"1cd230570394",1348510761,"Change the wording of the extension warning from","Change the wording of the extension warning from\n> \'long long\' is an extension when C99 mode is not enabled\nto\n> \'long long\' is a C++11 extension\nwhile compiling in C++98 mode.\n\nllvm-svn: 164545"},
		[i]={{"clang/lib/Lex/PPExpressions.cpp",324,"/// 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      // ...\n      else\n        PP.Diag(PeekTok, diag::ext_c99_longlong);"},{v,4237,"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          // ...\n          else if (!getLangOpts().C99)\n            Diag(Tok.getLocation(), diag::ext_c99_longlong);"},{U,1413,"/// 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          // ...\n          else\n            S.Diag(DS.getTypeSpecWidthLoc(), diag::ext_c99_longlong);"},{U,1438,"/// 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          // ...\n          else\n            S.Diag(DS.getTypeSpecWidthLoc(), diag::ext_c99_longlong);"}},
		[j]={
			["clang/test/Parser/extension.c"]={"clang/test/Parser/extension.c:18:21: warning: \'long long\' is an extension when C99 mode is not enabled [-Wlong-long]"}
		}
	},
	["ext_c99_variable_decl_in_for_loop"]={
		[n]={W,w},
		[o]=W,
		[a]="ext_c99_variable_decl_in_for_loop",
		[b]="variable declaration in for loop is a C99-specific feature",
		[c]="variable declaration in for loop is a C99-specific feature",
		[d]=p,
		[e]="variable declaration in for loop is a C99\\-specific feature",
		[f]=vb,
		[g]=s,
		[h]={Q,1236199783,M,L},
		[i]={{Rb,2054,"/// 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    // Parse declaration, which eats the \';\'.\n    if (!C99orCXXorObjC) { // Use of C99-style for loops in C90 mode?\n      Diag(Tok, diag::ext_c99_variable_decl_in_for_loop);"}},
		[j]={
			["clang/test/C/drs/dr2xx.c"]={"clang/test/C/drs/dr2xx.c:400:8: warning: variable declaration in for loop is a C99-specific feature [-Wc99-extensions]"}
		}
	},
	["ext_c99_whitespace_required_after_macro_name"]={
		[n]={W},
		[o]=W,
		[a]="ext_c99_whitespace_required_after_macro_name",
		[b]="ISO C99 requires whitespace after the macro name",
		[c]="ISO C99 requires whitespace after the macro name",
		[d]=p,
		[e]="ISO C99 requires whitespace after the macro name",
		[f]=vb,
		[g]=I,
		[h]={Q,1236199783,M,L},
		[i]={{zb,2857,"MacroInfo *Preprocessor::ReadOptionalMacroParameterListAndBody(const Token &MacroNameTok, const bool ImmediatelyAfterHeaderGuard) {\n  // ...\n  // If this is a function-like macro definition, parse the argument list,\n  // marking each of the identifiers as being used as macro arguments.  Also,\n  // check other constraints on the first token of the macro body.\n  if (Tok.is(tok::eod)) {\n  // ...\n  } else if (Tok.hasLeadingSpace()) {\n  // ...\n  } else if (Tok.is(tok::l_paren)) {\n  // ...\n  } else if (LangOpts.C99 || LangOpts.CPlusPlus11) {\n    // ...\n    Diag(Tok, diag::ext_c99_whitespace_required_after_macro_name);"}},
		[j]={
			["clang/test/Preprocessor/ucn-allowed-chars.c"]={"clang/test/Preprocessor/ucn-allowed-chars.c:85:12: warning: ISO C99 requires whitespace after the macro name [-Wc99-extensions]","clang/test/Preprocessor/ucn-allowed-chars.c:87:12: warning: ISO C99 requires whitespace after the macro name [-Wc99-extensions]","clang/test/Preprocessor/ucn-allowed-chars.c:89:12: warning: ISO C99 requires whitespace after the macro name [-Wc99-extensions]"}
		}
	},
	["ext_c_empty_initializer"]={
		[n]={eb,w},
		[o]=eb,
		[a]="ext_c_empty_initializer",
		[b]="use of an empty initializer is a C2x extension",
		[c]="use of an empty initializer is a C2x extension",
		[d]=p,
		[e]="use of an empty initializer is a C2x extension",
		[f]=Gb,
		[g]=s,
		[h]={"5d8aaad4452f",1680549555,"[C2x] Implement support for empty brace initialization (WG14 N2900 and WG14 N3011)","[C2x] Implement support for empty brace initialization (WG14 N2900 and WG14 N3011)\n\nThis implements support for allowing {} to consistently zero initialize\nobjects. We already supported most of this work as a GNU extension, but\nthe C2x feature goes beyond what the GNU extension allowed.\n\nThe changes in this patch are:\n\n* Removed the -Wgnu-empty-initializer warning group. The extension is\n  now a C2x extension warning instead. Note that use of\n  `-Wno-gnu-empty-initializer seems` to be quite low in the wild\n(https://sourcegraph.com/search?q=context%3Aglobal+-file%3A.*test.*+%22-Wno-gnu-empty-initializer%22&patternType=standard&sm=1&groupBy=repo\n  which currently only gives 8 hits total), so this is not expected to\n  be an overly disruptive change. But I\'m adding the clang vendors\n  review group just in case this expectation is wrong.\n* Reworded the diagnostic wording to be about a C2x extension, added a\n  pre-C2x compat warning.\n* Allow {} to zero initialize a VLA\n\nThis functionality is exposed as an extension in all older C modes\n(same as the GNU extension was), but does *not* allow the extension for\nVLA initialization in C++ due to concern about handling non-trivially\nconstructible types.\n\nDifferential Revision: https://reviews.llvm.org/D147349"},
		[i]={{"clang/lib/Parse/ParseInit.cpp",457,"/// ParseBraceInitializer - Called when parsing an initializer that has a\n/// leading open brace.\n///\n///       initializer: [C99 6.7.8]\n///         \'{\' initializer-list \'}\'\n///         \'{\' initializer-list \',\' \'}\'\n/// [C2x]   \'{\' \'}\'\n///\n///       initializer-list:\n///         designation[opt] initializer ...[opt]\n///         initializer-list \',\' designation[opt] initializer ...[opt]\n///\nExprResult Parser::ParseBraceInitializer() {\n  // ...\n  if (Tok.is(tok::r_brace)) {\n    // Empty initializers are a C++ feature and a GNU extension to C before C2x.\n    if (!getLangOpts().CPlusPlus) {\n      Diag(LBraceLoc, getLangOpts().C2x ? diag::warn_c2x_compat_empty_initializer : diag::ext_c_empty_initializer);"}},
		[j]={
			[Ab]={"clang/test/Sema/vla.c:116:20: warning: use of an empty initializer is a C2x extension [-Wc2x-extensions]","clang/test/Sema/vla.c:123:23: warning: use of an empty initializer is a C2x extension [-Wc2x-extensions]"}
		}
	},
	["ext_c_label_end_of_compound_statement"]={
		[n]={eb},
		[o]=eb,
		[a]={{nil,B,"ext_c_label_end_of_compound_statement"}},
		[b]={{nil,B,"label at end of compound statement is a C2x extension"}},
		[c]={{nil,B,"label at end of compound statement is a C2x extension"}},
		[d]=p,
		[e]="label at end of compound statement is a C2x extension",
		[f]=Gb,
		[g]={{nil,B,s}},
		[h]={"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"},
		[i]={{Rb,1081,"void Parser::DiagnoseLabelAtEndOfCompoundStatement() {\n  if (getLangOpts().CPlusPlus) {\n  // ...\n  } else {\n    Diag(Tok, getLangOpts().C2x ? diag::warn_c2x_compat_label_end_of_compound_statement : diag::ext_c_label_end_of_compound_statement);"}},
		[j]={
			["clang/test/Parser/c2x-label.c"]={"clang/test/Parser/c2x-label.c:9:1: warning: label at end of compound statement is a C2x extension [-Wc2x-extensions]","clang/test/Parser/c2x-label.c:19:5: warning: label at end of compound statement is a C2x extension [-Wc2x-extensions]","clang/test/Parser/c2x-label.c:26:5: warning: label at end of compound statement is a C2x extension [-Wc2x-extensions]"}
		}
	},
	["ext_c_nullptr"]={
		[n]={eb,w},
		[o]=eb,
		[a]={{nil,B,"ext_c_nullptr"}},
		[b]={{nil,B,"\'nullptr\' is a C2x extension"}},
		[c]={{nil,B,"\'nullptr\' is a C2x extension"}},
		[d]=p,
		[e]="\'nullptr\' is a C2x extension",
		[f]=Gb,
		[g]={{nil,B,s}},
		[h]={"3a31970ee2af",1665756274,"[C2x] Implement support for nullptr and nullptr_t","[C2x] Implement support for nullptr and nullptr_t\n\nThis introduces support for nullptr and nullptr_t in C2x mode. The\nproposal accepted by WG14 is:\nhttps://www.open-std.org/jtc1/sc22/wg14/www/docs/n3042.htm\n\nNote, there are quite a few incompatibilities with the C++ feature in\nsome of the edge cases of this feature. Therefore, there are some FIXME\ncomments in tests for testing behavior that might change after WG14 has\nresolved national body comments (a process we\'ve not yet started). So\nthis implementation might change slightly depending on the resolution\nof comments. This is called out explicitly in the release notes as\nwell.\n\nDifferential Revision: https://reviews.llvm.org/D135099"},
		[i]={{Eb,1015,"/// 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    // ...\n    else\n      Diag(Tok, getLangOpts().C2x ? diag::warn_c2x_compat_keyword : diag::ext_c_nullptr) << Tok.getName();"}}
	},
	["ext_c_static_assert_no_message"]={
		[n]={eb},
		[o]=eb,
		[a]={{nil,x,"ext_c_static_assert_no_message"}},
		[b]={{nil,x,"\'_Static_assert\' with no message is a C2x extension"}},
		[c]={{nil,x,"\'_Static_assert\' with no message is a C2x extension"}},
		[d]=p,
		[e]="\'_Static_assert\' with no message is a C2x extension",
		[f]=Gb,
		[g]={{nil,x,s}},
		[h]={rb,1612659633,qb,ub},
		[i]={{Y,1011,"/// 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    // ...\n    else if (getLangOpts().CPlusPlus)\n    // ...\n    else if (getLangOpts().C2x)\n    // ...\n    else\n      DiagVal = diag::ext_c_static_assert_no_message;"}},
		[j]={
			["clang/test/C/C11/n1330.c"]={"clang/test/C/C11/n1330.c:12:17: warning: \'_Static_assert\' with no message is a C2x extension [-Wc2x-extensions]","clang/test/C/C11/n1330.c:17:17: warning: \'_Static_assert\' with no message is a C2x extension [-Wc2x-extensions]"}
		}
	},
	["ext_cannot_use_trivial_abi"]={
		[n]={"attributes","ignored-attributes"},
		[o]="ignored-attributes",
		[a]={{nil,bb,"ext_cannot_use_trivial_abi"}},
		[b]={{nil,bb,"\'trivial_abi\' cannot be applied to %0"}},
		[c]={{nil,bb,"\'trivial_abi\' cannot be applied to A"}},
		[d]=p,
		[e]="\'trivial_abi\' cannot be applied to (.*?)",
		[f]=" \\[(?:\\-Werror,)?\\-Wignored\\-attributes[^\\]]*\\]",
		[g]={{nil,bb,m}},
		[h]={"02914dc1278c",1517862202,"Add support for attribute \'trivial_abi\'.","Add support for attribute \'trivial_abi\'.\n\nThe \'trivial_abi\' attribute can be applied to a C++ class, struct, or\nunion. It makes special functions of the annotated class (the destructor\nand copy/move constructors) to be trivial for the purpose of calls and,\nas a result, enables the annotated class or containing classes to be\npassed or returned using the C ABI for the underlying type.\n\nWhen a type that is considered trivial for the purpose of calls despite\nhaving a non-trivial destructor (which happens only when the class type\nor one of its subobjects is a \'trivial_abi\' class) is passed to a\nfunction, the callee is responsible for destroying the object.\n\nFor more background, see the discussions that took place on the mailing\nlist:\n\nhttp://lists.llvm.org/pipermail/cfe-dev/2017-November/055955.html\nhttp://lists.llvm.org/pipermail/cfe-commits/Week-of-Mon-20180101/thread.html#214043\n\nrdar://problem/35204524\n\nDifferential Revision: https://reviews.llvm.org/D41039\n\nllvm-svn: 324269"},
		[i]={{r,10302,"void Sema::checkIllFormedTrivialABIStruct(CXXRecordDecl &RD) {\n  auto PrintDiagAndRemoveAttr = [&](unsigned N) {\n    // No diagnostics if this is a template instantiation.\n    if (!isTemplateInstantiation(RD.getTemplateSpecializationKind())) {\n      Diag(RD.getAttr<TrivialABIAttr>()->getLocation(), diag::ext_cannot_use_trivial_abi) << &RD;"}},
		[j]={
			["clang/test/SemaCXX/attr-trivial-abi.cpp"]={"clang/test/SemaCXX/attr-trivial-abi.cpp:28:23: warning: \'trivial_abi\' cannot be applied to \'S3\' [-Wignored-attributes]","clang/test/SemaCXX/attr-trivial-abi.cpp:35:18: warning: \'trivial_abi\' cannot be applied to \'S3_2\' [-Wignored-attributes]","clang/test/SemaCXX/attr-trivial-abi.cpp:38:23: warning: \'trivial_abi\' cannot be applied to \'S3_3\' [-Wignored-attributes]","clang/test/SemaCXX/attr-trivial-abi.cpp:53:23: warning: \'trivial_abi\' cannot be applied to \'S3_4\' [-Wignored-attributes]","clang/test/SemaCXX/attr-trivial-abi.cpp:64:23: warning: \'trivial_abi\' cannot be applied to \'S5\' [-Wignored-attributes]","clang/test/SemaCXX/attr-trivial-abi.cpp:117:23: warning: \'trivial_abi\' cannot be applied to \'CopyMoveDeleted\' [-Wignored-attributes]","clang/test/SemaCXX/attr-trivial-abi.cpp:127:23: warning: \'trivial_abi\' cannot be applied to \'S18\' [-Wignored-attributes]","clang/test/SemaCXX/attr-trivial-abi.cpp:152:23: warning: \'trivial_abi\' cannot be applied to \'S19\' [-Wignored-attributes]"}
		}
	},
	["ext_capture_binding"]={
		[n]={J,cb},
		[o]=J,
		[a]={{nil,B,"ext_capture_binding"}},
		[b]={{nil,B,"captured structured bindings are a C++20 extension"}},
		[c]={{nil,B,"captured structured bindings are a C++20 extension"}},
		[d]=p,
		[e]="captured structured bindings are a C\\+\\+20 extension",
		[f]=mb,
		[g]={{nil,B,m}},
		[h]={F,1625925174,G,H},
		[i]={{v,19211,"// 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;"}},
		[j]={
			["clang/test/SemaCXX/cxx1z-decomposition.cpp"]={"clang/test/SemaCXX/cxx1z-decomposition.cpp:75:22: warning: captured structured bindings are a C++20 extension [-Wc++20-extensions]","clang/test/SemaCXX/cxx1z-decomposition.cpp:76:10: warning: captured structured bindings are a C++20 extension [-Wc++20-extensions]","clang/test/SemaCXX/cxx1z-decomposition.cpp:89:11: warning: captured structured bindings are a C++20 extension [-Wc++20-extensions]","clang/test/SemaCXX/cxx1z-decomposition.cpp:98:22: warning: captured structured bindings are a C++20 extension [-Wc++20-extensions]"}
		}
	},
	["ext_cast_fn_obj"]={
		[n]={w},
		[o]=w,
		[a]="ext_cast_fn_obj",
		[b]="cast between pointer-to-function and pointer-to-object is an extension",
		[c]="cast between pointer-to-function and pointer-to-object is an extension",
		[d]=p,
		[e]="cast between pointer\\-to\\-function and pointer\\-to\\-object is an extension",
		[f]=" \\[(?:\\-Werror,)?\\-Wpedantic[^\\]]*\\]",
		[g]=m,
		[h]={"9f831dbbcdfa",1248536498,"Implement C++ semantics for C-style and functional-style casts. This regresses Clang extension conve...","Implement C++ semantics for C-style and functional-style casts. This regresses Clang extension conversions, like vectors, but allows conversions via constructors and conversion operators.\nAdd custom conversions to static_cast.\n\nllvm-svn: 77076"},
		[i]={{Hb,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;"},{Hb,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;"}},
		[j]={
			["clang/test/SemaCXX/reinterpret-fn-obj-pedantic.cpp"]={"clang/test/SemaCXX/reinterpret-fn-obj-pedantic.cpp:7:14: warning: cast between pointer-to-function and pointer-to-object is an extension [-Wpedantic]","clang/test/SemaCXX/reinterpret-fn-obj-pedantic.cpp:8:9: warning: cast between pointer-to-function and pointer-to-object is an extension [-Wpedantic]"}
		}
	},
	["ext_cce_narrowing"]={
		[n]={"c++0x-compat","c++0x-narrowing","c++11-compat","c++11-compat-pedantic","c++11-narrowing","narrowing"},
		[o]="c++11-narrowing",
		[a]="ext_cce_narrowing",
		[b]={{nil,T,"%select{case value|enumerator value|non-type template argument|array size|explicit specifier argument|noexcept specifier argument}0 %select{cannot be narrowed from type %2 to %3|evaluates to %2, which cannot be narrowed to type %3}1"},{x,x,"%select{case value|enumerator value|non-type template argument|array size|explicit specifier argument}0 %select{cannot be narrowed from type %2 to %3|evaluates to %2, which cannot be narrowed to type %3}1"},{"12.0",y,"%select{case value|enumerator value|non-type template argument|array size|constexpr if condition|explicit specifier argument}0 %select{cannot be narrowed from type %2 to %3|evaluates to %2, which cannot be narrowed to type %3}1"},{X,nil,"%select{case value|enumerator value|non-type template argument|array size|constexpr if condition}0 %select{cannot be narrowed from type %2 to %3|evaluates to %2, which cannot be narrowed to type %3}1"}},
		[c]={{nil,T,{{"case value",Bb,"non-type template argument","array size","explicit specifier argument","noexcept specifier argument"},Vb,{"cannot be narrowed from type C to D","evaluates to C, which cannot be narrowed to type D"}}},{x,x,{{"case value",Bb,"non-type template argument","array size","explicit specifier argument"},Vb,{"cannot be narrowed from type C to D","evaluates to C, which cannot be narrowed to type D"}}},{"12.0",y,{{"case value",Bb,"non-type template argument","array size","constexpr if condition","explicit specifier argument"},Vb,{"cannot be narrowed from type C to D","evaluates to C, which cannot be narrowed to type D"}}},{X,nil,{{"case value",Bb,"non-type template argument","array size","constexpr if condition"},Vb,{"cannot be narrowed from type C to D","evaluates to C, which cannot be narrowed to type D"}}}},
		[d]="(?:error|warning|fatal error)\\: ",
		[e]="(?:case value|enumerator value|non\\-type template argument|array size|explicit specifier argument|noexcept specifier argument) (?:cannot be narrowed from type (.*?) to (.*?)|evaluates to (.*?), which cannot be narrowed to type (.*?))",
		[f]=" \\[[^\\]]*\\-Wc\\+\\+11\\-narrowing[^\\]]*\\]",
		[g]=m,
		[h]={"16e1b07597f3",1384224105,"Rather than duplicating extension diagnostics to allow them to cause a","Rather than duplicating extension diagnostics to allow them to cause a\nsubstitution failure, allow a flag to be set on the Diagnostic object,\nto mark it as \'causes substitution failure\'.\n\nRefactor Diagnostic.td and the tablegen to use an enum for SFINAE behavior\nrather than a bunch of flags.\n\nllvm-svn: 194444"},
		[i]={{"clang/lib/Sema/SemaOverload.cpp",5929,"/// BuildConvertedConstantExpression - Check that the expression From is a\n/// converted constant expression of type T, perform the conversion but\n/// does not evaluate the expression\nstatic ExprResult BuildConvertedConstantExpression(Sema &S, Expr *From, QualType T, Sema::CCEKind CCE, NamedDecl *Dest, APValue &PreNarrowingValue) {\n  // ...\n  case NK_Constant_Narrowing:\n    // ...\n    S.Diag(From->getBeginLoc(), diag::ext_cce_narrowing) << CCE << /*Constant*/ 1 << PreNarrowingValue.getAsString(S.Context, PreNarrowingType) << T;"},{"clang/lib/Sema/SemaOverload.cpp",5937,"/// BuildConvertedConstantExpression - Check that the expression From is a\n/// converted constant expression of type T, perform the conversion but\n/// does not evaluate the expression\nstatic ExprResult BuildConvertedConstantExpression(Sema &S, Expr *From, QualType T, Sema::CCEKind CCE, NamedDecl *Dest, APValue &PreNarrowingValue) {\n  // ...\n  case NK_Type_Narrowing:\n    // ...\n    S.Diag(From->getBeginLoc(), diag::ext_cce_narrowing) << CCE << /*Constant*/ 0 << From->getType() << T;"}},
		[j]={
			["clang/test/SemaCXX/cxx0x-noexcept-expression.cpp"]={"clang/test/SemaCXX/cxx0x-noexcept-expression.cpp:86:19: error: noexcept specifier argument evaluates to 2, which cannot be narrowed to type \'bool\' [-Wc++11-narrowing]","clang/test/SemaCXX/cxx0x-noexcept-expression.cpp:92:19: error: noexcept specifier argument evaluates to 2, which cannot be narrowed to type \'bool\' [-Wc++11-narrowing]"}
		}
	},
	["ext_charize_microsoft"]={
		[n]={Ub,"microsoft-charize",w},
		[o]="microsoft-charize",
		[a]="ext_charize_microsoft",
		[b]="charizing operator #@ is a Microsoft extension",
		[c]="charizing operator #@ is a Microsoft extension",
		[d]=p,
		[e]="charizing operator \\#@ is a Microsoft extension",
		[f]=" \\[(?:\\-Werror,)?\\-Wmicrosoft\\-charize[^\\]]*\\]",
		[g]=I,
		[h]={"a08713ce8610",1318888073,"Move about 20 random diagnostics under -W flags.  Patch by Ahmed Charles!","Move about 20 random diagnostics under -W flags.  Patch by Ahmed Charles!\n\nllvm-svn: 142284"},
		[i]={{kb,4073,"LexStart:\n  // ...\n  case \'%\':\n    // ...\n    if (Char == \'=\') {\n    // ...\n    } else if (LangOpts.Digraphs && Char == \'>\') {\n    // ...\n    } else if (LangOpts.Digraphs && Char == \':\') {\n      // ...\n      if (Char == \'%\' && getCharAndSize(CurPtr + SizeTmp, SizeTmp2) == \':\') {\n      // ...\n      } else if (Char == \'@\' && LangOpts.MicrosoftExt) { // %:@ -> #@ -> Charize\n        // ...\n        if (!isLexingRawMode())\n          Diag(BufferPtr, diag::ext_charize_microsoft);"},{kb,4262,"LexStart:\n  // ...\n  case \'#\':\n    // ...\n    if (Char == \'#\') {\n    // ...\n    } else if (Char == \'@\' && LangOpts.MicrosoftExt) { // #@ -> Charize\n      // ...\n      if (!isLexingRawMode())\n        Diag(BufferPtr, diag::ext_charize_microsoft);"}}
	},
	["ext_clang_c_enum_fixed_underlying_type"]={
		[n]={"fixed-enum-extension",w},
		[o]="fixed-enum-extension",
		[a]={{nil,X,"ext_clang_c_enum_fixed_underlying_type"}},
		[b]={{nil,X,"enumeration types with a fixed underlying type are a Clang extension"}},
		[c]={{nil,X,"enumeration types with a fixed underlying type are a Clang extension"}},
		[d]=p,
		[e]="enumeration types with a fixed underlying type are a Clang extension",
		[f]=" \\[(?:\\-Werror,)?\\-Wfixed\\-enum\\-extension[^\\]]*\\]",
		[g]={{nil,X,s}},
		[h]={"6f11db137034",1538166298,"Support enums with a fixed underlying type in all language modes.","Support enums with a fixed underlying type in all language modes.\n\nPreviously we supported these in C++, ObjC, and C with -fms-extensions.\n\nrdar://43831380\n\nDifferential revision: https://reviews.llvm.org/D52339\n\nllvm-svn: 343360"},
		[i]={{D,4949,"/// 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        // ...\n        else if (getLangOpts().CPlusPlus)\n        // ...\n        else if (getLangOpts().MicrosoftExt)\n        // ...\n        else\n          Diag(ColonLoc, diag::ext_clang_c_enum_fixed_underlying_type) << BaseRange;"}},
		[j]={
			["clang/test/Sema/fixed-enum.c"]={"clang/test/Sema/fixed-enum.c:8:8: warning: enumeration types with a fixed underlying type are a Clang extension [-Wfixed-enum-extension]","clang/test/Sema/fixed-enum.c:22:10: warning: enumeration types with a fixed underlying type are a Clang extension [-Wfixed-enum-extension]","clang/test/Sema/fixed-enum.c:23:10: warning: enumeration types with a fixed underlying type are a Clang extension [-Wfixed-enum-extension]","clang/test/Sema/fixed-enum.c:30:13: warning: enumeration types with a fixed underlying type are a Clang extension [-Wfixed-enum-extension]","clang/test/Sema/fixed-enum.c:35:13: warning: enumeration types with a fixed underlying type are a Clang extension [-Wfixed-enum-extension]"}
		}
	},
	["ext_clang_diagnose_if"]={
		[n]={"gcc-compat",w},
		[o]="gcc-compat",
		[a]="ext_clang_diagnose_if",
		[b]="\'diagnose_if\' is a clang extension",
		[c]="\'diagnose_if\' is a clang extension",
		[d]=p,
		[e]="\'diagnose_if\' is a clang extension",
		[f]=" \\[(?:\\-Werror,)?\\-Wgcc\\-compat[^\\]]*\\]",
		[g]=t,
		[h]={"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"},
		[i]={{xb,1098,"static void handleDiagnoseIfAttr(Sema &S, Decl *D, const ParsedAttr &AL) {\n  S.Diag(AL.getLoc(), diag::ext_clang_diagnose_if);"}},
		[j]={
			["clang/test/SemaCXX/diagnose_if-ext.cpp"]={"clang/test/SemaCXX/diagnose_if-ext.cpp:3:27: warning: \'diagnose_if\' is a clang extension [-Wgcc-compat]","clang/test/SemaCXX/diagnose_if-ext.cpp:4:32: warning: \'diagnose_if\' is a clang extension [-Wgcc-compat]"}
		}
	},
	["ext_clang_enable_if"]={
		[n]={"gcc-compat",w},
		[o]="gcc-compat",
		[a]="ext_clang_enable_if",
		[b]="\'enable_if\' is a clang extension",
		[c]="\'enable_if\' is a clang extension",
		[d]=p,
		[e]="\'enable_if\' is a clang extension",
		[f]=" \\[(?:\\-Werror,)?\\-Wgcc\\-compat[^\\]]*\\]",
		[g]=t,
		[h]={"046ba5b66fae",1455778171,"Sema: provide an extension warning for enable_if","Sema: provide an extension warning for enable_if\n\nClang implements an enable_if attribute as an extension.  Hook up `-Wpedantic`\nto issue an extension usage warning when __enable_if__ is used.\n\nllvm-svn: 261192"},
		[i]={{xb,957,"static void handleEnableIfAttr(Sema &S, Decl *D, const ParsedAttr &AL) {\n  S.Diag(AL.getLoc(), diag::ext_clang_enable_if);"}},
		[j]={
			["clang/test/Sema/enable_if-ext.c"]={"clang/test/Sema/enable_if-ext.c:11:18: warning: \'enable_if\' is a clang extension [-Wgcc-compat]","clang/test/Sema/enable_if-ext.c:17:18: warning: \'enable_if\' is a clang extension [-Wgcc-compat]","clang/test/Sema/enable_if-ext.c:23:18: warning: \'enable_if\' is a clang extension [-Wgcc-compat]","clang/test/Sema/enable_if-ext.c:29:18: warning: \'enable_if\' is a clang extension [-Wgcc-compat]"}
		}
	},
	["ext_comment_paste_microsoft"]={
		[n]={Ub,"microsoft-comment-paste",w},
		[o]="microsoft-comment-paste",
		[a]="ext_comment_paste_microsoft",
		[b]="pasting two \'/\' tokens into a \'//\' comment is a Microsoft extension",
		[c]="pasting two \'/\' tokens into a \'//\' comment is a Microsoft extension",
		[d]=p,
		[e]="pasting two \'\\/\' tokens into a \'\\/\\/\' comment is a Microsoft extension",
		[f]=" \\[(?:\\-Werror,)?\\-Wmicrosoft\\-comment\\-paste[^\\]]*\\]",
		[g]=I,
		[h]={"446cf25c2131",1451430377,"Emit a -Wmicrosoft warning when pasting /##/ into a comment token in MS mode.","Emit a -Wmicrosoft warning when pasting /##/ into a comment token in MS mode.\n\nllvm-svn: 256595"},
		[i]={{"clang/lib/Lex/TokenLexer.cpp",947,"/// HandleMicrosoftCommentPaste - In microsoft compatibility mode, /##/ pastes\n/// together to form a comment that comments out everything in the current\n/// macro, other active macros, and anything left on the current physical\n/// source line of the expanded buffer.  Handle this by returning the\n/// first token on the next line.\nvoid TokenLexer::HandleMicrosoftCommentPaste(Token &Tok, SourceLocation OpLoc) {\n  PP.Diag(OpLoc, diag::ext_comment_paste_microsoft);"}},
		[j]={
			["clang/test/Preprocessor/macro_paste_msextensions.c"]={"clang/test/Preprocessor/macro_paste_msextensions.c:15:1: warning: pasting two \'/\' tokens into a \'//\' comment is a Microsoft extension [-Wmicrosoft-comment-paste]","clang/test/Preprocessor/macro_paste_msextensions.c:24:1: warning: pasting two \'/\' tokens into a \'//\' comment is a Microsoft extension [-Wmicrosoft-comment-paste]"}
		}
	},
	["ext_complex_component_init"]={
		[n]={"complex-component-init",w},
		[o]="complex-component-init",
		[a]="ext_complex_component_init",
		[b]="complex initialization specifying real and imaginary components is an extension",
		[c]="complex initialization specifying real and imaginary components is an extension",
		[d]=p,
		[e]="complex initialization specifying real and imaginary components is an extension",
		[f]=" \\[(?:\\-Werror,)?\\-Wcomplex\\-component\\-init[^\\]]*\\]",
		[g]=m,
		[h]={"6b9c41ea68f8",1316474264,"Add list initialization for complex numbers in C.  Essentially, this allows \"_Complex float x = {1.0...","Add list initialization for complex numbers in C.  Essentially, this allows \"_Complex float x = {1.0f, 2.0f};\".  See changes to docs/LanguageExtensions.html for a longer description.\n\n<rdar://problem/9397672>.\n\nllvm-svn: 140090"},
		[i]={{nb,1606,"void InitListChecker::CheckComplexType(const InitializedEntity &Entity, InitListExpr *IList, QualType DeclType, unsigned &Index, InitListExpr *StructuredList, unsigned &StructuredIndex) {\n  // ...\n  // This is an extension in C.  (The builtin _Complex type does not exist\n  // in the C++ standard.)\n  if (!SemaRef.getLangOpts().CPlusPlus && !VerifyOnly)\n    SemaRef.Diag(IList->getBeginLoc(), diag::ext_complex_component_init) << IList->getSourceRange();"}},
		[j]={
			["clang/test/Sema/complex-init-list.c"]={"clang/test/Sema/complex-init-list.c:20:25: warning: complex initialization specifying real and imaginary components is an extension [-Wcomplex-component-init]","clang/test/Sema/complex-init-list.c:28:23: warning: complex initialization specifying real and imaginary components is an extension [-Wcomplex-component-init]","clang/test/Sema/complex-init-list.c:30:30: warning: complex initialization specifying real and imaginary components is an extension [-Wcomplex-component-init]","clang/test/Sema/complex-init-list.c:31:30: warning: complex initialization specifying real and imaginary components is an extension [-Wcomplex-component-init]","clang/test/Sema/complex-init-list.c:31:44: warning: complex initialization specifying real and imaginary components is an extension [-Wcomplex-component-init]","clang/test/Sema/complex-init-list.c:33:25: warning: complex initialization specifying real and imaginary components is an extension [-Wcomplex-component-init]","clang/test/Sema/complex-init-list.c:39:27: warning: complex initialization specifying real and imaginary components is an extension [-Wcomplex-component-init]","clang/test/Sema/complex-init-list.c:45:32: warning: complex initialization specifying real and imaginary components is an extension [-Wcomplex-component-init]","clang/test/Sema/complex-init-list.c:45:46: warning: complex initialization specifying real and imaginary components is an extension [-Wcomplex-component-init]","clang/test/Sema/complex-init-list.c:47:44: warning: complex initialization specifying real and imaginary components is an extension [-Wcomplex-component-init]","clang/test/Sema/complex-init-list.c:51:41: warning: complex initialization specifying real and imaginary components is an extension [-Wcomplex-component-init]","clang/test/Sema/complex-init-list.c:54:22: warning: complex initialization specifying real and imaginary components is an extension [-Wcomplex-component-init]","clang/test/Sema/complex-init-list.c:56:21: warning: complex initialization specifying real and imaginary components is an extension [-Wcomplex-component-init]"}
		}
	},
	["ext_consteval_if"]={
		[n]={S,sb},
		[o]=S,
		[a]={{nil,T,"ext_consteval_if"}},
		[b]="consteval if is a C++23 extension",
		[c]="consteval if is a C++23 extension",
		[d]=p,
		[e]="consteval if is a C\\+\\+23 extension",
		[f]=ob,
		[g]={{nil,T,s}},
		[h]={rb,1612659633,qb,ub},
		[i]={{Rb,1480,"/// 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);"}}
	},
	["ext_constexpr_body_invalid_stmt"]={
		[n]={db,wb},
		[o]=db,
		[a]="ext_constexpr_body_invalid_stmt",
		[b]="use of this statement in a constexpr %select{function|constructor}0 is a C++14 extension",
		[c]={{nil,nil,{"use of this statement in a constexpr ",{fb,gb}," is a C++14 extension"}}},
		[d]=p,
		[e]="use of this statement in a constexpr (?:function|constructor) is a C\\+\\+14 extension",
		[f]=Qb,
		[g]=m,
		[h]={"d9f663b510c4",1366644711,"C++1y constexpr extensions, round 1: Allow most forms of declaration and","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"},
		[i]={{r,2301,"/// 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);"}},
		[j]={
			[Sb]={"clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp:57:11: error: use of this statement in a constexpr constructor is a C++14 extension [-Werror,-Wc++14-extensions]","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp:106:5: error: use of this statement in a constexpr constructor is a C++14 extension [-Werror,-Wc++14-extensions]","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp:130:5: error: use of this statement in a constexpr constructor is a C++14 extension [-Werror,-Wc++14-extensions]"}
		}
	},
	["ext_constexpr_body_invalid_stmt_cxx20"]={
		[n]={J,cb},
		[o]=J,
		[a]={{nil,C,"ext_constexpr_body_invalid_stmt_cxx20"}},
		[b]={{nil,C,"use of this statement in a constexpr %select{function|constructor}0 is a C++20 extension"}},
		[c]={{nil,C,{"use of this statement in a constexpr ",{fb,gb}," is a C++20 extension"}}},
		[d]=p,
		[e]="use of this statement in a constexpr (?:function|constructor) is a C\\+\\+20 extension",
		[f]=mb,
		[g]={{nil,C,m}},
		[h]={"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"},
		[i]={{r,2295,"/// 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);"}},
		[j]={
			["clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p3.cpp"]={"clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p3.cpp:124:5: warning: use of this statement in a constexpr function is a C++20 extension [-Wc++20-extensions]","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p3.cpp:140:3: warning: use of this statement in a constexpr function is a C++20 extension [-Wc++20-extensions]"}
		}
	},
	["ext_constexpr_body_invalid_stmt_cxx23"]={
		[n]={S,sb},
		[o]=S,
		[a]="ext_constexpr_body_invalid_stmt_cxx23",
		[b]="use of this statement in a constexpr %select{function|constructor}0 is a C++23 extension",
		[c]={{nil,nil,{"use of this statement in a constexpr ",{fb,gb}," is a C++23 extension"}}},
		[d]=p,
		[e]="use of this statement in a constexpr (?:function|constructor) is a C\\+\\+23 extension",
		[f]=ob,
		[g]=m,
		[h]={"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"},
		[i]={{r,2289,"/// 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);"}},
		[j]={
			["clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/dtor.cpp"]={"clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/dtor.cpp:17:7: warning: use of this statement in a constexpr function is a C++23 extension [-Wc++23-extensions]","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/dtor.cpp:23:5: warning: use of this statement in a constexpr function is a C++23 extension [-Wc++23-extensions]"}
		}
	},
	["ext_constexpr_body_multiple_return"]={
		[n]={db,wb},
		[o]=db,
		[a]="ext_constexpr_body_multiple_return",
		[b]="multiple return statements in constexpr function is a C++14 extension",
		[c]="multiple return statements in constexpr function is a C++14 extension",
		[d]=p,
		[e]="multiple return statements in constexpr function is a C\\+\\+14 extension",
		[f]=Qb,
		[g]=m,
		[h]={"d9f663b510c4",1366644711,"C++1y constexpr extensions, round 1: Allow most forms of declaration and","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"},
		[i]={{r,2400,"/// 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);"}},
		[j]={
			["clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p3.cpp"]={"clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p3.cpp:132:5: warning: multiple return statements in constexpr function is a C++14 extension [-Wc++14-extensions]","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p3.cpp:218:3: warning: multiple return statements in constexpr function is a C++14 extension [-Wc++14-extensions]"}
		}
	},
	["ext_constexpr_ctor_missing_init"]={
		[n]={J,cb},
		[o]=J,
		[a]={{nil,q,"ext_constexpr_ctor_missing_init"}},
		[b]={{nil,q,"constexpr constructor that does not initialize all members is a C++20 extension"}},
		[c]={{nil,q,"constexpr constructor that does not initialize all members is a C++20 extension"}},
		[d]=p,
		[e]="constexpr constructor that does not initialize all members is a C\\+\\+20 extension",
		[f]=mb,
		[g]={{nil,q,m}},
		[h]={Pb,1567434909,Wb,Xb},
		[i]={{r,2045,"/// 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);"}},
		[j]={
			[Sb]={"clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp:140:13: error: constexpr constructor that does not initialize all members is a C++20 extension [-Werror,-Wc++20-extensions]","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp:173:13: error: constexpr constructor that does not initialize all members is a C++20 extension [-Werror,-Wc++20-extensions]","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp:179:13: error: constexpr constructor that does not initialize all members is a C++20 extension [-Werror,-Wc++20-extensions]","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp:184:13: error: constexpr constructor that does not initialize all members is a C++20 extension [-Werror,-Wc++20-extensions]","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp:189:13: error: constexpr constructor that does not initialize all members is a C++20 extension [-Werror,-Wc++20-extensions]"}
		}
	},
	["ext_constexpr_function_never_constant_expr"]={
		[n]={"invalid-constexpr"},
		[o]="invalid-constexpr",
		[a]="ext_constexpr_function_never_constant_expr",
		[b]={{nil,C,"%select{constexpr|consteval}1 %select{function|constructor}0 never produces a constant expression"},{q,nil,"constexpr %select{function|constructor}0 never produces a constant expression"}},
		[c]={{nil,C,{{"constexpr","consteval"},Vb,{fb,gb}," never produces a constant expression"}},{q,nil,{"constexpr ",{fb,gb}," never produces a constant expression"}}},
		[d]="(?:error|warning|fatal error)\\: ",
		[e]="(?:constexpr|consteval) (?:function|constructor) never produces a constant expression",
		[f]=" \\[[^\\]]*\\-Winvalid\\-constexpr[^\\]]*\\]",
		[g]=m,
		[h]={"f86b5dc7009e",1355032543,"PR14550: If a system header contains a bogus constexpr function definition,","PR14550: If a system header contains a bogus constexpr function definition,\ndon\'t mark the function as invalid, since we suppress the error.\n\nllvm-svn: 169689"},
		[i]={{r,2431,"/// 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::Diagnose && !Expr::isPotentialConstantExpr(Dcl, Diags)) {\n    SemaRef.Diag(Dcl->getLocation(), diag::ext_constexpr_function_never_constant_expr) << isa<CXXConstructorDecl>(Dcl) << Dcl->isConsteval();"}},
		[j]={
			["clang/test/SemaCXX/literal-type.cpp"]={"clang/test/SemaCXX/literal-type.cpp:57:13: error: constexpr constructor never produces a constant expression [-Winvalid-constexpr]"}
		}
	},
	["ext_constexpr_function_try_block_cxx20"]={
		[n]={J,cb},
		[o]=J,
		[a]={{nil,C,"ext_constexpr_function_try_block_cxx20"}},
		[b]={{nil,C,"function try block in constexpr %select{function|constructor}0 is a C++20 extension"}},
		[c]={{nil,C,{"function try block in constexpr ",{fb,gb}," is a C++20 extension"}}},
		[d]=p,
		[e]="function try block in constexpr (?:function|constructor) is a C\\+\\+20 extension",
		[f]=mb,
		[g]={{nil,C,m}},
		[h]={"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"},
		[i]={{r,2258,"/// 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);"}},
		[j]={
			[Sb]={"clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp:53:5: error: function try block in constexpr constructor is a C++20 extension [-Werror,-Wc++20-extensions]"}
		}
	},
	["ext_constexpr_if"]={
		[n]={ib,Ib},
		[o]=ib,
		[a]="ext_constexpr_if",
		[b]="constexpr if is a C++1z extension",
		[c]="constexpr if is a C++1z extension",
		[d]=p,
		[e]="constexpr if is a C\\+\\+17 extension",
		[f]=Nb,
		[g]=s,
		[h]={"b130fe7d316e",1466709409,"Implement p0292r2 (constexpr if), a likely C++1z feature.","Implement p0292r2 (constexpr if), a likely C++1z feature.\n\nllvm-svn: 273602"},
		[i]={{Rb,1470,"/// 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);"}},
		[j]={
			["clang/test/CodeGenCXX/nrvo.cpp"]={"clang/test/CodeGenCXX/nrvo.cpp:2568:6: warning: constexpr if is a C++17 extension [-Wc++17-extensions]","clang/test/CodeGenCXX/nrvo.cpp:2577:6: warning: constexpr if is a C++17 extension [-Wc++17-extensions]","clang/test/CodeGenCXX/nrvo.cpp:2927:6: warning: constexpr if is a C++17 extension [-Wc++17-extensions]"}
		}
	},
	["ext_constexpr_local_var"]={
		[n]={db,wb},
		[o]=db,
		[a]="ext_constexpr_local_var",
		[b]="variable declaration in a constexpr %select{function|constructor}0 is a C++14 extension",
		[c]={{nil,nil,{"variable declaration in a constexpr ",{fb,gb}," is a C++14 extension"}}},
		[d]=p,
		[e]="variable declaration in a constexpr (?:function|constructor) is a C\\+\\+14 extension",
		[f]=Qb,
		[g]=m,
		[h]={"d9f663b510c4",1366644711,"C++1y constexpr extensions, round 1: Allow most forms of declaration and","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"},
		[i]={{r,1972,"/// 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);"}},
		[j]={
			[Sb]={"clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp:100:19: error: variable declaration in a constexpr constructor is a C++14 extension [-Werror,-Wc++14-extensions]"}
		}
	},
	["ext_constexpr_local_var_no_init"]={
		[n]={J,cb},
		[o]=J,
		[a]={{nil,q,"ext_constexpr_local_var_no_init"}},
		[b]={{nil,q,"uninitialized variable in a constexpr %select{function|constructor}0 is a C++20 extension"}},
		[c]={{nil,q,{"uninitialized variable in a constexpr ",{fb,gb}," is a C++20 extension"}}},
		[d]=p,
		[e]="uninitialized variable in a constexpr (?:function|constructor) is a C\\+\\+20 extension",
		[f]=mb,
		[g]={{nil,q,m}},
		[h]={Pb,1567434909,Wb,Xb},
		[i]={{r,1960,"/// 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);"}},
		[j]={
			["clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p3.cpp"]={"clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p3.cpp:167:7: warning: uninitialized variable in a constexpr function is a C++20 extension [-Wc++20-extensions]","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p3.cpp:272:9: warning: uninitialized variable in a constexpr function is a C++20 extension [-Wc++20-extensions]"}
		}
	},
	["ext_constexpr_on_lambda_cxx17"]={
		[n]={ib,Ib},
		[o]=ib,
		[a]={{nil,z,"ext_constexpr_on_lambda_cxx17"}},
		[b]={{nil,z,"\'constexpr\' on lambda expressions is a C++17 extension"}},
		[c]={{nil,z,"\'constexpr\' on lambda expressions is a C++17 extension"}},
		[d]=p,
		[e]="\'constexpr\' on lambda expressions is a C\\+\\+17 extension",
		[f]=Nb,
		[g]={{nil,z,s}},
		[h]={"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"},
		[i]={{tb,1227,"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);"}},
		[j]={
			["clang/test/Parser/cxx1z-constexpr-lambdas.cpp"]={"clang/test/Parser/cxx1z-constexpr-lambdas.cpp:7:15: warning: \'constexpr\' on lambda expressions is a C++17 extension [-Wc++17-extensions]","clang/test/Parser/cxx1z-constexpr-lambdas.cpp:33:23: warning: \'constexpr\' on lambda expressions is a C++17 extension [-Wc++17-extensions]","clang/test/Parser/cxx1z-constexpr-lambdas.cpp:34:16: warning: \'constexpr\' on lambda expressions is a C++17 extension [-Wc++17-extensions]","clang/test/Parser/cxx1z-constexpr-lambdas.cpp:35:16: warning: \'constexpr\' on lambda expressions is a C++17 extension [-Wc++17-extensions]"}
		}
	},
	["ext_constexpr_static_var"]={
		[n]={S,sb},
		[o]=S,
		[a]={{nil,A,"ext_constexpr_static_var"}},
		[b]="definition of a %select{static|thread_local}1 variable in a constexpr %select{function|constructor}0 is a C++23 extension",
		[c]={{nil,nil,{"definition of a ",{"static","thread_local"}," variable in a constexpr ",{fb,gb}," is a C++23 extension"}},{B,A,{"definition of a ",{"static","thread_local"}," variable in a constexpr ",{fb,gb}," is a C++2b extension"}}},
		[d]=p,
		[e]="definition of a (?:static|thread_local) variable in a constexpr (?:function|constructor) is a C\\+\\+23 extension",
		[f]=ob,
		[g]={{nil,A,m}},
		[h]={"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"},
		[i]={{r,1935,"/// 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);"}},
		[j]={
			["clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/dtor.cpp"]={"clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/dtor.cpp:38:18: warning: definition of a static variable in a constexpr function is a C++23 extension [-Wc++23-extensions]","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/dtor.cpp:44:24: warning: definition of a thread_local variable in a constexpr function is a C++23 extension [-Wc++23-extensions]"}
		}
	},
	["ext_constexpr_type_definition"]={
		[n]={db,wb},
		[o]=db,
		[a]="ext_constexpr_type_definition",
		[b]="type definition in a constexpr %select{function|constructor}0 is a C++14 extension",
		[c]={{nil,nil,{"type definition in a constexpr ",{fb,gb}," is a C++14 extension"}}},
		[d]=p,
		[e]="type definition in a constexpr (?:function|constructor) is a C\\+\\+14 extension",
		[f]=Qb,
		[g]=m,
		[h]={"d9f663b510c4",1366644711,"C++1y constexpr extensions, round 1: Allow most forms of declaration and","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"},
		[i]={{r,1907,"/// 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);"}},
		[j]={
			[Sb]={"clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp:112:5: error: type definition in a constexpr constructor is a C++14 extension [-Werror,-Wc++14-extensions]","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp:118:5: error: type definition in a constexpr constructor is a C++14 extension [-Werror,-Wc++14-extensions]","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp:124:5: error: type definition in a constexpr constructor is a C++14 extension [-Werror,-Wc++14-extensions]"}
		}
	},
	["ext_constexpr_union_ctor_no_init"]={
		[n]={J,cb},
		[o]=J,
		[a]={{nil,q,"ext_constexpr_union_ctor_no_init"}},
		[b]={{nil,q,"constexpr union constructor that does not initialize any member is a C++20 extension"}},
		[c]={{nil,q,"constexpr union constructor that does not initialize any member is a C++20 extension"}},
		[d]=p,
		[e]="constexpr union constructor that does not initialize any member is a C\\+\\+20 extension",
		[f]=mb,
		[g]={{nil,q,m}},
		[h]={Pb,1567434909,Wb,Xb},
		[i]={{r,2322,"/// 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);"}}
	},
	["ext_constinit_missing"]={
		[n]={"missing-constinit"},
		[o]="missing-constinit",
		[a]={{nil,q,"ext_constinit_missing"}},
		[b]={{nil,q,"\'constinit\' specifier missing on initializing declaration of %0"}},
		[c]={{nil,q,"\'constinit\' specifier missing on initializing declaration of A"}},
		[d]=p,
		[e]="\'constinit\' specifier missing on initializing declaration of (.*?)",
		[f]=" \\[(?:\\-Werror,)?\\-Wmissing\\-constinit[^\\]]*\\]",
		[g]={{nil,q,m}},
		[h]={Pb,1567434909,Wb,Xb},
		[i]={{u,3165,"static void diagnoseMissingConstinit(Sema &S, const VarDecl *InitDecl, const ConstInitAttr *CIAttr, bool AttrBeforeInit) {\n  // ...\n  if (AttrBeforeInit) {\n    // ...\n    S.Diag(InitDecl->getLocation(), diag::ext_constinit_missing) << InitDecl << FixItHint::CreateInsertion(InsertLoc, SuitableSpelling);"}},
		[j]={
			["clang/test/CXX/dcl.dcl/dcl.spec/dcl.constinit/p2.cpp"]={"clang/test/CXX/dcl.dcl/dcl.spec/dcl.constinit/p2.cpp:8:5: warning: \'constinit\' specifier missing on initializing declaration of \'c\' [-Wmissing-constinit]"}
		}
	},
	["ext_ctrl_z_eof_microsoft"]={
		[n]={Ub,"microsoft-end-of-file",w},
		[o]="microsoft-end-of-file",
		[a]="ext_ctrl_z_eof_microsoft",
		[b]="treating Ctrl-Z as end-of-file is a Microsoft extension",
		[c]="treating Ctrl-Z as end-of-file is a Microsoft extension",
		[d]=p,
		[e]="treating Ctrl\\-Z as end\\-of\\-file is a Microsoft extension",
		[f]=" \\[(?:\\-Werror,)?\\-Wmicrosoft\\-end\\-of\\-file[^\\]]*\\]",
		[g]=I,
		[h]={"de2310bddf64",1451431047,"Emit a -Wmicrosoft warning when treating ^Z as EOF in MS mode.","Emit a -Wmicrosoft warning when treating ^Z as EOF in MS mode.\n\nllvm-svn: 256596"},
		[i]={{kb,3654,"LexStart:\n  // ...\n  case 26: // DOS & CP/M EOF: \"^Z\".\n    // If we\'re in Microsoft extensions mode, treat this as end of file.\n    if (LangOpts.MicrosoftExt) {\n      if (!isLexingRawMode())\n        Diag(CurPtr - 1, diag::ext_ctrl_z_eof_microsoft);"}},
		[j]={
			["clang/test/Lexer/msdos-cpm-eof.c"]={"clang/test/Lexer/msdos-cpm-eof.c:6:1: warning: treating Ctrl-Z as end-of-file is a Microsoft extension [-Wmicrosoft-end-of-file]"}
		}
	},
	["ext_cxx11_attr_placement"]={
		[n]={"cxx-attribute-extension"},
		[o]="cxx-attribute-extension",
		[a]={{nil,x,"ext_cxx11_attr_placement"}},
		[b]="ISO C++ does not allow %select{an attribute list|%0}1 to appear here",
		[c]={{nil,nil,{"ISO C++ does not allow ",{"an attribute list","A"}," to appear here"}},{B,x,"ISO C++ does not allow an attribute list to appear here"}},
		[d]=p,
		[e]="ISO C\\+\\+ does not allow (?:an attribute list|(.*?)) to appear here",
		[f]=" \\[(?:\\-Werror,)?\\-Wcxx\\-attribute\\-extension[^\\]]*\\]",
		[g]={{nil,x,s}},
		[h]={rb,1612659633,qb,ub},
		[i]={{D,1782,"void Parser::DiagnoseCXX11AttributeExtension(ParsedAttributes &Attrs) {\n  for (const ParsedAttr &PA : Attrs) {\n    if (PA.isCXX11Attribute() || PA.isC2xAttribute() || PA.isRegularKeywordAttribute())\n      Diag(PA.getLoc(), diag::ext_cxx11_attr_placement) << PA << PA.isRegularKeywordAttribute() << PA.getRange();"}},
		[j]={
			["clang/test/SemaCXX/cxx11-attributes-on-using-declaration.cpp"]={"clang/test/SemaCXX/cxx11-attributes-on-using-declaration.cpp:7:3: warning: ISO C++ does not allow an attribute list to appear here [-Wcxx-attribute-extension]","clang/test/SemaCXX/cxx11-attributes-on-using-declaration.cpp:10:3: warning: ISO C++ does not allow an attribute list to appear here [-Wcxx-attribute-extension]","clang/test/SemaCXX/cxx11-attributes-on-using-declaration.cpp:11:15: warning: ISO C++ does not allow an attribute list to appear here [-Wcxx-attribute-extension]","clang/test/SemaCXX/cxx11-attributes-on-using-declaration.cpp:15:10: warning: ISO C++ does not allow an attribute list to appear here [-Wcxx-attribute-extension]","clang/test/SemaCXX/cxx11-attributes-on-using-declaration.cpp:18:3: warning: ISO C++ does not allow an attribute list to appear here [-Wcxx-attribute-extension]","clang/test/SemaCXX/cxx11-attributes-on-using-declaration.cpp:18:40: warning: ISO C++ does not allow an attribute list to appear here [-Wcxx-attribute-extension]","clang/test/SemaCXX/cxx11-attributes-on-using-declaration.cpp:18:72: warning: ISO C++ does not allow an attribute list to appear here [-Wcxx-attribute-extension]","clang/test/SemaCXX/cxx11-attributes-on-using-declaration.cpp:22:5: warning: ISO C++ does not allow an attribute list to appear here [-Wcxx-attribute-extension]","clang/test/SemaCXX/cxx11-attributes-on-using-declaration.cpp:23:5: warning: ISO C++ does not allow an attribute list to appear here [-Wcxx-attribute-extension]","clang/test/SemaCXX/cxx11-attributes-on-using-declaration.cpp:25:25: warning: ISO C++ does not allow an attribute list to appear here [-Wcxx-attribute-extension]","clang/test/SemaCXX/cxx11-attributes-on-using-declaration.cpp:26:16: warning: ISO C++ does not allow an attribute list to appear here [-Wcxx-attribute-extension]"}
		}
	},
	["ext_cxx11_enum_fixed_underlying_type"]={
		[n]={Kb,hb,w},
		[o]=hb,
		[a]="ext_cxx11_enum_fixed_underlying_type",
		[b]="enumeration types with a fixed underlying type are a C++11 extension",
		[c]="enumeration types with a fixed underlying type are a C++11 extension",
		[d]=p,
		[e]="enumeration types with a fixed underlying type are a C\\+\\+11 extension",
		[f]=Mb,
		[g]=s,
		[h]={"0d0355abfca9",1351820068,"Change diagnostics for enums with fixed underlying type so in C++98 mode, we cite C++11.","Change diagnostics for enums with fixed underlying type so in C++98 mode, we cite C++11.\n\nllvm-svn: 167273"},
		[i]={{D,4943,"/// 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        // ...\n        else if (getLangOpts().CPlusPlus)\n          Diag(ColonLoc, diag::ext_cxx11_enum_fixed_underlying_type) << BaseRange;"}},
		[j]={
			["clang/test/SemaCXX/enum.cpp"]={"clang/test/SemaCXX/enum.cpp:111:13: warning: enumeration types with a fixed underlying type are a C++11 extension [-Wc++11-extensions]"}
		}
	},
	["ext_cxx11_longlong"]={
		[n]={Kb,hb,"c++11-long-long","long-long",w,w},
		[o]="c++11-long-long",
		[a]="ext_cxx11_longlong",
		[b]="\'long long\' is a C++11 extension",
		[c]="\'long long\' is a C++11 extension",
		[d]=p,
		[e]="\'long long\' is a C\\+\\+11 extension",
		[f]=" \\[(?:\\-Werror,)?\\-Wc\\+\\+11\\-long\\-long[^\\]]*\\]",
		[g]=t,
		[h]={"1cd230570394",1348510761,"Change the wording of the extension warning from","Change the wording of the extension warning from\n> \'long long\' is an extension when C99 mode is not enabled\nto\n> \'long long\' is a C++11 extension\nwhile compiling in C++98 mode.\n\nllvm-svn: 164545"},
		[i]={{"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);"},{v,4228,"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);"},{U,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);"},{U,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);"}},
		[j]={
			["clang/test/SemaCXX/warn-c++11-extensions.cpp"]={"clang/test/SemaCXX/warn-c++11-extensions.cpp:3:1: warning: \'long long\' is a C++11 extension [-Wc++11-long-long]","clang/test/SemaCXX/warn-c++11-extensions.cpp:4:11: warning: \'long long\' is a C++11 extension [-Wc++11-long-long]","clang/test/SemaCXX/warn-c++11-extensions.cpp:5:10: warning: \'long long\' is a C++11 extension [-Wc++11-long-long]","clang/test/SemaCXX/warn-c++11-extensions.cpp:6:20: warning: \'long long\' is a C++11 extension [-Wc++11-long-long]"}
		}
	},
	["ext_cxx14_attr"]={
		[n]={"c++14-attribute-extensions",db,wb,"future-attribute-extensions",w,w},
		[o]="c++14-attribute-extensions",
		[a]="ext_cxx14_attr",
		[b]="use of the %0 attribute is a C++14 extension",
		[c]="use of the A attribute is a C++14 extension",
		[d]=p,
		[e]="use of the (.*?) attribute is a C\\+\\+14 extension",
		[f]=" \\[(?:\\-Werror,)?\\-Wc\\+\\+14\\-attribute\\-extensions[^\\]]*\\]",
		[g]=m,
		[h]={"4f902c7eccd4",1457397175,"P0188R1: add support for standard [[fallthrough]] attribute. This is almost","P0188R1: add support for standard [[fallthrough]] attribute. This is almost\nexactly the same as clang\'s existing [[clang::fallthrough]] attribute, which\nhas been updated to have the same semantics. The one significant difference\nis that [[fallthrough]] is ill-formed if it\'s not used immediately before a\nswitch label (even when -Wimplicit-fallthrough is disabled). To support that,\nwe now build a CFG of any function that uses a \'[[fallthrough]];\' statement\nto check.\n\nIn passing, fix some bugs with our support for statement attributes -- in\nparticular, diagnose their use on declarations, rather than asserting.\n\nllvm-svn: 262881"},
		[i]={{xb,8200,"static void handleDeprecatedAttr(Sema &S, Decl *D, const ParsedAttr &AL) {\n  // ...\n  if (!S.getLangOpts().CPlusPlus14 && AL.isCXX11Attribute() && !AL.isGNUScope())\n    S.Diag(AL.getLoc(), diag::ext_cxx14_attr) << AL;"}},
		[j]={
			["clang/test/SemaCXX/generalized-deprecated.cpp"]={"clang/test/SemaCXX/generalized-deprecated.cpp:6:3: warning: use of the \'deprecated\' attribute is a C++14 extension [-Wc++14-attribute-extensions]"}
		}
	},
	["ext_cxx17_attr"]={
		[n]={"c++17-attribute-extensions",ib,Ib,"future-attribute-extensions",w,w},
		[o]="c++17-attribute-extensions",
		[a]={{nil,z,"ext_cxx17_attr"}},
		[b]={{nil,z,"use of the %0 attribute is a C++17 extension"}},
		[c]={{nil,z,"use of the A attribute is a C++17 extension"}},
		[d]=p,
		[e]="use of the (.*?) attribute is a C\\+\\+17 extension",
		[f]=" \\[(?:\\-Werror,)?\\-Wc\\+\\+17\\-attribute\\-extensions[^\\]]*\\]",
		[g]={{nil,z,m}},
		[h]={"4f902c7eccd4",1457397175,"P0188R1: add support for standard [[fallthrough]] attribute. This is almost","P0188R1: add support for standard [[fallthrough]] attribute. This is almost\nexactly the same as clang\'s existing [[clang::fallthrough]] attribute, which\nhas been updated to have the same semantics. The one significant difference\nis that [[fallthrough]] is ill-formed if it\'s not used immediately before a\nswitch label (even when -Wimplicit-fallthrough is disabled). To support that,\nwe now build a CFG of any function that uses a \'[[fallthrough]];\' statement\nto check.\n\nIn passing, fix some bugs with our support for statement attributes -- in\nparticular, diagnose their use on declarations, rather than asserting.\n\nllvm-svn: 262881"},
		[i]={{xb,2336,"static void handleUnusedAttr(Sema &S, Decl *D, const ParsedAttr &AL) {\n  // ...\n  // If this is spelled as the standard C++17 attribute, but not in C++17, warn\n  // about using it as an extension.\n  if (!S.getLangOpts().CPlusPlus17 && IsCXX17Attr)\n    S.Diag(AL.getLoc(), diag::ext_cxx17_attr) << AL;"},{xb,3176,"static void handleWarnUnusedResult(Sema &S, Decl *D, const ParsedAttr &AL) {\n  // ...\n  if (AL.isStandardAttributeSyntax() && !AL.getScopeName()) {\n    // ...\n    if (AL.getNumArgs() == 1) {\n    // ...\n    } else if (LO.CPlusPlus && !LO.CPlusPlus17)\n      S.Diag(AL.getLoc(), diag::ext_cxx17_attr) << AL;"},{"clang/lib/Sema/SemaStmtAttr.cpp",49,"static Attr *handleFallThroughAttr(Sema &S, Stmt *St, const ParsedAttr &A, SourceRange Range) {\n  // ...\n  // If this is spelled as the standard C++17 attribute, but not in C++17, warn\n  // about using it as an extension.\n  if (!S.getLangOpts().CPlusPlus17 && A.isCXX11Attribute() && !A.getScopeName())\n    S.Diag(A.getLoc(), diag::ext_cxx17_attr) << A;"}},
		[j]={
			["clang/test/Parser/cxx0x-attributes.cpp"]={"clang/test/Parser/cxx0x-attributes.cpp:387:7: warning: use of the \'fallthrough\' attribute is a C++17 extension [-Wc++17-attribute-extensions]"}
		}
	},
	["ext_cxx20_attr"]={
		[n]={"c++20-attribute-extensions",J,cb,"future-attribute-extensions",w,w},
		[o]="c++20-attribute-extensions",
		[a]={{nil,C,"ext_cxx20_attr"}},
		[b]={{nil,C,"use of the %0 attribute is a C++20 extension"}},
		[c]={{nil,C,"use of the A attribute is a C++20 extension"}},
		[d]=p,
		[e]="use of the (.*?) attribute is a C\\+\\+20 extension",
		[f]=" \\[(?:\\-Werror,)?\\-Wc\\+\\+20\\-attribute\\-extensions[^\\]]*\\]",
		[g]={{nil,C,m}},
		[h]={"3bef014e7d79",1563609394,"Implement P1301R4, which allows specifying an optional message on the [[nodiscard]] attribute.","Implement P1301R4, which allows specifying an optional message on the [[nodiscard]] attribute.\n\nThis also bumps the attribute feature test value and introduces the notion of a C++2a extension warning.\n\nllvm-svn: 366626"},
		[i]={{xb,3167,"static void handleWarnUnusedResult(Sema &S, Decl *D, const ParsedAttr &AL) {\n  // ...\n  if (AL.isStandardAttributeSyntax() && !AL.getScopeName()) {\n    // ...\n    if (AL.getNumArgs() == 1) {\n      if (LO.CPlusPlus && !LO.CPlusPlus20)\n        S.Diag(AL.getLoc(), diag::ext_cxx20_attr) << AL;"},{"clang/lib/Sema/SemaStmtAttr.cpp",312,"static Attr *handleLikely(Sema &S, Stmt *St, const ParsedAttr &A, SourceRange Range) {\n  if (!S.getLangOpts().CPlusPlus20 && A.isCXX11Attribute() && !A.getScopeName())\n    S.Diag(A.getLoc(), diag::ext_cxx20_attr) << A << Range;"},{"clang/lib/Sema/SemaStmtAttr.cpp",321,"static Attr *handleUnlikely(Sema &S, Stmt *St, const ParsedAttr &A, SourceRange Range) {\n  if (!S.getLangOpts().CPlusPlus20 && A.isCXX11Attribute() && !A.getScopeName())\n    S.Diag(A.getLoc(), diag::ext_cxx20_attr) << A << Range;"}},
		[j]={
			["clang/test/SemaCXX/attr-likelihood.cpp"]={"clang/test/SemaCXX/attr-likelihood.cpp:7:7: warning: use of the \'likely\' attribute is a C++20 extension [-Wc++20-attribute-extensions]","clang/test/SemaCXX/attr-likelihood.cpp:9:7: warning: use of the \'unlikely\' attribute is a C++20 extension [-Wc++20-attribute-extensions]"}
		}
	},
	["ext_cxx23_pp_directive"]={
		[n]={S,sb},
		[o]=S,
		[a]="ext_cxx23_pp_directive",
		[b]="use of a \'#%select{<BUG IF SEEN>|elifdef|elifndef}0\' directive is a C++23 extension",
		[c]={{nil,nil,{"use of a \'#",{"elifdef","elifndef"},"\' directive is a C++23 extension"}}},
		[d]=p,
		[e]="use of a \'\\#(?:elifdef|elifndef)\' directive is a C\\+\\+23 extension",
		[f]=ob,
		[g]=I,
		[h]={F,1625925174,G,H},
		[i]={{zb,769,"/// 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;"},{zb,3455,"/// 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;"}},
		[j]={
			["clang/test/Preprocessor/ext-pp-directive.c"]={"clang/test/Preprocessor/ext-pp-directive.c:18:2: warning: use of a \'#elifdef\' directive is a C++23 extension [-Wc++23-extensions]","clang/test/Preprocessor/ext-pp-directive.c:29:2: warning: use of a \'#elifndef\' directive is a C++23 extension [-Wc++23-extensions]","clang/test/Preprocessor/ext-pp-directive.c:40:2: warning: use of a \'#elifdef\' directive is a C++23 extension [-Wc++23-extensions]","clang/test/Preprocessor/ext-pp-directive.c:51:2: warning: use of a \'#elifndef\' directive is a C++23 extension [-Wc++23-extensions]"}
		}
	},
	["ext_cxx23_size_t_suffix"]={
		[n]={S,sb},
		[o]=S,
		[a]="ext_cxx23_size_t_suffix",
		[b]="\'size_t\' suffix for literals is a C++23 extension",
		[c]="\'size_t\' suffix for literals is a C++23 extension",
		[d]=p,
		[e]="\'size_t\' suffix for literals is a C\\+\\+23 extension",
		[f]=ob,
		[g]=t,
		[h]={"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)."},
		[i]={{"clang/lib/Lex/PPExpressions.cpp",332,"/// 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);"},{v,4059,"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);"}},
		[j]={
			["clang/test/SemaCXX/size_t-literal.cpp"]={"clang/test/SemaCXX/size_t-literal.cpp:19:13: warning: \'size_t\' suffix for literals is a C++23 extension [-Wc++23-extensions]","clang/test/SemaCXX/size_t-literal.cpp:24:13: warning: \'size_t\' suffix for literals is a C++23 extension [-Wc++23-extensions]","clang/test/SemaCXX/size_t-literal.cpp:31:13: warning: \'size_t\' suffix for literals is a C++23 extension [-Wc++23-extensions]","clang/test/SemaCXX/size_t-literal.cpp:36:13: warning: \'size_t\' suffix for literals is a C++23 extension [-Wc++23-extensions]","clang/test/SemaCXX/size_t-literal.cpp:41:13: warning: \'size_t\' suffix for literals is a C++23 extension [-Wc++23-extensions]","clang/test/SemaCXX/size_t-literal.cpp:46:13: warning: \'size_t\' suffix for literals is a C++23 extension [-Wc++23-extensions]","clang/test/SemaCXX/size_t-literal.cpp:51:13: warning: \'size_t\' suffix for literals is a C++23 extension [-Wc++23-extensions]","clang/test/SemaCXX/size_t-literal.cpp:56:13: warning: \'size_t\' suffix for literals is a C++23 extension [-Wc++23-extensions]","clang/test/SemaCXX/size_t-literal.cpp:61:13: warning: \'size_t\' suffix for literals is a C++23 extension [-Wc++23-extensions]","clang/test/SemaCXX/size_t-literal.cpp:66:13: warning: \'size_t\' suffix for literals is a C++23 extension [-Wc++23-extensions]"}
		}
	},
	["ext_cxx_designated_init"]={
		[n]={"c++20-designator",J,cb,"c99-designator",W,w},
		[o]="c++20-designator",
		[a]={{nil,q,"ext_cxx_designated_init"}},
		[b]={{nil,q,"designated initializers are a C++20 extension"}},
		[c]={{nil,q,"designated initializers are a C++20 extension"}},
		[d]=p,
		[e]="designated initializers are a C\\+\\+20 extension",
		[f]=" \\[(?:\\-Werror,)?\\-Wc\\+\\+20\\-designator[^\\]]*\\]",
		[g]={{nil,q,m}},
		[h]={"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"},
		[i]={{v,7833,"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);"}},
		[j]={
			["clang/test/SemaCXX/c99.cpp"]={"clang/test/SemaCXX/c99.cpp:11:14: warning: designated initializers are a C++20 extension [-Wc++20-designator]","clang/test/SemaCXX/c99.cpp:20:3: warning: designated initializers are a C++20 extension [-Wc++20-designator]","clang/test/SemaCXX/c99.cpp:53:3: warning: designated initializers are a C++20 extension [-Wc++20-designator]"}
		}
	},
	["ext_cxx_label_end_of_compound_statement"]={
		[n]={S,sb},
		[o]=S,
		[a]={{nil,B,"ext_cxx_label_end_of_compound_statement"}},
		[b]="label at end of compound statement is a C++23 extension",
		[c]="label at end of compound statement is a C++23 extension",
		[d]=p,
		[e]="label at end of compound statement is a C\\+\\+23 extension",
		[f]=ob,
		[g]={{nil,B,s}},
		[h]={"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"},
		[i]={{Rb,1077,"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);"}},
		[j]={
			["clang/test/Parser/switch-recovery.cpp"]={"clang/test/Parser/switch-recovery.cpp:164:3: warning: label at end of compound statement is a C++23 extension [-Wc++23-extensions]","clang/test/Parser/switch-recovery.cpp:171:3: warning: label at end of compound statement is a C++23 extension [-Wc++23-extensions]","clang/test/Parser/switch-recovery.cpp:182:3: warning: label at end of compound statement is a C++23 extension [-Wc++23-extensions]","clang/test/Parser/switch-recovery.cpp:213:3: warning: label at end of compound statement is a C++23 extension [-Wc++23-extensions]"}
		}
	},
	["ext_cxx_static_assert_no_message"]={
		[n]={ib,Ib},
		[o]=ib,
		[a]={{nil,x,"ext_cxx_static_assert_no_message"}},
		[b]={{nil,x,"\'static_assert\' with no message is a C++17 extension"}},
		[c]={{nil,x,"\'static_assert\' with no message is a C++17 extension"}},
		[d]=p,
		[e]="\'static_assert\' with no message is a C\\+\\+17 extension",
		[f]=Nb,
		[g]={{nil,x,s}},
		[h]={rb,1612659633,qb,ub},
		[i]={{Y,1007,"/// 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    // ...\n    else if (getLangOpts().CPlusPlus)\n      DiagVal = diag::ext_cxx_static_assert_no_message;"}},
		[j]={
			["clang/test/SemaCXX/static-assert.cpp"]={"clang/test/SemaCXX/static-assert.cpp:85:19: warning: \'static_assert\' with no message is a C++17 extension [-Wc++17-extensions]","clang/test/SemaCXX/static-assert.cpp:86:20: warning: \'static_assert\' with no message is a C++17 extension [-Wc++17-extensions]","clang/test/SemaCXX/static-assert.cpp:241:22: warning: \'static_assert\' with no message is a C++17 extension [-Wc++17-extensions]"}
		}
	},
	["ext_decl_attrs_on_lambda"]={
		[n]={S,sb},
		[o]=S,
		[a]={{nil,x,"ext_decl_attrs_on_lambda"}},
		[b]="%select{an attribute specifier sequence|%0}1 in this position is a C++23 extension",
		[c]={{nil,nil,{{"an attribute specifier sequence","A"}," in this position is a C++23 extension"}},{B,x,"an attribute specifier sequence in this position is a C++2b extension"}},
		[d]=p,
		[e]="(?:an attribute specifier sequence|(.*?)) in this position is a C\\+\\+23 extension",
		[f]=ob,
		[g]={{nil,x,s}},
		[h]={rb,1612659633,qb,ub},
		[i]={{tb,1368,"/// 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();"}},
		[j]={
			["clang/test/Parser/cxx0x-lambda-expressions.cpp"]={"clang/test/Parser/cxx0x-lambda-expressions.cpp:129:7: warning: an attribute specifier sequence in this position is a C++23 extension [-Wc++23-extensions]","clang/test/Parser/cxx0x-lambda-expressions.cpp:134:17: warning: an attribute specifier sequence in this position is a C++23 extension [-Wc++23-extensions]","clang/test/Parser/cxx0x-lambda-expressions.cpp:139:7: warning: an attribute specifier sequence in this position is a C++23 extension [-Wc++23-extensions]"}
		}
	},
	["ext_decltype_auto_type_specifier"]={
		[n]={db,wb},
		[o]=db,
		[a]="ext_decltype_auto_type_specifier",
		[b]="\'decltype(auto)\' type specifier is a C++14 extension",
		[c]="\'decltype(auto)\' type specifier is a C++14 extension",
		[d]=p,
		[e]="\'decltype\\(auto\\)\' type specifier is a C\\+\\+14 extension",
		[f]=Qb,
		[g]=s,
		[h]={"74aeef50a0cc",1366992935,"Implement C++1y decltype(auto).","Implement C++1y decltype(auto).\n\nllvm-svn: 180610"},
		[i]={{Y,1105,"/// 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);"}},
		[j]={
			["clang/test/SemaCXX/trailing-return-0x.cpp"]={"clang/test/SemaCXX/trailing-return-0x.cpp:21:10: warning: \'decltype(auto)\' type specifier is a C++14 extension [-Wc++14-extensions]"}
		}
	},
	["ext_decomp_decl"]={
		[n]={ib,Ib},
		[o]=ib,
		[a]="ext_decomp_decl",
		[b]="decomposition declarations are a C++1z extension",
		[c]="decomposition declarations are a C++1z extension",
		[d]=p,
		[e]="decomposition declarations are a C\\+\\+17 extension",
		[f]=Nb,
		[g]=m,
		[h]={"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"},
		[i]={{r,752,"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();"}},
		[j]={
			["clang/test/CodeGenCXX/mangle.cpp"]={"clang/test/CodeGenCXX/mangle.cpp:1209:10: warning: decomposition declarations are a C++17 extension [-Wc++17-extensions]","clang/test/CodeGenCXX/mangle.cpp:1216:8: warning: decomposition declarations are a C++17 extension [-Wc++17-extensions]"}
		}
	},
	["ext_decomp_decl_cond"]={
		[n]={"binding-in-condition"},
		[o]="binding-in-condition",
		[a]={{nil,z,"ext_decomp_decl_cond"}},
		[b]={{nil,z,"ISO C++17 does not permit structured binding declaration in a condition"}},
		[c]={{nil,z,"ISO C++17 does not permit structured binding declaration in a condition"}},
		[d]=p,
		[e]="ISO C\\+\\+17 does not permit structured binding declaration in a condition",
		[f]=" \\[(?:\\-Werror,)?\\-Wbinding\\-in\\-condition[^\\]]*\\]",
		[g]={{nil,z,m}},
		[h]={"c81f4538ecd9",1512630195,"Allow conditions to be decomposed with structured bindings","Allow conditions to be decomposed with structured bindings\n\nSummary:\nThis feature was discussed but not yet proposed.  It allows a structured binding to appear as a //condition//\n\n    if (auto [ok, val] = f(...))\n\nSo the user can save an extra //condition// if the statement can test the value to-be-decomposed instead.  Formally, it makes the value of the underlying object of the structured binding declaration also the value of a //condition// that is an initialized declaration.\n\nConsidering its logicality which is entirely evident from its trivial implementation, I think it might be acceptable to land it as an extension for now before I write the paper.\n\nReviewers: rsmith, faisalv, aaron.ballman\n\nReviewed By: rsmith\n\nSubscribers: aaron.ballman, cfe-commits\n\nDifferential Revision: https://reviews.llvm.org/D39284\n\nllvm-svn: 320011"},
		[i]={{r,754,"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();"}},
		[j]={
			["clang/test/Parser/decomposed-condition.cpp"]={"clang/test/Parser/decomposed-condition.cpp:36:12: warning: ISO C++17 does not permit structured binding declaration in a condition [-Wbinding-in-condition]","clang/test/Parser/decomposed-condition.cpp:38:12: warning: ISO C++17 does not permit structured binding declaration in a condition [-Wbinding-in-condition]","clang/test/Parser/decomposed-condition.cpp:40:12: warning: ISO C++17 does not permit structured binding declaration in a condition [-Wbinding-in-condition]","clang/test/Parser/decomposed-condition.cpp:47:15: warning: ISO C++17 does not permit structured binding declaration in a condition [-Wbinding-in-condition]","clang/test/Parser/decomposed-condition.cpp:49:15: warning: ISO C++17 does not permit structured binding declaration in a condition [-Wbinding-in-condition]","clang/test/Parser/decomposed-condition.cpp:51:15: warning: ISO C++17 does not permit structured binding declaration in a condition [-Wbinding-in-condition]","clang/test/Parser/decomposed-condition.cpp:58:15: warning: ISO C++17 does not permit structured binding declaration in a condition [-Wbinding-in-condition]","clang/test/Parser/decomposed-condition.cpp:60:15: warning: ISO C++17 does not permit structured binding declaration in a condition [-Wbinding-in-condition]","clang/test/Parser/decomposed-condition.cpp:62:15: warning: ISO C++17 does not permit structured binding declaration in a condition [-Wbinding-in-condition]","clang/test/Parser/decomposed-condition.cpp:77:16: warning: ISO C++17 does not permit structured binding declaration in a condition [-Wbinding-in-condition]","clang/test/Parser/decomposed-condition.cpp:79:16: warning: ISO C++17 does not permit structured binding declaration in a condition [-Wbinding-in-condition]","clang/test/Parser/decomposed-condition.cpp:81:16: warning: ISO C++17 does not permit structured binding declaration in a condition [-Wbinding-in-condition]"}
		}
	},
	["ext_decomp_decl_empty"]={
		[n]={"empty-decomposition"},
		[o]="empty-decomposition",
		[a]="ext_decomp_decl_empty",
		[b]="ISO C++1z does not allow a decomposition group to be empty",
		[c]="ISO C++1z does not allow a decomposition group to be empty",
		[d]=p,
		[e]="ISO C\\+\\+17 does not allow a decomposition group to be empty",
		[f]=" \\[(?:\\-Werror,)?\\-Wempty\\-decomposition[^\\]]*\\]",
		[g]=s,
		[h]={"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"},
		[i]={{D,6783,"void Parser::ParseDecompositionDeclarator(Declarator &D) {\n  // ...\n  if (Tok.isNot(tok::r_square))\n  // ...\n  else {\n    // C++17 does not allow the identifier-list in a structured binding\n    // to be empty.\n    if (Bindings.empty())\n      Diag(Tok.getLocation(), diag::ext_decomp_decl_empty);"}},
		[j]={
			["clang/test/SemaCXX/cxx1z-decomposition.cpp"]={"clang/test/SemaCXX/cxx1z-decomposition.cpp:12:9: warning: ISO C++17 does not allow a decomposition group to be empty [-Wempty-decomposition]","clang/test/SemaCXX/cxx1z-decomposition.cpp:14:9: warning: ISO C++17 does not allow a decomposition group to be empty [-Wempty-decomposition]","clang/test/SemaCXX/cxx1z-decomposition.cpp:17:9: warning: ISO C++17 does not allow a decomposition group to be empty [-Wempty-decomposition]","clang/test/SemaCXX/cxx1z-decomposition.cpp:162:9: warning: ISO C++17 does not allow a decomposition group to be empty [-Wempty-decomposition]","clang/test/SemaCXX/cxx1z-decomposition.cpp:196:13: warning: ISO C++17 does not allow a decomposition group to be empty [-Wempty-decomposition]"}
		}
	},
	["ext_decomp_decl_spec"]={
		[n]={J,cb},
		[o]=J,
		[a]={{nil,y,"ext_decomp_decl_spec"}},
		[b]={{nil,q,"decomposition declaration declared %plural{1:\'%1\'|:with \'%1\' specifiers}0 is a C++20 extension"},{y,y,"decomposition declaration declared %plural{1:\'%1\'|:with \'%1\' specifiers}0 is a C++2a extension"}},
		[c]={{nil,q,{"decomposition declaration declared ",{"\'B\'","with \'B\' specifiers"}," is a C++20 extension"}},{y,y,{"decomposition declaration declared ",{"\'B\'","with \'B\' specifiers"}," is a C++2a extension"}}},
		[d]=p,
		[e]="decomposition declaration declared (?:\'(.*?)\'|with \'(.*?)\' specifiers) is a C\\+\\+20 extension",
		[f]=mb,
		[g]={{nil,y,m}},
		[h]={"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"},
		[i]={{r,813,"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);"}},
		[j]={
			["clang/test/CodeGenCXX/cxx1z-decomposition.cpp"]={"clang/test/CodeGenCXX/cxx1z-decomposition.cpp:122:3: warning: decomposition declaration declared \'static\' is a C++20 extension [-Wc++20-extensions]","clang/test/CodeGenCXX/cxx1z-decomposition.cpp:138:3: warning: decomposition declaration declared \'static\' is a C++20 extension [-Wc++20-extensions]"}
		}
	},
	["ext_default_init_const"]={
		[n]={Ub,"microsoft-const-init"},
		[o]="microsoft-const-init",
		[a]="ext_default_init_const",
		[b]="default initialization of an object of const type %0%select{| without a user-provided default constructor}1 is a Microsoft extension",
		[c]={{nil,nil,{"default initialization of an object of const type A",{k," without a user-provided default constructor"}," is a Microsoft extension"}}},
		[d]=p,
		[e]="default initialization of an object of const type (.*?)(?:| without a user\\-provided default constructor) is a Microsoft extension",
		[f]=" \\[(?:\\-Werror,)?\\-Wmicrosoft\\-const\\-init[^\\]]*\\]",
		[g]=m,
		[h]={"337d5aa58fc2",1429259558,"Move fixit for const init from note to diag, weaken to warning in MS mode.","Move fixit for const init from note to diag, weaken to warning in MS mode.\n\nr235046 turned \"extern __declspec(selectany) int a;\" from a declaration into\na definition to fix PR23242 (required for compatibility with mc.exe output).\nHowever, this broke parsing Windows headers: A  d3d11 headers contain something\nlike\n\n  struct SomeStruct {};\n  extern const __declspec(selectany) SomeStruct some_struct;\n\nThis is now a definition, and const objects either need an explicit default\nctor or an initializer so this errors out with \n\n  d3d11.h(1065,48) :\n    error: default initialization of an object of const type\n           \'const CD3D11_DEFAULT\' without a user-provided default constructor\n\n(cl.exe just doesn\'t implement this rule, independent of selectany.)\n\nTo work around this, weaken this error into a warning for selectany decls\nin microsoft mode, and recover with zero-initialization.\n\nDoing this is a bit hairy since it adds a fixit on an error emitted\nby InitializationSequence – this means it needs to build a correct AST, which\nin turn means InitializationSequence::Failed() cannot return true when this\nfixit is applied. As a workaround, the patch adds a fixit member to\nInitializationSequence, and InitializationSequence::Perform() prints the\ndiagnostic if the fixit member is set right after its call to Diagnose.\nThat function is usually called when InitializationSequences are used –\nInitListChecker::PerformEmptyInit() doesn\'t call it, but the InitListChecker\ncase never performs default-initialization, so this is technically OK.\n\nThis is the alternative, original fix for PR20208 that got reviewed in the\nthread \"[patch] Improve diagnostic on default-initializing const variables\n(PR20208)\".  This change basically reverts r213725, adds the original fix for\nPR20208, and makes the error a warning in Microsoft mode.\n\nllvm-svn: 235166"},
		[i]={{nb,8537,"ExprResult InitializationSequence::Perform(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Args, QualType *ResultType) {\n  // ...\n  if (!ZeroInitializationFixit.empty()) {\n    // ...\n    // The initialization would have succeeded with this fixit. Since the fixit\n    // is on the error, we need to build a valid AST in this case, so this isn\'t\n    // handled in the Failed() branch above.\n    if (!DestType->isRecordType() && VD && VD->isConstexpr()) {\n    // ...\n    } else {\n      // ...\n      if (S.getLangOpts().MSVCCompat && D && D->hasAttr<SelectAnyAttr>())\n        DiagID = diag::ext_default_init_const;"}},
		[j]={
			["clang/test/SemaCXX/attr-selectany.cpp"]={"clang/test/SemaCXX/attr-selectany.cpp:48:47: warning: default initialization of an object of const type \'const SomeStruct\' without a user-provided default constructor is a Microsoft extension [-Wmicrosoft-const-init]"}
		}
	},
	["ext_defaulted_comparison"]={
		[n]={J,cb},
		[o]=J,
		[a]={{nil,q,"ext_defaulted_comparison"}},
		[b]={{nil,q,"defaulted comparison operators are a C++20 extension"}},
		[c]={{nil,q,"defaulted comparison operators are a C++20 extension"}},
		[d]=p,
		[e]="defaulted comparison operators are a C\\+\\+20 extension",
		[f]=mb,
		[g]={{nil,q,m}},
		[h]={Pb,1567434909,Wb,Xb},
		[i]={{r,17884,"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);"}},
		[j]={
			["clang/test/SemaCXX/cxx17-compat.cpp"]={"clang/test/SemaCXX/cxx17-compat.cpp:93:56: warning: defaulted comparison operators are a C++20 extension [-Wc++20-extensions]","clang/test/SemaCXX/cxx17-compat.cpp:94:56: warning: defaulted comparison operators are a C++20 extension [-Wc++20-extensions]"}
		}
	},
	["ext_defaulted_comparison_constexpr_mismatch"]={
		[n]={"c++23-default-comp-relaxed-constexpr",w},
		[o]="c++23-default-comp-relaxed-constexpr",
		[a]="ext_defaulted_comparison_constexpr_mismatch",
		[b]="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 a C++23 extension",
		[c]={{nil,nil,{"defaulted definition of ",{{{"equality","three-way","equality","relational"}," comparison operator"},"three-way comparison operator"}," that is declared ",{"constexpr","consteval"}," but",{k,"for which the corresponding implicit \'operator==\' "}," invokes a non-constexpr comparison function is a C++23 extension"}}},
		[d]=p,
		[e]="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 a C\\+\\+23 extension",
		[f]=" \\[(?:\\-Werror,)?\\-Wc\\+\\+23\\-default\\-comp\\-relaxed\\-constexpr[^\\]]*\\]",
		[g]=m,
		[h]={F,1625925174,G,H},
		[i]={{r,8968,"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();"}},
		[j]={
			["clang/test/CXX/class/class.compare/class.compare.default/p4.cpp"]={"clang/test/CXX/class/class.compare/class.compare.default/p4.cpp:87:3: warning: defaulted definition of three-way comparison operator that is declared constexpr butfor which the corresponding implicit \'operator==\'  invokes a non-constexpr comparison function is a C++23 extension [-Wc++23-default-comp-relaxed-constexpr]","clang/test/CXX/class/class.compare/class.compare.default/p4.cpp:153:5: warning: defaulted definition of equality comparison operator that is declared constexpr but invokes a non-constexpr comparison function is a C++23 extension [-Wc++23-default-comp-relaxed-constexpr]"}
		}
	},
	["ext_defaulted_deleted_function"]={
		[n]={Kb,hb},
		[o]=hb,
		[a]="ext_defaulted_deleted_function",
		[b]="%select{defaulted|deleted}0 function definitions are a C++11 extension",
		[c]={{nil,nil,{{"defaulted","deleted"}," function definitions are a C++11 extension"}}},
		[d]=p,
		[e]="(?:defaulted|deleted) function definitions are a C\\+\\+11 extension",
		[f]=Mb,
		[g]=s,
		[h]={"54a6a68c706b",1447524968,"Merge some similar diagnostics using %select.","Merge some similar diagnostics using %select.\n\nllvm-svn: 253136"},
		[i]={{"clang/lib/Parse/ParseCXXInlineMethods.cpp",72,"/// 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",82,"/// 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 */;"},{Cb,1368,"/// 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 */;"},{Cb,1374,"/// 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 */;"}},
		[j]={
			["clang/test/SemaCXX/aggregate-init-cxx98.cpp"]={"clang/test/SemaCXX/aggregate-init-cxx98.cpp:4:9: warning: defaulted function definitions are a C++11 extension [-Wc++11-extensions]"}
		}
	},
	["ext_delete_void_ptr_operand"]={
		[n]={"delete-incomplete"},
		[o]="delete-incomplete",
		[a]="ext_delete_void_ptr_operand",
		[b]="cannot delete expression with pointer-to-\'void\' type %0",
		[c]="cannot delete expression with pointer-to-\'void\' type A",
		[d]=p,
		[e]="cannot delete expression with pointer\\-to\\-\'void\' type (.*?)",
		[f]=" \\[(?:\\-Werror,)?\\-Wdelete\\-incomplete[^\\]]*\\]",
		[g]=m,
		[h]={"bb3348ed33ac",1274720516,"Downgrade deletion of a void* from an error (which is should be) to an","Downgrade deletion of a void* from an error (which is should be) to an\nextension warning (which other compilers seem to use). Works around a\nknown bug in Xalan.\n\nllvm-svn: 104509"},
		[i]={{R,3686,"/// 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      Diag(StartLoc, diag::ext_delete_void_ptr_operand) << Type << Ex.get()->getSourceRange();"}},
		[j]={
			["clang/test/SemaCXX/new-delete.cpp"]={"clang/test/SemaCXX/new-delete.cpp:174:3: warning: cannot delete expression with pointer-to-\'void\' type \'void *\' [-Wdelete-incomplete]"}
		}
	}
};