Module:ClangDiags/DiagsLongData9

From emmtrix Wiki
Jump to navigation Jump to search

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

local a="";
local b="commit";
local c="id_hist";
local d="message_hist";
local e="hierarchical_hist";
local f="regex1";
local g="regex2";
local h="regex3";
local i="category_hist";
local j="(?:error|fatal error)\\: ";
local k="source";
local l="tests2";
local m="Semantic Issue";
local n="clang/lib/Sema/SemaExpr.cpp";
local o="clang/lib/Sema/SemaTemplate.cpp";
local p="Update tablegen diagnostic files to be in sync with the def files.\n\nllvm-svn: 67004";
local q="5a8987ca5113";
local r="Update tablegen diagnostic files to be in sync with the def files.";
local s="12.0";
local t="10.0";
local u="11.0";
local v="clang/lib/Sema/SemaDecl.cpp";
local w="clang/lib/Sema/SemaChecking.cpp";
local x="6.0";
local y="13.0";
local z="None";
local A="14.0";
local B="clang/lib/Sema/SemaType.cpp";
local C="5.0";
local D="9.0";
local E="clang/test/SemaSYCL/zero-length-arrays.cpp:9:3: error: zero-length arrays are not permitted in SYCL device code";
local F="function";
local G="clang/lib/Sema/SemaExprCXX.cpp";
local H="clang/lib/Sema/SemaDeclAttr.cpp";
local I="Parse Issue";
local J="method";
local K="converting A to type B";
local L="returning from function with different return type";
local M="block";
local N="passing to parameter of different type";
local O="kernel function";
local P="converting between types";
local Q="initializing with expression of different type";
local R="initializing A with an expression of type B";
local S="sending A to parameter of type B";
local T="sending to parameter of different type";
local U="arguments to ";
local V="execution configuration ";
local W="casting A to type B";
local X="passing A to parameter of type B";
local Y="casting between types";
local Z="assigning to different types";
local ab="returning A from a function with result type B";
local bb="7.0";
local cb="clang/lib/Sema/SemaExprMember.cpp";
local db="clang/lib/Sema/SemaOverload.cpp";
local eb="8.0";
local fb="931fcd3ba011";
local gb="[WebAssembly] Improve clang diagnostics for wasm attributes";
local hb="[WebAssembly] Improve clang diagnostics for wasm attributes\n\nThis patch addresses the review comments on r352930:\n\n - Removes redundant diagnostic checking code\n - Removes errnoneous use of diag::err_alias_is_definition, which\n   turned out to be ineffective anyway since functions can be defined later\n   in the translation unit and avoid detection.\n - Adds a test for various invalid cases for import_name and import_module.\n\nDifferential Revision: https://reviews.llvm.org/D59520";
local ib="15.0";
local jb="16.0";
local kb="Implement P2361 Unevaluated string literals\n\nThis patch proposes to handle in an uniform fashion\nthe parsing of strings that are never evaluated,\nin asm statement, static assert, attrributes, extern,\netc.\n\nUnevaluated strings are UTF-8 internally and so currently\nbehave as narrow strings, but these things will diverge with\nD93031.\n\nThe big question both for this patch and the P2361 paper\nis whether we risk breaking code by disallowing\nencoding prefixes in this context.\nI hope this patch may allow to gather some data on that.\n\nFuture work:\nImprove the rendering of unicode characters, line break\nand so forth in static-assert messages\n\nReviewed By: aaron.ballman, shafik\n\nDifferential Revision: https://reviews.llvm.org/D105759";
local lb="Implement P2361 Unevaluated string literals";
local mb="95f50964fbf5";
local nb="capturing value";
local ob="copying parameter";
local pb="returning object";
local qb="throwing object";
local rb="clang/lib/Parse/ParseDecl.cpp";
local sb="copying member subobject";
local tb="allocating object";
local ub="clang/test/Sema/fp-eval-pragma-with-float-double_t-1.c:30:16: error: cannot use type \'double_t\' within \'#pragma clang fp eval_method\'; type is set according to the default eval method for the translation unit";
local vb="copying array element";
local wb="assigning to A from B";
local xb="initializing vector element";
local yb="initializing base subobject";
local zb="copying temporary";
local Ab="clang/test/Sema/fp-eval-pragma-with-float-double_t-1.c:28:15: error: cannot use type \'float_t\' within \'#pragma clang fp eval_method\'; type is set according to the default eval method for the translation unit";
local Bb="copying variable";
local Cb="clang/lib/Sema/SemaInit.cpp";
local Db="clang/lib/Sema/SemaDeclCXX.cpp";
local Eb="11.1";
local Fb="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 Gb="[clang] Implement objc_non_runtime_protocol to remove protocol metadata";
local Hb="clang/lib/Sema/Sema.cpp";
local Ib="clang/lib/Sema/SemaStmt.cpp";
local Jb=" (A and B)";
local Kb="<unused>";
local Lb="14f6bfcb52e7";
local Mb="clang/lib/Parse/ParseDeclCXX.cpp";
local Nb="[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";
local Ob="class template";
local Pb="b1c4d5507fad";
local Qb="The basic representation of diagnostics information in tablegen format, plus (uncommented and incomp...";
local Rb="clang/lib/Sema/SemaCast.cpp";
local Sb="function template";
local Tb="clang/lib/Sema/SemaObjCProperty.cpp";
local Ub="; remove *";
local Vb="; take the address with &";
local Wb="initializing statement expression result";
local Xb="too many ";
local Yb="; dereference with *";
local Zb="; remove &";
local ac=" of type B";
local bc="too few ";
local cc="clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1-11.cpp";
local dc="template";
local ec="variable template";
local fc="Let clang atomic builtins fetch add/sub support floating point types";
local gc="Let clang atomic builtins fetch add/sub support floating point types\n\nRecently atomicrmw started to support fadd/fsub:\n\nhttps://reviews.llvm.org/D53965\n\nHowever clang atomic builtins fetch add/sub still does not support\nemitting atomicrmw fadd/fsub.\n\nThis patch adds that.\n\nReviewed by: John McCall, Artem Belevich, Matt Arsenault, JF Bastien,\nJames Y Knight, Louis Dionne, Olivier Giroux\n\nDifferential Revision: https://reviews.llvm.org/D71726";
local hc="61d065e21ff3";
local ic="clang/test/CXX/dcl.dcl/dcl.spec/dcl.typedef/p2-0x.cpp";
local jc="clang/lib/Lex/PPMacroExpansion.cpp";
local kc="s";
local lc="clang/lib/Basic/Targets.cpp";

return {
	["err_subscript_svbool_t"]={
		[c]={{nil,ib,"err_subscript_svbool_t"}},
		[d]={{nil,ib,"subscript of svbool_t is not allowed"}},
		[e]={{nil,ib,"subscript of svbool_t is not allowed"}},
		[f]=j,
		[g]="subscript of svbool_t is not allowed",
		[h]=a,
		[i]={{nil,ib,m}},
		[b]={"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"},
		[k]={{n,5924,"ExprResult Sema::CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc, Expr *Idx, SourceLocation RLoc) {\n  // ...\n  if (LHSTy->isDependentType() || RHSTy->isDependentType()) {\n  // ...\n  } else if (const PointerType *PTy = LHSTy->getAs<PointerType>()) {\n  // ...\n  } else if (const ObjCObjectPointerType *PTy = LHSTy->getAs<ObjCObjectPointerType>()) {\n  // ...\n  } else if (const PointerType *PTy = RHSTy->getAs<PointerType>()) {\n  // ...\n  } else if (const ObjCObjectPointerType *PTy = RHSTy->getAs<ObjCObjectPointerType>()) {\n  // ...\n  } else if (const VectorType *VTy = LHSTy->getAs<VectorType>()) {\n  // ...\n  } else if (LHSTy->isBuiltinType() && LHSTy->getAs<BuiltinType>()->isVLSTBuiltinType()) {\n    // ...\n    if (BTy->isSVEBool())\n      return ExprError(Diag(LLoc, diag::err_subscript_svbool_t) << LHSExp->getSourceRange() << RHSExp->getSourceRange());"}},
		[l]={
			["clang/test/Sema/aarch64-sve-vector-subscript-ops.c"]={"clang/test/Sema/aarch64-sve-vector-subscript-ops.c:11:10: error: subscript of svbool_t is not allowed","clang/test/Sema/aarch64-sve-vector-subscript-ops.c:12:10: error: subscript of svbool_t is not allowed","clang/test/Sema/aarch64-sve-vector-subscript-ops.c:13:10: error: subscript of svbool_t is not allowed"}
		}
	},
	["err_super_in_lambda_unsupported"]={
		[c]="err_super_in_lambda_unsupported",
		[d]="use of \'__super\' inside a lambda is unsupported",
		[e]="use of \'__super\' inside a lambda is unsupported",
		[f]=j,
		[g]="use of \'__super\' inside a lambda is unsupported",
		[h]=a,
		[i]=m,
		[b]={"67860249e064",1411691300,"-ms-extensions: Implement __super scope specifier (PR13236).","-ms-extensions: Implement __super scope specifier (PR13236).\n\nWe build a NestedNameSpecifier that records the CXXRecordDecl in which\n__super appeared. Name lookup is performed in all base classes of the\nrecorded CXXRecordDecl. Use of __super is allowed only inside class and\nmember function scope.\n\nllvm-svn: 218484"},
		[k]={{"clang/lib/Sema/SemaCXXScopeSpec.cpp",316,"bool Sema::ActOnSuperScopeSpecifier(SourceLocation SuperLoc, SourceLocation ColonColonLoc, CXXScopeSpec &SS) {\n  if (getCurLambda()) {\n    Diag(SuperLoc, diag::err_super_in_lambda_unsupported);"}},
		[l]={
			["clang/test/SemaCXX/MicrosoftSuper.cpp"]={"clang/test/SemaCXX/MicrosoftSuper.cpp:12:23: error: use of \'__super\' inside a lambda is unsupported"}
		}
	},
	["err_super_in_using_declaration"]={
		[c]="err_super_in_using_declaration",
		[d]="\'__super\' cannot be used with a using declaration",
		[e]="\'__super\' cannot be used with a using declaration",
		[f]=j,
		[g]="\'__super\' cannot be used with a using declaration",
		[h]=a,
		[i]=I,
		[b]={"67860249e064",1411691300,"-ms-extensions: Implement __super scope specifier (PR13236).","-ms-extensions: Implement __super scope specifier (PR13236).\n\nWe build a NestedNameSpecifier that records the CXXRecordDecl in which\n__super appeared. Name lookup is performed in all base classes of the\nrecorded CXXRecordDecl. Use of __super is allowed only inside class and\nmember function scope.\n\nllvm-svn: 218484"},
		[k]={{Mb,606,"/// Parse a using-declarator (or the identifier in a C++11 alias-declaration).\n///\n///     using-declarator:\n///       \'typename\'[opt] nested-name-specifier unqualified-id\n///\nbool Parser::ParseUsingDeclarator(DeclaratorContext Context, UsingDeclarator &D) {\n  // ...\n  if (Tok.is(tok::kw___super)) {\n    Diag(Tok.getLocation(), diag::err_super_in_using_declaration);"}},
		[l]={
			["clang/test/SemaCXX/MicrosoftSuper.cpp"]={"clang/test/SemaCXX/MicrosoftSuper.cpp:4:9: error: \'__super\' cannot be used with a using declaration"}
		}
	},
	["err_sve_vector_in_non_sve_target"]={
		[c]={{nil,jb,"err_sve_vector_in_non_sve_target"}},
		[d]={{nil,jb,"SVE vector type %0 cannot be used in a target without sve"}},
		[e]={{nil,jb,"SVE vector type A cannot be used in a target without sve"}},
		[f]=j,
		[g]="SVE vector type (.*?) cannot be used in a target without sve",
		[h]=a,
		[i]={{nil,jb,m}},
		[b]={mb,1625925174,lb,kb},
		[k]={{Hb,2063,"void Sema::checkTypeSupport(QualType Ty, SourceLocation Loc, ValueDecl *D) {\n  // ...\n  auto CheckType = [&](QualType Ty, bool IsRetTy = false) {\n    // ...\n    // Don\'t allow SVE types in functions without a SVE target.\n    if (Ty->isSVESizelessBuiltinType() && FD && FD->hasBody()) {\n      // ...\n      if (!Builtin::evaluateRequiredTargetFeatures(\"sve\", CallerFeatureMap))\n        Diag(D->getLocation(), diag::err_sve_vector_in_non_sve_target) << Ty;"},{v,8782,"void Sema::CheckVariableDeclarationType(VarDecl *NewVD) {\n  // ...\n  // Check that SVE types are only used in functions with SVE available.\n  if (T->isSVESizelessBuiltinType() && isa<FunctionDecl>(CurContext)) {\n    // ...\n    if (!Builtin::evaluateRequiredTargetFeatures(\"sve\", CallerFeatureMap)) {\n      Diag(NewVD->getLocation(), diag::err_sve_vector_in_non_sve_target) << T;"}},
		[l]={
			["clang/test/Sema/arm-sve-target.cpp"]={"clang/test/Sema/arm-sve-target.cpp:6:17: error: SVE vector type \'__SVFloat32_t\' cannot be used in a target without sve","clang/test/Sema/arm-sve-target.cpp:25:15: error: SVE vector type \'__SVFloat32_t\' cannot be used in a target without sve","clang/test/Sema/arm-sve-target.cpp:34:6: error: SVE vector type \'__SVFloat32_t\' cannot be used in a target without sve","clang/test/Sema/arm-sve-target.cpp:42:23: error: SVE vector type \'__clang_svint32x4_t\' cannot be used in a target without sve","clang/test/Sema/arm-sve-target.cpp:41:21: error: SVE vector type \'__clang_svint32x4_t\' cannot be used in a target without sve"}
		}
	},
	["err_swift_abi_parameter_wrong_type"]={
		[c]="err_swift_abi_parameter_wrong_type",
		[d]="\'%0\' parameter must have pointer%select{| to unqualified pointer}1 type; type here is %2",
		[e]={{nil,nil,{"\'A\' parameter must have pointer",{a," to unqualified pointer"}," type; type here is C"}}},
		[f]=j,
		[g]="\'(.*?)\' parameter must have pointer(?:| to unqualified pointer) type; type here is (.*?)",
		[h]=a,
		[i]=m,
		[b]={"477f2bb0d53c",1456987172,"Semantic analysis for the swiftcall calling convention.","Semantic analysis for the swiftcall calling convention.\n\nI\'ve tried to keep the infrastructure behind parameter ABI\ntreatments fairly general.\n\nllvm-svn: 262587"},
		[k]={{H,5527,"void Sema::AddParameterABIAttr(Decl *D, const AttributeCommonInfo &CI, ParameterABI abi) {\n  // ...\n  case ParameterABI::SwiftContext:\n    if (!isValidSwiftContextType(type)) {\n      Diag(CI.getLoc(), diag::err_swift_abi_parameter_wrong_type) << getParameterABISpelling(abi) << /*pointer to pointer */ 0 << type;"},{H,5535,"void Sema::AddParameterABIAttr(Decl *D, const AttributeCommonInfo &CI, ParameterABI abi) {\n  // ...\n  case ParameterABI::SwiftAsyncContext:\n    if (!isValidSwiftContextType(type)) {\n      Diag(CI.getLoc(), diag::err_swift_abi_parameter_wrong_type) << getParameterABISpelling(abi) << /*pointer to pointer */ 0 << type;"},{H,5543,"void Sema::AddParameterABIAttr(Decl *D, const AttributeCommonInfo &CI, ParameterABI abi) {\n  // ...\n  case ParameterABI::SwiftErrorResult:\n    if (!isValidSwiftErrorResultType(type)) {\n      Diag(CI.getLoc(), diag::err_swift_abi_parameter_wrong_type) << getParameterABISpelling(abi) << /*pointer to pointer */ 1 << type;"},{H,5551,"void Sema::AddParameterABIAttr(Decl *D, const AttributeCommonInfo &CI, ParameterABI abi) {\n  // ...\n  case ParameterABI::SwiftIndirectResult:\n    if (!isValidSwiftIndirectResultType(type)) {\n      Diag(CI.getLoc(), diag::err_swift_abi_parameter_wrong_type) << getParameterABISpelling(abi) << /*pointer*/ 0 << type;"}},
		[l]={
			["clang/test/SemaCXX/attr-swiftcall.cpp"]={"clang/test/SemaCXX/attr-swiftcall.cpp:21:31: error: \'swift_indirect_result\' parameter must have pointer type; type here is \'int\'","clang/test/SemaCXX/attr-swiftcall.cpp:29:51: error: \'swift_error_result\' parameter must have pointer to unqualified pointer type; type here is \'int\'","clang/test/SemaCXX/attr-swiftcall.cpp:30:52: error: \'swift_error_result\' parameter must have pointer to unqualified pointer type; type here is \'int *\'","clang/test/SemaCXX/attr-swiftcall.cpp:35:23: error: \'swift_context\' parameter must have pointer type; type here is \'int\'","clang/test/SemaCXX/attr-swiftcall.cpp:42:29: error: \'swift_async_context\' parameter must have pointer type; type here is \'int\'"}
		}
	},
	["err_swift_async_bad_block_type"]={
		[c]={{nil,s,"err_swift_async_bad_block_type"}},
		[d]={{nil,s,"\'swift_async\' completion handler parameter must have block type returning \'void\', type here is %0"}},
		[e]={{nil,s,"\'swift_async\' completion handler parameter must have block type returning \'void\', type here is A"}},
		[f]=j,
		[g]="\'swift_async\' completion handler parameter must have block type returning \'void\', type here is (.*?)",
		[h]=a,
		[i]={{nil,s,m}},
		[b]={hc,1590001902,fc,gc},
		[k]={{H,6946,"static void handleSwiftAsyncAttr(Sema &S, Decl *D, const ParsedAttr &AL) {\n  // ...\n  if (Kind == SwiftAsyncAttr::None) {\n  // ...\n  } else {\n    // ...\n    if (!CompletionBlockType->isBlockPointerType()) {\n      S.Diag(CompletionBlock->getLocation(), diag::err_swift_async_bad_block_type) << CompletionBlock->getType();"},{H,6954,"static void handleSwiftAsyncAttr(Sema &S, Decl *D, const ParsedAttr &AL) {\n  // ...\n  if (Kind == SwiftAsyncAttr::None) {\n  // ...\n  } else {\n    // ...\n    if (!BlockTy->castAs<FunctionType>()->getReturnType()->isVoidType()) {\n      S.Diag(CompletionBlock->getLocation(), diag::err_swift_async_bad_block_type) << CompletionBlock->getType();"}},
		[l]={
			["clang/test/SemaObjC/attr-swift-async.m"]={"clang/test/SemaObjC/attr-swift-async.m:12:32: error: \'swift_async\' completion handler parameter must have block type returning \'void\', type here is \'int\'","clang/test/SemaObjC/attr-swift-async.m:13:39: error: \'swift_async\' completion handler parameter must have block type returning \'void\', type here is \'int (^)()\'","clang/test/SemaObjC/attr-swift-async.m:23:26: error: \'swift_async\' completion handler parameter must have block type returning \'void\', type here is \'int (^)()\'","clang/test/SemaObjC/attr-swift-async.m:36:43: error: \'swift_async\' completion handler parameter must have block type returning \'void\', type here is \'int (^)()\'"}
		}
	},
	["err_swift_async_error_no_error_parameter"]={
		[c]={{nil,y,"err_swift_async_error_no_error_parameter"}},
		[d]={{nil,y,"%0 attribute with \'nonnull_error\' convention can only be applied to a %select{function|method}1 with a completion handler with an error parameter"}},
		[e]={{nil,y,{"A attribute with \'nonnull_error\' convention can only be applied to a ",{F,J}," with a completion handler with an error parameter"}}},
		[f]=j,
		[g]="(.*?) attribute with \'nonnull_error\' convention can only be applied to a (?:function|method) with a completion handler with an error parameter",
		[h]=a,
		[i]={{nil,y,m}},
		[b]={hc,1590001902,fc,gc},
		[k]={{H,6527,"static void checkSwiftAsyncErrorBlock(Sema &S, Decl *D, const SwiftAsyncErrorAttr *ErrorAttr, const SwiftAsyncAttr *AsyncAttr) {\n  // ...\n  case SwiftAsyncErrorAttr::NonNullError: {\n    // ...\n    if (!AnyErrorParams) {\n      S.Diag(ErrorAttr->getLocation(), diag::err_swift_async_error_no_error_parameter) << ErrorAttr << isa<ObjCMethodDecl>(D);"}},
		[l]={
			["clang/test/SemaObjC/attr-swift-async-error.m"]={"clang/test/SemaObjC/attr-swift-async-error.m:37:1: error: \'swift_async_error\' attribute with \'nonnull_error\' convention can only be applied to a function with a completion handler with an error parameter","clang/test/SemaObjC/attr-swift-async-error.m:89:3: error: \'swift_async_error\' attribute with \'nonnull_error\' convention can only be applied to a method with a completion handler with an error parameter"}
		}
	},
	["err_swift_async_error_non_integral"]={
		[c]={{nil,y,"err_swift_async_error_non_integral"}},
		[d]={{nil,y,"%0 attribute with \'%1\' convention must have an integral-typed parameter in completion handler at index %2, type here is %3"}},
		[e]={{nil,y,"A attribute with \'B\' convention must have an integral-typed parameter in completion handler at index C, type here is D"}},
		[f]=j,
		[g]="(.*?) attribute with \'(.*?)\' convention must have an integral\\-typed parameter in completion handler at index (.*?), type here is (.*?)",
		[h]=a,
		[i]={{nil,y,m}},
		[b]={hc,1590001902,fc,gc},
		[k]={{H,6496,"static void checkSwiftAsyncErrorBlock(Sema &S, Decl *D, const SwiftAsyncErrorAttr *ErrorAttr, const SwiftAsyncAttr *AsyncAttr) {\n  // ...\n  case SwiftAsyncErrorAttr::ZeroArgument:\n  case SwiftAsyncErrorAttr::NonZeroArgument: {\n    // ...\n    if (!ErrorParam->isIntegralType(S.Context)) {\n      // ...\n      S.Diag(ErrorAttr->getLocation(), diag::err_swift_async_error_non_integral) << ErrorAttr << ConvStr << ParamIdx << ErrorParam;"}},
		[l]={
			["clang/test/SemaObjC/attr-swift-async-error.m"]={"clang/test/SemaObjC/attr-swift-async-error.m:41:1: error: \'swift_async_error\' attribute with \'zero_argument\' convention must have an integral-typed parameter in completion handler at index 1, type here is \'double\'","clang/test/SemaObjC/attr-swift-async-error.m:81:3: error: \'swift_async_error\' attribute with \'nonzero_argument\' convention must have an integral-typed parameter in completion handler at index 1, type here is \'double\'"}
		}
	},
	["err_swift_async_error_without_swift_async"]={
		[c]={{nil,y,"err_swift_async_error_without_swift_async"}},
		[d]={{nil,y,"%0 attribute must be applied to a %select{function|method}1 annotated with non-\'none\' attribute \'swift_async\'"}},
		[e]={{nil,y,{"A attribute must be applied to a ",{F,J}," annotated with non-\'none\' attribute \'swift_async\'"}}},
		[f]=j,
		[g]="(.*?) attribute must be applied to a (?:function|method) annotated with non\\-\'none\' attribute \'swift_async\'",
		[h]=a,
		[i]={{nil,y,m}},
		[b]={hc,1590001902,fc,gc},
		[k]={{H,6463,"static void checkSwiftAsyncErrorBlock(Sema &S, Decl *D, const SwiftAsyncErrorAttr *ErrorAttr, const SwiftAsyncAttr *AsyncAttr) {\n  if (AsyncAttr->getKind() == SwiftAsyncAttr::None) {\n    if (ErrorAttr->getConvention() != SwiftAsyncErrorAttr::None) {\n      S.Diag(AsyncAttr->getLocation(), diag::err_swift_async_error_without_swift_async) << AsyncAttr << isa<ObjCMethodDecl>(D);"}}
	},
	["err_swift_async_no_access"]={
		[c]={{nil,s,"err_swift_async_no_access"}},
		[d]={{nil,s,"first argument to \'swift_async\' must be either \'none\', \'swift_private\', or \'not_swift_private\'"}},
		[e]={{nil,s,"first argument to \'swift_async\' must be either \'none\', \'swift_private\', or \'not_swift_private\'"}},
		[f]=j,
		[g]="first argument to \'swift_async\' must be either \'none\', \'swift_private\', or \'not_swift_private\'",
		[h]=a,
		[i]={{nil,s,m}},
		[b]={hc,1590001902,fc,gc},
		[k]={{H,6923,"static void handleSwiftAsyncAttr(Sema &S, Decl *D, const ParsedAttr &AL) {\n  // ...\n  if (!SwiftAsyncAttr::ConvertStrToKind(II->getName(), Kind)) {\n    S.Diag(AL.getLoc(), diag::err_swift_async_no_access) << AL << II;"}},
		[l]={
			["clang/test/SemaObjC/attr-swift-async.m"]={"clang/test/SemaObjC/attr-swift-async.m:20:1: error: first argument to \'swift_async\' must be either \'none\', \'swift_private\', or \'not_swift_private\'"}
		}
	},
	["err_swift_error_result_not_after_swift_context"]={
		[c]="err_swift_error_result_not_after_swift_context",
		[d]="\'swift_error_result\' parameter must follow \'swift_context\' parameter",
		[e]="\'swift_error_result\' parameter must follow \'swift_context\' parameter",
		[f]=j,
		[g]="\'swift_error_result\' parameter must follow \'swift_context\' parameter",
		[h]=a,
		[i]=m,
		[b]={"477f2bb0d53c",1456987172,"Semantic analysis for the swiftcall calling convention.","Semantic analysis for the swiftcall calling convention.\n\nI\'ve tried to keep the infrastructure behind parameter ABI\ntreatments fairly general.\n\nllvm-svn: 262587"},
		[k]={{B,3005,"/// Check the extended parameter information.  Most of the necessary\n/// checking should occur when applying the parameter attribute; the\n/// only other checks required are positional restrictions.\nstatic void checkExtParameterInfos(Sema &S, ArrayRef<QualType> paramTypes, const FunctionProtoType::ExtProtoInfo &EPI, llvm::function_ref<SourceLocation(unsigned)> getParamLoc) {\n  // ...\n  for (size_t paramIndex = 0, numParams = paramTypes.size(); paramIndex != numParams; ++paramIndex) {\n    // ...\n    // swift_error parameters must be preceded by a swift_context parameter.\n    case ParameterABI::SwiftErrorResult:\n      // ...\n      if (paramIndex == 0 || EPI.ExtParameterInfos[paramIndex - 1].getABI() != ParameterABI::SwiftContext) {\n        S.Diag(getParamLoc(paramIndex), diag::err_swift_error_result_not_after_swift_context);"}},
		[l]={
			["clang/test/SemaCXX/attr-swiftcall.cpp"]={"clang/test/SemaCXX/attr-swiftcall.cpp:27:48: error: \'swift_error_result\' parameter must follow \'swift_context\' parameter","clang/test/SemaCXX/attr-swiftcall.cpp:28:64: error: \'swift_error_result\' parameter must follow \'swift_context\' parameter"}
		}
	},
	["err_swift_indirect_result_not_first"]={
		[c]="err_swift_indirect_result_not_first",
		[d]="\'swift_indirect_result\' parameters must be first parameters of function",
		[e]="\'swift_indirect_result\' parameters must be first parameters of function",
		[f]=j,
		[g]="\'swift_indirect_result\' parameters must be first parameters of function",
		[h]=a,
		[i]=m,
		[b]={"477f2bb0d53c",1456987172,"Semantic analysis for the swiftcall calling convention.","Semantic analysis for the swiftcall calling convention.\n\nI\'ve tried to keep the infrastructure behind parameter ABI\ntreatments fairly general.\n\nllvm-svn: 262587"},
		[k]={{B,2986,"/// Check the extended parameter information.  Most of the necessary\n/// checking should occur when applying the parameter attribute; the\n/// only other checks required are positional restrictions.\nstatic void checkExtParameterInfos(Sema &S, ArrayRef<QualType> paramTypes, const FunctionProtoType::ExtProtoInfo &EPI, llvm::function_ref<SourceLocation(unsigned)> getParamLoc) {\n  // ...\n  for (size_t paramIndex = 0, numParams = paramTypes.size(); paramIndex != numParams; ++paramIndex) {\n    // ...\n    // swift_indirect_result parameters must be a prefix of the function\n    // arguments.\n    case ParameterABI::SwiftIndirectResult:\n      // ...\n      if (paramIndex != 0 && EPI.ExtParameterInfos[paramIndex - 1].getABI() != ParameterABI::SwiftIndirectResult) {\n        S.Diag(getParamLoc(paramIndex), diag::err_swift_indirect_result_not_first);"}},
		[l]={
			["clang/test/SemaCXX/attr-swiftcall.cpp"]={"clang/test/SemaCXX/attr-swiftcall.cpp:20:68: error: \'swift_indirect_result\' parameters must be first parameters of function"}
		}
	},
	["err_swift_param_attr_not_swiftcall"]={
		[c]="err_swift_param_attr_not_swiftcall",
		[d]={{nil,y,"\'%0\' parameter can only be used with swiftcall%select{ or swiftasynccall|}1 calling convention%select{|s}1"},{s,nil,"\'%0\' parameter can only be used with swiftcall calling convention"}},
		[e]={{nil,y,{"\'A\' parameter can only be used with swiftcall",{" or swiftasynccall",a}," calling convention",{a,kc}}},{s,nil,"\'A\' parameter can only be used with swiftcall calling convention"}},
		[f]=j,
		[g]="\'(.*?)\' parameter can only be used with swiftcall(?: or swiftasynccall|) calling convention(?:|s)",
		[h]=a,
		[i]=m,
		[b]={"477f2bb0d53c",1456987172,"Semantic analysis for the swiftcall calling convention.","Semantic analysis for the swiftcall calling convention.\n\nI\'ve tried to keep the infrastructure behind parameter ABI\ntreatments fairly general.\n\nllvm-svn: 262587"},
		[k]={{B,2966,"/// Check the extended parameter information.  Most of the necessary\n/// checking should occur when applying the parameter attribute; the\n/// only other checks required are positional restrictions.\nstatic void checkExtParameterInfos(Sema &S, ArrayRef<QualType> paramTypes, const FunctionProtoType::ExtProtoInfo &EPI, llvm::function_ref<SourceLocation(unsigned)> getParamLoc) {\n  // ...\n  auto checkCompatible = [&](unsigned paramIndex, RequiredCC required) {\n    // ...\n    S.Diag(getParamLoc(paramIndex), diag::err_swift_param_attr_not_swiftcall) << getParameterABISpelling(EPI.ExtParameterInfos[paramIndex].getABI()) << (required == RequiredCC::OnlySwift);"}},
		[l]={
			["clang/test/SemaCXX/attr-swiftcall.cpp"]={"clang/test/SemaCXX/attr-swiftcall.cpp:19:53: error: \'swift_indirect_result\' parameter can only be used with swiftcall or swiftasynccall calling convention","clang/test/SemaCXX/attr-swiftcall.cpp:27:48: error: \'swift_error_result\' parameter can only be used with swiftcall calling conventions","clang/test/SemaCXX/attr-swiftcall.cpp:34:37: error: \'swift_context\' parameter can only be used with swiftcall or swiftasynccall calling convention"}
		}
	},
	["err_switch_explicit_conversion"]={
		[c]="err_switch_explicit_conversion",
		[d]="switch condition type %0 requires explicit conversion to %1",
		[e]="switch condition type A requires explicit conversion to B",
		[f]=j,
		[g]="switch condition type (.*?) requires explicit conversion to (.*?)",
		[h]=a,
		[i]=m,
		[b]={"d0c22e0d10fc",1258983968,"Implement conversion from a switch condition with class type to an","Implement conversion from a switch condition with class type to an\nintegral or enumeration type (vi user-defined conversions). Fixes PR5518.\n\nllvm-svn: 89655"},
		[k]={{Ib,1051,"ExprResult Sema::CheckSwitchCondition(SourceLocation SwitchLoc, Expr *Cond) {\n  class SwitchConvertDiagnoser : public ICEConvertDiagnoser {\n    // ...\n    SemaDiagnosticBuilder diagnoseExplicitConv(Sema &S, SourceLocation Loc, QualType T, QualType ConvTy) override { return S.Diag(Loc, diag::err_switch_explicit_conversion) << T << ConvTy; }"}},
		[l]={
			["clang/test/SemaCXX/switch-0x.cpp"]={"clang/test/SemaCXX/switch-0x.cpp:9:3: error: switch condition type \'A\' requires explicit conversion to \'int\'"}
		}
	},
	["err_switch_incomplete_class_type"]={
		[c]="err_switch_incomplete_class_type",
		[d]="switch condition has incomplete class type %0",
		[e]="switch condition has incomplete class type A",
		[f]=j,
		[g]="switch condition has incomplete class type (.*?)",
		[h]=a,
		[i]=m,
		[b]={"378e1923b6a5",1258984401,"Require a class type to be complete before probing its conversion","Require a class type to be complete before probing its conversion\nfunctions for a switch condition\'s conversion to integral or\nenumeration type. \n\nllvm-svn: 89656"},
		[k]={{Ib,1045,"ExprResult Sema::CheckSwitchCondition(SourceLocation SwitchLoc, Expr *Cond) {\n  class SwitchConvertDiagnoser : public ICEConvertDiagnoser {\n    // ...\n    SemaDiagnosticBuilder diagnoseIncomplete(Sema &S, SourceLocation Loc, QualType T) override { return S.Diag(Loc, diag::err_switch_incomplete_class_type) << T << Cond->getSourceRange(); }"}},
		[l]={
			["clang/test/SemaCXX/switch.cpp"]={"clang/test/SemaCXX/switch.cpp:40:3: error: switch condition has incomplete class type \'C\'"}
		}
	},
	["err_switch_into_protected_scope"]={
		[c]="err_switch_into_protected_scope",
		[d]="cannot jump from switch statement to this case label",
		[e]="cannot jump from switch statement to this case label",
		[f]=j,
		[g]="cannot jump from switch statement to this case label",
		[h]=a,
		[i]=m,
		[b]={"7535f41c6673",1240083757,"first step to getting switches giving \"jump into vla scope\" errors.","first step to getting switches giving \"jump into vla scope\" errors.\n\nllvm-svn: 69461"},
		[k]={{"clang/lib/ARCMigrate/TransProtectedScope.cpp",121,"class ProtectedScopeFixer {\n  // ...\n  ProtectedScopeFixer(BodyContext &BodyCtx) : Pass(BodyCtx.getMigrationContext().Pass), SM(Pass.Ctx.getSourceManager()) {\n    // ...\n    while (I != E) {\n      if (I->getID() == diag::err_switch_into_protected_scope && isInRange(I->getLocation(), BodyRange)) {"},{"clang/lib/ARCMigrate/TransProtectedScope.cpp",134,"class ProtectedScopeFixer {\n  // ...\n  void handleProtectedScopeError(SmallVectorImpl<StoredDiagnostic>::iterator &DiagI, SmallVectorImpl<StoredDiagnostic>::iterator DiagE) {\n    // ...\n    assert(DiagI->getID() == diag::err_switch_into_protected_scope);"},{"clang/lib/ARCMigrate/TransProtectedScope.cpp",145,"class ProtectedScopeFixer {\n  // ...\n  void handleProtectedScopeError(SmallVectorImpl<StoredDiagnostic>::iterator &DiagI, SmallVectorImpl<StoredDiagnostic>::iterator DiagE) {\n    // ...\n    if (handledAllNotes)\n      Pass.TA.clearDiagnostic(diag::err_switch_into_protected_scope, ErrLoc);"},{"clang/lib/Sema/JumpDiagnostics.cpp",712,"/// VerifyJumps - Verify each element of the Jumps array to see if they are\n/// valid, emitting diagnostics if not.\nvoid JumpScopeChecker::VerifyJumps() {\n  while (!Jumps.empty()) {\n    // ...\n    for (SwitchCase *SC = SS->getSwitchCaseList(); SC; SC = SC->getNextSwitchCase()) {\n      // ...\n      CheckJump(SS, SC, Loc, diag::err_switch_into_protected_scope, 0, diag::warn_cxx98_compat_switch_into_protected_scope);"}},
		[l]={
			["clang/test/SemaObjC/strong-in-c-struct.m"]={"clang/test/SemaObjC/strong-in-c-struct.m:20:3: error: cannot jump from switch statement to this case label","clang/test/SemaObjC/strong-in-c-struct.m:44:3: error: cannot jump from switch statement to this case label","clang/test/SemaObjC/strong-in-c-struct.m:63:3: error: cannot jump from switch statement to this case label"}
		}
	},
	["err_switch_multiple_conversions"]={
		[c]="err_switch_multiple_conversions",
		[d]="multiple conversions from switch condition type %0 to an integral or enumeration type",
		[e]="multiple conversions from switch condition type A to an integral or enumeration type",
		[f]=j,
		[g]="multiple conversions from switch condition type (.*?) to an integral or enumeration type",
		[h]=a,
		[i]=m,
		[b]={"d0c22e0d10fc",1258983968,"Implement conversion from a switch condition with class type to an","Implement conversion from a switch condition with class type to an\nintegral or enumeration type (vi user-defined conversions). Fixes PR5518.\n\nllvm-svn: 89655"},
		[k]={{Ib,1062,"ExprResult Sema::CheckSwitchCondition(SourceLocation SwitchLoc, Expr *Cond) {\n  class SwitchConvertDiagnoser : public ICEConvertDiagnoser {\n    // ...\n    SemaDiagnosticBuilder diagnoseAmbiguous(Sema &S, SourceLocation Loc, QualType T) override { return S.Diag(Loc, diag::err_switch_multiple_conversions) << T; }"}},
		[l]={
			["clang/test/SemaCXX/switch.cpp"]={"clang/test/SemaCXX/switch.cpp:33:3: error: multiple conversions from switch condition type \'B\' to an integral or enumeration type"}
		}
	},
	["err_sycl_special_type_num_init_method"]={
		[c]={{nil,A,"err_sycl_special_type_num_init_method"}},
		[d]={{nil,A,"types with \'sycl_special_class\' attribute must have one and only one \'__init\' method defined"}},
		[e]={{nil,A,"types with \'sycl_special_class\' attribute must have one and only one \'__init\' method defined"}},
		[f]=j,
		[g]="types with \'sycl_special_class\' attribute must have one and only one \'__init\' method defined",
		[h]=a,
		[i]={{nil,A,z}},
		[b]={"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"},
		[k]={{v,17816,"void Sema::ActOnTagFinishDefinition(Scope *S, Decl *TagD, SourceRange BraceRange) {\n  // ...\n  if (auto *RD = dyn_cast<CXXRecordDecl>(Tag)) {\n    // ...\n    if (RD->hasAttr<SYCLSpecialClassAttr>()) {\n      // ...\n      if (NumInitMethods > 1 || !Def->hasInitMethod())\n        Diag(RD->getLocation(), diag::err_sycl_special_type_num_init_method);"}},
		[l]={
			["clang/test/SemaSYCL/special-class-attribute.cpp"]={"clang/test/SemaSYCL/special-class-attribute.cpp:42:43: error: types with \'sycl_special_class\' attribute must have one and only one \'__init\' method defined","clang/test/SemaSYCL/special-class-attribute.cpp:45:37: error: types with \'sycl_special_class\' attribute must have one and only one \'__init\' method defined","clang/test/SemaSYCL/special-class-attribute.cpp:49:37: error: types with \'sycl_special_class\' attribute must have one and only one \'__init\' method defined","clang/test/SemaSYCL/special-class-attribute.cpp:56:8: error: types with \'sycl_special_class\' attribute must have one and only one \'__init\' method defined","clang/test/SemaSYCL/special-class-attribute.cpp:59:44: error: types with \'sycl_special_class\' attribute must have one and only one \'__init\' method defined","clang/test/SemaSYCL/special-class-attribute.cpp:78:37: error: types with \'sycl_special_class\' attribute must have one and only one \'__init\' method defined","clang/test/SemaSYCL/special-class-attribute.cpp:83:43: error: types with \'sycl_special_class\' attribute must have one and only one \'__init\' method defined","clang/test/SemaSYCL/special-class-attribute.cpp:88:38: error: types with \'sycl_special_class\' attribute must have one and only one \'__init\' method defined","clang/test/SemaSYCL/special-class-attribute.cpp:93:44: error: types with \'sycl_special_class\' attribute must have one and only one \'__init\' method defined"}
		}
	},
	["err_synthesize_category_decl"]={
		[c]="err_synthesize_category_decl",
		[d]="@synthesize not allowed in a category\'s implementation",
		[e]="@synthesize not allowed in a category\'s implementation",
		[f]=j,
		[g]="@synthesize not allowed in a category\'s implementation",
		[h]=a,
		[i]=m,
		[b]={"f881267db9a9",1480718311,"Mass-rename the handful of error_* diagnostics to err_*.","Mass-rename the handful of error_* diagnostics to err_*.\n\nllvm-svn: 288545"},
		[k]={{Tb,1176,"/// 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 = dyn_cast<ObjCImplementationDecl>(ClassImpDecl))) {\n  // ...\n  } else if ((CatImplClass = dyn_cast<ObjCCategoryImplDecl>(ClassImpDecl))) {\n    if (Synthesize) {\n      Diag(AtLoc, diag::err_synthesize_category_decl);"}},
		[l]={
			["clang/test/SemaObjC/property.m"]={"clang/test/SemaObjC/property.m:26:1: error: @synthesize not allowed in a category\'s implementation"}
		}
	},
	["err_synthesize_on_class_property"]={
		[c]="err_synthesize_on_class_property",
		[d]="@synthesize not allowed on a class property %0",
		[e]="@synthesize not allowed on a class property A",
		[f]=j,
		[g]="@synthesize not allowed on a class property (.*?)",
		[h]=a,
		[i]=m,
		[b]={"f881267db9a9",1480718311,"Mass-rename the handful of error_* diagnostics to err_*.","Mass-rename the handful of error_* diagnostics to err_*.\n\nllvm-svn: 288545"},
		[k]={{Tb,1118,"/// 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 = dyn_cast<ObjCImplementationDecl>(ClassImpDecl))) {\n    // ...\n    if (property->isClassProperty() && Synthesize) {\n      Diag(PropertyLoc, diag::err_synthesize_on_class_property) << PropertyId;"}},
		[l]={
			["clang/test/SemaObjC/objc-class-property.m"]={"clang/test/SemaObjC/objc-class-property.m:32:16: error: @synthesize not allowed on a class property \'c2\'"}
		}
	},
	["err_synthesize_variable_sized_ivar"]={
		[c]={{nil,x,"err_synthesize_variable_sized_ivar"}},
		[d]={{nil,x,"synthesized property with variable size type %0 requires an existing instance variable"}},
		[e]={{nil,x,"synthesized property with variable size type A requires an existing instance variable"}},
		[f]=j,
		[g]="synthesized property with variable size type (.*?) requires an existing instance variable",
		[h]=a,
		[i]={{nil,x,m}},
		[b]={"30680e943735",1508796101,"[Sema] Add support for flexible array members in Obj-C.","[Sema] Add support for flexible array members in Obj-C.\n\nAllow Obj-C ivars with incomplete array type but only as the last ivar.\nAlso add a requirement for ivars that contain a flexible array member to\nbe at the end of class too. It is possible to add in a subclass another\nivar at the end but we\'ll emit a warning in this case. Also we\'ll emit a\nwarning if a variable sized ivar is declared in class extension or in\nimplementation because subclasses won\'t know they should avoid adding\nnew ivars.\n\nIn ARC incomplete array objects are treated as __unsafe_unretained so\nrequire them to be marked as such.\n\nProhibit synthesizing ivars with flexible array members because order of\nsynthesized ivars is not obvious and tricky to control. Spelling out\nivar explicitly gives control to developers and helps to avoid surprises\nwith unexpected ivar ordering.\n\nFor C and C++ changed diagnostic to tell explicitly a field is not the\nlast one and point to the next field. It is not as useful as in Obj-C\nbut it is an improvement and it is consistent with Obj-C. For C for\nunions emit more specific err_flexible_array_union instead of generic\nerr_field_incomplete.\n\nrdar://problem/21054495\n\nReviewers: rjmccall, theraven\n\nReviewed By: rjmccall\n\nSubscribers: cfe-commits\n\nDifferential Revision: https://reviews.llvm.org/D38773\n\nllvm-svn: 316381"},
		[k]={{Tb,1335,"/// 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    if (!Ivar) {\n      // ...\n      if (!CompleteTypeErr) {\n        // ...\n        if (RecordTy && RecordTy->getDecl()->hasFlexibleArrayMember()) {\n          Diag(PropertyIvarLoc, diag::err_synthesize_variable_sized_ivar) << PropertyIvarType;"}},
		[l]={
			["clang/test/SemaObjC/flexible-array.m"]={"clang/test/SemaObjC/flexible-array.m:214:25: error: synthesized property with variable size type \'struct Packet\' requires an existing instance variable","clang/test/SemaObjC/flexible-array.m:220:25: error: synthesized property with variable size type \'struct Packet\' requires an existing instance variable"}
		}
	},
	["err_synthesized_property_name"]={
		[c]="err_synthesized_property_name",
		[d]="expected a property name in @synthesize",
		[e]="expected a property name in @synthesize",
		[f]=j,
		[g]="expected a property name in @synthesize",
		[h]=a,
		[i]=I,
		[b]={"88e72a0bf662",1258573545,"Improve diagnostics and recovery when parsing @synthesized definitions","Improve diagnostics and recovery when parsing @synthesized definitions\n\nllvm-svn: 89227"},
		[k]={{"clang/lib/Parse/ParseObjc.cpp",2385,"///   property-synthesis:\n///     @synthesize property-ivar-list \';\'\n///\n///   property-ivar-list:\n///     property-ivar\n///     property-ivar-list \',\' property-ivar\n///\n///   property-ivar:\n///     identifier\n///     identifier \'=\' identifier\n///\nDecl *Parser::ParseObjCPropertySynthesize(SourceLocation atLoc) {\n  // ...\n  while (true) {\n    // ...\n    if (Tok.isNot(tok::identifier)) {\n      Diag(Tok, diag::err_synthesized_property_name);"}},
		[l]={
			["clang/test/Parser/objc-synthesized-recover.m"]={"clang/test/Parser/objc-synthesized-recover.m:13:20: error: expected a property name in @synthesize"}
		}
	},
	["err_synthesizing_arc_weak_property_disabled"]={
		[c]="err_synthesizing_arc_weak_property_disabled",
		[d]="cannot synthesize weak property in file using manual reference counting",
		[e]="cannot synthesize weak property in file using manual reference counting",
		[f]=j,
		[g]="cannot synthesize weak property in file using manual reference counting",
		[h]=a,
		[i]="ARC Weak References",
		[b]={"b61e14e5962a",1445921690,"Be more conservative about diagnosing \"incorrect\" uses of __weak:","Be more conservative about diagnosing \"incorrect\" uses of __weak:\nallow them to be written in certain kinds of user declaration and\ndiagnose on the use-site instead.\n\nAlso, improve and fix some diagnostics relating to __weak and\nproperties.\n\nrdar://23228631\n\nllvm-svn: 251384"},
		[k]={{Tb,1253,"/// 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    if (kind & ObjCPropertyAttribute::kind_weak) {\n      // Add GC __weak to the ivar type if the property is weak.\n      if (getLangOpts().getGC() != LangOptions::NonGC) {\n      // ...\n      } else {\n        if (!getLangOpts().ObjCWeak) {\n          // Only complain here when synthesizing an ivar.\n          if (!Ivar) {\n            Diag(PropertyDiagLoc, getLangOpts().ObjCWeakRuntime ? diag::err_synthesizing_arc_weak_property_disabled : diag::err_synthesizing_arc_weak_property_no_runtime);"}},
		[l]={
			["clang/test/SemaObjC/mrc-no-weak.m"]={"clang/test/SemaObjC/mrc-no-weak.m:28:13: error: cannot synthesize weak property in file using manual reference counting","clang/test/SemaObjC/mrc-no-weak.m:34:1: error: cannot synthesize weak property in file using manual reference counting"}
		}
	},
	["err_synthesizing_arc_weak_property_no_runtime"]={
		[c]="err_synthesizing_arc_weak_property_no_runtime",
		[d]="cannot synthesize weak property because the current deployment target does not support weak references",
		[e]="cannot synthesize weak property because the current deployment target does not support weak references",
		[f]=j,
		[g]="cannot synthesize weak property because the current deployment target does not support weak references",
		[h]=a,
		[i]="ARC Weak References",
		[b]={"b61e14e5962a",1445921690,"Be more conservative about diagnosing \"incorrect\" uses of __weak:","Be more conservative about diagnosing \"incorrect\" uses of __weak:\nallow them to be written in certain kinds of user declaration and\ndiagnose on the use-site instead.\n\nAlso, improve and fix some diagnostics relating to __weak and\nproperties.\n\nrdar://23228631\n\nllvm-svn: 251384"},
		[k]={{Tb,1254,"/// 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    if (kind & ObjCPropertyAttribute::kind_weak) {\n      // Add GC __weak to the ivar type if the property is weak.\n      if (getLangOpts().getGC() != LangOptions::NonGC) {\n      // ...\n      } else {\n        if (!getLangOpts().ObjCWeak) {\n          // Only complain here when synthesizing an ivar.\n          if (!Ivar) {\n            Diag(PropertyDiagLoc, getLangOpts().ObjCWeakRuntime ? diag::err_synthesizing_arc_weak_property_disabled : diag::err_synthesizing_arc_weak_property_no_runtime);"}},
		[l]={
			["clang/test/SemaObjC/synthesized-ivar.m"]={"clang/test/SemaObjC/synthesized-ivar.m:60:13: error: cannot synthesize weak property because the current deployment target does not support weak references"}
		}
	},
	["err_systemz_invalid_tabort_code"]={
		[c]="err_systemz_invalid_tabort_code",
		[d]="invalid transaction abort code",
		[e]="invalid transaction abort code",
		[f]=j,
		[g]="invalid transaction abort code",
		[h]=a,
		[i]=m,
		[b]={"3a610ebf1e7c",1427892865,"[SystemZ] Support transactional execution on zEC12","[SystemZ] Support transactional execution on zEC12\n\nThe zEC12 provides the transactional-execution facility.  This is exposed\nto users via a set of builtin routines on other compilers.  This patch\nadds clang support to enable those builtins.  In partciular, the patch:\n\n- enables the transactional-execution feature by default on zEC12\n- allows to override presence of that feature via the -mhtm/-mno-htm options\n- adds a predefined macro __HTM__ if the feature is enabled\n- adds support for the transactional-execution GCC builtins\n- adds Sema checking to verify the __builtin_tabort abort code\n- adds the s390intrin.h header file (for GCC compatibility)\n- adds s390 sections to the htmintrin.h and htmxlintrin.h header files\n\nSince this is first use of target-specific intrinsics on the platform,\nthe patch creates the include/clang/Basic/BuiltinsSystemZ.def file and\nhooks it up in TargetBuiltins.h and lib/Basic/Targets.cpp.\n\nAn associated LLVM patch adds the required LLVM IR intrinsics.\n\nFor reference, the transactional-execution instructions are documented\nin the z/Architecture Principles of Operation for the zEC12:\nhttp://publibfp.boulder.ibm.com/cgi-bin/bookmgr/download/DZ9ZR009.pdf\nThe associated builtins are documented in the GCC manual:\nhttp://gcc.gnu.org/onlinedocs/gcc/S_002f390-System-z-Built-in-Functions.html\nThe htmxlintrin.h intrinsics provided for compatibility with the IBM XL\ncompiler are documented in the \"z/OS XL C/C++ Programming Guide\".\n\nllvm-svn: 233804"},
		[k]={{w,5332,"bool Sema::CheckSystemZBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {\n  if (BuiltinID == SystemZ::BI__builtin_tabort) {\n    // ...\n    if (std::optional<llvm::APSInt> AbortCode = Arg->getIntegerConstantExpr(Context))\n      if (AbortCode->getSExtValue() >= 0 && AbortCode->getSExtValue() < 256)\n        return Diag(Arg->getBeginLoc(), diag::err_systemz_invalid_tabort_code) << Arg->getSourceRange();"}},
		[l]={
			["clang/test/CodeGen/SystemZ/builtins-systemz-error.c"]={"clang/test/CodeGen/SystemZ/builtins-systemz-error.c:6:21: error: invalid transaction abort code","clang/test/CodeGen/SystemZ/builtins-systemz-error.c:7:21: error: invalid transaction abort code"}
		}
	},
	["err_tag_definition_of_typedef"]={
		[c]="err_tag_definition_of_typedef",
		[d]="definition of type %0 conflicts with %select{typedef|type alias}1 of the same name",
		[e]={{nil,nil,{"definition of type A conflicts with ",{"typedef","type alias"}," of the same name"}}},
		[f]=j,
		[g]="definition of type (.*?) conflicts with (?:typedef|type alias) of the same name",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{v,17451,"/// 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    // ...\n    } else {\n      // Use a better diagnostic if an elaborated-type-specifier\n      // found the wrong kind of type on the first\n      // (non-redeclaration) lookup.\n      if ((TUK == TUK_Reference || TUK == TUK_Friend) && !Previous.isForRedeclaration()) {\n      // ...\n      } else if (!isDeclInScope(DirectPrevDecl, SearchDC, S, SS.isNotEmpty() || isMemberSpecialization)) {\n      // ...\n      } else if (TUK == TUK_Reference || TUK == TUK_Friend) {\n      // ...\n      } else if (TypedefNameDecl *TND = dyn_cast<TypedefNameDecl>(PrevDecl)) {\n        // ...\n        Diag(NameLoc, diag::err_tag_definition_of_typedef) << Name << Kind << TND->getUnderlyingType();"}},
		[l]={
			["clang/test/SemaCXX/typedef-redecl.cpp"]={"clang/test/SemaCXX/typedef-redecl.cpp:17:8: error: definition of type \'Y2\' conflicts with typedef of the same name"}
		}
	},
	["err_tag_index_out_of_range"]={
		[c]={{nil,x,"err_tag_index_out_of_range"}},
		[d]={{nil,x,"%select{type tag|argument}0 index %1 is greater than the number of arguments specified"}},
		[e]={{nil,x,{{"type tag","argument"}," index B is greater than the number of arguments specified"}}},
		[f]=j,
		[g]="(?:type tag|argument) index (.*?) is greater than the number of arguments specified",
		[h]=a,
		[i]={{nil,x,m}},
		[b]={"d1f6dcd1f548",1511997014,"Perform a bounds check on a function\'s argument list before accessing any index value specified by a...","Perform a bounds check on a function\'s argument list before accessing any index value specified by an \'argument_with_type_tag\' attribute. Fixes PR28520.\n\nPatch by Matt Davis.\n\nllvm-svn: 319383"},
		[k]={{w,18384,"void Sema::CheckArgumentWithTypeTag(const ArgumentWithTypeTagAttr *Attr, const ArrayRef<const Expr *> ExprArgs, SourceLocation CallSiteLoc) {\n  // ...\n  if (TypeTagIdxAST >= ExprArgs.size()) {\n    Diag(CallSiteLoc, diag::err_tag_index_out_of_range) << 0 << Attr->getTypeTagIdx().getSourceIndex();"},{w,18404,"void Sema::CheckArgumentWithTypeTag(const ArgumentWithTypeTagAttr *Attr, const ArrayRef<const Expr *> ExprArgs, SourceLocation CallSiteLoc) {\n  // ...\n  if (ArgumentIdxAST >= ExprArgs.size()) {\n    Diag(CallSiteLoc, diag::err_tag_index_out_of_range) << 1 << Attr->getArgumentIdx().getSourceIndex();"}},
		[l]={
			["clang/test/Sema/error-type-safety.cpp"]={"clang/test/Sema/error-type-safety.cpp:45:22: error: type tag index 2 is greater than the number of arguments specified","clang/test/Sema/error-type-safety.cpp:46:24: error: type tag index 3 is greater than the number of arguments specified","clang/test/Sema/error-type-safety.cpp:47:26: error: type tag index 2 is greater than the number of arguments specified","clang/test/Sema/error-type-safety.cpp:48:28: error: type tag index 3 is greater than the number of arguments specified","clang/test/Sema/error-type-safety.cpp:50:35: error: argument index 3 is greater than the number of arguments specified","clang/test/Sema/error-type-safety.cpp:51:37: error: argument index 4 is greater than the number of arguments specified"}
		}
	},
	["err_tag_reference_conflict"]={
		[c]="err_tag_reference_conflict",
		[d]="implicit declaration introduced by elaborated type conflicts with a %select{non-struct type|non-class type|non-union type|non-enum type|typedef|type alias|template|type alias template|template template argument}0 of the same name",
		[e]={{nil,nil,{"implicit declaration introduced by elaborated type conflicts with a ",{"non-struct type","non-class type","non-union type","non-enum type","typedef","type alias",dc,"type alias template","template template argument"}," of the same name"}}},
		[f]=j,
		[g]="implicit declaration introduced by elaborated type conflicts with a (?:non\\-struct type|non\\-class type|non\\-union type|non\\-enum type|typedef|type alias|template|type alias template|template template argument) of the same name",
		[h]=a,
		[i]=m,
		[b]={"a245671ae003",1271990501,"C++ doesn\'t really use \"namespaces\" for different kinds of names the same","C++ doesn\'t really use \"namespaces\" for different kinds of names the same\nway that C does.  Among other differences, elaborated type specifiers\nare defined to skip \"non-types\", which, as you might imagine, does not\ninclude typedefs.  Rework our use of IDNS masks to capture the semantics\nof different kinds of declarations better, and remove most current lookup\nfilters.  Removing the last remaining filter is more complicated and will\nhappen in a separate patch.\n\nFixes PR 6885 as well some spectrum of unfiled bugs.\n\nllvm-svn: 102164"},
		[k]={{v,17442,"/// 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    // ...\n    } else {\n      // Use a better diagnostic if an elaborated-type-specifier\n      // found the wrong kind of type on the first\n      // (non-redeclaration) lookup.\n      if ((TUK == TUK_Reference || TUK == TUK_Friend) && !Previous.isForRedeclaration()) {\n      // ...\n      } else if (!isDeclInScope(DirectPrevDecl, SearchDC, S, SS.isNotEmpty() || isMemberSpecialization)) {\n      // ...\n      } else if (TUK == TUK_Reference || TUK == TUK_Friend) {\n        // ...\n        Diag(NameLoc, diag::err_tag_reference_conflict) << NTK;"}},
		[l]={
			["clang/test/SemaCXX/elaborated-type-specifier.cpp"]={"clang/test/SemaCXX/elaborated-type-specifier.cpp:61:10: error: implicit declaration introduced by elaborated type conflicts with a template of the same name"}
		}
	},
	["err_tag_reference_non_tag"]={
		[c]="err_tag_reference_non_tag",
		[d]="%select{non-struct type|non-class type|non-union type|non-enum type|typedef|type alias|template|type alias template|template template argument}1 %0 cannot be referenced with a %select{struct|interface|union|class|enum}2 specifier",
		[e]={{nil,nil,{{"non-struct type","non-class type","non-union type","non-enum type","typedef","type alias",dc,"type alias template","template template argument"}," A cannot be referenced with a ",{"struct","interface","union","class","enum"}," specifier"}}},
		[f]=j,
		[g]="(?:non\\-struct type|non\\-class type|non\\-union type|non\\-enum type|typedef|type alias|template|type alias template|template template argument) (.*?) cannot be referenced with a (?:struct|interface|union|class|enum) specifier",
		[h]=a,
		[i]=m,
		[b]={"a245671ae003",1271990501,"C++ doesn\'t really use \"namespaces\" for different kinds of names the same","C++ doesn\'t really use \"namespaces\" for different kinds of names the same\nway that C does.  Among other differences, elaborated type specifiers\nare defined to skip \"non-types\", which, as you might imagine, does not\ninclude typedefs.  Rework our use of IDNS masks to capture the semantics\nof different kinds of declarations better, and remove most current lookup\nfilters.  Removing the last remaining filter is more complicated and will\nhappen in a separate patch.\n\nFixes PR 6885 as well some spectrum of unfiled bugs.\n\nllvm-svn: 102164"},
		[k]={{v,17429,"/// 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    // ...\n    } else {\n      // Use a better diagnostic if an elaborated-type-specifier\n      // found the wrong kind of type on the first\n      // (non-redeclaration) lookup.\n      if ((TUK == TUK_Reference || TUK == TUK_Friend) && !Previous.isForRedeclaration()) {\n        // ...\n        Diag(NameLoc, diag::err_tag_reference_non_tag) << PrevDecl << NTK << Kind;"},{o,4284,"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  if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(Template.getAsTemplateDecl())) {\n    // ...\n    Diag(TemplateLoc, diag::err_tag_reference_non_tag) << TAT << NTK_TypeAliasTemplate << TagKind;"},{o,9963,"// 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 (!ClassTemplate) {\n    // ...\n    Diag(TemplateNameLoc, diag::err_tag_reference_non_tag) << TD << NTK << Kind;"}},
		[l]={
			["clang/test/SemaCXX/PR8755.cpp"]={"clang/test/SemaCXX/PR8755.cpp:10:17: error: typedef \'iterator\' cannot be referenced with a class specifier"}
		}
	},
	["err_tagless_friend_type_template"]={
		[c]="err_tagless_friend_type_template",
		[d]="friend type templates must use an elaborated type",
		[e]="friend type templates must use an elaborated type",
		[f]=j,
		[g]="friend type templates must use an elaborated type",
		[h]=a,
		[i]=m,
		[b]={"11083da4d0aa",1253141228,"Improved representation and support for friend class templates.  Angst about same.","Improved representation and support for friend class templates.  Angst about same.\n\nllvm-svn: 82088"},
		[k]={{Db,17444,"/// Handle a friend type declaration.  This works in tandem with\n/// ActOnTag.\n///\n/// Notes on friend class templates:\n///\n/// We generally treat friend class declarations as if they were\n/// declaring a class.  So, for example, the elaborated type specifier\n/// in a friend declaration is required to obey the restrictions of a\n/// class-head (i.e. no typedefs in the scope chain), template\n/// parameters are required to match up with simple template-ids, &c.\n/// However, unlike when declaring a template specialization, it\'s\n/// okay to refer to a template specialization without an empty\n/// template parameter declaration, e.g.\n///   friend class A<T>::B<unsigned>;\n/// We permit this as a special case; if there are any template\n/// parameters present at all, require proper matching, i.e.\n///   template <> template \\<class T> friend class A<int>::B;\nDecl *Sema::ActOnFriendTypeDecl(Scope *S, const DeclSpec &DS, MultiTemplateParamsArg TempParams) {\n  // ...\n  // This is definitely an error in C++98.  It\'s probably meant to\n  // be forbidden in C++0x, too, but the specification is just\n  // poorly written.\n  //\n  // The problem is with declarations like the following:\n  //   template <T> friend A<T>::foo;\n  // where deciding whether a class C is a friend or not now hinges\n  // on whether there exists an instantiation of A that causes\n  // \'foo\' to equal C.  There are restrictions on class-heads\n  // (which we declare (by fiat) elaborated friend declarations to\n  // be) that makes this tractable.\n  //\n  // FIXME: handle \"template <> friend class A<T>;\", which\n  // is possibly well-formed?  Who even knows?\n  if (TempParams.size() && !T->isElaboratedTypeSpecifier()) {\n    Diag(Loc, diag::err_tagless_friend_type_template) << DS.getSourceRange();"}},
		[l]={
			["clang/test/CXX/temp/temp.decls/temp.friend/p3.cpp"]={"clang/test/CXX/temp/temp.decls/temp.friend/p3.cpp:11:22: error: friend type templates must use an elaborated type"}
		}
	},
	["err_target_clone_doesnt_match"]={
		[c]={{nil,A,"err_target_clone_doesnt_match"}},
		[d]={{nil,A,"\'target_clones\' attribute does not match previous declaration"}},
		[e]={{nil,A,"\'target_clones\' attribute does not match previous declaration"}},
		[f]=j,
		[g]="\'target_clones\' attribute does not match previous declaration",
		[h]=a,
		[i]={{nil,A,z}},
		[b]={"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"},
		[k]={{v,11477,"/// Check the validity of a new function declaration being added to an existing\n/// multiversioned declaration collection.\nstatic bool CheckMultiVersionAdditionalDecl(Sema &S, FunctionDecl *OldFD, FunctionDecl *NewFD, MultiVersionKind NewMVKind, const CPUDispatchAttr *NewCPUDisp, const CPUSpecificAttr *NewCPUSpec, const TargetClonesAttr *NewClones, bool &Redeclaration, NamedDecl *&OldDecl, LookupResult &Previous) {\n  // ...\n  // Next, check ALL non-invalid non-overloads to see if this is a redeclaration\n  // of a previous member of the MultiVersion set.\n  for (NamedDecl *ND : Previous) {\n    // ...\n    case MultiVersionKind::TargetClones: {\n      // ...\n      if (CurClones && NewClones && (CurClones->featuresStrs_size() != NewClones->featuresStrs_size() || !std::equal(CurClones->featuresStrs_begin(), CurClones->featuresStrs_end(), NewClones->featuresStrs_begin()))) {\n        S.Diag(NewFD->getLocation(), diag::err_target_clone_doesnt_match);"}},
		[l]={
			["clang/test/Sema/attr-target-clones-aarch64.c"]={"clang/test/Sema/attr-target-clones-aarch64.c:27:92: error: \'target_clones\' attribute does not match previous declaration","clang/test/Sema/attr-target-clones-aarch64.c:37:65: error: \'target_clones\' attribute does not match previous declaration"}
		}
	},
	["err_target_clone_must_have_default"]={
		[c]={{nil,A,"err_target_clone_must_have_default"}},
		[d]={{nil,A,"\'target_clones\' multiversioning requires a default target"}},
		[e]={{nil,A,"\'target_clones\' multiversioning requires a default target"}},
		[f]=j,
		[g]="\'target_clones\' multiversioning requires a default target",
		[h]=a,
		[i]={{nil,A,z}},
		[b]={"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"},
		[k]={{H,3654,"static void handleTargetClonesAttr(Sema &S, Decl *D, const ParsedAttr &AL) {\n  // ...\n  if (!HasDefault) {\n    S.Diag(AL.getLoc(), diag::err_target_clone_must_have_default);"}},
		[l]={
			["clang/test/Sema/attr-target-clones.c"]={"clang/test/Sema/attr-target-clones.c:4:21: error: \'target_clones\' multiversioning requires a default target"}
		}
	},
	["err_target_unknown_abi"]={
		[c]="err_target_unknown_abi",
		[d]="unknown target ABI \'%0\'",
		[e]="unknown target ABI \'A\'",
		[f]=j,
		[g]="unknown target ABI \'(.*?)\'",
		[h]=a,
		[i]=z,
		[b]={"b9bbd54fdb5b",1258267726,"Add TargetOptions and use it when constructing targets.","Add TargetOptions and use it when constructing targets.\n - This ended up being hard to factor, sorry for the large diff.\n\n - Some post-commit cleanup to come.\n\nllvm-svn: 88833"},
		[k]={{lc,809,"/// CreateTargetInfo - Return the target info object for the specified target\n/// options.\nTargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags, const std::shared_ptr<TargetOptions> &Opts) {\n  // ...\n  // Set the target ABI if specified.\n  if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {\n    Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;"}}
	},
	["err_target_unknown_cpu"]={
		[c]="err_target_unknown_cpu",
		[d]="unknown target CPU \'%0\'",
		[e]="unknown target CPU \'A\'",
		[f]=j,
		[g]="unknown target CPU \'(.*?)\'",
		[h]=a,
		[i]=z,
		[b]={"acde99ea522d",1261161757,"ARM: Fix predefines (__ARM_ARCH_..., __REGISTER_PREFIX).","ARM: Fix predefines (__ARM_ARCH_..., __REGISTER_PREFIX).\n - This should be done leveraging the backend, but I\'m a little refactored\n   out. I\'ll fix it one day, I promise.\n\nllvm-svn: 91700"},
		[k]={{lc,788,"/// CreateTargetInfo - Return the target info object for the specified target\n/// options.\nTargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags, const std::shared_ptr<TargetOptions> &Opts) {\n  // ...\n  // Set the target CPU if specified.\n  if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {\n    Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;"},{lc,799,"/// CreateTargetInfo - Return the target info object for the specified target\n/// options.\nTargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags, const std::shared_ptr<TargetOptions> &Opts) {\n  // ...\n  // Check the TuneCPU name if specified.\n  if (!Opts->TuneCPU.empty() && !Target->isValidTuneCPUName(Opts->TuneCPU)) {\n    Diags.Report(diag::err_target_unknown_cpu) << Opts->TuneCPU;"}},
		[l]={
			["clang/test/Preprocessor/predefined-arch-macros.c"]={"error: unknown target CPU \'amdgcn\'"}
		}
	},
	["err_target_unknown_fpmath"]={
		[c]="err_target_unknown_fpmath",
		[d]="unknown FP unit \'%0\'",
		[e]="unknown FP unit \'A\'",
		[f]=j,
		[g]="unknown FP unit \'(.*?)\'",
		[h]=a,
		[i]=z,
		[b]={"eb26547177b9",1377122343,"Move -mfpmath handling to -cc1 and implement it for x86.","Move -mfpmath handling to -cc1 and implement it for x86.\n\nThe original idea was to implement it all on the driver, but to do that the\ndriver needs to know the sse level and to do that it has to know the default\nfeatures of a cpu.\n\nBenjamin Kramer pointed out that if one day we decide to implement support for\n\' __attribute__ ((__target__ (\"arch=core2\")))\', then the frontend needs to\nkeep its knowledge of default features of a cpu.\n\nTo avoid duplicating which part of clang handles default cpu features,\nit is probably better to handle -mfpmath in the frontend.\n\nFor ARM this patch is just a small improvement. Instead of a cpu list, we\ncheck if neon is enabled, which allows us to reject things like\n\n-mcpu=cortex-a9 -mfpu=vfp -mfpmath=neon\n\nFor X86, since LLVM doesn\'t support an independent ssefp feature, we just\nmake sure the selected -mfpmath matches the sse level.\n\nllvm-svn: 188939"},
		[k]={{lc,815,"/// CreateTargetInfo - Return the target info object for the specified target\n/// options.\nTargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags, const std::shared_ptr<TargetOptions> &Opts) {\n  // ...\n  // Set the fp math unit.\n  if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {\n    Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;"}}
	},
	["err_target_unknown_triple"]={
		[c]="err_target_unknown_triple",
		[d]="unknown target triple \'%0\'",
		[e]="unknown target triple \'A\'",
		[f]=j,
		[g]="unknown target triple \'(.*?)\'",
		[h]=a,
		[i]=z,
		[b]={"b9bbd54fdb5b",1258267726,"Add TargetOptions and use it when constructing targets.","Add TargetOptions and use it when constructing targets.\n - This ended up being hard to factor, sorry for the large diff.\n\n - Some post-commit cleanup to come.\n\nllvm-svn: 88833"},
		[k]={{lc,781,"/// CreateTargetInfo - Return the target info object for the specified target\n/// options.\nTargetInfo *TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags, const std::shared_ptr<TargetOptions> &Opts) {\n  // ...\n  if (!Target) {\n    Diags.Report(diag::err_target_unknown_triple) << Triple.str();"},{"clang/lib/Driver/ToolChains/CrossWindows.cpp",98,"void tools::CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA, const InputInfo &Output, const InputInfoList &Inputs, const ArgList &Args, const char *LinkingOutput) const {\n  // ...\n  default:\n    D.Diag(diag::err_target_unknown_triple) << TC.getEffectiveTriple().str();"},{"clang/lib/Driver/ToolChains/Gnu.cpp",453,"void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA, const InputInfo &Output, const InputInfoList &Inputs, const ArgList &Args, const char *LinkingOutput) const {\n  // ...\n  if (const char *LDMOption = getLDMOption(ToolChain.getTriple(), Args)) {\n  // ...\n  } else {\n    D.Diag(diag::err_target_unknown_triple) << Triple.str();"},{"clang/lib/Driver/ToolChains/MinGW.cpp",139,"void tools::MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA, const InputInfo &Output, const InputInfoList &Inputs, const ArgList &Args, const char *LinkingOutput) const {\n  // ...\n  default:\n    D.Diag(diag::err_target_unknown_triple) << TC.getEffectiveTriple().str();"},{"clang/tools/driver/cc1as_main.cpp",390,"static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts, DiagnosticsEngine &Diags) {\n  // ...\n  if (!TheTarget)\n    return Diags.Report(diag::err_target_unknown_triple) << Opts.Triple;"},{"clang/tools/driver/cc1as_main.cpp",574,"static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts, DiagnosticsEngine &Diags) {\n  // ...\n  if (!TAP)\n    Failed = Diags.Report(diag::err_target_unknown_triple) << Opts.Triple;"},{"clang/unittests/Basic/DiagnosticTest.cpp",42,"// Check that DiagnosticErrorTrap works with SuppressAllDiagnostics.\nTEST(DiagnosticTest, suppressAndTrap) {\n  // ...\n  {\n    // ...\n    Diags.Report(diag::err_target_unknown_triple) << \"unknown\";"}}
	},
	["err_target_unsupported_abi"]={
		[c]="err_target_unsupported_abi",
		[d]="ABI \'%0\' is not supported on CPU \'%1\'",
		[e]="ABI \'A\' is not supported on CPU \'B\'",
		[f]=j,
		[g]="ABI \'(.*?)\' is not supported on CPU \'(.*?)\'",
		[h]=a,
		[i]=z,
		[b]={"32b2d6b1602b",1465894730,"[mips] Defer validity check for CPU/ABI pairs and improve error message for invalid cases.","[mips] Defer validity check for CPU/ABI pairs and improve error message for invalid cases.\n\nSummary:\nThe validity of ABI/CPU pairs is no longer checked on the fly but is\ninstead checked after initialization. As a result, invalid CPU/ABI pairs\ncan be reported as being known but invalid instead of being unknown. For\nexample, we now emit:\n  error: ABI \'n32\' is not supported on CPU \'mips32r2\'\ninstead of:\n  error: unknown target ABI \'n64\'\n\nReviewers: atanasyan\n\nSubscribers: sdardis, cfe-commits\n\nDifferential Revision: http://reviews.llvm.org/D21023\n\nllvm-svn: 272645"},
		[k]={{"clang/lib/Basic/Targets/Mips.cpp",245,"bool MipsTargetInfo::validateTarget(DiagnosticsEngine &Diags) const {\n  // ...\n  // 64-bit ABI\'s require 64-bit CPU\'s.\n  if (!processorSupportsGPR64() && (ABI == \"n32\" || ABI == \"n64\")) {\n    Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;"}}
	},
	["err_target_unsupported_abi_for_triple"]={
		[c]="err_target_unsupported_abi_for_triple",
		[d]="ABI \'%0\' is not supported for \'%1\'",
		[e]="ABI \'A\' is not supported for \'B\'",
		[f]=j,
		[g]="ABI \'(.*?)\' is not supported for \'(.*?)\'",
		[h]=a,
		[i]=z,
		[b]={"32b2d6b1602b",1465894730,"[mips] Defer validity check for CPU/ABI pairs and improve error message for invalid cases.","[mips] Defer validity check for CPU/ABI pairs and improve error message for invalid cases.\n\nSummary:\nThe validity of ABI/CPU pairs is no longer checked on the fly but is\ninstead checked after initialization. As a result, invalid CPU/ABI pairs\ncan be reported as being known but invalid instead of being unknown. For\nexample, we now emit:\n  error: ABI \'n32\' is not supported on CPU \'mips32r2\'\ninstead of:\n  error: unknown target ABI \'n64\'\n\nReviewers: atanasyan\n\nSubscribers: sdardis, cfe-commits\n\nDifferential Revision: http://reviews.llvm.org/D21023\n\nllvm-svn: 272645"}
	},
	["err_target_unsupported_arch"]={
		[c]="err_target_unsupported_arch",
		[d]="the target architecture \'%0\' is not supported by the target \'%1\'",
		[e]="the target architecture \'A\' is not supported by the target \'B\'",
		[f]=j,
		[g]="the target architecture \'(.*?)\' is not supported by the target \'(.*?)\'",
		[h]=a,
		[i]=z,
		[b]={"f4c9e49f9449",1396643479,"Driver: add target definition for Windows on ARM","Driver: add target definition for Windows on ARM\n\nThis introduces the definitions needed for the Windows on ARM target.  Add\ntarget definitions for both the MSVC environment and the MSVC + Itanium C++ ABI\nenvironment.  The Visual Studio definitions correspond to the definitions\nprovided by Visual Studio 2012.\n\nllvm-svn: 205650"},
		[k]={{"clang/lib/Driver/ToolChains/Clang.cpp",4778,"void Clang::ConstructJob(Compilation &C, const JobAction &JA, const InputInfo &Output, const InputInfoList &Inputs, const ArgList &Args, const char *LinkingOutput) const {\n  // ...\n  if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm || Triple.getArch() == llvm::Triple::thumb)) {\n    // ...\n    if (Failure || Version < 7)\n      D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName() << TripleStr;"},{"clang/lib/Driver/ToolChains/Myriad.cpp",220,"MyriadToolChain::MyriadToolChain(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) : Generic_ELF(D, Triple, Args) {\n  // ...\n  default:\n    D.Diag(clang::diag::err_target_unsupported_arch) << Triple.getArchName() << \"myriad\";"},{"clang/lib/Driver/ToolChains/NaCl.cpp",99,"// This is quite similar to gnutools::Linker::ConstructJob with changes that\n// we use static by default, do not yet support sanitizers or LTO, and a few\n// others. Eventually we can support more of that and hopefully migrate back\n// to gnutools::Linker.\nvoid nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA, const InputInfo &Output, const InputInfoList &Inputs, const ArgList &Args, const char *LinkingOutput) const {\n  // ...\n  if (Arch == llvm::Triple::x86)\n  // ...\n  else if (Arch == llvm::Triple::arm)\n  // ...\n  else if (Arch == llvm::Triple::x86_64)\n  // ...\n  else if (Arch == llvm::Triple::mipsel)\n  // ...\n  else\n    D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName() << \"Native Client\";"}}
	},
	["err_target_unsupported_cpu_for_micromips"]={
		[c]={{nil,x,"err_target_unsupported_cpu_for_micromips"}},
		[d]={{nil,x,"micromips is not supported for target CPU \'%0\'"}},
		[e]={{nil,x,"micromips is not supported for target CPU \'A\'"}},
		[f]=j,
		[g]="micromips is not supported for target CPU \'(.*?)\'",
		[h]=a,
		[i]={{nil,x,z}},
		[b]={"8ee529615210",1512991757,"[mips] Removal of microMIPS64R6","[mips] Removal of microMIPS64R6\n\nmicroMIPS64R6 is removed from backend, and therefore frontend\nwill show an error when target is microMIPS64R6.\n\nThis is Clang part of patch.\n\nDifferential Revision: https://reviews.llvm.org/D35624\n\nllvm-svn: 320351"},
		[k]={{"clang/lib/Basic/Targets/Mips.cpp",239,"bool MipsTargetInfo::validateTarget(DiagnosticsEngine &Diags) const {\n  // microMIPS64R6 backend was removed.\n  if (getTriple().isMIPS64() && IsMicromips && (ABI == \"n32\" || ABI == \"n64\")) {\n    Diags.Report(diag::err_target_unsupported_cpu_for_micromips) << CPU;"}}
	},
	["err_target_unsupported_execute_only"]={
		[c]="err_target_unsupported_execute_only",
		[d]="execute only is not supported for the %0 sub-architecture",
		[e]="execute only is not supported for the A sub-architecture",
		[f]=j,
		[g]="execute only is not supported for the (.*?) sub\\-architecture",
		[h]=a,
		[i]=z,
		[b]={"61ef150d53e4",1481788764,"[ARM] Implement execute-only support in CodeGen","[ARM] Implement execute-only support in CodeGen\n\nSummary:\nThis implements execute-only support for ARM code generation, which\nprevents the compiler from generating data accesses to code sections.\nThe following changes are involved:\n\n* Add the CodeGen option \"-arm-execute-only\" to the ARM code generator.\n* Add the clang flag \"-mexecute-only\" as well as the GCC-compatible\n  alias \"-mpure-code\" to enable this option.\n* When enabled, literal pools are replaced with MOVW/MOVT instructions,\n  with VMOV used in addition for floating-point literals. As the MOVT\n  instruction is required, execute-only support is only available in\n  Thumb mode for targets supporting ARMv8-M baseline or Thumb2.\n* Jump tables are placed in data sections when in execute-only mode.\n* The execute-only text section is assigned section ID 0, and is\n  marked as unreadable with the SHF_ARM_PURECODE flag with symbol \'y\'.\n  This also overrides selection of ELF sections for globals.\n\nReviewers: t.p.northover, rengolin\n\nSubscribers: llvm-commits, aemerson\n\nDifferential Revision: https://reviews.llvm.org/D27450\n\nllvm-svn: 289786"},
		[k]={{"clang/lib/Driver/ToolChains/Arch/ARM.cpp",849,"llvm::ARM::FPUKind arm::getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple, const ArgList &Args, std::vector<StringRef> &Features, bool ForAS, bool ForMultilib) {\n  // ...\n  // Generate execute-only output (no data access to code sections).\n  // This only makes sense for the compiler, not for the assembler.\n  // It\'s not needed for multilib selection and may hide an unused\n  // argument diagnostic if the code is always run.\n  if (!ForAS && !ForMultilib) {\n    // Supported only on ARMv6T2 and ARMv7 and above.\n    // Cannot be combined with -mno-movt.\n    if (Arg *A = Args.getLastArg(options::OPT_mexecute_only, options::OPT_mno_execute_only)) {\n      if (A->getOption().matches(options::OPT_mexecute_only)) {\n        if (getARMSubArchVersionNumber(Triple) < 7 && llvm::ARM::parseArch(Triple.getArchName()) != llvm::ARM::ArchKind::ARMV6T2)\n          D.Diag(diag::err_target_unsupported_execute_only) << Triple.getArchName();"}}
	},
	["err_target_unsupported_fpmath"]={
		[c]="err_target_unsupported_fpmath",
		[d]="the \'%0\' unit is not supported with this instruction set",
		[e]="the \'A\' unit is not supported with this instruction set",
		[f]=j,
		[g]="the \'(.*?)\' unit is not supported with this instruction set",
		[h]=a,
		[i]=z,
		[b]={"eb26547177b9",1377122343,"Move -mfpmath handling to -cc1 and implement it for x86.","Move -mfpmath handling to -cc1 and implement it for x86.\n\nThe original idea was to implement it all on the driver, but to do that the\ndriver needs to know the sse level and to do that it has to know the default\nfeatures of a cpu.\n\nBenjamin Kramer pointed out that if one day we decide to implement support for\n\' __attribute__ ((__target__ (\"arch=core2\")))\', then the frontend needs to\nkeep its knowledge of default features of a cpu.\n\nTo avoid duplicating which part of clang handles default cpu features,\nit is probably better to handle -mfpmath in the frontend.\n\nFor ARM this patch is just a small improvement. Instead of a cpu list, we\ncheck if neon is enabled, which allows us to reject things like\n\n-mcpu=cortex-a9 -mfpu=vfp -mfpmath=neon\n\nFor X86, since LLVM doesn\'t support an independent ssefp feature, we just\nmake sure the selected -mfpmath matches the sse level.\n\nllvm-svn: 188939"},
		[k]={{"clang/lib/Basic/Targets/ARM.cpp",629,"bool ARMTargetInfo::handleTargetFeatures(std::vector<std::string> &Features, DiagnosticsEngine &Diags) {\n  // ...\n  if (!(FPU & NeonFPU) && FPMath == FP_Neon) {\n    Diags.Report(diag::err_target_unsupported_fpmath) << \"neon\";"},{"clang/lib/Basic/Targets/X86.cpp",420,"/// handleTargetFeatures - Perform initialization based on the user\n/// configured set of features.\nbool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features, DiagnosticsEngine &Diags) {\n  // ...\n  // LLVM doesn\'t have a separate switch for fpmath, so only accept it if it\n  // matches the selected sse level.\n  if ((FPMath == FP_SSE && SSELevel < SSE1) || (FPMath == FP_387 && SSELevel >= SSE1)) {\n    Diags.Report(diag::err_target_unsupported_fpmath) << (FPMath == FP_SSE ? \"sse\" : \"387\");"}}
	},
	["err_target_unsupported_mcmse"]={
		[c]={{nil,D,"err_target_unsupported_mcmse"}},
		[d]={{nil,D,"-mcmse is not supported for %0"}},
		[e]={{nil,D,"-mcmse is not supported for A"}},
		[f]=j,
		[g]="\\-mcmse is not supported for (.*?)",
		[h]=a,
		[i]={{nil,D,z}},
		[b]={"603a2bac05a8",1558448486,"[ARM][CMSE] Add commandline option and feature macro","[ARM][CMSE] Add commandline option and feature macro\n\nDefines macro ARM_FEATURE_CMSE to 1 for v8-M targets and introduces\n-mcmse option which for v8-M targets sets ARM_FEATURE_CMSE to 3.\nA diagnostic is produced when the option is given on architectures\nwithout support for Security Extensions.\nReviewed By: dmgreen, snidertm\nDifferential Revision: https://reviews.llvm.org/D59879\n\nllvm-svn: 361261"},
		[k]={{"clang/lib/Basic/Targets/ARM.cpp",570,"bool ARMTargetInfo::handleTargetFeatures(std::vector<std::string> &Features, DiagnosticsEngine &Diags) {\n  // ...\n  // This does not diagnose illegal cases like having both\n  // \"+vfpv2\" and \"+vfpv3\" or having \"+neon\" and \"-fp64\".\n  for (const auto &Feature : Features) {\n    if (Feature == \"+soft-float\") {\n    // ...\n    } else if (Feature == \"+vfp2sp\" || Feature == \"+vfp2\") {\n    // ...\n    } else if (Feature == \"+vfp3sp\" || Feature == \"+vfp3d16sp\" || Feature == \"+vfp3\" || Feature == \"+vfp3d16\") {\n    // ...\n    } else if (Feature == \"+vfp4sp\" || Feature == \"+vfp4d16sp\" || Feature == \"+vfp4\" || Feature == \"+vfp4d16\") {\n    // ...\n    } else if (Feature == \"+fp-armv8sp\" || Feature == \"+fp-armv8d16sp\" || Feature == \"+fp-armv8\" || Feature == \"+fp-armv8d16\") {\n    // ...\n    } else if (Feature == \"+neon\") {\n    // ...\n    } else if (Feature == \"+hwdiv\") {\n    // ...\n    } else if (Feature == \"+hwdiv-arm\") {\n    // ...\n    } else if (Feature == \"+crc\") {\n    // ...\n    } else if (Feature == \"+crypto\") {\n    // ...\n    } else if (Feature == \"+sha2\") {\n    // ...\n    } else if (Feature == \"+aes\") {\n    // ...\n    } else if (Feature == \"+dsp\") {\n    // ...\n    } else if (Feature == \"+fp64\") {\n    // ...\n    } else if (Feature == \"+8msecext\") {\n      if (CPUProfile != \"M\" || ArchVersion != 8) {\n        Diags.Report(diag::err_target_unsupported_mcmse) << CPU;"}}
	},
	["err_target_unsupported_tp_hard"]={
		[c]={{nil,A,"err_target_unsupported_tp_hard"}},
		[d]={{nil,A,"hardware TLS register is not supported for the %0 sub-architecture"}},
		[e]={{nil,A,"hardware TLS register is not supported for the A sub-architecture"}},
		[f]=j,
		[g]="hardware TLS register is not supported for the (.*?) sub\\-architecture",
		[h]=a,
		[i]={{nil,A,z}},
		[b]={"4bafe65c2b2f",1634659977,"Add support for floating-point option `ffp-eval-method` and for","Add support for floating-point option `ffp-eval-method` and for\n`pragma clang fp eval_method`."},
		[k]={{"clang/lib/Driver/ToolChains/Arch/ARM.cpp",212,"// Select mode for reading thread pointer (-mtp=soft/cp15).\narm::ReadTPMode arm::getReadTPMode(const Driver &D, const ArgList &Args, const llvm::Triple &Triple, bool ForAS) {\n  if (Arg *A = Args.getLastArg(options::OPT_mtp_mode_EQ)) {\n    // ...\n    if ((ThreadPointer == ReadTPMode::TPIDRURW || ThreadPointer == ReadTPMode::TPIDRURO || ThreadPointer == ReadTPMode::TPIDRPRW) && !isHardTPSupported(Triple) && !ForAS) {\n      D.Diag(diag::err_target_unsupported_tp_hard) << Triple.getArchName();"},{"clang/lib/Driver/ToolChains/Clang.cpp",3397,"static void RenderSSPOptions(const Driver &D, const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs, bool KernelOrKext) {\n  // ...\n  if (Arg *A = Args.getLastArg(options::OPT_mstack_protector_guard_EQ)) {\n    // ...\n    if ((EffectiveTriple.isARM() || EffectiveTriple.isThumb()) && Value == \"tls\") {\n      // ...\n      // Check whether the target subarch supports the hardware TLS register\n      if (!arm::isHardTPSupported(EffectiveTriple)) {\n        D.Diag(diag::err_target_unsupported_tp_hard) << EffectiveTriple.getArchName();"}}
	},
	["err_target_unsupported_type"]={
		[c]={{nil,A,"err_target_unsupported_type"}},
		[d]={{nil,A,"%0 requires %select{|%2 bit size}1 %3 %select{|return }4type support, but target \'%5\' does not support it"}},
		[e]={{nil,A,{"A requires ",{a,"C bit size"}," D ",{a,"return "},"type support, but target \'F\' does not support it"}}},
		[f]=j,
		[g]="(.*?) requires (?:|(.*?) bit size) (.*?) (?:|return )type support, but target \'(.*?)\' does not support it",
		[h]=a,
		[i]={{nil,A,"OpenMP Issue"}},
		[b]={"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"},
		[k]={{Hb,1960,"void Sema::checkTypeSupport(QualType Ty, SourceLocation Loc, ValueDecl *D) {\n  // ...\n  auto CheckDeviceType = [&](QualType Ty) {\n    // ...\n    if (Ty->isBitIntType()) {\n      if (!Context.getTargetInfo().hasBitIntType()) {\n        PartialDiagnostic PD = PDiag(diag::err_target_unsupported_type);"},{Hb,1992,"void Sema::checkTypeSupport(QualType Ty, SourceLocation Loc, ValueDecl *D) {\n  // ...\n  auto CheckDeviceType = [&](QualType Ty) {\n    // ...\n    if ((Ty->isFloat16Type() && !Context.getTargetInfo().hasFloat16Type()) || (Ty->isFloat128Type() && !Context.getTargetInfo().hasFloat128Type()) || (Ty->isIbm128Type() && !Context.getTargetInfo().hasIbm128Type()) || (Ty->isIntegerType() && Context.getTypeSize(Ty) == 128 && !Context.getTargetInfo().hasInt128Type()) || (Ty->isBFloat16Type() && !Context.getTargetInfo().hasBFloat16Type() && !LangOpts.CUDAIsDevice) || LongDoubleMismatched) {\n      PartialDiagnostic PD = PDiag(diag::err_target_unsupported_type);"},{Hb,2019,"void Sema::checkTypeSupport(QualType Ty, SourceLocation Loc, ValueDecl *D) {\n  // ...\n  auto CheckType = [&](QualType Ty, bool IsRetTy = false) {\n    // ...\n    if (!TI.hasLongDoubleType() && UnqualTy == Context.LongDoubleTy) {\n      PartialDiagnostic PD = PDiag(diag::err_target_unsupported_type);"},{Hb,2038,"void Sema::checkTypeSupport(QualType Ty, SourceLocation Loc, ValueDecl *D) {\n  // ...\n  auto CheckType = [&](QualType Ty, bool IsRetTy = false) {\n    // ...\n    if (IsRetTy && !TI.hasFPReturn() && (IsDouble || IsFloat)) {\n      PartialDiagnostic PD = PDiag(diag::err_target_unsupported_type);"},{w,4373,"bool Sema::CheckPPCBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID, CallExpr *TheCall) {\n  // ...\n  case PPC::BI__builtin_ppc_maxfe:\n  case PPC::BI__builtin_ppc_minfe:\n  case PPC::BI__builtin_ppc_maxfl:\n  case PPC::BI__builtin_ppc_minfl:\n  case PPC::BI__builtin_ppc_maxfs:\n  case PPC::BI__builtin_ppc_minfs: {\n    if (Context.getTargetInfo().getTriple().isOSAIX() && (BuiltinID == PPC::BI__builtin_ppc_maxfe || BuiltinID == PPC::BI__builtin_ppc_minfe))\n      return Diag(TheCall->getBeginLoc(), diag::err_target_unsupported_type) << \"builtin\" << true << 128 << QualType(Context.LongDoubleTy) << false << Context.getTargetInfo().getTriple().str();"}},
		[l]={
			["clang/test/SemaCUDA/spirv-int128.cu"]={"clang/test/SemaCUDA/spirv-int128.cu:15:10: error: \'d_glb\' requires 128 bit size \'__int128\' type support, but target \'spirv64\' does not support it"}
		}
	},
	["err_target_unsupported_unaligned"]={
		[c]="err_target_unsupported_unaligned",
		[d]="the %0 sub-architecture does not support unaligned accesses",
		[e]="the A sub-architecture does not support unaligned accesses",
		[f]=j,
		[g]="the (.*?) sub\\-architecture does not support unaligned accesses",
		[h]=a,
		[i]=z,
		[b]={"76244be6d4f8",1407921492,"Emit diagnostic for -munaligned-access on v6m targets","Emit diagnostic for -munaligned-access on v6m targets\n\nRather than silently disabling unaligned accesses for v6m targets as\nin the previous patch to llvm, instead produce a warning saying that\nthis architecture doesn\'t support unaligned accesses.\n\nPatch by Ben Foster\n\nllvm-svn: 215531"},
		[k]={{"clang/lib/Driver/ToolChains/Arch/ARM.cpp",866,"llvm::ARM::FPUKind arm::getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple, const ArgList &Args, std::vector<StringRef> &Features, bool ForAS, bool ForMultilib) {\n  // ...\n  // Kernel code has more strict alignment requirements.\n  if (KernelOrKext) {\n  // ...\n  } else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access, options::OPT_munaligned_access)) {\n    if (A->getOption().matches(options::OPT_munaligned_access)) {\n      // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).\n      if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)\n        D.Diag(diag::err_target_unsupported_unaligned) << \"v6m\";"},{"clang/lib/Driver/ToolChains/Arch/ARM.cpp",870,"llvm::ARM::FPUKind arm::getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple, const ArgList &Args, std::vector<StringRef> &Features, bool ForAS, bool ForMultilib) {\n  // ...\n  // Kernel code has more strict alignment requirements.\n  if (KernelOrKext) {\n  // ...\n  } else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access, options::OPT_munaligned_access)) {\n    if (A->getOption().matches(options::OPT_munaligned_access)) {\n      // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).\n      if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)\n      // ...\n      // v8M Baseline follows on from v6M, so doesn\'t support unaligned memory\n      // access either.\n      else if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8m_baseline)\n        D.Diag(diag::err_target_unsupported_unaligned) << \"v8m.base\";"}}
	},
	["err_tcb_conflicting_attributes"]={
		[c]={{nil,s,"err_tcb_conflicting_attributes"}},
		[d]={{nil,s,"attributes \'%0(\"%2\")\' and \'%1(\"%2\")\' are mutually exclusive"}},
		[e]={{nil,s,"attributes \'A(\"C\")\' and \'B(\"C\")\' are mutually exclusive"}},
		[f]=j,
		[g]="attributes \'(.*?)\\(\"(.*?)\"\\)\' and \'(.*?)\\(\"(.*?)\"\\)\' are mutually exclusive",
		[h]=a,
		[i]={{nil,s,z}},
		[b]={hc,1590001902,fc,gc},
		[k]={{H,8629,"template <typename AttrTy, typename ConflictingAttrTy> static void handleEnforceTCBAttr(Sema &S, Decl *D, const ParsedAttr &AL) {\n  // ...\n  // A function cannot be have both regular and leaf membership in the same TCB.\n  if (const ConflictingAttrTy *ConflictingAttr = findEnforceTCBAttrByName<ConflictingAttrTy>(D, Argument)) {\n    // ...\n    S.Diag(AL.getLoc(), diag::err_tcb_conflicting_attributes) << AL.getAttrName()->getName() << ConflictingAttr->getAttrName()->getName() << Argument;"},{H,8649,"template <typename AttrTy, typename ConflictingAttrTy> static AttrTy *mergeEnforceTCBAttrImpl(Sema &S, Decl *D, const AttrTy &AL) {\n  // ...\n  if (const ConflictingAttrTy *ConflictingAttr = findEnforceTCBAttrByName<ConflictingAttrTy>(D, TCBName)) {\n    S.Diag(ConflictingAttr->getLoc(), diag::err_tcb_conflicting_attributes) << ConflictingAttr->getAttrName()->getName() << AL.getAttrName()->getName() << TCBName;"}},
		[l]={
			["clang/test/Sema/attr-enforce-tcb-errors.cpp"]={"clang/test/Sema/attr-enforce-tcb-errors.cpp:21:16: error: attributes \'enforce_tcb_leaf(\"x\")\' and \'enforce_tcb(\"x\")\' are mutually exclusive","clang/test/Sema/attr-enforce-tcb-errors.cpp:28:16: error: attributes \'enforce_tcb(\"x\")\' and \'enforce_tcb_leaf(\"x\")\' are mutually exclusive","clang/test/Sema/attr-enforce-tcb-errors.cpp:36:16: error: attributes \'enforce_tcb(\"x\")\' and \'enforce_tcb_leaf(\"x\")\' are mutually exclusive","clang/test/Sema/attr-enforce-tcb-errors.cpp:43:16: error: attributes \'enforce_tcb_leaf(\"x\")\' and \'enforce_tcb(\"x\")\' are mutually exclusive","clang/test/Sema/attr-enforce-tcb-errors.cpp:75:16: error: attributes \'enforce_tcb_leaf(\"x\")\' and \'enforce_tcb(\"x\")\' are mutually exclusive"}
		}
	},
	["err_temp_copy_ambiguous"]={
		[c]="err_temp_copy_ambiguous",
		[d]={{nil,s,"ambiguous constructor call when %select{copying variable|copying parameter|initializing template parameter|returning object|initializing statement expression result|throwing object|copying member subobject|copying array element|allocating object|copying temporary|initializing base subobject|initializing vector element|capturing value}0 of type %1"},{Eb,bb,"ambiguous constructor call when %select{copying variable|copying parameter|returning object|initializing statement expression result|throwing object|copying member subobject|copying array element|allocating object|copying temporary|initializing base subobject|initializing vector element|capturing value}0 of type %1"},{x,nil,"ambiguous constructor call when %select{copying variable|copying parameter|returning object|throwing object|copying member subobject|copying array element|allocating object|copying temporary|initializing base subobject|initializing vector element|capturing value}0 of type %1"}},
		[e]={{nil,s,{"ambiguous constructor call when ",{Bb,ob,"initializing template parameter",pb,Wb,qb,sb,vb,tb,zb,yb,xb,nb},ac}},{Eb,bb,{"ambiguous constructor call when ",{Bb,ob,pb,Wb,qb,sb,vb,tb,zb,yb,xb,nb},ac}},{x,nil,{"ambiguous constructor call when ",{Bb,ob,pb,qb,sb,vb,tb,zb,yb,xb,nb},ac}}},
		[f]=j,
		[g]="ambiguous constructor call when (?:copying variable|copying parameter|initializing template parameter|returning object|initializing statement expression result|throwing object|copying member subobject|copying array element|allocating object|copying temporary|initializing base subobject|initializing vector element|capturing value) of type (.*?)",
		[h]=a,
		[i]=m,
		[b]={"e1314a64b803",1261112541,"Switch the initialization required by return statements over to the","Switch the initialization required by return statements over to the\nnew InitializationSequence. This fixes some bugs (e.g., PR5808),\nchanged some diagnostics, and caused more churn than expected. What\'s\nnew:\n\n  - InitializationSequence now has a \"C conversion sequence\" category\n    and step kind, which falls back to\n  - Changed the diagnostics for returns to always have the result type\n    of the function first and the type of the expression second.\n    CheckSingleAssignmentConstraints to peform checking in C. \n  - Improved ASTs for initialization of return values. The ASTs now\n    capture all of the temporaries we need to create, but\n    intentionally do not bind the tempoary that is actually returned,\n    so that it won\'t get destroyed twice.\n  - Make sure to perform an (elidable!) copy of the class object that\n    is returned from a class.\n  - Fix copy elision in CodeGen to properly see through the\n    subexpressions that occur with elidable copies.\n  - Give \"new\" its own entity kind; as with return values and thrown\n    objects, we don\'t bind the expression so we don\'t call a\n    destructor for it.\n\nNote that, with this patch, I\'ve broken returning move-only types in\nC++0x. We\'ll fix it later, when we tackle NRVO.\n\nllvm-svn: 91669"},
		[k]={{Cb,6799,"/// Make a (potentially elidable) temporary copy of the object\n/// provided by the given initializer by calling the appropriate copy\n/// constructor.\n///\n/// \\param S The Sema object used for type-checking.\n///\n/// \\param T The type of the temporary object, which must either be\n/// the type of the initializer expression or a superclass thereof.\n///\n/// \\param Entity The entity being initialized.\n///\n/// \\param CurInit The initializer expression.\n///\n/// \\param IsExtraneousCopy Whether this is an \"extraneous\" copy that\n/// is permitted in C++03 (but not C++0x) when binding a reference to\n/// an rvalue.\n///\n/// \\returns An expression that copies the initializer expression into\n/// a temporary object, or an error expression if a copy could not be\n/// created.\nstatic ExprResult CopyObject(Sema &S, QualType T, const InitializedEntity &Entity, ExprResult CurInit, bool IsExtraneousCopy) {\n  // ...\n  case OR_Ambiguous:\n    CandidateSet.NoteCandidates(PartialDiagnosticAt(Loc, S.PDiag(diag::err_temp_copy_ambiguous) << (int)Entity.getKind() << CurInitExpr->getType() << CurInitExpr->getSourceRange()), S, OCD_AmbiguousCandidates, CurInitExpr);"}}
	},
	["err_temp_copy_deleted"]={
		[c]="err_temp_copy_deleted",
		[d]={{nil,s,"%select{copying variable|copying parameter|initializing template parameter|returning object|initializing statement expression result|throwing object|copying member subobject|copying array element|allocating object|copying temporary|initializing base subobject|initializing vector element|capturing value}0 of type %1 invokes deleted constructor"},{Eb,bb,"%select{copying variable|copying parameter|returning object|initializing statement expression result|throwing object|copying member subobject|copying array element|allocating object|copying temporary|initializing base subobject|initializing vector element|capturing value}0 of type %1 invokes deleted constructor"},{x,nil,"%select{copying variable|copying parameter|returning object|throwing object|copying member subobject|copying array element|allocating object|copying temporary|initializing base subobject|initializing vector element|capturing value}0 of type %1 invokes deleted constructor"}},
		[e]={{nil,s,{{Bb,ob,"initializing template parameter",pb,Wb,qb,sb,vb,tb,zb,yb,xb,nb}," of type B invokes deleted constructor"}},{Eb,bb,{{Bb,ob,pb,Wb,qb,sb,vb,tb,zb,yb,xb,nb}," of type B invokes deleted constructor"}},{x,nil,{{Bb,ob,pb,qb,sb,vb,tb,zb,yb,xb,nb}," of type B invokes deleted constructor"}}},
		[f]=j,
		[g]="(?:copying variable|copying parameter|initializing template parameter|returning object|initializing statement expression result|throwing object|copying member subobject|copying array element|allocating object|copying temporary|initializing base subobject|initializing vector element|capturing value) of type (.*?) invokes deleted constructor",
		[h]=a,
		[i]=m,
		[b]={"e1314a64b803",1261112541,"Switch the initialization required by return statements over to the","Switch the initialization required by return statements over to the\nnew InitializationSequence. This fixes some bugs (e.g., PR5808),\nchanged some diagnostics, and caused more churn than expected. What\'s\nnew:\n\n  - InitializationSequence now has a \"C conversion sequence\" category\n    and step kind, which falls back to\n  - Changed the diagnostics for returns to always have the result type\n    of the function first and the type of the expression second.\n    CheckSingleAssignmentConstraints to peform checking in C. \n  - Improved ASTs for initialization of return values. The ASTs now\n    capture all of the temporaries we need to create, but\n    intentionally do not bind the tempoary that is actually returned,\n    so that it won\'t get destroyed twice.\n  - Make sure to perform an (elidable!) copy of the class object that\n    is returned from a class.\n  - Fix copy elision in CodeGen to properly see through the\n    subexpressions that occur with elidable copies.\n  - Give \"new\" its own entity kind; as with return values and thrown\n    objects, we don\'t bind the expression so we don\'t call a\n    destructor for it.\n\nNote that, with this patch, I\'ve broken returning move-only types in\nC++0x. We\'ll fix it later, when we tackle NRVO.\n\nllvm-svn: 91669"},
		[k]={{Cb,6807,"/// Make a (potentially elidable) temporary copy of the object\n/// provided by the given initializer by calling the appropriate copy\n/// constructor.\n///\n/// \\param S The Sema object used for type-checking.\n///\n/// \\param T The type of the temporary object, which must either be\n/// the type of the initializer expression or a superclass thereof.\n///\n/// \\param Entity The entity being initialized.\n///\n/// \\param CurInit The initializer expression.\n///\n/// \\param IsExtraneousCopy Whether this is an \"extraneous\" copy that\n/// is permitted in C++03 (but not C++0x) when binding a reference to\n/// an rvalue.\n///\n/// \\returns An expression that copies the initializer expression into\n/// a temporary object, or an error expression if a copy could not be\n/// created.\nstatic ExprResult CopyObject(Sema &S, QualType T, const InitializedEntity &Entity, ExprResult CurInit, bool IsExtraneousCopy) {\n  // ...\n  case OR_Deleted:\n    S.Diag(Loc, diag::err_temp_copy_deleted) << (int)Entity.getKind() << CurInitExpr->getType() << CurInitExpr->getSourceRange();"}},
		[l]={
			["clang/test/SemaCXX/cxx1z-copy-omission.cpp"]={"clang/test/SemaCXX/cxx1z-copy-omission.cpp:55:13: error: copying variable of type \'Noncopyable\' invokes deleted constructor","clang/test/SemaCXX/cxx1z-copy-omission.cpp:60:13: error: copying variable of type \'Derived\' invokes deleted constructor","clang/test/SemaCXX/cxx1z-copy-omission.cpp:143:13: error: copying variable of type \'Noncopyable\' invokes deleted constructor","clang/test/SemaCXX/cxx1z-copy-omission.cpp:146:13: error: copying variable of type \'Derived\' invokes deleted constructor"}
		}
	},
	["err_temp_copy_incomplete"]={
		[c]="err_temp_copy_incomplete",
		[d]="copying a temporary object of incomplete type %0",
		[e]="copying a temporary object of incomplete type A",
		[f]=j,
		[g]="copying a temporary object of incomplete type (.*?)",
		[h]=a,
		[i]=m,
		[b]={"d5c231e7450e",1272143365,"When we attempt to create a temporary object of class type, be sure","When we attempt to create a temporary object of class type, be sure\nthat the type we\'re copying is complete. \n\nBoost.Regex now builds, although it\'s failing its regression tests\nwith our favorite \"Sema doesn\'t consider destructor as used.\"\nassertion.\n\nllvm-svn: 102271"},
		[k]={{Cb,6766,"/// Make a (potentially elidable) temporary copy of the object\n/// provided by the given initializer by calling the appropriate copy\n/// constructor.\n///\n/// \\param S The Sema object used for type-checking.\n///\n/// \\param T The type of the temporary object, which must either be\n/// the type of the initializer expression or a superclass thereof.\n///\n/// \\param Entity The entity being initialized.\n///\n/// \\param CurInit The initializer expression.\n///\n/// \\param IsExtraneousCopy Whether this is an \"extraneous\" copy that\n/// is permitted in C++03 (but not C++0x) when binding a reference to\n/// an rvalue.\n///\n/// \\returns An expression that copies the initializer expression into\n/// a temporary object, or an error expression if a copy could not be\n/// created.\nstatic ExprResult CopyObject(Sema &S, QualType T, const InitializedEntity &Entity, ExprResult CurInit, bool IsExtraneousCopy) {\n  // ...\n  if (S.RequireCompleteType(Loc, T, diag::err_temp_copy_incomplete))"}}
	},
	["err_temp_copy_no_viable"]={
		[c]="err_temp_copy_no_viable",
		[d]={{nil,s,"no viable constructor %select{copying variable|copying parameter|initializing template parameter|returning object|initializing statement expression result|throwing object|copying member subobject|copying array element|allocating object|copying temporary|initializing base subobject|initializing vector element|capturing value}0 of type %1"},{Eb,bb,"no viable constructor %select{copying variable|copying parameter|returning object|initializing statement expression result|throwing object|copying member subobject|copying array element|allocating object|copying temporary|initializing base subobject|initializing vector element|capturing value}0 of type %1"},{x,nil,"no viable constructor %select{copying variable|copying parameter|returning object|throwing object|copying member subobject|copying array element|allocating object|copying temporary|initializing base subobject|initializing vector element|capturing value}0 of type %1"}},
		[e]={{nil,s,{"no viable constructor ",{Bb,ob,"initializing template parameter",pb,Wb,qb,sb,vb,tb,zb,yb,xb,nb},ac}},{Eb,bb,{"no viable constructor ",{Bb,ob,pb,Wb,qb,sb,vb,tb,zb,yb,xb,nb},ac}},{x,nil,{"no viable constructor ",{Bb,ob,pb,qb,sb,vb,tb,zb,yb,xb,nb},ac}}},
		[f]=j,
		[g]="no viable constructor (?:copying variable|copying parameter|initializing template parameter|returning object|initializing statement expression result|throwing object|copying member subobject|copying array element|allocating object|copying temporary|initializing base subobject|initializing vector element|capturing value) of type (.*?)",
		[h]=a,
		[i]=m,
		[b]={"e1314a64b803",1261112541,"Switch the initialization required by return statements over to the","Switch the initialization required by return statements over to the\nnew InitializationSequence. This fixes some bugs (e.g., PR5808),\nchanged some diagnostics, and caused more churn than expected. What\'s\nnew:\n\n  - InitializationSequence now has a \"C conversion sequence\" category\n    and step kind, which falls back to\n  - Changed the diagnostics for returns to always have the result type\n    of the function first and the type of the expression second.\n    CheckSingleAssignmentConstraints to peform checking in C. \n  - Improved ASTs for initialization of return values. The ASTs now\n    capture all of the temporaries we need to create, but\n    intentionally do not bind the tempoary that is actually returned,\n    so that it won\'t get destroyed twice.\n  - Make sure to perform an (elidable!) copy of the class object that\n    is returned from a class.\n  - Fix copy elision in CodeGen to properly see through the\n    subexpressions that occur with elidable copies.\n  - Give \"new\" its own entity kind; as with return values and thrown\n    objects, we don\'t bind the expression so we don\'t call a\n    destructor for it.\n\nNote that, with this patch, I\'ve broken returning move-only types in\nC++0x. We\'ll fix it later, when we tackle NRVO.\n\nllvm-svn: 91669"},
		[k]={{Cb,6789,"/// Make a (potentially elidable) temporary copy of the object\n/// provided by the given initializer by calling the appropriate copy\n/// constructor.\n///\n/// \\param S The Sema object used for type-checking.\n///\n/// \\param T The type of the temporary object, which must either be\n/// the type of the initializer expression or a superclass thereof.\n///\n/// \\param Entity The entity being initialized.\n///\n/// \\param CurInit The initializer expression.\n///\n/// \\param IsExtraneousCopy Whether this is an \"extraneous\" copy that\n/// is permitted in C++03 (but not C++0x) when binding a reference to\n/// an rvalue.\n///\n/// \\returns An expression that copies the initializer expression into\n/// a temporary object, or an error expression if a copy could not be\n/// created.\nstatic ExprResult CopyObject(Sema &S, QualType T, const InitializedEntity &Entity, ExprResult CurInit, bool IsExtraneousCopy) {\n  // ...\n  case OR_No_Viable_Function:\n    CandidateSet.NoteCandidates(PartialDiagnosticAt(Loc, S.PDiag(IsExtraneousCopy && !S.isSFINAEContext() ? diag::ext_rvalue_to_reference_temp_copy_no_viable : diag::err_temp_copy_no_viable) << (int)Entity.getKind() << CurInitExpr->getType() << CurInitExpr->getSourceRange()), S, OCD_AllCandidates, CurInitExpr);"}},
		[l]={
			["clang/test/SemaCXX/copy-initialization.cpp"]={"clang/test/SemaCXX/copy-initialization.cpp:44:7: error: no viable constructor copying parameter of type \'const Foo\'"}
		}
	},
	["err_template_arg_address_of_non_pointer"]={
		[c]="err_template_arg_address_of_non_pointer",
		[d]="address taken in non-type template argument for template parameter of reference type %0",
		[e]="address taken in non-type template argument for template parameter of reference type A",
		[f]=j,
		[g]="address taken in non\\-type template argument for template parameter of reference type (.*?)",
		[h]=a,
		[i]=m,
		[b]={"b242683d9992",1270146755,"Overhaul checking of non-type template arguments that should refer to","Overhaul checking of non-type template arguments that should refer to\nan object or function. Our previous checking was too lax, and ended up\nallowing missing or extraneous address-of operators, among other\nevils. The new checking provides better diagnostics and adheres more\nclosely to the standard.\n\nFixes PR6563 and PR6749.\n\nllvm-svn: 100125"},
		[k]={{o,6909,"/// Checks whether the given template argument is the address\n/// of an object or function according to C++ [temp.arg.nontype]p1.\nstatic bool CheckTemplateArgumentAddressOfObjectOrFunction(Sema &S, NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *ArgIn, TemplateArgument &SugaredConverted, TemplateArgument &CanonicalConverted) {\n  // ...\n  if (AddressTaken && ParamType->isReferenceType()) {\n    // If we originally had an address-of operator, but the\n    // parameter has reference type, complain and (if things look\n    // like they will work) drop the address-of operator.\n    if (!S.Context.hasSameUnqualifiedType(Entity->getType(), ParamType.getNonReferenceType())) {\n      S.Diag(AddrOpLoc, diag::err_template_arg_address_of_non_pointer) << ParamType;"},{o,6915,"/// Checks whether the given template argument is the address\n/// of an object or function according to C++ [temp.arg.nontype]p1.\nstatic bool CheckTemplateArgumentAddressOfObjectOrFunction(Sema &S, NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *ArgIn, TemplateArgument &SugaredConverted, TemplateArgument &CanonicalConverted) {\n  // ...\n  if (AddressTaken && ParamType->isReferenceType()) {\n    // ...\n    S.Diag(AddrOpLoc, diag::err_template_arg_address_of_non_pointer) << ParamType << FixItHint::CreateRemoval(AddrOpLoc);"}},
		[l]={
			["clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1.cpp"]={"clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1.cpp:116:8: error: address taken in non-type template argument for template parameter of reference type \'int &\'","clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1.cpp:118:8: error: address taken in non-type template argument for template parameter of reference type \'int &\'","clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1.cpp:129:9: error: address taken in non-type template argument for template parameter of reference type \'const int &\'","clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1.cpp:136:8: error: address taken in non-type template argument for template parameter of reference type \'int (&)(int)\'","clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1.cpp:138:8: error: address taken in non-type template argument for template parameter of reference type \'int (&)(int)\'","clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1.cpp:140:8: error: address taken in non-type template argument for template parameter of reference type \'int (&)(int)\'","clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1.cpp:146:8: error: address taken in non-type template argument for template parameter of reference type \'int (&)(int)\'"}
		}
	},
	["err_template_arg_deduced_incomplete_pack"]={
		[c]="err_template_arg_deduced_incomplete_pack",
		[d]="deduced incomplete pack %0 for template parameter %1",
		[e]="deduced incomplete pack A for template parameter B",
		[f]=j,
		[g]="deduced incomplete pack (.*?) for template parameter (.*?)",
		[h]=a,
		[i]=m,
		[b]={"539e8e370398",1483494535,"Fix template argument deduction when only some of a parameter pack is a non-deduced context.","Fix template argument deduction when only some of a parameter pack is a non-deduced context.\n\nWhen a parameter pack has multiple corresponding arguments, and some subset of\nthem are overloaded functions, it\'s possible that some subset of the parameters\nare non-deduced contexts. In such a case, keep deducing from the remainder of\nthe arguments, and resolve the incomplete pack against whatever other\ndeductions we\'ve performed for the pack.\n\nGCC, MSVC, and ICC give three different bad behaviors for this case; what we do\nnow (and what we did before) don\'t exactly match any of them, sadly :( I\'m\ngetting a core issue opened to specify more precisely how this should be\nhandled.\n\nllvm-svn: 290923"},
		[k]={{"clang/lib/Sema/SemaTemplateDeduction.cpp",2675,"/// Convert the given deduced template argument and add it to the set of\n/// fully-converted template arguments.\nstatic bool ConvertDeducedTemplateArgument(Sema &S, NamedDecl *Param, DeducedTemplateArgument Arg, NamedDecl *Template, TemplateDeductionInfo &Info, bool IsDeduced, SmallVectorImpl<TemplateArgument> &SugaredOutput, SmallVectorImpl<TemplateArgument> &CanonicalOutput) {\n  // ...\n  if (Arg.getKind() == TemplateArgument::Pack) {\n    // ...\n    for (const auto &P : Arg.pack_elements()) {\n      // ...\n      if (P.isNull()) {\n        // ...\n        S.Diag(Param->getLocation(), diag::err_template_arg_deduced_incomplete_pack) << Arg << Param;"}}
	},
	["err_template_arg_field"]={
		[c]="err_template_arg_field",
		[d]="non-type template argument refers to non-static data member %0",
		[e]="non-type template argument refers to non-static data member A",
		[f]=j,
		[g]="non\\-type template argument refers to non\\-static data member (.*?)",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{o,6839,"/// Checks whether the given template argument is the address\n/// of an object or function according to C++ [temp.arg.nontype]p1.\nstatic bool CheckTemplateArgumentAddressOfObjectOrFunction(Sema &S, NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *ArgIn, TemplateArgument &SugaredConverted, TemplateArgument &CanonicalConverted) {\n  // ...\n  // Cannot refer to non-static data members\n  if (isa<FieldDecl>(Entity) || isa<IndirectFieldDecl>(Entity)) {\n    S.Diag(Arg->getBeginLoc(), diag::err_template_arg_field) << Entity << Arg->getSourceRange();"}},
		[l]={
			["clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1.cpp"]={"clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1.cpp:169:9: error: non-type template argument refers to non-static data member \'NonStaticMember\'"}
		}
	},
	["err_template_arg_invalid"]={
		[c]={{nil,jb,"err_template_arg_invalid"}},
		[d]={{nil,jb,"non-type template argument \'%0\' is invalid"}},
		[e]={{nil,jb,"non-type template argument \'A\' is invalid"}},
		[f]=j,
		[g]="non\\-type template argument \'(.*?)\' is invalid",
		[h]=a,
		[i]={{nil,jb,m}},
		[b]={mb,1625925174,lb,kb},
		[k]={{o,6617,"/// Determine whether the given template argument is a null pointer\n/// value of the appropriate type.\nstatic NullPointerValueKind isNullPointerValueTemplateArgument(Sema &S, NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *Arg, Decl *Entity = nullptr) {\n  // ...\n  if (EvalResult.Val.isLValue() && !EvalResult.Val.getLValueBase()) {\n    // ...\n    S.Diag(Arg->getExprLoc(), diag::err_template_arg_invalid) << EvalResult.Val.getAsString(S.Context, ParamType);"}},
		[l]={
			[cc]={"clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1-11.cpp:31:4: error: non-type template argument \'(int *)1\' is invalid"}
		}
	},
	["err_template_arg_list_constraints_not_satisfied"]={
		[c]={{nil,t,"err_template_arg_list_constraints_not_satisfied"}},
		[d]={{nil,t,"constraints not satisfied for %select{class template|function template|variable template|alias template|template template parameter|template}0 %1%2"}},
		[e]={{nil,t,{"constraints not satisfied for ",{Ob,Sb,ec,"alias template","template template parameter",dc}," BC"}}},
		[f]=j,
		[g]="constraints not satisfied for (?:class template|function template|variable template|alias template|template template parameter|template) (.*?)(.*?)",
		[h]=a,
		[i]={{nil,t,m}},
		[b]={"bd8791610948",1569403888,"[clang] Add no_builtin attribute","[clang] Add no_builtin attribute\n\nSummary:\nThis is a follow up on https://reviews.llvm.org/D61634\nThis patch is simpler and only adds the no_builtin attribute.\n\nReviewers: tejohnson, courbet, theraven, t.p.northover, jdoerfert\n\nSubscribers: mgrang, cfe-commits\n\nTags: #clang\n\nDifferential Revision: https://reviews.llvm.org/D68028"},
		[k]={{"clang/lib/Sema/SemaConcept.cpp",862,"bool Sema::EnsureTemplateArgumentListConstraints(TemplateDecl *TD, const MultiLevelTemplateArgumentList &TemplateArgsLists, SourceRange TemplateIDRange) {\n  // ...\n  if (!Satisfaction.IsSatisfied) {\n    // ...\n    Diag(TemplateIDRange.getBegin(), diag::err_template_arg_list_constraints_not_satisfied) << (int)getTemplateNameKindForDiagnostics(TemplateName(TD)) << TD << TemplateArgString << TemplateIDRange;"}},
		[l]={
			["clang/test/CXX/temp/temp.constr/temp.constr.constr/partial-specializations.cpp"]={"clang/test/CXX/temp/temp.constr/temp.constr.constr/partial-specializations.cpp:14:17: error: constraints not satisfied for class template \'is_same\' [with T = char, U = char]"}
		}
	},
	["err_template_arg_list_different_arity"]={
		[c]="err_template_arg_list_different_arity",
		[d]="%select{too few|too many}0 template arguments for %select{class template|function template|template template parameter|template}1 %2",
		[e]={{nil,D,{{"too few","too many"}," template arguments for ",{Ob,Sb,ec,"alias template","template template parameter","concept",dc}," C"}},{eb,C,{{"too few","too many"}," template arguments for ",{Ob,Sb,ec,"alias template","template template parameter",dc}," C"}},{nil,nil,{{"too few","too many"}," template arguments for ",{Ob,Sb,"template template parameter",dc}," C"}}},
		[f]=j,
		[g]="(?:too few|too many) template arguments for (?:class template|function template|variable template|alias template|template template parameter|concept|template) (.*?)",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{o,5870,"/// Diagnose a missing template argument.\ntemplate <typename TemplateParmDecl> static bool diagnoseMissingArgument(Sema &S, SourceLocation Loc, TemplateDecl *TD, const TemplateParmDecl *D, TemplateArgumentListInfo &Args) {\n  // ...\n  S.Diag(Loc, diag::err_template_arg_list_different_arity) << /*not enough args*/ 0 << (int)S.getTemplateNameKindForDiagnostics(TemplateName(TD)) << TD;"},{o,5937,"/// Check that the given template argument list is well-formed\n/// for specializing the given template.\nbool Sema::CheckTemplateArgumentList(TemplateDecl *Template, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs, bool PartialTemplateArgs, SmallVectorImpl<TemplateArgument> &SugaredConverted, SmallVectorImpl<TemplateArgument> &CanonicalConverted, bool UpdateArgsWithConversions, bool *ConstraintsNotSatisfied) {\n  // ...\n  for (TemplateParameterList::iterator Param = Params->begin(), ParamEnd = Params->end(); Param != ParamEnd; /* increment in loop */) {\n    // If we have an expanded parameter pack, make sure we don\'t have too\n    // many arguments.\n    if (std::optional<unsigned> Expansions = getExpandedPackSize(*Param)) {\n      if (*Expansions == SugaredArgumentPack.size()) {\n      // ...\n      } else if (ArgIdx == NumArgs && !PartialTemplateArgs) {\n        // ...\n        Diag(TemplateLoc, diag::err_template_arg_list_different_arity) << /*not enough args*/ 0 << (int)getTemplateNameKindForDiagnostics(TemplateName(Template)) << Template;"},{o,6165,"/// Check that the given template argument list is well-formed\n/// for specializing the given template.\nbool Sema::CheckTemplateArgumentList(TemplateDecl *Template, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs, bool PartialTemplateArgs, SmallVectorImpl<TemplateArgument> &SugaredConverted, SmallVectorImpl<TemplateArgument> &CanonicalConverted, bool UpdateArgsWithConversions, bool *ConstraintsNotSatisfied) {\n  // ...\n  // If we have any leftover arguments, then there were too many arguments.\n  // Complain and fail.\n  if (ArgIdx < NumArgs) {\n    Diag(TemplateLoc, diag::err_template_arg_list_different_arity) << /*too many args*/ 1 << (int)getTemplateNameKindForDiagnostics(TemplateName(Template)) << Template << SourceRange(NewArgs[ArgIdx].getLocation(), NewArgs.getRAngleLoc());"}},
		[l]={
			["clang/test/CXX/temp/temp.spec/temp.expl.spec/p20.cpp"]={"clang/test/CXX/temp/temp.spec/temp.expl.spec/p20.cpp:22:28: error: too few template arguments for class template \'A\'"}
		}
	},
	["err_template_arg_member_ptr_base_derived_not_supported"]={
		[c]="err_template_arg_member_ptr_base_derived_not_supported",
		[d]="sorry, non-type template argument of pointer-to-member type %1 that refers to member %q0 of a different class is not supported yet",
		[e]="sorry, non-type template argument of pointer-to-member type B that refers to member A of a different class is not supported yet",
		[f]=j,
		[g]="sorry, non\\-type template argument of pointer\\-to\\-member type (.*?) that refers to member (.*?) of a different class is not supported yet",
		[h]=a,
		[i]=m,
		[b]={"410cc893745e",1416972413,"[c++1z] Most of N4268 (allow constant evaluation for non-type template arguments).","[c++1z] Most of N4268 (allow constant evaluation for non-type template arguments).\n\nWe don\'t yet support pointer-to-member template arguments that have undergone\npointer-to-member conversions, mostly because we don\'t have a mangling for them yet.\n\nllvm-svn: 222807"},
		[k]={{o,7325,"/// Check a template argument against its corresponding\n/// non-type template parameter.\n///\n/// This routine implements the semantics of C++ [temp.arg.nontype].\n/// If an error occurred, it returns ExprError(); otherwise, it\n/// returns the converted template argument. \\p ParamType is the\n/// type of the non-type template parameter after it has been instantiated.\nExprResult Sema::CheckTemplateArgument(NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *Arg, TemplateArgument &SugaredConverted, TemplateArgument &CanonicalConverted, CheckTemplateArgumentKind CTAK) {\n  // ...\n  if (getLangOpts().CPlusPlus17) {\n    // ...\n    case APValue::MemberPointer: {\n      // ...\n      // FIXME: We need TemplateArgument representation and mangling for these.\n      if (!Value.getMemberPointerPath().empty()) {\n        Diag(Arg->getBeginLoc(), diag::err_template_arg_member_ptr_base_derived_not_supported) << Value.getMemberPointerDecl() << ParamType << Arg->getSourceRange();"}},
		[l]={
			["clang/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp"]={"clang/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp:100:28: error: sorry, non-type template argument of pointer-to-member type \'int PtrMem::B::*\' that refers to member \'PtrMem::E::e\' of a different class is not supported yet","clang/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp:101:28: error: sorry, non-type template argument of pointer-to-member type \'int PtrMem::B::*\' that refers to member \'PtrMem::E::e\' of a different class is not supported yet","clang/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp:105:43: error: sorry, non-type template argument of pointer-to-member type \'int PtrMem::B::*\' that refers to member \'PtrMem::E::e\' of a different class is not supported yet","clang/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp:109:28: error: sorry, non-type template argument of pointer-to-member type \'int PtrMem::E::*\' that refers to member \'PtrMem::B::b\' of a different class is not supported yet","clang/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp:110:28: error: sorry, non-type template argument of pointer-to-member type \'int PtrMem::E::*\' that refers to member \'PtrMem::B::b\' of a different class is not supported yet","clang/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp:114:43: error: sorry, non-type template argument of pointer-to-member type \'int PtrMem::E::*\' that refers to member \'PtrMem::B::b\' of a different class is not supported yet","clang/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp:208:34: error: sorry, non-type template argument of pointer-to-member type \'int Auto::Basic::Y::*\' that refers to member \'Auto::Basic::X::n\' of a different class is not supported yet","clang/test/SemaTemplate/temp_arg_nontype_cxx1z.cpp:210:34: error: sorry, non-type template argument of pointer-to-member type \'const int Auto::Basic::Y::*\' that refers to member \'Auto::Basic::X::n\' of a different class is not supported yet"}
		}
	},
	["err_template_arg_method"]={
		[c]="err_template_arg_method",
		[d]="non-type template argument refers to non-static member function %0",
		[e]="non-type template argument refers to non-static member function A",
		[f]=j,
		[g]="non\\-type template argument refers to non\\-static member function (.*?)",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{o,6848,"/// Checks whether the given template argument is the address\n/// of an object or function according to C++ [temp.arg.nontype]p1.\nstatic bool CheckTemplateArgumentAddressOfObjectOrFunction(Sema &S, NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *ArgIn, TemplateArgument &SugaredConverted, TemplateArgument &CanonicalConverted) {\n  // ...\n  // Cannot refer to non-static member functions\n  if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(Entity)) {\n    if (!Method->isStatic()) {\n      S.Diag(Arg->getBeginLoc(), diag::err_template_arg_method) << Method << Arg->getSourceRange();"}}
	},
	["err_template_arg_must_be_expr"]={
		[c]="err_template_arg_must_be_expr",
		[d]="template argument for non-type template parameter must be an expression",
		[e]="template argument for non-type template parameter must be an expression",
		[f]=j,
		[g]="template argument for non\\-type template parameter must be an expression",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{o,5730,"/// Check that the given template argument corresponds to the given\n/// template parameter.\n///\n/// \\param Param The template parameter against which the argument will be\n/// checked.\n///\n/// \\param Arg The template argument, which may be updated due to conversions.\n///\n/// \\param Template The template in which the template argument resides.\n///\n/// \\param TemplateLoc The location of the template name for the template\n/// whose argument list we\'re matching.\n///\n/// \\param RAngleLoc The location of the right angle bracket (\'>\') that closes\n/// the template argument list.\n///\n/// \\param ArgumentPackIndex The index into the argument pack where this\n/// argument will be placed. Only valid if the parameter is a parameter pack.\n///\n/// \\param Converted The checked, converted argument will be added to the\n/// end of this small vector.\n///\n/// \\param CTAK Describes how we arrived at this particular template argument:\n/// explicitly written, deduced, etc.\n///\n/// \\returns true on error, false otherwise.\nbool Sema::CheckTemplateArgument(NamedDecl *Param, TemplateArgumentLoc &Arg, NamedDecl *Template, SourceLocation TemplateLoc, SourceLocation RAngleLoc, unsigned ArgumentPackIndex, SmallVectorImpl<TemplateArgument> &SugaredConverted, SmallVectorImpl<TemplateArgument> &CanonicalConverted, CheckTemplateArgumentKind CTAK) {\n  // ...\n  // Check non-type template parameters.\n  if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param)) {\n    // ...\n    case TemplateArgument::Template:\n    case TemplateArgument::TemplateExpansion:\n      // ...\n      Diag(Arg.getLocation(), diag::err_template_arg_must_be_expr) << Arg.getSourceRange();"},{o,5752,"/// Check that the given template argument corresponds to the given\n/// template parameter.\n///\n/// \\param Param The template parameter against which the argument will be\n/// checked.\n///\n/// \\param Arg The template argument, which may be updated due to conversions.\n///\n/// \\param Template The template in which the template argument resides.\n///\n/// \\param TemplateLoc The location of the template name for the template\n/// whose argument list we\'re matching.\n///\n/// \\param RAngleLoc The location of the right angle bracket (\'>\') that closes\n/// the template argument list.\n///\n/// \\param ArgumentPackIndex The index into the argument pack where this\n/// argument will be placed. Only valid if the parameter is a parameter pack.\n///\n/// \\param Converted The checked, converted argument will be added to the\n/// end of this small vector.\n///\n/// \\param CTAK Describes how we arrived at this particular template argument:\n/// explicitly written, deduced, etc.\n///\n/// \\returns true on error, false otherwise.\nbool Sema::CheckTemplateArgument(NamedDecl *Param, TemplateArgumentLoc &Arg, NamedDecl *Template, SourceLocation TemplateLoc, SourceLocation RAngleLoc, unsigned ArgumentPackIndex, SmallVectorImpl<TemplateArgument> &SugaredConverted, SmallVectorImpl<TemplateArgument> &CanonicalConverted, CheckTemplateArgumentKind CTAK) {\n  // ...\n  // Check non-type template parameters.\n  if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param)) {\n    // ...\n    case TemplateArgument::Type: {\n      // ...\n      if (T->isFunctionType())\n      // ...\n      else\n        Diag(SR.getBegin(), diag::err_template_arg_must_be_expr) << SR;"}},
		[l]={
			["clang/test/SemaTemplate/missing-class-keyword-crash.cpp"]={"clang/test/SemaTemplate/missing-class-keyword-crash.cpp:7:11: error: template argument for non-type template parameter must be an expression"}
		}
	},
	["err_template_arg_must_be_template"]={
		[c]="err_template_arg_must_be_template",
		[d]="template argument for template template parameter must be a class template%select{| or type alias template}0",
		[e]={{nil,nil,{"template argument for template template parameter must be a class template",{a," or type alias template"}}}},
		[f]=j,
		[g]="template argument for template template parameter must be a class template(?:| or type alias template)",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{o,5824,"/// Check that the given template argument corresponds to the given\n/// template parameter.\n///\n/// \\param Param The template parameter against which the argument will be\n/// checked.\n///\n/// \\param Arg The template argument, which may be updated due to conversions.\n///\n/// \\param Template The template in which the template argument resides.\n///\n/// \\param TemplateLoc The location of the template name for the template\n/// whose argument list we\'re matching.\n///\n/// \\param RAngleLoc The location of the right angle bracket (\'>\') that closes\n/// the template argument list.\n///\n/// \\param ArgumentPackIndex The index into the argument pack where this\n/// argument will be placed. Only valid if the parameter is a parameter pack.\n///\n/// \\param Converted The checked, converted argument will be added to the\n/// end of this small vector.\n///\n/// \\param CTAK Describes how we arrived at this particular template argument:\n/// explicitly written, deduced, etc.\n///\n/// \\returns true on error, false otherwise.\nbool Sema::CheckTemplateArgument(NamedDecl *Param, TemplateArgumentLoc &Arg, NamedDecl *Template, SourceLocation TemplateLoc, SourceLocation RAngleLoc, unsigned ArgumentPackIndex, SmallVectorImpl<TemplateArgument> &SugaredConverted, SmallVectorImpl<TemplateArgument> &CanonicalConverted, CheckTemplateArgumentKind CTAK) {\n  // ...\n  case TemplateArgument::Expression:\n  case TemplateArgument::Type:\n    // ...\n    Diag(Arg.getLocation(), diag::err_template_arg_must_be_template) << getLangOpts().CPlusPlus11;"}},
		[l]={
			["clang/test/SemaCXX/make_integer_seq.cpp"]={"clang/test/SemaCXX/make_integer_seq.cpp:49:20: error: template argument for template template parameter must be a class template or type alias template"}
		}
	},
	["err_template_arg_must_be_type"]={
		[c]="err_template_arg_must_be_type",
		[d]="template argument for template type parameter must be a type",
		[e]="template argument for template type parameter must be a type",
		[f]=j,
		[g]="template argument for template type parameter must be a type",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{o,5285,"bool Sema::CheckTemplateTypeArgument(TemplateTypeParmDecl *Param, TemplateArgumentLoc &AL, SmallVectorImpl<TemplateArgument> &SugaredConverted, SmallVectorImpl<TemplateArgument> &CanonicalConverted) {\n  // ...\n  default: {\n    // ...\n    Diag(SR.getBegin(), diag::err_template_arg_must_be_type) << SR;"}},
		[l]={
			["clang/test/SemaCXX/dcl_ambig_res.cpp"]={"clang/test/SemaCXX/dcl_ambig_res.cpp:41:4: error: template argument for template type parameter must be a type"}
		}
	},
	["err_template_arg_must_be_type_suggest"]={
		[c]="err_template_arg_must_be_type_suggest",
		[d]="template argument for template type parameter must be a type; did you forget \'typename\'?",
		[e]="template argument for template type parameter must be a type; did you forget \'typename\'?",
		[f]=j,
		[g]="template argument for template type parameter must be a type; did you forget \'typename\'\\?",
		[h]=a,
		[i]=m,
		[b]={"864d0b002cdc",1337384569,"Suggest adding \'typename\' when it would make the compiler","Suggest adding \'typename\' when it would make the compiler\naccept the template argument expression as a type.\n\nllvm-svn: 157085"},
		[k]={{o,5255,"bool Sema::CheckTemplateTypeArgument(TemplateTypeParmDecl *Param, TemplateArgumentLoc &AL, SmallVectorImpl<TemplateArgument> &SugaredConverted, SmallVectorImpl<TemplateArgument> &CanonicalConverted) {\n  // ...\n  case TemplateArgument::Expression: {\n    // ...\n    if (auto *II = NameInfo.getName().getAsIdentifierInfo()) {\n      // ...\n      if (Result.getAsSingle<TypeDecl>() || Result.getResultKind() == LookupResult::NotFoundInCurrentInstantiation) {\n        // ...\n        Diag(Loc, getLangOpts().MSVCCompat ? diag::ext_ms_template_type_arg_missing_typename : diag::err_template_arg_must_be_type_suggest) << FixItHint::CreateInsertion(Loc, \"typename \");"}},
		[l]={
			["clang/test/SemaTemplate/typename-specifier.cpp"]={"clang/test/SemaTemplate/typename-specifier.cpp:174:8: error: template argument for template type parameter must be a type; did you forget \'typename\'?","clang/test/SemaTemplate/typename-specifier.cpp:192:8: error: template argument for template type parameter must be a type; did you forget \'typename\'?","clang/test/SemaTemplate/typename-specifier.cpp:165:10: error: template argument for template type parameter must be a type; did you forget \'typename\'?","clang/test/SemaTemplate/typename-specifier.cpp:185:10: error: template argument for template type parameter must be a type; did you forget \'typename\'?","clang/test/SemaTemplate/typename-specifier.cpp:210:7: error: template argument for template type parameter must be a type; did you forget \'typename\'?","clang/test/SemaTemplate/typename-specifier.cpp:217:7: error: template argument for template type parameter must be a type; did you forget \'typename\'?"}
		}
	},
	["err_template_arg_no_ref_bind"]={
		[c]="err_template_arg_no_ref_bind",
		[d]="non-type template parameter of reference type %diff{$ cannot bind to template argument of type $|cannot bind to template of incompatible argument type}0,1",
		[e]={{nil,nil,{"non-type template parameter of reference type ",{"A cannot bind to template argument of type B","cannot bind to template of incompatible argument type"}}}},
		[f]=j,
		[g]="non\\-type template parameter of reference type (?:(.*?) cannot bind to template argument of type (.*?)|cannot bind to template of incompatible argument type)",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{o,6685,"/// Checks whether the given template argument is compatible with its\n/// template parameter.\nstatic bool CheckTemplateArgumentIsCompatibleWithParameter(Sema &S, NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *ArgIn, Expr *Arg, QualType ArgType) {\n  // ...\n  if (ParamType->isPointerType() && !ParamType->castAs<PointerType>()->getPointeeType()->isFunctionType() && S.IsQualificationConversion(ArgType, ParamType, false, ObjCLifetimeConversion)) {\n  // ...\n  } else {\n    // ...\n    // At this point, the template argument refers to an object or\n    // function with external linkage. We now need to check whether the\n    // argument and parameter types are compatible.\n    if (!S.Context.hasSameUnqualifiedType(ArgType, ParamType.getNonReferenceType())) {\n      // We can\'t perform this conversion or binding.\n      if (ParamType->isReferenceType())\n        S.Diag(Arg->getBeginLoc(), diag::err_template_arg_no_ref_bind) << ParamType << ArgIn->getType() << Arg->getSourceRange();"}},
		[l]={
			["clang/test/CXX/temp/temp.decls/temp.variadic/multi-level-substitution.cpp"]={"clang/test/CXX/temp/temp.decls/temp.variadic/multi-level-substitution.cpp:237:43: error: non-type template parameter of reference type \'float &\' cannot bind to template argument of type \'int\'"}
		}
	},
	["err_template_arg_nontype_ambig"]={
		[c]="err_template_arg_nontype_ambig",
		[d]="template argument for non-type template parameter is treated as function type %0",
		[e]="template argument for non-type template parameter is treated as function type A",
		[f]=j,
		[g]="template argument for non\\-type template parameter is treated as function type (.*?)",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{o,5750,"/// Check that the given template argument corresponds to the given\n/// template parameter.\n///\n/// \\param Param The template parameter against which the argument will be\n/// checked.\n///\n/// \\param Arg The template argument, which may be updated due to conversions.\n///\n/// \\param Template The template in which the template argument resides.\n///\n/// \\param TemplateLoc The location of the template name for the template\n/// whose argument list we\'re matching.\n///\n/// \\param RAngleLoc The location of the right angle bracket (\'>\') that closes\n/// the template argument list.\n///\n/// \\param ArgumentPackIndex The index into the argument pack where this\n/// argument will be placed. Only valid if the parameter is a parameter pack.\n///\n/// \\param Converted The checked, converted argument will be added to the\n/// end of this small vector.\n///\n/// \\param CTAK Describes how we arrived at this particular template argument:\n/// explicitly written, deduced, etc.\n///\n/// \\returns true on error, false otherwise.\nbool Sema::CheckTemplateArgument(NamedDecl *Param, TemplateArgumentLoc &Arg, NamedDecl *Template, SourceLocation TemplateLoc, SourceLocation RAngleLoc, unsigned ArgumentPackIndex, SmallVectorImpl<TemplateArgument> &SugaredConverted, SmallVectorImpl<TemplateArgument> &CanonicalConverted, CheckTemplateArgumentKind CTAK) {\n  // ...\n  // Check non-type template parameters.\n  if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param)) {\n    // ...\n    case TemplateArgument::Type: {\n      // ...\n      if (T->isFunctionType())\n        Diag(SR.getBegin(), diag::err_template_arg_nontype_ambig) << SR << T;"}},
		[l]={
			["clang/test/SemaTemplate/temp_arg_nontype.cpp"]={"clang/test/SemaTemplate/temp_arg_nontype.cpp:6:3: error: template argument for non-type template parameter is treated as function type \'int ()\'"}
		}
	},
	["err_template_arg_not_address_constant"]={
		[c]="err_template_arg_not_address_constant",
		[d]="non-type template argument of type %0 is not a constant expression",
		[e]="non-type template argument of type A is not a constant expression",
		[f]=j,
		[g]="non\\-type template argument of type (.*?) is not a constant expression",
		[h]=a,
		[i]=m,
		[b]={"20fdef32dd31",1334077705,"Rework implementation of null non-type template arguments based on","Rework implementation of null non-type template arguments based on\nRichard\'s feedback, to properly catch non-constant expressions and\ntype mismatches. Finishes <rdar://problem/11193097>.\n\nllvm-svn: 154407"},
		[k]={{o,6578,"/// Determine whether the given template argument is a null pointer\n/// value of the appropriate type.\nstatic NullPointerValueKind isNullPointerValueTemplateArgument(Sema &S, NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *Arg, Decl *Entity = nullptr) {\n  // ...\n  if (!Arg->EvaluateAsRValue(EvalResult, S.Context) || EvalResult.HasSideEffects) {\n    // ...\n    S.Diag(DiagLoc, diag::err_template_arg_not_address_constant) << Arg->getType() << Arg->getSourceRange();"}},
		[l]={
			[cc]={"clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1-11.cpp:27:4: error: non-type template argument of type \'std::nullptr_t\' is not a constant expression","clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1-11.cpp:30:4: error: non-type template argument of type \'int *\' is not a constant expression"}
		}
	},
	["err_template_arg_not_address_of"]={
		[c]="err_template_arg_not_address_of",
		[d]="non-type template argument for template parameter of pointer type %0 must have its address taken",
		[e]="non-type template argument for template parameter of pointer type A must have its address taken",
		[f]=j,
		[g]="non\\-type template argument for template parameter of pointer type (.*?) must have its address taken",
		[h]=a,
		[i]=m,
		[b]={"b242683d9992",1270146755,"Overhaul checking of non-type template arguments that should refer to","Overhaul checking of non-type template arguments that should refer to\nan object or function. Our previous checking was too lax, and ended up\nallowing missing or extraneous address-of operators, among other\nevils. The new checking provides better diagnostics and adheres more\nclosely to the standard.\n\nFixes PR6563 and PR6749.\n\nllvm-svn: 100125"},
		[k]={{o,6938,"/// Checks whether the given template argument is the address\n/// of an object or function according to C++ [temp.arg.nontype]p1.\nstatic bool CheckTemplateArgumentAddressOfObjectOrFunction(Sema &S, NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *ArgIn, TemplateArgument &SugaredConverted, TemplateArgument &CanonicalConverted) {\n  // ...\n  // If the template parameter has pointer type, either we must have taken the\n  // address or the argument must decay to a pointer.\n  if (!AddressTaken && ParamType->isPointerType()) {\n    if (Func) {\n    // ...\n    } else if (Entity->getType()->isArrayType()) {\n    // ...\n    } else {\n      // ...\n      if (!S.Context.hasSameUnqualifiedType(ArgType, ParamType)) {\n        S.Diag(Arg->getBeginLoc(), diag::err_template_arg_not_address_of) << ParamType;"},{o,6944,"/// Checks whether the given template argument is the address\n/// of an object or function according to C++ [temp.arg.nontype]p1.\nstatic bool CheckTemplateArgumentAddressOfObjectOrFunction(Sema &S, NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *ArgIn, TemplateArgument &SugaredConverted, TemplateArgument &CanonicalConverted) {\n  // ...\n  // If the template parameter has pointer type, either we must have taken the\n  // address or the argument must decay to a pointer.\n  if (!AddressTaken && ParamType->isPointerType()) {\n    if (Func) {\n    // ...\n    } else if (Entity->getType()->isArrayType()) {\n    // ...\n    } else {\n      // ...\n      S.Diag(Arg->getBeginLoc(), diag::err_template_arg_not_address_of) << ParamType << FixItHint::CreateInsertion(Arg->getBeginLoc(), \"&\");"}},
		[l]={
			["clang/test/Parser/MicrosoftExtensions.cpp"]={"clang/test/Parser/MicrosoftExtensions.cpp:148:25: error: non-type template argument for template parameter of pointer type \'const GUID *\' (aka \'const _GUID *\') must have its address taken"}
		}
	},
	["err_template_arg_not_convertible"]={
		[c]="err_template_arg_not_convertible",
		[d]="non-type template argument of type %0 cannot be converted to a value of type %1",
		[e]="non-type template argument of type A cannot be converted to a value of type B",
		[f]=j,
		[g]="non\\-type template argument of type (.*?) cannot be converted to a value of type (.*?)",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{o,6688,"/// Checks whether the given template argument is compatible with its\n/// template parameter.\nstatic bool CheckTemplateArgumentIsCompatibleWithParameter(Sema &S, NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *ArgIn, Expr *Arg, QualType ArgType) {\n  // ...\n  if (ParamType->isPointerType() && !ParamType->castAs<PointerType>()->getPointeeType()->isFunctionType() && S.IsQualificationConversion(ArgType, ParamType, false, ObjCLifetimeConversion)) {\n  // ...\n  } else {\n    // ...\n    // At this point, the template argument refers to an object or\n    // function with external linkage. We now need to check whether the\n    // argument and parameter types are compatible.\n    if (!S.Context.hasSameUnqualifiedType(ArgType, ParamType.getNonReferenceType())) {\n      // We can\'t perform this conversion or binding.\n      if (ParamType->isReferenceType())\n      // ...\n      else\n        S.Diag(Arg->getBeginLoc(), diag::err_template_arg_not_convertible) << ArgIn->getType() << ParamType << Arg->getSourceRange();"},{o,7061,"/// Checks whether the given template argument is a pointer to\n/// member constant according to C++ [temp.arg.nontype]p1.\nstatic bool CheckTemplateArgumentPointerToMember(Sema &S, NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *&ResultArg, TemplateArgument &SugaredConverted, TemplateArgument &CanonicalConverted) {\n  // ...\n  if (S.IsQualificationConversion(ResultArg->getType(), ParamType.getNonReferenceType(), false, ObjCLifetimeConversion)) {\n  // ...\n  } else if (!S.Context.hasSameUnqualifiedType(ResultArg->getType(), ParamType.getNonReferenceType())) {\n    // ...\n    S.Diag(ResultArg->getBeginLoc(), diag::err_template_arg_not_convertible) << ResultArg->getType() << ParamType << ResultArg->getSourceRange();"},{o,7521,"/// Check a template argument against its corresponding\n/// non-type template parameter.\n///\n/// This routine implements the semantics of C++ [temp.arg.nontype].\n/// If an error occurred, it returns ExprError(); otherwise, it\n/// returns the converted template argument. \\p ParamType is the\n/// type of the non-type template parameter after it has been instantiated.\nExprResult Sema::CheckTemplateArgument(NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *Arg, TemplateArgument &SugaredConverted, TemplateArgument &CanonicalConverted, CheckTemplateArgumentKind CTAK) {\n  // ...\n  // C++ [temp.arg.nontype]p5:\n  //   The following conversions are performed on each expression used\n  //   as a non-type template-argument. If a non-type\n  //   template-argument cannot be converted to the type of the\n  //   corresponding template-parameter then the program is\n  //   ill-formed.\n  if (ParamType->isIntegralOrEnumerationType()) {\n    // ...\n    // Try to convert the argument to the parameter\'s type.\n    if (Context.hasSameType(ParamType, ArgType)) {\n    // ...\n    } else if (ParamType->isBooleanType()) {\n    // ...\n    } else if (IsIntegralPromotion(Arg, ArgType, ParamType) || !ParamType->isEnumeralType()) {\n    // ...\n    } else {\n      // ...\n      Diag(Arg->getBeginLoc(), diag::err_template_arg_not_convertible) << Arg->getType() << ParamType << Arg->getSourceRange();"},{o,7704,"/// Check a template argument against its corresponding\n/// non-type template parameter.\n///\n/// This routine implements the semantics of C++ [temp.arg.nontype].\n/// If an error occurred, it returns ExprError(); otherwise, it\n/// returns the converted template argument. \\p ParamType is the\n/// type of the non-type template parameter after it has been instantiated.\nExprResult Sema::CheckTemplateArgument(NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *Arg, TemplateArgument &SugaredConverted, TemplateArgument &CanonicalConverted, CheckTemplateArgumentKind CTAK) {\n  // ...\n  // Deal with parameters of type std::nullptr_t.\n  if (ParamType->isNullPtrType()) {\n    // ...\n    case NPV_NotNullPointer:\n      Diag(Arg->getExprLoc(), diag::err_template_arg_not_convertible) << Arg->getType() << ParamType;"}},
		[l]={
			[cc]={"clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1-11.cpp:68:4: error: non-type template argument of type \'const int\' cannot be converted to a value of type \'std::nullptr_t\'"}
		}
	},
	["err_template_arg_not_decl_ref"]={
		[c]="err_template_arg_not_decl_ref",
		[d]="non-type template argument does not refer to any declaration",
		[e]="non-type template argument does not refer to any declaration",
		[f]=j,
		[g]="non\\-type template argument does not refer to any declaration",
		[h]=a,
		[i]=m,
		[b]={"724a8a1fef46",1264932080,"Fix PR6159 and several other problems with value-dependent non-type template","Fix PR6159 and several other problems with value-dependent non-type template\narguments. This both prevents meaningless checks on these arguments and ensures\nthat they are represented as an expression by the instantiation.\n\nCleaned up and added standard text to the relevant test case. Also started\nadding tests for *rejected* cases. At least one FIXME here where (I think) we\nallow something we shouldn\'t. More to come in the area of rejecting crazy\narguments with decent diagnostics. Suggestions welcome for still better\ndiagnostics on these errors!\n\nllvm-svn: 94953"},
		[k]={{o,6741,"/// Checks whether the given template argument is the address\n/// of an object or function according to C++ [temp.arg.nontype]p1.\nstatic bool CheckTemplateArgumentAddressOfObjectOrFunction(Sema &S, NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *ArgIn, TemplateArgument &SugaredConverted, TemplateArgument &CanonicalConverted) {\n  // ...\n  if (S.getLangOpts().MicrosoftExt) {\n    // ...\n    if (FirstOpLoc.isValid()) {\n      // ...\n      if (FirstOpKind == UO_AddrOf)\n      // ...\n      else if (Arg->getType()->isPointerType()) {\n        // ...\n        S.Diag(Arg->getBeginLoc(), diag::err_template_arg_not_decl_ref) << Arg->getSourceRange();"},{o,6831,"/// Checks whether the given template argument is the address\n/// of an object or function according to C++ [temp.arg.nontype]p1.\nstatic bool CheckTemplateArgumentAddressOfObjectOrFunction(Sema &S, NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *ArgIn, TemplateArgument &SugaredConverted, TemplateArgument &CanonicalConverted) {\n  // ...\n  if (!Entity) {\n    S.Diag(Arg->getBeginLoc(), diag::err_template_arg_not_decl_ref) << Arg->getSourceRange();"},{o,7354,"/// Check a template argument against its corresponding\n/// non-type template parameter.\n///\n/// This routine implements the semantics of C++ [temp.arg.nontype].\n/// If an error occurred, it returns ExprError(); otherwise, it\n/// returns the converted template argument. \\p ParamType is the\n/// type of the non-type template parameter after it has been instantiated.\nExprResult Sema::CheckTemplateArgument(NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *Arg, TemplateArgument &SugaredConverted, TemplateArgument &CanonicalConverted, CheckTemplateArgumentKind CTAK) {\n  // ...\n  if (getLangOpts().CPlusPlus17) {\n    // ...\n    case APValue::LValue: {\n      // ...\n      if (Base && (!VD || isa<LifetimeExtendedTemporaryDecl, UnnamedGlobalConstantDecl>(VD))) {\n        Diag(Arg->getBeginLoc(), diag::err_template_arg_not_decl_ref) << Arg->getSourceRange();"}},
		[l]={
			["clang/test/SemaTemplate/temp_arg_template.cpp"]={"clang/test/SemaTemplate/temp_arg_template.cpp:107:21: error: non-type template argument does not refer to any declaration"}
		}
	},
	["err_template_arg_not_ice"]={
		[c]="err_template_arg_not_ice",
		[d]="non-type template argument of type %0 is not an integral constant expression",
		[e]="non-type template argument of type A is not an integral constant expression",
		[f]=j,
		[g]="non\\-type template argument of type (.*?) is not an integral constant expression",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{o,7496,"/// Check a template argument against its corresponding\n/// non-type template parameter.\n///\n/// This routine implements the semantics of C++ [temp.arg.nontype].\n/// If an error occurred, it returns ExprError(); otherwise, it\n/// returns the converted template argument. \\p ParamType is the\n/// type of the non-type template parameter after it has been instantiated.\nExprResult Sema::CheckTemplateArgument(NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *Arg, TemplateArgument &SugaredConverted, TemplateArgument &CanonicalConverted, CheckTemplateArgumentKind CTAK) {\n  // ...\n  // C++ [temp.arg.nontype]p5:\n  //   The following conversions are performed on each expression used\n  //   as a non-type template-argument. If a non-type\n  //   template-argument cannot be converted to the type of the\n  //   corresponding template-parameter then the program is\n  //   ill-formed.\n  if (ParamType->isIntegralOrEnumerationType()) {\n    // ...\n    if (!ArgType->isIntegralOrEnumerationType()) {\n    // ...\n    } else if (!Arg->isValueDependent()) {\n      class TmplArgICEDiagnoser : public VerifyICEDiagnoser {\n        // ...\n        SemaDiagnosticBuilder diagnoseNotICE(Sema &S, SourceLocation Loc) override { return S.Diag(Loc, diag::err_template_arg_not_ice) << T; }"}},
		[l]={
			["clang/test/SemaCXX/constant-expression.cpp"]={"clang/test/SemaCXX/constant-expression.cpp:103:5: error: non-type template argument of type \'int\' is not an integral constant expression"}
		}
	},
	["err_template_arg_not_integral_or_enumeral"]={
		[c]="err_template_arg_not_integral_or_enumeral",
		[d]="non-type template argument of type %0 must have an integral or enumeration type",
		[e]="non-type template argument of type A must have an integral or enumeration type",
		[f]=j,
		[g]="non\\-type template argument of type (.*?) must have an integral or enumeration type",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{o,7483,"/// Check a template argument against its corresponding\n/// non-type template parameter.\n///\n/// This routine implements the semantics of C++ [temp.arg.nontype].\n/// If an error occurred, it returns ExprError(); otherwise, it\n/// returns the converted template argument. \\p ParamType is the\n/// type of the non-type template parameter after it has been instantiated.\nExprResult Sema::CheckTemplateArgument(NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *Arg, TemplateArgument &SugaredConverted, TemplateArgument &CanonicalConverted, CheckTemplateArgumentKind CTAK) {\n  // ...\n  // C++ [temp.arg.nontype]p5:\n  //   The following conversions are performed on each expression used\n  //   as a non-type template-argument. If a non-type\n  //   template-argument cannot be converted to the type of the\n  //   corresponding template-parameter then the program is\n  //   ill-formed.\n  if (ParamType->isIntegralOrEnumerationType()) {\n    // ...\n    if (!ArgType->isIntegralOrEnumerationType()) {\n      Diag(Arg->getBeginLoc(), diag::err_template_arg_not_integral_or_enumeral) << ArgType << Arg->getSourceRange();"}},
		[l]={
			["clang/test/SemaTemplate/temp_arg_nontype.cpp"]={"clang/test/SemaTemplate/temp_arg_nontype.cpp:35:3: error: non-type template argument of type \'X\' must have an integral or enumeration type"}
		}
	},
	["err_template_arg_not_object_or_func"]={
		[c]="err_template_arg_not_object_or_func",
		[d]="non-type template argument does not refer to an object or function",
		[e]="non-type template argument does not refer to an object or function",
		[f]=j,
		[g]="non\\-type template argument does not refer to an object or function",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{o,6862,"/// Checks whether the given template argument is the address\n/// of an object or function according to C++ [temp.arg.nontype]p1.\nstatic bool CheckTemplateArgumentAddressOfObjectOrFunction(Sema &S, NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *ArgIn, TemplateArgument &SugaredConverted, TemplateArgument &CanonicalConverted) {\n  // ...\n  // A non-type template argument must refer to an object or function.\n  if (!Func && !Var && !Guid) {\n    // ...\n    S.Diag(Arg->getBeginLoc(), diag::err_template_arg_not_object_or_func) << Arg->getSourceRange();"}}
	},
	["err_template_arg_not_pointer_to_member_form"]={
		[c]="err_template_arg_not_pointer_to_member_form",
		[d]="non-type template argument is not a pointer to member constant",
		[e]="non-type template argument is not a pointer to member constant",
		[f]=j,
		[g]="non\\-type template argument is not a pointer to member constant",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{o,7069,"/// Checks whether the given template argument is a pointer to\n/// member constant according to C++ [temp.arg.nontype]p1.\nstatic bool CheckTemplateArgumentPointerToMember(Sema &S, NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *&ResultArg, TemplateArgument &SugaredConverted, TemplateArgument &CanonicalConverted) {\n  // ...\n  if (!DRE)\n    return S.Diag(Arg->getBeginLoc(), diag::err_template_arg_not_pointer_to_member_form) << Arg->getSourceRange();"},{o,7097,"/// Checks whether the given template argument is a pointer to\n/// member constant according to C++ [temp.arg.nontype]p1.\nstatic bool CheckTemplateArgumentPointerToMember(Sema &S, NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *&ResultArg, TemplateArgument &SugaredConverted, TemplateArgument &CanonicalConverted) {\n  // ...\n  S.Diag(Arg->getBeginLoc(), diag::err_template_arg_not_pointer_to_member_form) << Arg->getSourceRange();"}},
		[l]={
			["clang/test/SemaTemplate/instantiate-member-pointers.cpp"]={"clang/test/SemaTemplate/instantiate-member-pointers.cpp:73:5: error: non-type template argument is not a pointer to member constant"}
		}
	},
	["err_template_arg_not_valid_template"]={
		[c]="err_template_arg_not_valid_template",
		[d]="template argument does not refer to a class or alias template, or template template parameter",
		[e]="template argument does not refer to a class or alias template, or template template parameter",
		[f]=j,
		[g]="template argument does not refer to a class or alias template, or template template parameter",
		[h]=a,
		[i]=m,
		[b]={"b8b04f852637",1459025205,"[NFC] Tweak diagnostic for template template arguments, to include template aliases.","[NFC] Tweak diagnostic for template template arguments, to include template aliases.\n\nThe prior diagnostic (err_template_arg_not_class_template) would state that the template argument to a template template parameter can only be a class template, when it can also be a template alias.  The newly renamed diagnostic (err_template_arg_not_valid_template) mentions template aliases.\n\nllvm-svn: 264522"},
		[k]={{o,1683,"/// ActOnTemplateTemplateParameter - Called when a C++ template template\n/// parameter (e.g. T in template <template \\<typename> class T> class array)\n/// has been parsed. S is the current scope.\nNamedDecl *Sema::ActOnTemplateTemplateParameter(Scope *S, SourceLocation TmpLoc, TemplateParameterList *Params, SourceLocation EllipsisLoc, IdentifierInfo *Name, SourceLocation NameLoc, unsigned Depth, unsigned Position, SourceLocation EqualLoc, ParsedTemplateArgument Default) {\n  // ...\n  if (!Default.isInvalid()) {\n    // ...\n    if (DefaultArg.getArgument().getAsTemplate().isNull()) {\n      Diag(DefaultArg.getLocation(), diag::err_template_arg_not_valid_template) << DefaultArg.getSourceRange();"},{o,7773,"/// Check a template argument against its corresponding\n/// template template parameter.\n///\n/// This routine implements the semantics of C++ [temp.arg.template].\n/// It returns true if an error occurred, and false otherwise.\nbool Sema::CheckTemplateTemplateArgument(TemplateTemplateParmDecl *Param, TemplateParameterList *Params, TemplateArgumentLoc &Arg) {\n  // ...\n  // C++0x [temp.arg.template]p1:\n  //   A template-argument for a template template-parameter shall be\n  //   the name of a class template or an alias template, expressed as an\n  //   id-expression. When the template-argument names a class template, only\n  //   primary class templates are considered when matching the\n  //   template template argument with the corresponding parameter;\n  //   partial specializations are not considered even if their\n  //   parameter lists match that of the template template parameter.\n  //\n  // Note that we also allow template template parameters here, which\n  // will happen when we are dealing with, e.g., class template\n  // partial specializations.\n  if (!isa<ClassTemplateDecl>(Template) && !isa<TemplateTemplateParmDecl>(Template) && !isa<TypeAliasTemplateDecl>(Template) && !isa<BuiltinTemplateDecl>(Template)) {\n    // ...\n    Diag(Arg.getLocation(), diag::err_template_arg_not_valid_template);"}}
	},
	["err_template_arg_object_no_linkage"]={
		[c]="err_template_arg_object_no_linkage",
		[d]="non-type template argument refers to %select{function|object}0 %1 that does not have linkage",
		[e]={{nil,nil,{"non-type template argument refers to ",{F,"object"}," B that does not have linkage"}}},
		[f]=j,
		[g]="non\\-type template argument refers to (?:function|object) (.*?) that does not have linkage",
		[h]=a,
		[i]=m,
		[b]={"9380e0ea236a",1333573890,"Implement C++11 [temp.arg.nontype]\'s permission to use the address of an object","Implement C++11 [temp.arg.nontype]\'s permission to use the address of an object\nor function with internal linkage as a non-type template argument.\n\nllvm-svn: 154053"},
		[k]={{o,6878,"/// Checks whether the given template argument is the address\n/// of an object or function according to C++ [temp.arg.nontype]p1.\nstatic bool CheckTemplateArgumentAddressOfObjectOrFunction(Sema &S, NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *ArgIn, TemplateArgument &SugaredConverted, TemplateArgument &CanonicalConverted) {\n  // ...\n  // Address / reference template args must have external linkage in C++98.\n  if (Entity->getFormalLinkage() == InternalLinkage) {\n  // ...\n  } else if (!Entity->hasLinkage()) {\n    S.Diag(Arg->getBeginLoc(), diag::err_template_arg_object_no_linkage) << !Func << Entity << Arg->getSourceRange();"}},
		[l]={
			["clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1.cpp"]={"clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1.cpp:168:9: error: non-type template argument refers to function \'f\' that does not have linkage"}
		}
	},
	["err_template_arg_overload_type"]={
		[c]="err_template_arg_overload_type",
		[d]="template argument is the type of an unresolved overloaded function",
		[e]="template argument is the type of an unresolved overloaded function",
		[f]=j,
		[g]="template argument is the type of an unresolved overloaded function",
		[h]=a,
		[i]=m,
		[b]={"8364e6b56856",1261437444,"When a template-id refers to a single function template, and the","When a template-id refers to a single function template, and the\nexplicitly-specified template arguments are enough to determine the\ninstantiation, and either template argument deduction fails or is not\nperformed in that context, we can resolve the template-id down to a\nfunction template specialization (so sayeth C++0x\n[temp.arg.explicit]p3). Fixes PR5811.\n\nllvm-svn: 91852"},
		[k]={{o,6511,"/// 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  // ...\n  } else if (Context.hasSameUnqualifiedType(Arg, Context.OverloadTy)) {\n    return Diag(SR.getBegin(), diag::err_template_arg_overload_type) << SR;"}}
	},
	["err_template_arg_ref_bind_ignores_quals"]={
		[c]="err_template_arg_ref_bind_ignores_quals",
		[d]="reference binding of non-type template parameter %diff{of type $ to template argument of type $|to template argument}0,1 ignores qualifiers",
		[e]={{nil,nil,{"reference binding of non-type template parameter ",{"of type A to template argument of type B","to template argument"}," ignores qualifiers"}}},
		[f]=j,
		[g]="reference binding of non\\-type template parameter (?:of type (.*?) to template argument of type (.*?)|to template argument) ignores qualifiers",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{o,6670,"/// Checks whether the given template argument is compatible with its\n/// template parameter.\nstatic bool CheckTemplateArgumentIsCompatibleWithParameter(Sema &S, NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *ArgIn, Expr *Arg, QualType ArgType) {\n  // ...\n  if (ParamType->isPointerType() && !ParamType->castAs<PointerType>()->getPointeeType()->isFunctionType() && S.IsQualificationConversion(ArgType, ParamType, false, ObjCLifetimeConversion)) {\n  // ...\n  } else {\n    if (const ReferenceType *ParamRef = ParamType->getAs<ReferenceType>()) {\n      if (!ParamRef->getPointeeType()->isFunctionType()) {\n        // ...\n        if ((ParamQuals | ArgQuals) != ParamQuals) {\n          S.Diag(Arg->getBeginLoc(), diag::err_template_arg_ref_bind_ignores_quals) << ParamType << Arg->getType() << Arg->getSourceRange();"}},
		[l]={
			["clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1.cpp"]={"clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1.cpp:119:8: error: reference binding of non-type template parameter of type \'int &\' to template argument of type \'const int\' ignores qualifiers"}
		}
	},
	["err_template_arg_reference_var"]={
		[c]="err_template_arg_reference_var",
		[d]="non-type template argument of reference type %0 is not an object",
		[e]="non-type template argument of reference type A is not an object",
		[f]=j,
		[g]="non\\-type template argument of reference type (.*?) is not an object",
		[h]=a,
		[i]=m,
		[b]={"b242683d9992",1270146755,"Overhaul checking of non-type template arguments that should refer to","Overhaul checking of non-type template arguments that should refer to\nan object or function. Our previous checking was too lax, and ended up\nallowing missing or extraneous address-of operators, among other\nevils. The new checking provides better diagnostics and adheres more\nclosely to the standard.\n\nFixes PR6563 and PR6749.\n\nllvm-svn: 100125"},
		[k]={{o,6888,"/// Checks whether the given template argument is the address\n/// of an object or function according to C++ [temp.arg.nontype]p1.\nstatic bool CheckTemplateArgumentAddressOfObjectOrFunction(Sema &S, NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *ArgIn, TemplateArgument &SugaredConverted, TemplateArgument &CanonicalConverted) {\n  // ...\n  if (Var) {\n    // A value of reference type is not an object.\n    if (Var->getType()->isReferenceType()) {\n      S.Diag(Arg->getBeginLoc(), diag::err_template_arg_reference_var) << Var->getType() << Arg->getSourceRange();"}},
		[l]={
			["clang/test/CXX/temp/temp.arg/temp.arg.nontype/p5.cpp"]={"clang/test/CXX/temp/temp.arg/temp.arg.nontype/p5.cpp:154:9: error: non-type template argument of reference type \'int &\' is not an object"}
		}
	},
	["err_template_arg_template_params_mismatch"]={
		[c]="err_template_arg_template_params_mismatch",
		[d]="template template argument has different template parameters than its corresponding template template parameter",
		[e]="template template argument has different template parameters than its corresponding template template parameter",
		[f]=j,
		[g]="template template argument has different template parameters than its corresponding template template parameter",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{o,8018,"/// Match two template parameters within template parameter lists.\nstatic bool MatchTemplateParameterKind(Sema &S, NamedDecl *New, const NamedDecl *NewInstFrom, NamedDecl *Old, const NamedDecl *OldInstFrom, bool Complain, Sema::TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc) {\n  // Check the actual kind (type, non-type, template).\n  if (Old->getKind() != New->getKind()) {\n    if (Complain) {\n      // ...\n      if (TemplateArgLoc.isValid()) {\n        S.Diag(TemplateArgLoc, diag::err_template_arg_template_params_mismatch);"},{o,8041,"/// Match two template parameters within template parameter lists.\nstatic bool MatchTemplateParameterKind(Sema &S, NamedDecl *New, const NamedDecl *NewInstFrom, NamedDecl *Old, const NamedDecl *OldInstFrom, bool Complain, Sema::TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc) {\n  // ...\n  // Check that both are parameter packs or neither are parameter packs.\n  // However, if we are matching a template template argument to a\n  // template template parameter, the template template parameter can have\n  // a parameter pack where the template template argument does not.\n  if (Old->isTemplateParameterPack() != New->isTemplateParameterPack() && !(Kind == Sema::TPL_TemplateTemplateArgumentMatch && Old->isTemplateParameterPack())) {\n    if (Complain) {\n      // ...\n      if (TemplateArgLoc.isValid()) {\n        S.Diag(TemplateArgLoc, diag::err_template_arg_template_params_mismatch);"},{o,8080,"/// Match two template parameters within template parameter lists.\nstatic bool MatchTemplateParameterKind(Sema &S, NamedDecl *New, const NamedDecl *NewInstFrom, NamedDecl *Old, const NamedDecl *OldInstFrom, bool Complain, Sema::TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc) {\n  // ...\n  // For non-type template parameters, check the type of the parameter.\n  if (NonTypeTemplateParmDecl *OldNTTP = dyn_cast<NonTypeTemplateParmDecl>(Old)) {\n    // ...\n    // If we are matching a template template argument to a template\n    // template parameter and one of the non-type template parameter types\n    // is dependent, then we must wait until template instantiation time\n    // to actually compare the arguments.\n    if (Kind != Sema::TPL_TemplateTemplateArgumentMatch || (!OldNTTP->getType()->isDependentType() && !NewNTTP->getType()->isDependentType())) {\n      // ...\n      if (!S.Context.hasSameType(OldType, NewType)) {\n        if (Complain) {\n          // ...\n          if (TemplateArgLoc.isValid()) {\n            S.Diag(TemplateArgLoc, diag::err_template_arg_template_params_mismatch);"},{o,8167,"/// Diagnose a known arity mismatch when comparing template argument\n/// lists.\nstatic void DiagnoseTemplateParameterListArityMismatch(Sema &S, TemplateParameterList *New, TemplateParameterList *Old, Sema::TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc) {\n  // ...\n  if (TemplateArgLoc.isValid()) {\n    S.Diag(TemplateArgLoc, diag::err_template_arg_template_params_mismatch);"}},
		[l]={
			["clang/test/CXX/temp/temp.param/p12.cpp"]={"clang/test/CXX/temp/temp.param/p12.cpp:36:14: error: template template argument has different template parameters than its corresponding template template parameter"}
		}
	},
	["err_template_arg_thread_local"]={
		[c]="err_template_arg_thread_local",
		[d]="non-type template argument refers to thread-local object",
		[e]="non-type template argument refers to thread-local object",
		[f]=j,
		[g]="non\\-type template argument refers to thread\\-local object",
		[h]=a,
		[i]=m,
		[b]={"9380e0ea236a",1333573890,"Implement C++11 [temp.arg.nontype]\'s permission to use the address of an object","Implement C++11 [temp.arg.nontype]\'s permission to use the address of an object\nor function with internal linkage as a non-type template argument.\n\nllvm-svn: 154053"},
		[k]={{o,6896,"/// Checks whether the given template argument is the address\n/// of an object or function according to C++ [temp.arg.nontype]p1.\nstatic bool CheckTemplateArgumentAddressOfObjectOrFunction(Sema &S, NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *ArgIn, TemplateArgument &SugaredConverted, TemplateArgument &CanonicalConverted) {\n  // ...\n  if (Var) {\n    // ...\n    // A template argument must have static storage duration.\n    if (Var->getTLSKind()) {\n      S.Diag(Arg->getBeginLoc(), diag::err_template_arg_thread_local) << Arg->getSourceRange();"}},
		[l]={
			[cc]={"clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1-11.cpp:33:4: error: non-type template argument refers to thread-local object"}
		}
	},
	["err_template_arg_untyped_null_constant"]={
		[c]="err_template_arg_untyped_null_constant",
		[d]="null non-type template argument must be cast to template parameter type %0",
		[e]="null non-type template argument must be cast to template parameter type A",
		[f]=j,
		[g]="null non\\-type template argument must be cast to template parameter type (.*?)",
		[h]=a,
		[i]=m,
		[b]={"31f55dced546",1333752038,"Implement support for null non-type template arguments for non-type","Implement support for null non-type template arguments for non-type\ntemplate parameters of pointer, pointer-to-member, or nullptr_t\ntype in C++11. Fixes PR9700 / <rdar://problem/11193097>.\n\nllvm-svn: 154219"},
		[k]={{o,6627,"/// Determine whether the given template argument is a null pointer\n/// value of the appropriate type.\nstatic NullPointerValueKind isNullPointerValueTemplateArgument(Sema &S, NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *Arg, Decl *Entity = nullptr) {\n  // ...\n  // If we don\'t have a null pointer value, but we do have a NULL pointer\n  // constant, suggest a cast to the appropriate type.\n  if (Arg->isNullPointerConstant(S.Context, Expr::NPC_NeverValueDependent)) {\n    // ...\n    S.Diag(Arg->getExprLoc(), diag::err_template_arg_untyped_null_constant) << ParamType << FixItHint::CreateInsertion(Arg->getBeginLoc(), Code) << FixItHint::CreateInsertion(S.getLocForEndOfToken(Arg->getEndLoc()), \")\");"}},
		[l]={
			[cc]={"clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1-11.cpp:21:4: error: null non-type template argument must be cast to template parameter type \'int *\'","clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1-11.cpp:22:4: error: null non-type template argument must be cast to template parameter type \'int *\'","clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1-11.cpp:40:4: error: null non-type template argument must be cast to template parameter type \'int X::*\'","clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1-11.cpp:41:4: error: null non-type template argument must be cast to template parameter type \'int X::*\'","clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1-11.cpp:51:5: error: null non-type template argument must be cast to template parameter type \'int (X::*)(int)\'","clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1-11.cpp:52:5: error: null non-type template argument must be cast to template parameter type \'int (X::*)(int)\'","clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1-11.cpp:66:4: error: null non-type template argument must be cast to template parameter type \'std::nullptr_t\'"}
		}
	},
	["err_template_arg_wrongtype_null_constant"]={
		[c]="err_template_arg_wrongtype_null_constant",
		[d]="null non-type template argument of type %0 does not match template parameter of type %1",
		[e]="null non-type template argument of type A does not match template parameter of type B",
		[f]=j,
		[g]="null non\\-type template argument of type (.*?) does not match template parameter of type (.*?)",
		[h]=a,
		[i]=m,
		[b]={"20fdef32dd31",1334077705,"Rework implementation of null non-type template arguments based on","Rework implementation of null non-type template arguments based on\nRichard\'s feedback, to properly catch non-constant expressions and\ntype mismatches. Finishes <rdar://problem/11193097>.\n\nllvm-svn: 154407"},
		[k]={{o,6607,"/// Determine whether the given template argument is a null pointer\n/// value of the appropriate type.\nstatic NullPointerValueKind isNullPointerValueTemplateArgument(Sema &S, NonTypeTemplateParmDecl *Param, QualType ParamType, Expr *Arg, Decl *Entity = nullptr) {\n  // ...\n  //   - a constant expression that evaluates to a null pointer value (4.10); or\n  //   - a constant expression that evaluates to a null member pointer value\n  //     (4.11); or\n  if ((EvalResult.Val.isLValue() && EvalResult.Val.isNullPointer()) || (EvalResult.Val.isMemberPointer() && !EvalResult.Val.getMemberPointerDecl())) {\n    // ...\n    S.Diag(Arg->getExprLoc(), diag::err_template_arg_wrongtype_null_constant) << Arg->getType() << ParamType << Arg->getSourceRange();"}},
		[l]={
			[cc]={"clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1-11.cpp:29:4: error: null non-type template argument of type \'float *\' does not match template parameter of type \'int *\'"}
		}
	},
	["err_template_defn_explicit_instantiation"]={
		[c]="err_template_defn_explicit_instantiation",
		[d]="%select{function|class|variable}0 cannot be defined in an explicit instantiation; if this declaration is meant to be a %select{function|class|variable}0 definition, remove the \'template\' keyword",
		[e]={{nil,nil,{{F,"class","variable"}," cannot be defined in an explicit instantiation; if this declaration is meant to be a ",{F,"class","variable"}," definition, remove the \'template\' keyword"}}},
		[f]=j,
		[g]="(?:function|class|variable) cannot be defined in an explicit instantiation; if this declaration is meant to be a (?:function|class|variable) definition, remove the \'template\' keyword",
		[h]=a,
		[i]=I,
		[b]={"725de3e14ff2",1371773326,"Bug Fix: Template explicit instantiations should not have definitions (FixIts yet to be tested.)","Bug Fix: Template explicit instantiations should not have definitions (FixIts yet to be tested.)\n\nllvm-svn: 184503"},
		[k]={{rb,2473,"Decl *Parser::ParseDeclarationAfterDeclaratorAndAttributes(Declarator &D, const ParsedTemplateInfo &TemplateInfo, ForRangeInit *FRI) {\n  // ...\n  case ParsedTemplateInfo::ExplicitInstantiation: {\n    if (Tok.is(tok::semi)) {\n    // ...\n    } else {\n      // ...\n      // Check that this is a valid instantiation\n      if (D.getName().getKind() != UnqualifiedIdKind::IK_TemplateId) {\n        // ...\n        Diag(Tok, diag::err_template_defn_explicit_instantiation) << 2 << FixItHint::CreateRemoval(TemplateInfo.TemplateLoc);"},{Mb,2085,"#include \"clang/Basic/TransformTypeTraits.def\"\n  // ...\n  if (TemplateId) {\n  // ...\n  } else if (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation && TUK == Sema::TUK_Declaration) {\n  // ...\n  } else if (TUK == Sema::TUK_Friend && TemplateInfo.Kind != ParsedTemplateInfo::NonTemplate) {\n  // ...\n  } else {\n    // ...\n    if (TUK == Sema::TUK_Definition && TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation) {\n      // ...\n      Diag(Tok, diag::err_template_defn_explicit_instantiation) << 1 << FixItHint::CreateRemoval(TemplateInfo.TemplateLoc);"},{"clang/lib/Parse/ParseTemplate.cpp",334,"/// Parse a single declaration that declares a template,\n/// template specialization, or explicit instantiation of a template.\n///\n/// \\param DeclEnd will receive the source location of the last token\n/// within this declaration.\n///\n/// \\param AS the access specifier associated with this\n/// declaration. Will be AS_none for namespace-scope declarations.\n///\n/// \\returns the new declaration.\nDecl *Parser::ParseSingleDeclarationAfterTemplate(DeclaratorContext Context, const ParsedTemplateInfo &TemplateInfo, ParsingDeclRAIIObject &DiagsFromTParams, SourceLocation &DeclEnd, ParsedAttributes &AccessAttrs, AccessSpecifier AS) {\n  // ...\n  if (DeclaratorInfo.isFunctionDeclarator() && isStartOfFunctionDefinition(DeclaratorInfo)) {\n    // ...\n    if (TemplateInfo.Kind == ParsedTemplateInfo::ExplicitInstantiation) {\n      if (DeclaratorInfo.getName().getKind() != UnqualifiedIdKind::IK_TemplateId) {\n        // ...\n        Diag(Tok, diag::err_template_defn_explicit_instantiation) << 0;"}},
		[l]={
			["clang/test/SemaTemplate/explicit-instantiation.cpp"]={"clang/test/SemaTemplate/explicit-instantiation.cpp:113:24: error: function cannot be defined in an explicit instantiation; if this declaration is meant to be a function definition, remove the \'template\' keyword","clang/test/SemaTemplate/explicit-instantiation.cpp:117:31: error: function cannot be defined in an explicit instantiation; if this declaration is meant to be a function definition, remove the \'template\' keyword"}
		}
	},
	["err_template_different_requires_clause"]={
		[c]={{nil,t,"err_template_different_requires_clause"}},
		[d]={{nil,t,"requires clause differs in template redeclaration"}},
		[e]={{nil,t,"requires clause differs in template redeclaration"}},
		[f]=j,
		[g]="requires clause differs in template redeclaration",
		[h]=a,
		[i]={{nil,t,m}},
		[b]={"7c11da0cfd33",1567434909,"[clang] New __attribute__((__clang_arm_mve_alias)).","[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"},
		[k]={{o,8275,"/// Determine whether the given template parameter lists are\n/// equivalent.\n///\n/// \\param New  The new template parameter list, typically written in the\n/// source code as part of a new template declaration.\n///\n/// \\param Old  The old template parameter list, typically found via\n/// name lookup of the template declared with this template parameter\n/// list.\n///\n/// \\param Complain  If true, this routine will produce a diagnostic if\n/// the template parameter lists are not equivalent.\n///\n/// \\param Kind describes how we are to match the template parameter lists.\n///\n/// \\param TemplateArgLoc If this source location is valid, then we\n/// are actually checking the template parameter list of a template\n/// argument (New) against the template parameter list of its\n/// corresponding template template parameter (Old). We produce\n/// slightly different diagnostics in this scenario.\n///\n/// \\returns True if the template parameter lists are equal, false\n/// otherwise.\nbool Sema::TemplateParameterListsAreEqual(const NamedDecl *NewInstFrom, TemplateParameterList *New, const NamedDecl *OldInstFrom, TemplateParameterList *Old, bool Complain, TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc) {\n  // ...\n  if (Kind != TPL_TemplateTemplateArgumentMatch && Kind != TPL_TemplateParamsEquivalent) {\n    // ...\n    auto Diagnose = [&] {\n      Diag(NewRC ? NewRC->getBeginLoc() : New->getTemplateLoc(), diag::err_template_different_requires_clause);"}},
		[l]={
			["clang/test/CXX/temp/temp.constr/temp.constr.decl/class-template-decl.cpp"]={"clang/test/CXX/temp/temp.constr/temp.constr.decl/class-template-decl.cpp:24:1: error: requires clause differs in template redeclaration","clang/test/CXX/temp/temp.constr/temp.constr.decl/class-template-decl.cpp:27:32: error: requires clause differs in template redeclaration","clang/test/CXX/temp/temp.constr/temp.constr.decl/class-template-decl.cpp:32:32: error: requires clause differs in template redeclaration","clang/test/CXX/temp/temp.constr/temp.constr.decl/class-template-decl.cpp:76:1: error: requires clause differs in template redeclaration","clang/test/CXX/temp/temp.constr/temp.constr.decl/class-template-decl.cpp:80:50: error: requires clause differs in template redeclaration"}
		}
	},
	["err_template_different_type_constraint"]={
		[c]={{nil,t,"err_template_different_type_constraint"}},
		[d]={{nil,t,"type constraint differs in template redeclaration"}},
		[e]={{nil,t,"type constraint differs in template redeclaration"}},
		[f]=j,
		[g]="type constraint differs in template redeclaration",
		[h]=a,
		[i]={{nil,t,m}},
		[b]={"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"},
		[k]={{o,8133,"/// Match two template parameters within template parameter lists.\nstatic bool MatchTemplateParameterKind(Sema &S, NamedDecl *New, const NamedDecl *NewInstFrom, NamedDecl *Old, const NamedDecl *OldInstFrom, bool Complain, Sema::TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc) {\n  // ...\n  if (Kind != Sema::TPL_TemplateParamsEquivalent && Kind != Sema::TPL_TemplateTemplateArgumentMatch && !isa<TemplateTemplateParmDecl>(Old)) {\n    // ...\n    auto Diagnose = [&] {\n      S.Diag(NewC ? NewC->getBeginLoc() : New->getBeginLoc(), diag::err_template_different_type_constraint);"}},
		[l]={
			["clang/test/CXX/temp/temp.constr/temp.constr.decl/class-template-decl.cpp"]={"clang/test/CXX/temp/temp.constr/temp.constr.decl/class-template-decl.cpp:40:11: error: type constraint differs in template redeclaration"}
		}
	},
	["err_template_expansion_into_fixed_list"]={
		[c]={{nil,t,"err_template_expansion_into_fixed_list"}},
		[d]={{nil,t,"pack expansion used as argument for non-pack parameter of %select{alias template|concept}0"}},
		[e]={{nil,t,{"pack expansion used as argument for non-pack parameter of ",{"alias template","concept"}}}},
		[f]=j,
		[g]="pack expansion used as argument for non\\-pack parameter of (?:alias template|concept)",
		[h]=a,
		[i]={{nil,t,m}},
		[b]={"349636d2bfc3",1575555459,"Implement VectorType conditional operator GNU extension.","Implement VectorType conditional operator GNU extension.\n\nGCC supports the conditional operator on VectorTypes that acts as a\n\'select\' in C++ mode. This patch implements the support. Types are\nconverted as closely to GCC\'s behavior as possible, though in a few\nplaces consistency with our existing vector type support was preferred.\n\nNote that this implementation is different from the OpenCL version in a\nnumber of ways, so it unfortunately required a different implementation.\n\nFirst, the SEMA rules and promotion rules are significantly different.\n\nSecondly, GCC implements COND[i] != 0 ? LHS[i] : RHS[i] (where i is in\nthe range 0- VectorSize, for each element).  In OpenCL, the condition is\nCOND[i] < 0 ? LHS[i]: RHS[i].\n\nIn the process of implementing this, it was also required to make the\nexpression COND ? LHS : RHS type dependent if COND is type dependent,\nsince the type is now dependent on the condition.  For example:\n\n    T ? 1 : 2;\n\nIs not typically type dependent, since the result can be deduced from\nthe operands.  HOWEVER, if T is a VectorType now, it could change this\nto a \'select\' (basically a swizzle with a non-constant mask) with the 1\nand 2 being promoted to vectors themselves.\n\nWhile this is a change, it is NOT a standards incompatible change. Based\non my (and D. Gregor\'s, at the time of writing the code) reading of the\nstandard, the expression is supposed to be type dependent if ANY\nsub-expression is type dependent.\n\nDifferential Revision: https://reviews.llvm.org/D71463"},
		[k]={{o,5971,"/// Check that the given template argument list is well-formed\n/// for specializing the given template.\nbool Sema::CheckTemplateArgumentList(TemplateDecl *Template, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs, bool PartialTemplateArgs, SmallVectorImpl<TemplateArgument> &SugaredConverted, SmallVectorImpl<TemplateArgument> &CanonicalConverted, bool UpdateArgsWithConversions, bool *ConstraintsNotSatisfied) {\n  // ...\n  for (TemplateParameterList::iterator Param = Params->begin(), ParamEnd = Params->end(); Param != ParamEnd; /* increment in loop */) {\n    // ...\n    if (ArgIdx < NumArgs) {\n      // ...\n      if (PackExpansionIntoNonPack && (isa<TypeAliasTemplateDecl>(Template) || isa<ConceptDecl>(Template))) {\n        // ...\n        Diag(NewArgs[ArgIdx].getLocation(), diag::err_template_expansion_into_fixed_list) << (isa<ConceptDecl>(Template) ? 1 : 0) << NewArgs[ArgIdx].getSourceRange();"}},
		[l]={
			["clang/test/CXX/expr/expr.prim/expr.prim.id/p3.cpp"]={"clang/test/CXX/expr/expr.prim/expr.prim.id/p3.cpp:184:24: error: pack expansion used as argument for non-pack parameter of concept"}
		}
	},
	["err_template_id_not_a_type"]={
		[c]="err_template_id_not_a_type",
		[d]="template name refers to non-type template %0",
		[e]="template name refers to non-type template A",
		[f]=j,
		[g]="template name refers to non\\-type template (.*?)",
		[h]=a,
		[i]=m,
		[b]={"8b6070bb9df4",1299274634,"Teach Sema::ActOnCXXNestedNameSpecifier and Sema::CheckTemplateIdType","Teach Sema::ActOnCXXNestedNameSpecifier and Sema::CheckTemplateIdType\nto cope with non-type templates by providing appropriate\nerrors. Previously, we would either assert, crash, or silently build a\ndependent type when we shouldn\'t. Fixes PR9226.\n\nllvm-svn: 127037"},
		[k]={{o,3893,"QualType Sema::CheckTemplateIdType(TemplateName Name, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs) {\n  // ...\n  if (!Template || isa<FunctionTemplateDecl>(Template) || isa<VarTemplateDecl>(Template) || isa<ConceptDecl>(Template)) {\n    // ...\n    Diag(TemplateLoc, diag::err_template_id_not_a_type) << Name;"}},
		[l]={
			["clang/test/CXX/expr/expr.prim/expr.prim.req/type-requirement.cpp"]={"clang/test/CXX/expr/expr.prim/expr.prim.req/type-requirement.cpp:104:36: error: template name refers to non-type template \'F\'","clang/test/CXX/expr/expr.prim/expr.prim.req/type-requirement.cpp:106:38: error: template name refers to non-type template \'::F\'"}
		}
	},
	["err_template_inside_local_class"]={
		[c]="err_template_inside_local_class",
		[d]="templates cannot be declared inside of a local class",
		[e]="templates cannot be declared inside of a local class",
		[f]=j,
		[g]="templates cannot be declared inside of a local class",
		[h]=a,
		[i]=m,
		[b]={"766e259e38e5",1382415258,"Sema: Do not allow template declarations inside local classes","Sema: Do not allow template declarations inside local classes\n\nSummary:\nEnforce the rule in C++11 [temp.mem]p2 that local classes cannot have\nmember templates.\n\nThis fixes PR16947.\n\nN.B.  C++14 has slightly different wording to afford generic lambdas\ndeclared inside of functions.\n\nFun fact:  Some formulations of local classes with member templates\nwould cause clang to crash during Itanium mangling, such as the\nfollowing:\n\nvoid outer_mem() {\n  struct Inner {\n    template <typename = void>\n    struct InnerTemplateClass {\n      static void itc_mem() {}\n    };\n  };\n  Inner::InnerTemplateClass<>::itc_mem();\n}\n\nReviewers: eli.friedman, rsmith, doug.gregor, faisalv\n\nReviewed By: doug.gregor\n\nCC: cfe-commits, ygao\n\nDifferential Revision: http://llvm-reviews.chandlerc.com/D1866\n\nllvm-svn: 193144"},
		[k]={{o,8343,"/// Check whether a template can be declared within this scope.\n///\n/// If the template declaration is valid in this scope, returns\n/// false. Otherwise, issues a diagnostic and returns true.\nbool Sema::CheckTemplateDeclScope(Scope *S, TemplateParameterList *TemplateParams) {\n  // ...\n  // C++ [temp]p2:\n  //   A template-declaration can appear only as a namespace scope or\n  //   class scope declaration.\n  // C++ [temp.expl.spec]p3:\n  //   An explicit specialization may be declared in any scope in which the\n  //   corresponding primary template may be defined.\n  // C++ [temp.class.spec]p6: [P2096]\n  //   A partial specialization may be declared in any scope in which the\n  //   corresponding primary template may be defined.\n  if (Ctx) {\n    // ...\n    if (CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(Ctx)) {\n      // C++ [temp.mem]p2:\n      //   A local class shall not have member templates.\n      if (RD->isLocalClass())\n        return Diag(TemplateParams->getTemplateLoc(), diag::err_template_inside_local_class) << TemplateParams->getSourceRange();"}},
		[l]={
			["clang/test/CXX/temp/temp.decls/temp.mem/p2.cpp"]={"clang/test/CXX/temp/temp.decls/temp.mem/p2.cpp:8:5: error: templates cannot be declared inside of a local class","clang/test/CXX/temp/temp.decls/temp.mem/p2.cpp:9:5: error: templates cannot be declared inside of a local class","clang/test/CXX/temp/temp.decls/temp.mem/p2.cpp:10:5: error: templates cannot be declared inside of a local class","clang/test/CXX/temp/temp.decls/temp.mem/p2.cpp:11:5: error: templates cannot be declared inside of a local class","clang/test/CXX/temp/temp.decls/temp.mem/p2.cpp:12:5: error: templates cannot be declared inside of a local class"}
		}
	},
	["err_template_instantiate_undefined"]={
		[c]="err_template_instantiate_undefined",
		[d]="%select{implicit|explicit}0 instantiation of undefined template %1",
		[e]={{nil,nil,{{"implicit","explicit"}," instantiation of undefined template B"}}},
		[f]=j,
		[g]="(?:implicit|explicit) instantiation of undefined template (.*?)",
		[h]=a,
		[i]=m,
		[b]={"a1f499736818",1242174359,"Semantic analysis for explicit instantiation of class templates. We","Semantic analysis for explicit instantiation of class templates. We\nstill aren\'t instantiating the definitions of class template members,\nand core issues 275 and 259 will both affect the checking that we do\nfor explicit instantiations (but are not yet implemented).\n\nllvm-svn: 71613"},
		[k]={{o,854,"/// Determine whether we would be unable to instantiate this template (because\n/// it either has no definition, or is in the process of being instantiated).\nbool Sema::DiagnoseUninstantiableTemplate(SourceLocation PointOfInstantiation, NamedDecl *Instantiation, bool InstantiatedFromMember, const NamedDecl *Pattern, const NamedDecl *PatternDef, TemplateSpecializationKind TSK, bool Complain /*= true*/) {\n  // ...\n  if (PatternDef) {\n  // ...\n  } else if (InstantiatedFromMember) {\n  // ...\n  } else {\n    if (isa<FunctionDecl>(Instantiation)) {\n    // ...\n    } else if (isa<TagDecl>(Instantiation)) {\n      Diag(PointOfInstantiation, diag::err_template_instantiate_undefined) << (TSK != TSK_ImplicitInstantiation) << InstantiationTy;"}},
		[l]={
			["clang/test/SemaTemplate/dependent-class-member-operator.cpp"]={"clang/test/SemaTemplate/dependent-class-member-operator.cpp:10:8: error: implicit instantiation of undefined template \'C2<int>\'"}
		}
	},
	["err_template_instantiate_within_definition"]={
		[c]="err_template_instantiate_within_definition",
		[d]="%select{implicit|explicit}0 instantiation of template %1 within its own definition",
		[e]={{nil,nil,{{"implicit","explicit"}," instantiation of template B within its own definition"}}},
		[f]=j,
		[g]="(?:implicit|explicit) instantiation of template (.*?) within its own definition",
		[h]=a,
		[i]=m,
		[b]={"5476666d1738",1303886791,"Diagnose attempts to implicitly instantiate a template before it is","Diagnose attempts to implicitly instantiate a template before it is\nfully defined.  Somehow this escaped notice for a very long time.\n\nllvm-svn: 130298"},
		[k]={{o,827,"/// Determine whether we would be unable to instantiate this template (because\n/// it either has no definition, or is in the process of being instantiated).\nbool Sema::DiagnoseUninstantiableTemplate(SourceLocation PointOfInstantiation, NamedDecl *Instantiation, bool InstantiatedFromMember, const NamedDecl *Pattern, const NamedDecl *PatternDef, TemplateSpecializationKind TSK, bool Complain /*= true*/) {\n  // ...\n  if (PatternDef) {\n    Diag(PointOfInstantiation, diag::err_template_instantiate_within_definition) << /*implicit|explicit*/ (TSK != TSK_ImplicitInstantiation) << InstantiationTy;"}},
		[l]={
			["clang/test/CXX/class/class.mem/p2.cpp"]={"clang/test/CXX/class/class.mem/p2.cpp:21:12: error: implicit instantiation of template \'test1::A<int>\' within its own definition"}
		}
	},
	["err_template_kernel"]={
		[c]={{nil,D,"err_template_kernel"}},
		[d]={{nil,D,"kernel functions cannot be used in a template declaration, instantiation or specialization"}},
		[e]={{nil,D,"kernel functions cannot be used in a template declaration, instantiation or specialization"}},
		[f]=j,
		[g]="kernel functions cannot be used in a template declaration, instantiation or specialization",
		[h]=a,
		[i]={{nil,D,m}},
		[b]={"d6865b7d71bc",1557238954,"[OpenCL] Prevent mangling kernel functions.","[OpenCL] Prevent mangling kernel functions.\n\nKernel function names have to be preserved as in the original\nsource to be able to access them from the host API side. \n\nThis commit also adds restriction to kernels that prevents them\nfrom being used in overloading, templates, etc.\n\nDifferential Revision: https://reviews.llvm.org/D60454\n\nllvm-svn: 360152"},
		[k]={{v,10714,"NamedDecl *Sema::ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamListsRef, bool &AddToScope) {\n  // ...\n  if (getLangOpts().OpenCL && NewFD->hasAttr<OpenCLKernelAttr>()) {\n    // ...\n    if (getLangOpts().OpenCLCPlusPlus) {\n      // ...\n      if (FunctionTemplate) {\n        Diag(D.getIdentifierLoc(), diag::err_template_kernel);"}},
		[l]={
			["clang/test/SemaOpenCLCXX/invalid-kernel.clcpp"]={"clang/test/SemaOpenCLCXX/invalid-kernel.clcpp:14:13: error: kernel functions cannot be used in a template declaration, instantiation or specialization","clang/test/SemaOpenCLCXX/invalid-kernel.clcpp:18:13: error: kernel functions cannot be used in a template declaration, instantiation or specialization"}
		}
	},
	["err_template_kw_missing"]={
		[c]="err_template_kw_missing",
		[d]="missing \'template\' keyword prior to dependent template name \'%0%1\'",
		[e]="missing \'template\' keyword prior to dependent template name \'AB\'",
		[f]=j,
		[g]="missing \'template\' keyword prior to dependent template name \'(.*?)(.*?)\'",
		[h]=a,
		[i]=m,
		[b]={"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"},
		[k]={{n,16153,"ExprResult Sema::BuildBinOp(Scope *S, SourceLocation OpLoc, BinaryOperatorKind Opc, Expr *LHSExpr, Expr *RHSExpr) {\n  // ...\n  // Handle pseudo-objects in the LHS.\n  if (const BuiltinType *pty = LHSExpr->getType()->getAsPlaceholderType()) {\n    // ...\n    // If we\'re instantiating \"a.x < b\" or \"A::x < b\" and \'x\' names a function\n    // template, diagnose the missing \'template\' keyword instead of diagnosing\n    // an invalid use of a bound member function.\n    //\n    // Note that \"A::x < b\" might be valid if \'b\' has an overloadable type due\n    // to C++1z [over.over]/1.4, but we already checked for that case above.\n    if (Opc == BO_LT && inTemplateInstantiation() && (pty->getKind() == BuiltinType::BoundMember || pty->getKind() == BuiltinType::Overload)) {\n      // ...\n      if (OE && !OE->hasTemplateKeyword() && !OE->hasExplicitTemplateArgs() && llvm::any_of(OE->decls(), [](NamedDecl *ND) { return isa<FunctionTemplateDecl>(ND); })) {\n        Diag(OE->getQualifier() ? OE->getQualifierLoc().getBeginLoc() : OE->getNameLoc(), diag::err_template_kw_missing) << OE->getName().getAsString() << \"\";"},{o,367,"bool Sema::DiagnoseUnknownTemplateName(const IdentifierInfo &II, SourceLocation IILoc, Scope *S, const CXXScopeSpec *SS, TemplateTy &SuggestedTemplate, TemplateNameKind &SuggestedKind) {\n  // ...\n  Diag(IILoc, diag::err_template_kw_missing) << Qualifier << II.getName() << FixItHint::CreateInsertion(IILoc, \"template \");"},{o,666,"void Sema::diagnoseExprIntendedAsTemplateName(Scope *S, ExprResult TemplateName, SourceLocation Less, SourceLocation Greater) {\n  // ...\n  // If this is a dependent-scope lookup, diagnose that the \'template\' keyword\n  // was missing.\n  if (MissingTemplateKeyword) {\n    Diag(NameInfo.getBeginLoc(), diag::err_template_kw_missing) << \"\" << NameInfo.getName().getAsString() << SourceRange(Less, Greater);"}},
		[l]={
			["clang/test/SemaTemplate/dependent-template-recover.cpp"]={"clang/test/SemaTemplate/dependent-template-recover.cpp:10:8: error: missing \'template\' keyword prior to dependent template name \'f1\'","clang/test/SemaTemplate/dependent-template-recover.cpp:15:10: error: missing \'template\' keyword prior to dependent template name \'f2\'","clang/test/SemaTemplate/dependent-template-recover.cpp:16:10: error: missing \'template\' keyword prior to dependent template name \'f2\'","clang/test/SemaTemplate/dependent-template-recover.cpp:17:8: error: missing \'template\' keyword prior to dependent template name \'f2\'","clang/test/SemaTemplate/dependent-template-recover.cpp:18:8: error: missing \'template\' keyword prior to dependent template name \'f2\'","clang/test/SemaTemplate/dependent-template-recover.cpp:20:8: error: missing \'template\' keyword prior to dependent template name \'foo\'","clang/test/SemaTemplate/dependent-template-recover.cpp:24:8: error: missing \'template\' keyword prior to dependent template name \'foo\'","clang/test/SemaTemplate/dependent-template-recover.cpp:25:17: error: missing \'template\' keyword prior to dependent template name \'bar\'","clang/test/SemaTemplate/dependent-template-recover.cpp:28:14: error: missing \'template\' keyword prior to dependent template name \'foo\'","clang/test/SemaTemplate/dependent-template-recover.cpp:29:8: error: missing \'template\' keyword prior to dependent template name \'foo\'","clang/test/SemaTemplate/dependent-template-recover.cpp:33:12: error: missing \'template\' keyword prior to dependent template name \'foo\'","clang/test/SemaTemplate/dependent-template-recover.cpp:34:8: error: missing \'template\' keyword prior to dependent template name \'foo\'","clang/test/SemaTemplate/dependent-template-recover.cpp:36:15: error: missing \'template\' keyword prior to dependent template name \'foo\'","clang/test/SemaTemplate/dependent-template-recover.cpp:37:10: error: missing \'template\' keyword prior to dependent template name \'foo\'","clang/test/SemaTemplate/dependent-template-recover.cpp:38:10: error: missing \'template\' keyword prior to dependent template name \'bar\'","clang/test/SemaTemplate/dependent-template-recover.cpp:42:10: error: missing \'template\' keyword prior to dependent template name \'foo\'","clang/test/SemaTemplate/dependent-template-recover.cpp:68:15: error: missing \'template\' keyword prior to dependent template name \'t\'","clang/test/SemaTemplate/dependent-template-recover.cpp:86:6: error: missing \'template\' keyword prior to dependent template name \'g\'","clang/test/SemaTemplate/dependent-template-recover.cpp:77:5: error: missing \'template\' keyword prior to dependent template name \'f\'","clang/test/SemaTemplate/dependent-template-recover.cpp:78:5: error: missing \'template\' keyword prior to dependent template name \'f\'","clang/test/SemaTemplate/dependent-template-recover.cpp:79:3: error: missing \'template\' keyword prior to dependent template name \'g\'"}
		}
	},
	["err_template_kw_refers_to_dependent_non_template"]={
		[c]={{nil,u,"err_template_kw_refers_to_dependent_non_template"}},
		[d]={{nil,u,"%0%select{| following the \'template\' keyword}1 cannot refer to a dependent template"}},
		[e]={{nil,u,{"A",{a," following the \'template\' keyword"}," cannot refer to a dependent template"}}},
		[f]=j,
		[g]="(.*?)(?:| following the \'template\' keyword) cannot refer to a dependent template",
		[h]=a,
		[i]={{nil,u,m}},
		[b]={fb,1576908663,gb,hb},
		[k]={{o,5193,"/// 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  Diag(Name.getBeginLoc(), diag::err_template_kw_refers_to_dependent_non_template) << GetNameFromUnqualifiedId(Name).getName() << Name.getSourceRange() << TemplateKWLoc.isValid() << TemplateKWLoc;"}},
		[l]={
			["clang/test/SemaCXX/literal-operators.cpp"]={"clang/test/SemaCXX/literal-operators.cpp:52:16: error: \'operator\"\"_foo\' following the \'template\' keyword cannot refer to a dependent template"}
		}
	},
	["err_template_kw_refers_to_non_template"]={
		[c]="err_template_kw_refers_to_non_template",
		[d]={{nil,u,"%0%select{| following the \'template\' keyword}1 does not refer to a template"},{t,nil,"%0 following the \'template\' keyword does not refer to a template"}},
		[e]={{nil,u,{"A",{a," following the \'template\' keyword"}," does not refer to a template"}},{t,nil,"A following the \'template\' keyword does not refer to a template"}},
		[f]=j,
		[g]="(.*?)(?:| following the \'template\' keyword) does not refer to a template",
		[h]=a,
		[i]=m,
		[b]={"b67535d1b6d7",1238460238,"Parsing and AST representation for dependent template names that occur","Parsing and AST representation for dependent template names that occur\nwithin nested-name-specifiers, e.g., for the \"apply\" in\n\n  typename MetaFun::template apply<T1, T2>::type\n\nAt present, we can\'t instantiate these nested-name-specifiers, so our\ntesting is sketchy.\n\nllvm-svn: 68081"},
		[k]={{o,557,"bool Sema::LookupTemplateName(LookupResult &Found, Scope *S, CXXScopeSpec &SS, QualType ObjectType, bool EnteringContext, bool &MemberOfUnknownSpecialization, RequiredTemplateKind RequiredTemplate, AssumedTemplateKind *ATK, bool AllowTypoCorrection) {\n  // ...\n  if (Found.empty()) {\n    // ...\n    // If a \'template\' keyword was used, a lookup that finds only non-template\n    // names is an error.\n    if (ExampleLookupResult && RequiredTemplate) {\n      Diag(Found.getNameLoc(), diag::err_template_kw_refers_to_non_template) << Found.getLookupName() << SS.getRange() << RequiredTemplate.hasTemplateKeyword() << RequiredTemplate.getTemplateKeywordLoc();"}},
		[l]={
			["clang/test/SemaTemplate/metafun-apply.cpp"]={"clang/test/SemaTemplate/metafun-apply.cpp:25:38: error: \'apply\' following the \'template\' keyword does not refer to a template"}
		}
	},
	["err_template_kw_refers_to_type_template"]={
		[c]="err_template_kw_refers_to_type_template",
		[d]="\'%0%1\' is expected to be a non-type template, but instantiated to a %select{class|type alias}2 template",
		[e]={{nil,nil,{"\'AB\' is expected to be a non-type template, but instantiated to a ",{"class","type alias"}," template"}}},
		[f]=j,
		[g]="\'(.*?)(.*?)\' is expected to be a non\\-type template, but instantiated to a (?:class|type alias) template",
		[h]=a,
		[i]=m,
		[b]={mb,1625925174,lb,kb},
		[k]={{o,5042,"// We actually only call this from template instantiation.\nExprResult Sema::BuildQualifiedTemplateIdExpr(CXXScopeSpec &SS, SourceLocation TemplateKWLoc, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs) {\n  // ...\n  auto DiagnoseTypeTemplateDecl = [&](TemplateDecl *Temp, bool isTypeAliasTemplateDecl) {\n    Diag(NameInfo.getLoc(), diag::err_template_kw_refers_to_type_template) << SS.getScopeRep() << NameInfo.getName().getAsString() << SS.getRange() << isTypeAliasTemplateDecl;"}},
		[l]={
			["clang/test/SemaTemplate/ms-sizeof-missing-typename.cpp"]={"clang/test/SemaTemplate/ms-sizeof-missing-typename.cpp:54:61: error: \'Q::U\' is expected to be a non-type template, but instantiated to a class template"}
		}
	},
	["err_template_linkage"]={
		[c]="err_template_linkage",
		[d]="templates must have C++ linkage",
		[e]="templates must have C++ linkage",
		[f]=j,
		[g]="templates must have C\\+\\+ linkage",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{o,8318,"/// Check whether a template can be declared within this scope.\n///\n/// If the template declaration is valid in this scope, returns\n/// false. Otherwise, issues a diagnostic and returns true.\nbool Sema::CheckTemplateDeclScope(Scope *S, TemplateParameterList *TemplateParams) {\n  // ...\n  if (Ctx && Ctx->isExternCContext()) {\n    Diag(TemplateParams->getTemplateLoc(), diag::err_template_linkage) << TemplateParams->getSourceRange();"}},
		[l]={
			["clang/test/CXX/over/over.oper/over.literal/p6.cpp"]={"clang/test/CXX/over/over.oper/over.literal/p6.cpp:5:12: error: templates must have C++ linkage","clang/test/CXX/over/over.oper/over.literal/p6.cpp:10:3: error: templates must have C++ linkage","clang/test/CXX/over/over.oper/over.literal/p6.cpp:13:5: error: templates must have C++ linkage"}
		}
	},
	["err_template_member"]={
		[c]="err_template_member",
		[d]="member %0 declared as a template",
		[e]="member A declared as a template",
		[f]=j,
		[g]="member (.*?) declared as a template",
		[h]=a,
		[i]=m,
		[b]={"7c26c04ba95c",1316616046,"Diagnose attempts to write a templated data member, from Stepan","Diagnose attempts to write a templated data member, from Stepan\nDyatkovskiy! Fixes PR10896.\n\nllvm-svn: 140250"},
		[k]={{Db,3558,"/// ActOnCXXMemberDeclarator - This is invoked when a C++ class member\n/// declarator is parsed. \'AS\' is the access specifier, \'BW\' specifies the\n/// bitfield width if there is one, \'InitExpr\' specifies the initializer if\n/// one has been parsed, and \'InitStyle\' is set if an in-class initializer is\n/// present (but parsing it has been deferred).\nNamedDecl *Sema::ActOnCXXMemberDeclarator(Scope *S, AccessSpecifier AS, Declarator &D, MultiTemplateParamsArg TemplateParameterLists, Expr *BW, const VirtSpecifiers &VS, InClassInitStyle InitStyle) {\n  // ...\n  if (isInstField) {\n    // ...\n    // Member field could not be with \"template\" keyword.\n    // So TemplateParameterLists should be empty in this case.\n    if (TemplateParameterLists.size()) {\n      // ...\n      if (TemplateParams->size()) {\n        // ...\n        Diag(D.getIdentifierLoc(), diag::err_template_member) << II << SourceRange(TemplateParams->getTemplateLoc(), TemplateParams->getRAngleLoc());"}},
		[l]={
			["clang/test/SemaTemplate/nested-template.cpp"]={"clang/test/SemaTemplate/nested-template.cpp:137:7: error: member \'SomeField\' declared as a template"}
		}
	},
	["err_template_member_noparams"]={
		[c]="err_template_member_noparams",
		[d]="extraneous \'template<>\' in declaration of member %0",
		[e]="extraneous \'template<>\' in declaration of member A",
		[f]=j,
		[g]="extraneous \'template\\<\\>\' in declaration of member (.*?)",
		[h]=a,
		[i]=m,
		[b]={"7c26c04ba95c",1316616046,"Diagnose attempts to write a templated data member, from Stepan","Diagnose attempts to write a templated data member, from Stepan\nDyatkovskiy! Fixes PR10896.\n\nllvm-svn: 140250"},
		[k]={{Db,3565,"/// ActOnCXXMemberDeclarator - This is invoked when a C++ class member\n/// declarator is parsed. \'AS\' is the access specifier, \'BW\' specifies the\n/// bitfield width if there is one, \'InitExpr\' specifies the initializer if\n/// one has been parsed, and \'InitStyle\' is set if an in-class initializer is\n/// present (but parsing it has been deferred).\nNamedDecl *Sema::ActOnCXXMemberDeclarator(Scope *S, AccessSpecifier AS, Declarator &D, MultiTemplateParamsArg TemplateParameterLists, Expr *BW, const VirtSpecifiers &VS, InClassInitStyle InitStyle) {\n  // ...\n  if (isInstField) {\n    // ...\n    // Member field could not be with \"template\" keyword.\n    // So TemplateParameterLists should be empty in this case.\n    if (TemplateParameterLists.size()) {\n      // ...\n      if (TemplateParams->size()) {\n      // ...\n      } else {\n        // ...\n        Diag(TemplateParams->getTemplateLoc(), diag::err_template_member_noparams) << II << SourceRange(TemplateParams->getTemplateLoc(), TemplateParams->getRAngleLoc());"}},
		[l]={
			["clang/test/SemaTemplate/nested-template.cpp"]={"clang/test/SemaTemplate/nested-template.cpp:138:5: error: extraneous \'template<>\' in declaration of member \'SomeField2\'"}
		}
	},
	["err_template_missing_args"]={
		[c]="err_template_missing_args",
		[d]="use of class template %0 requires template arguments",
		[e]="use of class template A requires template arguments",
		[f]=j,
		[g]="use of (?:class template|function template|variable template|alias template|template template parameter|concept|template) (.*?) requires template arguments",
		[h]=a,
		[i]=m,
		[b]={"823015d627b8",1270684986,"When a template (without arguments) is passed as a template type","When a template (without arguments) is passed as a template type\nparameter, explicitly ask the user to give it arguments.  We used to\ncomplain that it wasn\'t a type and expect the user to figure it out.\n\nllvm-svn: 100729"},
		[k]={{o,4899,"void Sema::diagnoseMissingTemplateArguments(TemplateName Name, SourceLocation Loc) {\n  Diag(Loc, diag::err_template_missing_args) << (int)getTemplateNameKindForDiagnostics(Name) << Name;"}},
		[l]={
			["clang/test/Parser/cxx2a-constrained-template-param.cpp"]={"clang/test/Parser/cxx2a-constrained-template-param.cpp:49:27: error: use of class template \'test1\' requires template arguments"}
		}
	},
	["err_template_nontype_parm_bad_structural_type"]={
		[c]={{nil,s,"err_template_nontype_parm_bad_structural_type"}},
		[d]={{nil,s,"a non-type template parameter cannot have type %0 before C++20"}},
		[e]={{nil,s,"a non-type template parameter cannot have type A before C++20"}},
		[f]=j,
		[g]="a non\\-type template parameter cannot have type (.*?) before C\\+\\+20",
		[h]=a,
		[i]={{nil,s,m}},
		[b]={Lb,1582847864,Gb,Nb},
		[k]={{o,1484,"QualType Sema::CheckNonTypeTemplateParameterType(QualType T, SourceLocation Loc) {\n  // ...\n  if (!getLangOpts().CPlusPlus20) {\n    // ...\n    Diag(Loc, diag::err_template_nontype_parm_bad_structural_type) << T;"}},
		[l]={
			["clang/test/CXX/temp/temp.param/p4.cpp"]={"clang/test/CXX/temp/temp.param/p4.cpp:18:16: error: a non-type template parameter cannot have type \'float\' before C++20"}
		}
	},
	["err_template_nontype_parm_bad_type"]={
		[c]="err_template_nontype_parm_bad_type",
		[d]="a non-type template parameter cannot have type %0",
		[e]="a non-type template parameter cannot have type A",
		[f]=j,
		[g]="a non\\-type template parameter cannot have type (.*?)",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{o,1349,"/// Require the given type to be a structural type, and diagnose if it is not.\n///\n/// \\return \\c true if an error was produced.\nbool Sema::RequireStructuralType(QualType T, SourceLocation Loc) {\n  // ...\n  // Don\'t mention structural types in our diagnostic prior to C++20. Also,\n  // there\'s not much more we can say about non-scalar non-class types --\n  // because we can\'t see functions or arrays here, those can only be language\n  // extensions.\n  if (!getLangOpts().CPlusPlus20 || (!T->isScalarType() && !T->isRecordType())) {\n    Diag(Loc, diag::err_template_nontype_parm_bad_type) << T;"}},
		[l]={
			["clang/test/CXX/temp/temp.param/p7.cpp"]={"clang/test/CXX/temp/temp.param/p7.cpp:36:24: error: a non-type template parameter cannot have type \'_Atomic(float)\'","clang/test/CXX/temp/temp.param/p7.cpp:37:22: error: a non-type template parameter cannot have type \'_Atomic(int)\'"}
		}
	},
	["err_template_nontype_parm_different_type"]={
		[c]="err_template_nontype_parm_different_type",
		[d]="template non-type parameter has a different type %0 in template %select{|template parameter }1redeclaration",
		[e]={{nil,nil,{"template non-type parameter has a different type A in template ",{a,"template parameter "},"redeclaration"}}},
		[f]=j,
		[g]="template non\\-type parameter has a different type (.*?) in template (?:|template parameter )redeclaration",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{o,8077,"/// Match two template parameters within template parameter lists.\nstatic bool MatchTemplateParameterKind(Sema &S, NamedDecl *New, const NamedDecl *NewInstFrom, NamedDecl *Old, const NamedDecl *OldInstFrom, bool Complain, Sema::TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc) {\n  // ...\n  // For non-type template parameters, check the type of the parameter.\n  if (NonTypeTemplateParmDecl *OldNTTP = dyn_cast<NonTypeTemplateParmDecl>(Old)) {\n    // ...\n    // If we are matching a template template argument to a template\n    // template parameter and one of the non-type template parameter types\n    // is dependent, then we must wait until template instantiation time\n    // to actually compare the arguments.\n    if (Kind != Sema::TPL_TemplateTemplateArgumentMatch || (!OldNTTP->getType()->isDependentType() && !NewNTTP->getType()->isDependentType())) {\n      // ...\n      if (!S.Context.hasSameType(OldType, NewType)) {\n        if (Complain) {\n          unsigned NextDiag = diag::err_template_nontype_parm_different_type;"}},
		[l]={
			["clang/test/SemaTemplate/friend-template.cpp"]={"clang/test/SemaTemplate/friend-template.cpp:80:28: error: template non-type parameter has a different type \'long\' in template redeclaration","clang/test/SemaTemplate/friend-template.cpp:305:15: error: template non-type parameter has a different type \'char\' in template redeclaration"}
		}
	},
	["err_template_nontype_parm_incomplete"]={
		[c]={{nil,s,"err_template_nontype_parm_incomplete"}},
		[d]={{nil,s,"non-type template parameter has incomplete type %0"}},
		[e]={{nil,s,"non-type template parameter has incomplete type A"}},
		[f]=j,
		[g]="non\\-type template parameter has incomplete type (.*?)",
		[h]=a,
		[i]={{nil,s,m}},
		[b]={Lb,1582847864,Gb,Nb},
		[k]={{o,1331,"/// Require the given type to be a structural type, and diagnose if it is not.\n///\n/// \\return \\c true if an error was produced.\nbool Sema::RequireStructuralType(QualType T, SourceLocation Loc) {\n  // ...\n  if (RequireCompleteType(Loc, T, diag::err_template_nontype_parm_incomplete))"}},
		[l]={
			["clang/test/SemaCXX/invalid-template-params.cpp"]={"clang/test/SemaCXX/invalid-template-params.cpp:7:3: error: non-type template parameter has incomplete type \'class UBar\'"}
		}
	},
	["err_template_nontype_parm_not_literal"]={
		[c]={{nil,s,"err_template_nontype_parm_not_literal"}},
		[d]={{nil,s,"non-type template parameter has non-literal type %0"}},
		[e]={{nil,s,"non-type template parameter has non-literal type A"}},
		[f]=j,
		[g]="non\\-type template parameter has non\\-literal type (.*?)",
		[h]=a,
		[i]={{nil,s,m}},
		[b]={Lb,1582847864,Gb,Nb},
		[k]={{o,1354,"/// Require the given type to be a structural type, and diagnose if it is not.\n///\n/// \\return \\c true if an error was produced.\nbool Sema::RequireStructuralType(QualType T, SourceLocation Loc) {\n  // ...\n  if (RequireLiteralType(Loc, T, diag::err_template_nontype_parm_not_literal))"}}
	},
	["err_template_nontype_parm_not_structural"]={
		[c]={{nil,s,"err_template_nontype_parm_not_structural"}},
		[d]={{nil,s,"type %0 of non-type template parameter is not a structural type"}},
		[e]={{nil,s,"type A of non-type template parameter is not a structural type"}},
		[f]=j,
		[g]="type (.*?) of non\\-type template parameter is not a structural type",
		[h]=a,
		[i]={{nil,s,m}},
		[b]={Lb,1582847864,Gb,Nb},
		[k]={{o,1357,"/// Require the given type to be a structural type, and diagnose if it is not.\n///\n/// \\return \\c true if an error was produced.\nbool Sema::RequireStructuralType(QualType T, SourceLocation Loc) {\n  // ...\n  Diag(Loc, diag::err_template_nontype_parm_not_structural) << T;"}},
		[l]={
			["clang/test/CXX/temp/temp.param/p7.cpp"]={"clang/test/CXX/temp/temp.param/p7.cpp:73:14: error: type \'RRef\' of non-type template parameter is not a structural type","clang/test/CXX/temp/temp.param/p7.cpp:78:17: error: type \'BadBase\' of non-type template parameter is not a structural type","clang/test/CXX/temp/temp.param/p7.cpp:83:18: error: type \'BadField\' of non-type template parameter is not a structural type","clang/test/CXX/temp/temp.param/p7.cpp:88:23: error: type \'BadFieldArray\' of non-type template parameter is not a structural type","clang/test/CXX/temp/temp.param/p7.cpp:92:23: error: type \'ProtectedBase\' of non-type template parameter is not a structural type","clang/test/CXX/temp/temp.param/p7.cpp:96:21: error: type \'PrivateBase\' of non-type template parameter is not a structural type","clang/test/CXX/temp/temp.param/p7.cpp:100:22: error: type \'Private2Base\' of non-type template parameter is not a structural type","clang/test/CXX/temp/temp.param/p7.cpp:106:24: error: type \'ProtectedField\' of non-type template parameter is not a structural type","clang/test/CXX/temp/temp.param/p7.cpp:112:22: error: type \'PrivateField\' of non-type template parameter is not a structural type","clang/test/CXX/temp/temp.param/p7.cpp:117:23: error: type \'Private2Field\' of non-type template parameter is not a structural type","clang/test/CXX/temp/temp.param/p7.cpp:122:22: error: type \'MutableField\' of non-type template parameter is not a structural type","clang/test/CXX/temp/temp.param/p7.cpp:125:36: error: type \'BadExtType<_Atomic(float)>\' of non-type template parameter is not a structural type","clang/test/CXX/temp/temp.param/p7.cpp:126:34: error: type \'BadExtType<_Atomic(int)>\' of non-type template parameter is not a structural type"}
		}
	},
	["err_template_nontype_parm_rvalue_ref"]={
		[c]={{nil,s,"err_template_nontype_parm_rvalue_ref"}},
		[d]={{nil,s,"non-type template parameter has rvalue reference type %0"}},
		[e]={{nil,s,"non-type template parameter has rvalue reference type A"}},
		[f]=j,
		[g]="non\\-type template parameter has rvalue reference type (.*?)",
		[h]=a,
		[i]={{nil,s,m}},
		[b]={Lb,1582847864,Gb,Nb},
		[k]={{o,1339,"/// Require the given type to be a structural type, and diagnose if it is not.\n///\n/// \\return \\c true if an error was produced.\nbool Sema::RequireStructuralType(QualType T, SourceLocation Loc) {\n  // ...\n  // Structural types are required to be object types or lvalue references.\n  if (T->isRValueReferenceType()) {\n    Diag(Loc, diag::err_template_nontype_parm_rvalue_ref) << T;"}},
		[l]={
			["clang/test/CXX/temp/temp.param/p7.cpp"]={"clang/test/CXX/temp/temp.param/p7.cpp:26:16: error: non-type template parameter has rvalue reference type \'int &&\'"}
		}
	},
	["err_template_outside_namespace_or_class_scope"]={
		[c]="err_template_outside_namespace_or_class_scope",
		[d]="templates can only be declared in namespace or class scope",
		[e]="templates can only be declared in namespace or class scope",
		[f]=j,
		[g]="templates can only be declared in namespace or class scope",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{o,8351,"/// Check whether a template can be declared within this scope.\n///\n/// If the template declaration is valid in this scope, returns\n/// false. Otherwise, issues a diagnostic and returns true.\nbool Sema::CheckTemplateDeclScope(Scope *S, TemplateParameterList *TemplateParams) {\n  // ...\n  return Diag(TemplateParams->getTemplateLoc(), diag::err_template_outside_namespace_or_class_scope) << TemplateParams->getSourceRange();"}},
		[l]={
			["clang/test/SemaCXX/extern-c.cpp"]={"clang/test/SemaCXX/extern-c.cpp:265:5: error: templates can only be declared in namespace or class scope"}
		}
	},
	["err_template_param_default_arg_inconsistent_redefinition"]={
		[c]={{nil,ib,"err_template_param_default_arg_inconsistent_redefinition"}},
		[d]={{nil,ib,"template parameter default argument is inconsistent with previous definition"}},
		[e]={{nil,ib,"template parameter default argument is inconsistent with previous definition"}},
		[f]=j,
		[g]="template parameter default argument is inconsistent with previous definition",
		[h]=a,
		[i]={{nil,ib,m}},
		[b]={mb,1625925174,lb,kb},
		[k]={{o,3048,"/// Checks the validity of a template parameter list, possibly\n/// considering the template parameter list from a previous\n/// declaration.\n///\n/// If an \"old\" template parameter list is provided, it must be\n/// equivalent (per TemplateParameterListsAreEqual) to the \"new\"\n/// template parameter list.\n///\n/// \\param NewParams Template parameter list for a new template\n/// declaration. This template parameter list will be updated with any\n/// default arguments that are carried through from the previous\n/// template parameter list.\n///\n/// \\param OldParams If provided, template parameter list from a\n/// previous declaration of the same template. Default template\n/// arguments will be merged from the old template parameter list to\n/// the new template parameter list.\n///\n/// \\param TPC Describes the context in which we are checking the given\n/// template parameter list.\n///\n/// \\param SkipBody If we might have already made a prior merged definition\n/// of this template visible, the corresponding body-skipping information.\n/// Default argument redefinition is not an error when skipping such a body,\n/// because (under the ODR) we can assume the default arguments are the same\n/// as the prior merged definition.\n///\n/// \\returns true if an error occurred, false otherwise.\nbool Sema::CheckTemplateParameterList(TemplateParameterList *NewParams, TemplateParameterList *OldParams, TemplateParamListContext TPC, SkipBodyInfo *SkipBody) {\n  // ...\n  for (TemplateParameterList::iterator NewParam = NewParams->begin(), NewParamEnd = NewParams->end(); NewParam != NewParamEnd; ++NewParam) {\n    // ...\n    // [basic.def.odr]/13:\n    //     There can be more than one definition of a\n    //     ...\n    //     default template argument\n    //     ...\n    //     in a program provided that each definition appears in a different\n    //     translation unit and the definitions satisfy the [same-meaning\n    //     criteria of the ODR].\n    //\n    // Simply, the design of modules allows the definition of template default\n    // argument to be repeated across translation unit. Note that the ODR is\n    // checked elsewhere. But it is still not allowed to repeat template default\n    // argument in the same translation unit.\n    if (RedundantDefaultArg) {\n    // ...\n    } else if (InconsistentDefaultArg) {\n      // ...\n      Diag(NewDefaultLoc, diag::err_template_param_default_arg_inconsistent_redefinition);"}}
	},
	["err_template_param_default_arg_missing"]={
		[c]="err_template_param_default_arg_missing",
		[d]="template parameter missing a default argument",
		[e]="template parameter missing a default argument",
		[f]=j,
		[g]="template parameter missing a default argument",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{o,3060,"/// Checks the validity of a template parameter list, possibly\n/// considering the template parameter list from a previous\n/// declaration.\n///\n/// If an \"old\" template parameter list is provided, it must be\n/// equivalent (per TemplateParameterListsAreEqual) to the \"new\"\n/// template parameter list.\n///\n/// \\param NewParams Template parameter list for a new template\n/// declaration. This template parameter list will be updated with any\n/// default arguments that are carried through from the previous\n/// template parameter list.\n///\n/// \\param OldParams If provided, template parameter list from a\n/// previous declaration of the same template. Default template\n/// arguments will be merged from the old template parameter list to\n/// the new template parameter list.\n///\n/// \\param TPC Describes the context in which we are checking the given\n/// template parameter list.\n///\n/// \\param SkipBody If we might have already made a prior merged definition\n/// of this template visible, the corresponding body-skipping information.\n/// Default argument redefinition is not an error when skipping such a body,\n/// because (under the ODR) we can assume the default arguments are the same\n/// as the prior merged definition.\n///\n/// \\returns true if an error occurred, false otherwise.\nbool Sema::CheckTemplateParameterList(TemplateParameterList *NewParams, TemplateParameterList *OldParams, TemplateParamListContext TPC, SkipBodyInfo *SkipBody) {\n  // ...\n  for (TemplateParameterList::iterator NewParam = NewParams->begin(), NewParamEnd = NewParams->end(); NewParam != NewParamEnd; ++NewParam) {\n    // ...\n    // [basic.def.odr]/13:\n    //     There can be more than one definition of a\n    //     ...\n    //     default template argument\n    //     ...\n    //     in a program provided that each definition appears in a different\n    //     translation unit and the definitions satisfy the [same-meaning\n    //     criteria of the ODR].\n    //\n    // Simply, the design of modules allows the definition of template default\n    // argument to be repeated across translation unit. Note that the ODR is\n    // checked elsewhere. But it is still not allowed to repeat template default\n    // argument in the same translation unit.\n    if (RedundantDefaultArg) {\n    // ...\n    } else if (InconsistentDefaultArg) {\n    // ...\n    } else if (MissingDefaultArg && TPC != TPC_FunctionTemplate) {\n      // ...\n      Diag((*NewParam)->getLocation(), diag::err_template_param_default_arg_missing);"}},
		[l]={
			["clang/test/CXX/temp/temp.param/p11.cpp"]={"clang/test/CXX/temp/temp.param/p11.cpp:6:16: error: template parameter missing a default argument","clang/test/CXX/temp/temp.param/p11.cpp:10:31: error: template parameter missing a default argument","clang/test/CXX/temp/temp.param/p11.cpp:14:14: error: template parameter missing a default argument"}
		}
	},
	["err_template_param_default_arg_redefinition"]={
		[c]="err_template_param_default_arg_redefinition",
		[d]="template parameter redefines default argument",
		[e]="template parameter redefines default argument",
		[f]=j,
		[g]="template parameter redefines default argument",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{o,3041,"/// Checks the validity of a template parameter list, possibly\n/// considering the template parameter list from a previous\n/// declaration.\n///\n/// If an \"old\" template parameter list is provided, it must be\n/// equivalent (per TemplateParameterListsAreEqual) to the \"new\"\n/// template parameter list.\n///\n/// \\param NewParams Template parameter list for a new template\n/// declaration. This template parameter list will be updated with any\n/// default arguments that are carried through from the previous\n/// template parameter list.\n///\n/// \\param OldParams If provided, template parameter list from a\n/// previous declaration of the same template. Default template\n/// arguments will be merged from the old template parameter list to\n/// the new template parameter list.\n///\n/// \\param TPC Describes the context in which we are checking the given\n/// template parameter list.\n///\n/// \\param SkipBody If we might have already made a prior merged definition\n/// of this template visible, the corresponding body-skipping information.\n/// Default argument redefinition is not an error when skipping such a body,\n/// because (under the ODR) we can assume the default arguments are the same\n/// as the prior merged definition.\n///\n/// \\returns true if an error occurred, false otherwise.\nbool Sema::CheckTemplateParameterList(TemplateParameterList *NewParams, TemplateParameterList *OldParams, TemplateParamListContext TPC, SkipBodyInfo *SkipBody) {\n  // ...\n  for (TemplateParameterList::iterator NewParam = NewParams->begin(), NewParamEnd = NewParams->end(); NewParam != NewParamEnd; ++NewParam) {\n    // ...\n    // [basic.def.odr]/13:\n    //     There can be more than one definition of a\n    //     ...\n    //     default template argument\n    //     ...\n    //     in a program provided that each definition appears in a different\n    //     translation unit and the definitions satisfy the [same-meaning\n    //     criteria of the ODR].\n    //\n    // Simply, the design of modules allows the definition of template default\n    // argument to be repeated across translation unit. Note that the ODR is\n    // checked elsewhere. But it is still not allowed to repeat template default\n    // argument in the same translation unit.\n    if (RedundantDefaultArg) {\n      Diag(NewDefaultLoc, diag::err_template_param_default_arg_redefinition);"}},
		[l]={
			["clang/test/CXX/temp/temp.param/p12.cpp"]={"clang/test/CXX/temp/temp.param/p12.cpp:11:24: error: template parameter redefines default argument","clang/test/CXX/temp/temp.param/p12.cpp:21:34: error: template parameter redefines default argument","clang/test/CXX/temp/temp.param/p12.cpp:31:18: error: template parameter redefines default argument"}
		}
	},
	["err_template_param_different_kind"]={
		[c]="err_template_param_different_kind",
		[d]="template parameter has a different kind in template %select{|template parameter }0redeclaration",
		[e]={{nil,nil,{"template parameter has a different kind in template ",{a,"template parameter "},"redeclaration"}}},
		[f]=j,
		[g]="template parameter has a different kind in template (?:|template parameter )redeclaration",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{o,8016,"/// Match two template parameters within template parameter lists.\nstatic bool MatchTemplateParameterKind(Sema &S, NamedDecl *New, const NamedDecl *NewInstFrom, NamedDecl *Old, const NamedDecl *OldInstFrom, bool Complain, Sema::TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc) {\n  // Check the actual kind (type, non-type, template).\n  if (Old->getKind() != New->getKind()) {\n    if (Complain) {\n      unsigned NextDiag = diag::err_template_param_different_kind;"}},
		[l]={
			["clang/test/SemaTemplate/class-template-decl.cpp"]={"clang/test/SemaTemplate/class-template-decl.cpp:35:14: error: template parameter has a different kind in template redeclaration","clang/test/SemaTemplate/class-template-decl.cpp:50:18: error: template parameter has a different kind in template redeclaration"}
		}
	},
	["err_template_param_list_different_arity"]={
		[c]="err_template_param_list_different_arity",
		[d]="%select{too few|too many}0 template parameters in template %select{|template parameter }1redeclaration",
		[e]={{nil,nil,{{"too few","too many"}," template parameters in template ",{a,"template parameter "},"redeclaration"}}},
		[f]=j,
		[g]="(?:too few|too many) template parameters in template (?:|template parameter )redeclaration",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{o,8165,"/// Diagnose a known arity mismatch when comparing template argument\n/// lists.\nstatic void DiagnoseTemplateParameterListArityMismatch(Sema &S, TemplateParameterList *New, TemplateParameterList *Old, Sema::TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc) {\n  unsigned NextDiag = diag::err_template_param_list_different_arity;"}},
		[l]={
			["clang/test/SemaCXX/libstdcxx_map_base_hack.cpp"]={"clang/test/SemaCXX/libstdcxx_map_base_hack.cpp:20:5: error: too few template parameters in template redeclaration"}
		}
	},
	["err_template_param_list_matches_nontemplate"]={
		[c]="err_template_param_list_matches_nontemplate",
		[d]="template parameter list matching the non-templated nested type %0 should be empty (\'template<>\')",
		[e]="template parameter list matching the non-templated nested type A should be empty (\'template<>\')",
		[f]=j,
		[g]="template parameter list matching the non\\-templated nested type (.*?) should be empty \\(\'template\\<\\>\'\\)",
		[h]=a,
		[i]=m,
		[b]={"1530138fd04d",1248975651,"Support out-of-line definitions of the members of class template","Support out-of-line definitions of the members of class template\npartial specializations.\n\nllvm-svn: 77606"},
		[k]={{o,3487,"/// Match the given template parameter lists to the given scope\n/// specifier, returning the template parameter list that applies to the\n/// name.\n///\n/// \\param DeclStartLoc the start of the declaration that has a scope\n/// specifier or a template parameter list.\n///\n/// \\param DeclLoc The location of the declaration itself.\n///\n/// \\param SS the scope specifier that will be matched to the given template\n/// parameter lists. This scope specifier precedes a qualified name that is\n/// being declared.\n///\n/// \\param TemplateId The template-id following the scope specifier, if there\n/// is one. Used to check for a missing \'template<>\'.\n///\n/// \\param ParamLists the template parameter lists, from the outermost to the\n/// innermost template parameter lists.\n///\n/// \\param IsFriend Whether to apply the slightly different rules for\n/// matching template parameters to scope specifiers in friend\n/// declarations.\n///\n/// \\param IsMemberSpecialization will be set true if the scope specifier\n/// denotes a fully-specialized type, and therefore this is a declaration of\n/// a member specialization.\n///\n/// \\returns the template parameter list, if any, that corresponds to the\n/// name that is preceded by the scope specifier @p SS. This template\n/// parameter list may have template parameters (if we\'re declaring a\n/// template) or may have no template parameters (if we\'re declaring a\n/// template specialization), or may be NULL (if what we\'re declaring isn\'t\n/// itself a template).\nTemplateParameterList *Sema::MatchTemplateParametersToScopeSpecifier(SourceLocation DeclStartLoc, SourceLocation DeclLoc, const CXXScopeSpec &SS, TemplateIdAnnotation *TemplateId, ArrayRef<TemplateParameterList *> ParamLists, bool IsFriend, bool &IsMemberSpecialization, bool &Invalid, bool SuppressDiagnostic) {\n  // ...\n  for (unsigned TypeIdx = 0, NumTypes = NestedTypes.size(); TypeIdx != NumTypes; ++TypeIdx) {\n    // ...\n    if (NeedEmptyTemplateHeader) {\n      // ...\n      if (ParamIdx < ParamLists.size()) {\n        if (ParamLists[ParamIdx]->size() > 0) {\n          // The header has template parameters when it shouldn\'t. Complain.\n          if (!SuppressDiagnostic)\n            Diag(ParamLists[ParamIdx]->getTemplateLoc(), diag::err_template_param_list_matches_nontemplate) << T << SourceRange(ParamLists[ParamIdx]->getLAngleLoc(), ParamLists[ParamIdx]->getRAngleLoc()) << getRangeOfTypeInNestedNameSpecifier(Context, T, SS);"}},
		[l]={
			["clang/test/CXX/temp/temp.spec/temp.expl.spec/p5-example.cpp"]={"clang/test/CXX/temp/temp.spec/temp.expl.spec/p5-example.cpp:34:1: error: template parameter list matching the non-templated nested type \'A<short>\' should be empty (\'template<>\')"}
		}
	},
	["err_template_param_pack_default_arg"]={
		[c]="err_template_param_pack_default_arg",
		[d]="template parameter pack cannot have a default argument",
		[e]="template parameter pack cannot have a default argument",
		[f]=j,
		[g]="template parameter pack cannot have a default argument",
		[h]=a,
		[i]=m,
		[b]={"d382435014c5",1244845813,"Parameter packs can\'t have default arguments.","Parameter packs can\'t have default arguments.\n\nllvm-svn: 73262"},
		[k]={{o,1072,"/// ActOnTypeParameter - Called when a C++ template type parameter\n/// (e.g., \"typename T\") has been parsed. Typename specifies whether\n/// the keyword \"typename\" was used to declare the type parameter\n/// (otherwise, \"class\" was used), and KeyLoc is the location of the\n/// \"class\" or \"typename\" keyword. ParamName is the name of the\n/// parameter (NULL indicates an unnamed template parameter) and\n/// ParamNameLoc is the location of the parameter name (if any).\n/// If the type parameter has a default argument, it will be added\n/// later via ActOnTypeParameterDefault.\nNamedDecl *Sema::ActOnTypeParameter(Scope *S, bool Typename, SourceLocation EllipsisLoc, SourceLocation KeyLoc, IdentifierInfo *ParamName, SourceLocation ParamNameLoc, unsigned Depth, unsigned Position, SourceLocation EqualLoc, ParsedType DefaultArg, bool HasTypeConstraint) {\n  // ...\n  // C++0x [temp.param]p9:\n  //   A default template-argument may be specified for any kind of\n  //   template-parameter that is not a template parameter pack.\n  if (DefaultArg && IsParameterPack) {\n    Diag(EqualLoc, diag::err_template_param_pack_default_arg);"},{o,1604,"NamedDecl *Sema::ActOnNonTypeTemplateParameter(Scope *S, Declarator &D, unsigned Depth, unsigned Position, SourceLocation EqualLoc, Expr *Default) {\n  // ...\n  // C++0x [temp.param]p9:\n  //   A default template-argument may be specified for any kind of\n  //   template-parameter that is not a template parameter pack.\n  if (Default && IsParameterPack) {\n    Diag(EqualLoc, diag::err_template_param_pack_default_arg);"},{o,1668,"/// ActOnTemplateTemplateParameter - Called when a C++ template template\n/// parameter (e.g. T in template <template \\<typename> class T> class array)\n/// has been parsed. S is the current scope.\nNamedDecl *Sema::ActOnTemplateTemplateParameter(Scope *S, SourceLocation TmpLoc, TemplateParameterList *Params, SourceLocation EllipsisLoc, IdentifierInfo *Name, SourceLocation NameLoc, unsigned Depth, unsigned Position, SourceLocation EqualLoc, ParsedTemplateArgument Default) {\n  // ...\n  // C++0x [temp.param]p9:\n  //   A default template-argument may be specified for any kind of\n  //   template-parameter that is not a template parameter pack.\n  if (IsParameterPack && !Default.isInvalid()) {\n    Diag(EqualLoc, diag::err_template_param_pack_default_arg);"}},
		[l]={
			["clang/test/CXX/temp/temp.param/p9-0x.cpp"]={"clang/test/CXX/temp/temp.param/p9-0x.cpp:5:28: error: template parameter pack cannot have a default argument","clang/test/CXX/temp/temp.param/p9-0x.cpp:8:24: error: template parameter pack cannot have a default argument","clang/test/CXX/temp/temp.param/p9-0x.cpp:13:45: error: template parameter pack cannot have a default argument"}
		}
	},
	["err_template_param_pack_must_be_last_template_parameter"]={
		[c]="err_template_param_pack_must_be_last_template_parameter",
		[d]="template parameter pack must be the last template parameter",
		[e]="template parameter pack must be the last template parameter",
		[f]=j,
		[g]="template parameter pack must be the last template parameter",
		[h]=a,
		[i]=m,
		[b]={"327865db5323",1244848815,"A parameter pack must always come last in a class template.","A parameter pack must always come last in a class template.\n\nllvm-svn: 73269"},
		[k]={{o,3023,"/// Checks the validity of a template parameter list, possibly\n/// considering the template parameter list from a previous\n/// declaration.\n///\n/// If an \"old\" template parameter list is provided, it must be\n/// equivalent (per TemplateParameterListsAreEqual) to the \"new\"\n/// template parameter list.\n///\n/// \\param NewParams Template parameter list for a new template\n/// declaration. This template parameter list will be updated with any\n/// default arguments that are carried through from the previous\n/// template parameter list.\n///\n/// \\param OldParams If provided, template parameter list from a\n/// previous declaration of the same template. Default template\n/// arguments will be merged from the old template parameter list to\n/// the new template parameter list.\n///\n/// \\param TPC Describes the context in which we are checking the given\n/// template parameter list.\n///\n/// \\param SkipBody If we might have already made a prior merged definition\n/// of this template visible, the corresponding body-skipping information.\n/// Default argument redefinition is not an error when skipping such a body,\n/// because (under the ODR) we can assume the default arguments are the same\n/// as the prior merged definition.\n///\n/// \\returns true if an error occurred, false otherwise.\nbool Sema::CheckTemplateParameterList(TemplateParameterList *NewParams, TemplateParameterList *OldParams, TemplateParamListContext TPC, SkipBodyInfo *SkipBody) {\n  // ...\n  for (TemplateParameterList::iterator NewParam = NewParams->begin(), NewParamEnd = NewParams->end(); NewParam != NewParamEnd; ++NewParam) {\n    // ...\n    // C++11 [temp.param]p11:\n    //   If a template parameter of a primary class template or alias template\n    //   is a template parameter pack, it shall be the last template parameter.\n    if (SawParameterPack && (NewParam + 1) != NewParamEnd && (TPC == TPC_ClassTemplate || TPC == TPC_VarTemplate || TPC == TPC_TypeAliasTemplate)) {\n      Diag((*NewParam)->getLocation(), diag::err_template_param_pack_must_be_last_template_parameter);"},{o,9016,"Decl *Sema::ActOnConceptDefinition(Scope *S, MultiTemplateParamsArg TemplateParameterLists, IdentifierInfo *Name, SourceLocation NameLoc, Expr *ConstraintExpr) {\n  // ...\n  // Ensure that the parameter pack, if present, is the last parameter in the\n  // template.\n  for (TemplateParameterList::const_iterator ParamIt = Params->begin(), ParamEnd = Params->end(); ParamIt != ParamEnd; ++ParamIt) {\n    // ...\n    if (Param->isParameterPack()) {\n      // ...\n      Diag(Param->getLocation(), diag::err_template_param_pack_must_be_last_template_parameter);"}},
		[l]={
			["clang/test/CXX/temp/temp.param/p11-0x.cpp"]={"clang/test/CXX/temp/temp.param/p11-0x.cpp:26:22: error: template parameter pack must be the last template parameter","clang/test/CXX/temp/temp.param/p11-0x.cpp:30:22: error: template parameter pack must be the last template parameter","clang/test/CXX/temp/temp.param/p11-0x.cpp:34:17: error: template parameter pack must be the last template parameter","clang/test/CXX/temp/temp.param/p11-0x.cpp:37:17: error: template parameter pack must be the last template parameter","clang/test/CXX/temp/temp.param/p11-0x.cpp:41:38: error: template parameter pack must be the last template parameter","clang/test/CXX/temp/temp.param/p11-0x.cpp:44:38: error: template parameter pack must be the last template parameter"}
		}
	},
	["err_template_param_shadow"]={
		[c]="err_template_param_shadow",
		[d]="declaration of %0 shadows template parameter",
		[e]="declaration of A shadows template parameter",
		[f]=j,
		[g]="declaration of (.*?) shadows template parameter",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{"clang/lib/Sema/SemaLambda.cpp",1381,"void Sema::ActOnStartOfLambdaDefinition(LambdaIntroducer &Intro, Declarator &ParamInfo, const DeclSpec &DS) {\n  // ...\n  if (TemplateParams) {\n    for (const auto *TP : TemplateParams->asArray()) {\n      // ...\n      for (const auto &Capture : Intro.Captures) {\n        if (Capture.Id == TP->getIdentifier()) {\n          Diag(Capture.Loc, diag::err_template_param_shadow) << Capture.Id;"},{o,898,"/// DiagnoseTemplateParameterShadow - Produce a diagnostic complaining\n/// that the template parameter \'PrevDecl\' is being shadowed by a new\n/// declaration at location Loc. Returns true to indicate that this is\n/// an error, and false otherwise.\nvoid Sema::DiagnoseTemplateParameterShadow(SourceLocation Loc, Decl *PrevDecl) {\n  // ...\n  unsigned DiagId = getLangOpts().MSVCCompat ? diag::ext_template_param_shadow : diag::err_template_param_shadow;"}},
		[l]={
			[ic]={"clang/test/CXX/dcl.dcl/dcl.spec/dcl.typedef/p2-0x.cpp:80:11: error: declaration of \'T\' shadows template parameter","clang/test/CXX/dcl.dcl/dcl.spec/dcl.typedef/p2-0x.cpp:98:11: error: declaration of \'T\' shadows template parameter"}
		}
	},
	["err_template_parameter_default_friend_template"]={
		[c]="err_template_parameter_default_friend_template",
		[d]="default template argument not permitted on a friend template",
		[e]="default template argument not permitted on a friend template",
		[f]=j,
		[g]="default template argument not permitted on a friend template",
		[h]=a,
		[i]=m,
		[b]={"ed5731f68a8b",1259171439,"Diagnose ill-formed uses of default template arguments in","Diagnose ill-formed uses of default template arguments in\nfunction templates (in C++98), friend function templates, and\nout-of-line definitions of members of class templates.\n\nAlso handles merging of default template arguments from previous\ndeclarations of function templates, for C++0x. However, we don\'t yet\nmake use of those default template arguments.\n\nllvm-svn: 89872"},
		[k]={{o,2742,"/// Diagnose the presence of a default template argument on a\n/// template parameter, which is ill-formed in certain contexts.\n///\n/// \\returns true if the default template argument should be dropped.\nstatic bool DiagnoseDefaultTemplateArgument(Sema &S, Sema::TemplateParamListContext TPC, SourceLocation ParamLoc, SourceRange DefArgRange) {\n  // ...\n  case Sema::TPC_FriendClassTemplate:\n  case Sema::TPC_FriendFunctionTemplate:\n    // ...\n    S.Diag(ParamLoc, diag::err_template_parameter_default_friend_template) << DefArgRange;"}},
		[l]={
			["clang/test/CXX/temp/temp.param/p9-0x.cpp"]={"clang/test/CXX/temp/temp.param/p9-0x.cpp:17:21: error: default template argument not permitted on a friend template"}
		}
	},
	["err_template_parameter_default_template_member"]={
		[c]="err_template_parameter_default_template_member",
		[d]="cannot add a default template argument to the definition of a member of a class template",
		[e]="cannot add a default template argument to the definition of a member of a class template",
		[f]=j,
		[g]="cannot add a default template argument to the definition of a member of a class template",
		[h]=a,
		[i]=m,
		[b]={"ed5731f68a8b",1259171439,"Diagnose ill-formed uses of default template arguments in","Diagnose ill-formed uses of default template arguments in\nfunction templates (in C++98), friend function templates, and\nout-of-line definitions of members of class templates.\n\nAlso handles merging of default template arguments from previous\ndeclarations of function templates, for C++0x. However, we don\'t yet\nmake use of those default template arguments.\n\nllvm-svn: 89872"},
		[k]={{o,2733,"/// Diagnose the presence of a default template argument on a\n/// template parameter, which is ill-formed in certain contexts.\n///\n/// \\returns true if the default template argument should be dropped.\nstatic bool DiagnoseDefaultTemplateArgument(Sema &S, Sema::TemplateParamListContext TPC, SourceLocation ParamLoc, SourceRange DefArgRange) {\n  // ...\n  case Sema::TPC_ClassTemplateMember:\n    // ...\n    S.Diag(ParamLoc, diag::err_template_parameter_default_template_member) << DefArgRange;"}},
		[l]={
			["clang/test/CXX/temp/temp.param/p9-0x.cpp"]={"clang/test/CXX/temp/temp.param/p9-0x.cpp:32:42: error: cannot add a default template argument to the definition of a member of a class template","clang/test/CXX/temp/temp.param/p9-0x.cpp:41:21: error: cannot add a default template argument to the definition of a member of a class template","clang/test/CXX/temp/temp.param/p9-0x.cpp:42:42: error: cannot add a default template argument to the definition of a member of a class template"}
		}
	},
	["err_template_parameter_pack_non_pack"]={
		[c]="err_template_parameter_pack_non_pack",
		[d]="%select{template type|non-type template|template template}0 parameter%select{| pack}1 conflicts with previous %select{template type|non-type template|template template}0 parameter%select{ pack|}1",
		[e]={{nil,nil,{{"template type","non-type template","template template"}," parameter",{a," pack"}," conflicts with previous ",{"template type","non-type template","template template"}," parameter",{" pack",a}}}},
		[f]=j,
		[g]="(?:template type|non\\-type template|template template) parameter(?:| pack) conflicts with previous (?:template type|non\\-type template|template template) parameter(?: pack|)",
		[h]=a,
		[i]=m,
		[b]={"2e87ca218f5d",1275640472,"When checking for equality of template parameter lists, a template","When checking for equality of template parameter lists, a template\ntype parameter pack is distinct from a template type parameter.\n\nllvm-svn: 105464"},
		[k]={{o,8038,"/// Match two template parameters within template parameter lists.\nstatic bool MatchTemplateParameterKind(Sema &S, NamedDecl *New, const NamedDecl *NewInstFrom, NamedDecl *Old, const NamedDecl *OldInstFrom, bool Complain, Sema::TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc) {\n  // ...\n  // Check that both are parameter packs or neither are parameter packs.\n  // However, if we are matching a template template argument to a\n  // template template parameter, the template template parameter can have\n  // a parameter pack where the template template argument does not.\n  if (Old->isTemplateParameterPack() != New->isTemplateParameterPack() && !(Kind == Sema::TPL_TemplateTemplateArgumentMatch && Old->isTemplateParameterPack())) {\n    if (Complain) {\n      unsigned NextDiag = diag::err_template_parameter_pack_non_pack;"}},
		[l]={
			["clang/test/CXX/temp/temp.decls/temp.variadic/parameter-matching.cpp"]={"clang/test/CXX/temp/temp.decls/temp.variadic/parameter-matching.cpp:9:19: error: template type parameter conflicts with previous template type parameter pack","clang/test/CXX/temp/temp.decls/temp.variadic/parameter-matching.cpp:12:22: error: template type parameter pack conflicts with previous template type parameter","clang/test/CXX/temp/temp.decls/temp.variadic/parameter-matching.cpp:18:28: error: template type parameter conflicts with previous template type parameter pack","clang/test/CXX/temp/temp.decls/temp.variadic/parameter-matching.cpp:21:31: error: template type parameter pack conflicts with previous template type parameter","clang/test/CXX/temp/temp.decls/temp.variadic/parameter-matching.cpp:24:14: error: non-type template parameter conflicts with previous non-type template parameter pack","clang/test/CXX/temp/temp.decls/temp.variadic/parameter-matching.cpp:27:36: error: template template parameter pack conflicts with previous template template parameter"}
		}
	},
	["err_template_qualified_declarator_no_match"]={
		[c]="err_template_qualified_declarator_no_match",
		[d]="nested name specifier \'%0\' for declaration does not refer into a class, class template or class template partial specialization",
		[e]="nested name specifier \'A\' for declaration does not refer into a class, class template or class template partial specialization",
		[f]=j,
		[g]="nested name specifier \'(.*?)\' for declaration does not refer into a class, class template or class template partial specialization",
		[h]=a,
		[i]=m,
		[b]={"168190d82254",1248222489,"Complain if we\'re entering the context of a dependent nested-name-specifier but","Complain if we\'re entering the context of a dependent nested-name-specifier but\ncannot match that nested-name-specifier to a class template or class template\npartial specialization.\n\nllvm-svn: 76704"},
		[k]={{v,6289,"NamedDecl *Sema::HandleDeclarator(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParamLists) {\n  // ...\n  if (D.getCXXScopeSpec().isInvalid())\n  // ...\n  else if (D.getCXXScopeSpec().isSet()) {\n    // ...\n    if (!DC || isa<EnumDecl>(DC)) {\n      // ...\n      Diag(D.getIdentifierLoc(), diag::err_template_qualified_declarator_no_match) << D.getCXXScopeSpec().getScopeRep() << D.getCXXScopeSpec().getRange();"},{o,1862,"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 (SS.isNotEmpty() && !SS.isInvalid()) {\n    // ...\n    if (!SemanticContext) {\n      // ...\n      Diag(NameLoc, TUK == TUK_Friend ? diag::warn_template_qualified_friend_ignored : diag::err_template_qualified_declarator_no_match) << SS.getScopeRep() << SS.getRange();"}},
		[l]={
			["clang/test/SemaCXX/pr25181-crash-on-invalid.cpp"]={"clang/test/SemaCXX/pr25181-crash-on-invalid.cpp:6:16: error: nested name specifier \'Foo<T>::\' for declaration does not refer into a class, class template or class template partial specialization"}
		}
	},
	["err_template_recursion_depth_exceeded"]={
		[c]="err_template_recursion_depth_exceeded",
		[d]="recursive template instantiation exceeded maximum depth of %0",
		[e]="recursive template instantiation exceeded maximum depth of A",
		[f]="fatal error\\: ",
		[g]="recursive template instantiation exceeded maximum depth of (.*?)",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{"clang/lib/Sema/SemaTemplateInstantiate.cpp",723,"bool Sema::InstantiatingTemplate::CheckInstantiationDepth(SourceLocation PointOfInstantiation, SourceRange InstantiationRange) {\n  // ...\n  SemaRef.Diag(PointOfInstantiation, diag::err_template_recursion_depth_exceeded) << SemaRef.getLangOpts().InstantiationDepth << InstantiationRange;"}},
		[l]={
			["clang/test/SemaTemplate/instantiation-depth-subst.cpp"]={"clang/test/SemaTemplate/instantiation-depth-subst.cpp:4:46: fatal error: recursive template instantiation exceeded maximum depth of 2"}
		}
	},
	["err_template_spec_decl_friend"]={
		[c]="err_template_spec_decl_friend",
		[d]="cannot declare an explicit specialization in a friend",
		[e]="cannot declare an explicit specialization in a friend",
		[f]=j,
		[g]="cannot declare an explicit specialization in a friend",
		[h]=a,
		[i]=m,
		[b]={"816d75b7012a",1269416766,"Support friend function specializations.","Support friend function specializations.\n\nllvm-svn: 99389"},
		[k]={{v,9845,"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 (TemplateParams) {\n      // ...\n      if (TemplateParams->size() > 0) {\n      // ...\n      } else {\n        // ...\n        // C++0x [temp.expl.spec]p20 forbids \"template<> friend void foo(int);\".\n        if (isFriend) {\n          // ...\n          Diag(D.getIdentifierLoc(), diag::err_template_spec_decl_friend) << Name << RemoveRange << FixItHint::CreateRemoval(RemoveRange) << FixItHint::CreateInsertion(InsertLoc, \"<>\");"}},
		[l]={
			["clang/test/CXX/temp/temp.spec/temp.expl.spec/p20.cpp"]={"clang/test/CXX/temp/temp.spec/temp.expl.spec/p20.cpp:9:26: error: cannot declare an explicit specialization in a friend","clang/test/CXX/temp/temp.spec/temp.expl.spec/p20.cpp:18:27: error: cannot declare an explicit specialization in a friend"}
		}
	},
	["err_template_spec_decl_function_scope"]={
		[c]="err_template_spec_decl_function_scope",
		[d]="explicit specialization of %0 in function scope",
		[e]="explicit specialization of A in function scope",
		[f]=j,
		[g]="explicit specialization of (.*?) in function scope",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{o,8428,"/// Check whether a specialization is well-formed in the current\n/// context.\n///\n/// This routine determines whether a template specialization can be declared\n/// in the current context (C++ [temp.expl.spec]p2).\n///\n/// \\param S the semantic analysis object for which this check is being\n/// performed.\n///\n/// \\param Specialized the entity being specialized or instantiated, which\n/// may be a kind of template (class template, function template, etc.) or\n/// a member of a class template (member function, static data member,\n/// member class).\n///\n/// \\param PrevDecl the previous declaration of this entity, if any.\n///\n/// \\param Loc the location of the explicit specialization or instantiation of\n/// this entity.\n///\n/// \\param IsPartialSpecialization whether this is a partial specialization of\n/// a class template.\n///\n/// \\returns true if there was an error that we cannot recover from, false\n/// otherwise.\nstatic bool CheckTemplateSpecializationScope(Sema &S, NamedDecl *Specialized, NamedDecl *PrevDecl, SourceLocation Loc, bool IsPartialSpecialization) {\n  // ...\n  // C++ [temp.expl.spec]p2:\n  //   An explicit specialization may be declared in any scope in which\n  //   the corresponding primary template may be defined.\n  if (S.CurContext->getRedeclContext()->isFunctionOrMethod()) {\n    S.Diag(Loc, diag::err_template_spec_decl_function_scope) << Specialized;"}}
	},
	["err_template_spec_default_arg"]={
		[c]="err_template_spec_default_arg",
		[d]="default argument not permitted on an explicit %select{instantiation|specialization}0 of function %1",
		[e]={{nil,nil,{"default argument not permitted on an explicit ",{"instantiation","specialization"}," of function B"}}},
		[f]=j,
		[g]="default argument not permitted on an explicit (?:instantiation|specialization) of function (.*?)",
		[h]=a,
		[i]=m,
		[b]={"62e10f0bdcaa",1255453374,"Diagnose attempts to add default function arguments to a","Diagnose attempts to add default function arguments to a\nspecialization. This completes C++ [temp.expl.spec]!\n\nllvm-svn: 83980"},
		[k]={{Db,618,"/// MergeCXXFunctionDecl - Merge two declarations of the same C++\n/// function, once we already know that they have the same\n/// type. Subroutine of MergeFunctionDecl. Returns true if there was an\n/// error, false otherwise.\nbool Sema::MergeCXXFunctionDecl(FunctionDecl *New, FunctionDecl *Old, Scope *S) {\n  // ...\n  // C++ [dcl.fct.default]p4:\n  //   For non-template functions, default arguments can be added in\n  //   later declarations of a function in the same\n  //   scope. Declarations in different scopes have completely\n  //   distinct sets of default arguments. That is, declarations in\n  //   inner scopes do not acquire default arguments from\n  //   declarations in outer scopes, and vice versa. In a given\n  //   function declaration, all parameters subsequent to a\n  //   parameter with a default argument shall have default\n  //   arguments supplied in this or previous declarations. A\n  //   default argument shall not be redefined by a later\n  //   declaration (not even to the same value).\n  //\n  // C++ [dcl.fct.default]p6:\n  //   Except for member functions of class templates, the default arguments\n  //   in a member function definition that appears outside of the class\n  //   definition are added to the set of default arguments provided by the\n  //   member function declaration in the class definition.\n  for (unsigned p = 0, NumParams = PrevForDefaultArgs ? PrevForDefaultArgs->getNumParams() : 0; p < NumParams; ++p) {\n    // ...\n    if (OldParamHasDfl && NewParamHasDfl) {\n    // ...\n    } else if (OldParamHasDfl) {\n    // ...\n    } else if (NewParamHasDfl) {\n      if (New->getDescribedFunctionTemplate()) {\n      // ...\n      } else if (New->getTemplateSpecializationKind() != TSK_ImplicitInstantiation && New->getTemplateSpecializationKind() != TSK_Undeclared) {\n        // ...\n        Diag(NewParam->getLocation(), diag::err_template_spec_default_arg) << (New->getTemplateSpecializationKind() == TSK_ExplicitSpecialization) << New->getDeclName() << NewParam->getDefaultArgRange();"}},
		[l]={
			["clang/test/CXX/temp/temp.spec/temp.expl.spec/p21.cpp"]={"clang/test/CXX/temp/temp.spec/temp.expl.spec/p21.cpp:10:22: error: default argument not permitted on an explicit specialization of function \'mf1\'","clang/test/CXX/temp/temp.spec/temp.expl.spec/p21.cpp:15:27: error: default argument not permitted on an explicit specialization of function \'mf2\'"}
		}
	},
	["err_template_spec_extra_headers"]={
		[c]="err_template_spec_extra_headers",
		[d]="extraneous template parameter list in template specialization or out-of-line template definition",
		[e]="extraneous template parameter list in template specialization or out-of-line template definition",
		[f]=j,
		[g]="extraneous template parameter list in template specialization or out\\-of\\-line template definition",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{o,3581,"/// Match the given template parameter lists to the given scope\n/// specifier, returning the template parameter list that applies to the\n/// name.\n///\n/// \\param DeclStartLoc the start of the declaration that has a scope\n/// specifier or a template parameter list.\n///\n/// \\param DeclLoc The location of the declaration itself.\n///\n/// \\param SS the scope specifier that will be matched to the given template\n/// parameter lists. This scope specifier precedes a qualified name that is\n/// being declared.\n///\n/// \\param TemplateId The template-id following the scope specifier, if there\n/// is one. Used to check for a missing \'template<>\'.\n///\n/// \\param ParamLists the template parameter lists, from the outermost to the\n/// innermost template parameter lists.\n///\n/// \\param IsFriend Whether to apply the slightly different rules for\n/// matching template parameters to scope specifiers in friend\n/// declarations.\n///\n/// \\param IsMemberSpecialization will be set true if the scope specifier\n/// denotes a fully-specialized type, and therefore this is a declaration of\n/// a member specialization.\n///\n/// \\returns the template parameter list, if any, that corresponds to the\n/// name that is preceded by the scope specifier @p SS. This template\n/// parameter list may have template parameters (if we\'re declaring a\n/// template) or may have no template parameters (if we\'re declaring a\n/// template specialization), or may be NULL (if what we\'re declaring isn\'t\n/// itself a template).\nTemplateParameterList *Sema::MatchTemplateParametersToScopeSpecifier(SourceLocation DeclStartLoc, SourceLocation DeclLoc, const CXXScopeSpec &SS, TemplateIdAnnotation *TemplateId, ArrayRef<TemplateParameterList *> ParamLists, bool IsFriend, bool &IsMemberSpecialization, bool &Invalid, bool SuppressDiagnostic) {\n  // ...\n  // If there were too many template parameter lists, complain about that now.\n  if (ParamIdx < ParamLists.size() - 1) {\n    // ...\n    if (!SuppressDiagnostic)\n      Diag(ParamLists[ParamIdx]->getTemplateLoc(), AllExplicitSpecHeaders ? diag::warn_template_spec_extra_headers : diag::err_template_spec_extra_headers) << SourceRange(ParamLists[ParamIdx]->getTemplateLoc(), ParamLists[ParamLists.size() - 2]->getRAngleLoc());"}},
		[l]={
			["clang/test/SemaTemplate/crash-8204126.cpp"]={"clang/test/SemaTemplate/crash-8204126.cpp:4:3: error: extraneous template parameter list in template specialization or out-of-line template definition"}
		}
	},
	["err_template_spec_friend"]={
		[c]="err_template_spec_friend",
		[d]="template specialization declaration cannot be a friend",
		[e]="template specialization declaration cannot be a friend",
		[f]=j,
		[g]="template specialization declaration cannot be a friend",
		[h]=a,
		[i]=m,
		[b]={"3a88c1d784d8",1255444781,"Improve the internal representation and semantic analysis of friend","Improve the internal representation and semantic analysis of friend\nfunction templates.\n\nThis commit ensures that friend function templates are constructed as\nFunctionTemplateDecls rather than partial FunctionDecls (as they\npreviously were). It then implements template instantiation for friend\nfunction templates, injecting the friend function template only when\nno previous declaration exists at the time of instantiation. \n\nOh, and make sure that explicit specialization declarations are not\nfriends.\n\nllvm-svn: 83970"},
		[k]={{o,8698,"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 (TemplateParams && TemplateParams->size() > 0) {\n  // ...\n  } else if (TemplateParams) {\n    if (TUK == TUK_Friend)\n      Diag(KWLoc, diag::err_template_spec_friend) << FixItHint::CreateRemoval(SourceRange(TemplateParams->getTemplateLoc(), TemplateParams->getRAngleLoc())) << SourceRange(LAngleLoc, RAngleLoc);"}},
		[l]={
			["clang/test/CXX/temp/temp.spec/temp.expl.spec/p20.cpp"]={"clang/test/CXX/temp/temp.spec/temp.expl.spec/p20.cpp:10:21: error: template specialization declaration cannot be a friend","clang/test/CXX/temp/temp.spec/temp.expl.spec/p20.cpp:22:22: error: template specialization declaration cannot be a friend"}
		}
	},
	["err_template_spec_needs_header"]={
		[c]="err_template_spec_needs_header",
		[d]="template specialization requires \'template<>\'",
		[e]="template specialization requires \'template<>\'",
		[f]=j,
		[g]="template specialization requires \'template\\<\\>\'",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{o,3393,"/// Match the given template parameter lists to the given scope\n/// specifier, returning the template parameter list that applies to the\n/// name.\n///\n/// \\param DeclStartLoc the start of the declaration that has a scope\n/// specifier or a template parameter list.\n///\n/// \\param DeclLoc The location of the declaration itself.\n///\n/// \\param SS the scope specifier that will be matched to the given template\n/// parameter lists. This scope specifier precedes a qualified name that is\n/// being declared.\n///\n/// \\param TemplateId The template-id following the scope specifier, if there\n/// is one. Used to check for a missing \'template<>\'.\n///\n/// \\param ParamLists the template parameter lists, from the outermost to the\n/// innermost template parameter lists.\n///\n/// \\param IsFriend Whether to apply the slightly different rules for\n/// matching template parameters to scope specifiers in friend\n/// declarations.\n///\n/// \\param IsMemberSpecialization will be set true if the scope specifier\n/// denotes a fully-specialized type, and therefore this is a declaration of\n/// a member specialization.\n///\n/// \\returns the template parameter list, if any, that corresponds to the\n/// name that is preceded by the scope specifier @p SS. This template\n/// parameter list may have template parameters (if we\'re declaring a\n/// template) or may have no template parameters (if we\'re declaring a\n/// template specialization), or may be NULL (if what we\'re declaring isn\'t\n/// itself a template).\nTemplateParameterList *Sema::MatchTemplateParametersToScopeSpecifier(SourceLocation DeclStartLoc, SourceLocation DeclLoc, const CXXScopeSpec &SS, TemplateIdAnnotation *TemplateId, ArrayRef<TemplateParameterList *> ParamLists, bool IsFriend, bool &IsMemberSpecialization, bool &Invalid, bool SuppressDiagnostic) {\n  // ...\n  auto DiagnoseMissingExplicitSpecialization = [&](SourceRange Range) {\n    // ...\n    if (!SuppressDiagnostic)\n      Diag(DeclLoc, diag::err_template_spec_needs_header) << Range << FixItHint::CreateInsertion(ExpectedTemplateLoc, \"template<> \");"}},
		[l]={
			["clang/test/CXX/temp/temp.spec/temp.expl.spec/p17.cpp"]={"clang/test/CXX/temp/temp.spec/temp.expl.spec/p17.cpp:12:34: error: template specialization requires \'template<>\'","clang/test/CXX/temp/temp.spec/temp.expl.spec/p17.cpp:22:11: error: template specialization requires \'template<>\'","clang/test/CXX/temp/temp.spec/temp.expl.spec/p17.cpp:23:17: error: template specialization requires \'template<>\'","clang/test/CXX/temp/temp.spec/temp.expl.spec/p17.cpp:42:14: error: template specialization requires \'template<>\'","clang/test/CXX/temp/temp.spec/temp.expl.spec/p17.cpp:44:8: error: template specialization requires \'template<>\'"}
		}
	},
	["err_template_spec_needs_template_parameters"]={
		[c]="err_template_spec_needs_template_parameters",
		[d]="template specialization or definition requires a template parameter list corresponding to the nested type %0",
		[e]="template specialization or definition requires a template parameter list corresponding to the nested type A",
		[f]=j,
		[g]="template specialization or definition requires a template parameter list corresponding to the nested type (.*?)",
		[h]=a,
		[i]=m,
		[b]={"d8d297c0ac88",1248220411,"Basic parsing and semantic analysis for out-of-line definitions of the","Basic parsing and semantic analysis for out-of-line definitions of the\nmember functions of class templates, e.g.,\n\n  template<typename T> \n  struct X {\n    void f(T);\n  };\n\n  template<typename T> X<T>::f(T) { /* ... */ }\n\nllvm-svn: 76692"},
		[k]={{o,3540,"/// Match the given template parameter lists to the given scope\n/// specifier, returning the template parameter list that applies to the\n/// name.\n///\n/// \\param DeclStartLoc the start of the declaration that has a scope\n/// specifier or a template parameter list.\n///\n/// \\param DeclLoc The location of the declaration itself.\n///\n/// \\param SS the scope specifier that will be matched to the given template\n/// parameter lists. This scope specifier precedes a qualified name that is\n/// being declared.\n///\n/// \\param TemplateId The template-id following the scope specifier, if there\n/// is one. Used to check for a missing \'template<>\'.\n///\n/// \\param ParamLists the template parameter lists, from the outermost to the\n/// innermost template parameter lists.\n///\n/// \\param IsFriend Whether to apply the slightly different rules for\n/// matching template parameters to scope specifiers in friend\n/// declarations.\n///\n/// \\param IsMemberSpecialization will be set true if the scope specifier\n/// denotes a fully-specialized type, and therefore this is a declaration of\n/// a member specialization.\n///\n/// \\returns the template parameter list, if any, that corresponds to the\n/// name that is preceded by the scope specifier @p SS. This template\n/// parameter list may have template parameters (if we\'re declaring a\n/// template) or may have no template parameters (if we\'re declaring a\n/// template specialization), or may be NULL (if what we\'re declaring isn\'t\n/// itself a template).\nTemplateParameterList *Sema::MatchTemplateParametersToScopeSpecifier(SourceLocation DeclStartLoc, SourceLocation DeclLoc, const CXXScopeSpec &SS, TemplateIdAnnotation *TemplateId, ArrayRef<TemplateParameterList *> ParamLists, bool IsFriend, bool &IsMemberSpecialization, bool &Invalid, bool SuppressDiagnostic) {\n  // ...\n  for (unsigned TypeIdx = 0, NumTypes = NestedTypes.size(); TypeIdx != NumTypes; ++TypeIdx) {\n    // ...\n    if (NeedNonemptyTemplateHeader) {\n      // ...\n      if (!SuppressDiagnostic)\n        Diag(DeclLoc, diag::err_template_spec_needs_template_parameters) << T << getRangeOfTypeInNestedNameSpecifier(Context, T, SS);"}},
		[l]={
			["clang/test/SemaCXX/nested-name-spec.cpp"]={"clang/test/SemaCXX/nested-name-spec.cpp:283:13: error: template specialization or definition requires a template parameter list corresponding to the nested type \'A<T>\'"}
		}
	},
	["err_template_spec_redecl_global_scope"]={
		[c]="err_template_spec_redecl_global_scope",
		[d]="%select{class template|class template partial|variable template|variable template partial|function template|member function|static data member|member class|member enumeration}0 specialization of %1 must occur at global scope",
		[e]={{nil,nil,{{Ob,"class template partial",ec,"variable template partial",Sb,"member function","static data member","member class","member enumeration"}," specialization of B must occur at global scope"}}},
		[f]=j,
		[g]="(?:class template|class template partial|variable template|variable template partial|function template|member function|static data member|member class|member enumeration) specialization of (.*?) must occur at global scope",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{o,8445,"/// Check whether a specialization is well-formed in the current\n/// context.\n///\n/// This routine determines whether a template specialization can be declared\n/// in the current context (C++ [temp.expl.spec]p2).\n///\n/// \\param S the semantic analysis object for which this check is being\n/// performed.\n///\n/// \\param Specialized the entity being specialized or instantiated, which\n/// may be a kind of template (class template, function template, etc.) or\n/// a member of a class template (member function, static data member,\n/// member class).\n///\n/// \\param PrevDecl the previous declaration of this entity, if any.\n///\n/// \\param Loc the location of the explicit specialization or instantiation of\n/// this entity.\n///\n/// \\param IsPartialSpecialization whether this is a partial specialization of\n/// a class template.\n///\n/// \\returns true if there was an error that we cannot recover from, false\n/// otherwise.\nstatic bool CheckTemplateSpecializationScope(Sema &S, NamedDecl *Specialized, NamedDecl *PrevDecl, SourceLocation Loc, bool IsPartialSpecialization) {\n  // ...\n  // Make sure that this redeclaration (or definition) occurs in the same\n  // scope or an enclosing namespace.\n  if (!(DC->isFileContext() ? DC->Encloses(SpecializedContext) : DC->Equals(SpecializedContext))) {\n    if (isa<TranslationUnitDecl>(SpecializedContext))\n      S.Diag(Loc, diag::err_template_spec_redecl_global_scope) << EntityKind << Specialized;"}},
		[l]={
			["clang/test/CXX/temp/temp.spec/temp.expl.spec/p2-0x.cpp"]={"clang/test/CXX/temp/temp.spec/temp.expl.spec/p2-0x.cpp:121:18: error: variable template specialization of \'v1\' must occur at global scope","clang/test/CXX/temp/temp.spec/temp.expl.spec/p2-0x.cpp:122:16: error: variable template specialization of \'v1\' must occur at global scope","clang/test/CXX/temp/temp.spec/temp.expl.spec/p2-0x.cpp:126:18: error: variable template specialization of \'v1\' must occur at global scope","clang/test/CXX/temp/temp.spec/temp.expl.spec/p2-0x.cpp:127:16: error: variable template specialization of \'v1\' must occur at global scope"}
		}
	},
	["err_template_spec_redecl_out_of_scope"]={
		[c]="err_template_spec_redecl_out_of_scope",
		[d]={{nil,bb,"%select{class template|class template partial|variable template|variable template partial|function template|member function|static data member|member class|member enumeration}0 specialization of %1 not in %select{a namespace enclosing %2|class %2 or an enclosing namespace}3"},{x,nil,"%select{class template|class template partial|variable template|variable template partial|function template|member function|static data member|member class|member enumeration}0 specialization of %1 not in a namespace enclosing %2"}},
		[e]={{nil,bb,{{Ob,"class template partial",ec,"variable template partial",Sb,"member function","static data member","member class","member enumeration"}," specialization of B not in ",{"a namespace enclosing C","class C or an enclosing namespace"}}},{x,nil,{{Ob,"class template partial",ec,"variable template partial",Sb,"member function","static data member","member class","member enumeration"}," specialization of B not in a namespace enclosing C"}}},
		[f]=j,
		[g]="(?:class template|class template partial|variable template|variable template partial|function template|member function|static data member|member class|member enumeration) specialization of (.*?) not in (?:a namespace enclosing (.*?)|class (.*?) or an enclosing namespace)",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{o,8449,"/// Check whether a specialization is well-formed in the current\n/// context.\n///\n/// This routine determines whether a template specialization can be declared\n/// in the current context (C++ [temp.expl.spec]p2).\n///\n/// \\param S the semantic analysis object for which this check is being\n/// performed.\n///\n/// \\param Specialized the entity being specialized or instantiated, which\n/// may be a kind of template (class template, function template, etc.) or\n/// a member of a class template (member function, static data member,\n/// member class).\n///\n/// \\param PrevDecl the previous declaration of this entity, if any.\n///\n/// \\param Loc the location of the explicit specialization or instantiation of\n/// this entity.\n///\n/// \\param IsPartialSpecialization whether this is a partial specialization of\n/// a class template.\n///\n/// \\returns true if there was an error that we cannot recover from, false\n/// otherwise.\nstatic bool CheckTemplateSpecializationScope(Sema &S, NamedDecl *Specialized, NamedDecl *PrevDecl, SourceLocation Loc, bool IsPartialSpecialization) {\n  // ...\n  // Make sure that this redeclaration (or definition) occurs in the same\n  // scope or an enclosing namespace.\n  if (!(DC->isFileContext() ? DC->Encloses(SpecializedContext) : DC->Equals(SpecializedContext))) {\n    if (isa<TranslationUnitDecl>(SpecializedContext))\n    // ...\n    else {\n      // ...\n      int Diag = diag::err_template_spec_redecl_out_of_scope;"}},
		[l]={
			["clang/test/CXX/temp/temp.spec/temp.expl.spec/p2-0x.cpp"]={"clang/test/CXX/temp/temp.spec/temp.expl.spec/p2-0x.cpp:81:25: error: class template specialization of \'X0\' not in a namespace enclosing \'N0\'","clang/test/CXX/temp/temp.spec/temp.expl.spec/p2-0x.cpp:119:20: error: variable template specialization of \'v0\' not in a namespace enclosing \'N0\'","clang/test/CXX/temp/temp.spec/temp.expl.spec/p2-0x.cpp:120:16: error: variable template specialization of \'v0\' not in a namespace enclosing \'N0\'","clang/test/CXX/temp/temp.spec/temp.expl.spec/p2-0x.cpp:124:20: error: variable template specialization of \'v0\' not in a namespace enclosing \'N0\'","clang/test/CXX/temp/temp.spec/temp.expl.spec/p2-0x.cpp:125:16: error: variable template specialization of \'v0\' not in a namespace enclosing \'N0\'","clang/test/CXX/temp/temp.spec/temp.expl.spec/p2-0x.cpp:199:28: error: member class specialization of \'Inner\' not in class \'X0\' or an enclosing namespace","clang/test/CXX/temp/temp.spec/temp.expl.spec/p2-0x.cpp:202:33: error: member class specialization of \'Inner\' not in class \'X0\' or an enclosing namespace","clang/test/CXX/temp/temp.spec/temp.expl.spec/p2-0x.cpp:235:23: error: class template specialization of \'InnerTemplate\' not in class \'X0<int>\' or an enclosing namespace"}
		}
	},
	["err_template_spec_syntax_non_template"]={
		[c]="err_template_spec_syntax_non_template",
		[d]={{nil,jb,"identifier followed by \'<\' indicates a class template specialization but %0 %select{does not refer to a template|refers to a function template|<unused>|refers to a variable template|<unused>|<unused>|refers to a concept}1"},{ib,D,"identifier followed by \'<\' indicates a class template specialization but %0 %select{does not refer to a template|refers to a function template|<unused>|refers to a variable template|<unused>|refers to a concept}1"},{eb,nil,"identifier followed by \'<\' indicates a class template specialization but %0 %select{does not refer to a template|refers to a function template|<unused>|refers to a variable template|<unused>}1"}},
		[e]={{nil,jb,{"identifier followed by \'<\' indicates a class template specialization but A ",{"does not refer to a template","refers to a function template",Kb,"refers to a variable template",Kb,Kb,"refers to a concept"}}},{ib,D,{"identifier followed by \'<\' indicates a class template specialization but A ",{"does not refer to a template","refers to a function template",Kb,"refers to a variable template",Kb,"refers to a concept"}}},{eb,nil,{"identifier followed by \'<\' indicates a class template specialization but A ",{"does not refer to a template","refers to a function template",Kb,"refers to a variable template",Kb}}}},
		[f]=j,
		[g]="identifier followed by \'\\<\' indicates a class template specialization but (.*?) (?:does not refer to a template|refers to a function template|\\<unused\\>|refers to a variable template|\\<unused\\>|\\<unused\\>|refers to a concept)",
		[h]=a,
		[i]=I,
		[b]={Pb,1236199783,Qb,Fb},
		[k]={{Mb,1802,"#include \"clang/Basic/TransformTypeTraits.def\"\n  // ...\n  if (Tok.is(tok::identifier)) {\n  // ...\n  } else if (Tok.is(tok::annot_template_id)) {\n    // ...\n    if (TemplateId && !TemplateId->mightBeType()) {\n      // ...\n      Diag(TemplateId->LAngleLoc, diag::err_template_spec_syntax_non_template) << TemplateId->Name << static_cast<int>(TemplateId->Kind) << Range;"}},
		[l]={
			["clang/test/CXX/basic/basic.lookup/basic.lookup.elab/templateid.cpp"]={"clang/test/CXX/basic/basic.lookup/basic.lookup.elab/templateid.cpp:13:14: error: identifier followed by \'<\' indicates a class template specialization but \'Ident\' refers to a function template"}
		}
	},
	["err_template_spec_unknown_kind"]={
		[c]="err_template_spec_unknown_kind",
		[d]="can only provide an explicit specialization for a class template, function template, variable template, or a member function, static data member, %select{or member class|member class, or member enumeration}0 of a class template",
		[e]={{nil,nil,{"can only provide an explicit specialization for a class template, function template, variable template, or a member function, static data member, ",{"or member class","member class, or member enumeration"}," of a class template"}}},
		[f]=j,
		[g]="can only provide an explicit specialization for a class template, function template, variable template, or a member function, static data member, (?:or member class|member class, or member enumeration) of a class template",
		[h]=a,
		[i]=m,
		[b]={"548886518d08",1254874412,"Refactor checking of the scope of explicit template specialization","Refactor checking of the scope of explicit template specialization\ndeclarations and explicit template instantiations, improving\ndiagnostics and making the code usable for function template\nspecializations (as well as class template specializations and partial\nspecializations). \n\nllvm-svn: 83436"},
		[k]={{o,8418,"/// Check whether a specialization is well-formed in the current\n/// context.\n///\n/// This routine determines whether a template specialization can be declared\n/// in the current context (C++ [temp.expl.spec]p2).\n///\n/// \\param S the semantic analysis object for which this check is being\n/// performed.\n///\n/// \\param Specialized the entity being specialized or instantiated, which\n/// may be a kind of template (class template, function template, etc.) or\n/// a member of a class template (member function, static data member,\n/// member class).\n///\n/// \\param PrevDecl the previous declaration of this entity, if any.\n///\n/// \\param Loc the location of the explicit specialization or instantiation of\n/// this entity.\n///\n/// \\param IsPartialSpecialization whether this is a partial specialization of\n/// a class template.\n///\n/// \\returns true if there was an error that we cannot recover from, false\n/// otherwise.\nstatic bool CheckTemplateSpecializationScope(Sema &S, NamedDecl *Specialized, NamedDecl *PrevDecl, SourceLocation Loc, bool IsPartialSpecialization) {\n  // ...\n  if (isa<ClassTemplateDecl>(Specialized))\n  // ...\n  else if (isa<VarTemplateDecl>(Specialized))\n  // ...\n  else if (isa<FunctionTemplateDecl>(Specialized))\n  // ...\n  else if (isa<CXXMethodDecl>(Specialized))\n  // ...\n  else if (isa<VarDecl>(Specialized))\n  // ...\n  else if (isa<RecordDecl>(Specialized))\n  // ...\n  else if (isa<EnumDecl>(Specialized) && S.getLangOpts().CPlusPlus11)\n  // ...\n  else {\n    S.Diag(Loc, diag::err_template_spec_unknown_kind) << S.getLangOpts().CPlusPlus11;"}}
	},
	["err_template_tag_noparams"]={
		[c]="err_template_tag_noparams",
		[d]="extraneous \'template<>\' in declaration of %0 %1",
		[e]="extraneous \'template<>\' in declaration of A B",
		[f]=j,
		[g]="extraneous \'template\\<\\>\' in declaration of (.*?) (.*?)",
		[h]=a,
		[i]=m,
		[b]={"bbe8f4662117",1255014873,"Improve checking for specializations of member classes of class","Improve checking for specializations of member classes of class\ntemplates, and keep track of how those member classes were\ninstantiated or specialized. \n\nMake sure that we don\'t try to instantiate an explicitly-specialized\nmember class of a class template, when that explicit specialization\nwas a declaration rather than a definition.\n\nllvm-svn: 83547"},
		[k]={{v,16817,"/// 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  // We only need to do this matching if we have template parameters\n  // or a scope specifier, which also conveniently avoids this work\n  // for non-C++ cases.\n  if (TemplateParameterLists.size() > 0 || (SS.isNotEmpty() && TUK != TUK_Reference)) {\n    if (TemplateParameterList *TemplateParams = MatchTemplateParametersToScopeSpecifier(KWLoc, NameLoc, SS, nullptr, TemplateParameterLists, TUK == TUK_Friend, isMemberSpecialization, Invalid)) {\n      // ...\n      if (TemplateParams->size() > 0) {\n      // ...\n      } else {\n        // ...\n        Diag(TemplateParams->getTemplateLoc(), diag::err_template_tag_noparams) << TypeWithKeyword::getTagTypeKindName(Kind) << Name;"},{Db,17279,"/// Handle a friend tag declaration where the scope specifier was\n/// templated.\nDeclResult Sema::ActOnTemplatedFriendTag(Scope *S, SourceLocation FriendLoc, unsigned TagSpec, SourceLocation TagLoc, CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, const ParsedAttributesView &Attr, MultiTemplateParamsArg TempParamLists) {\n  // ...\n  if (TemplateParameterList *TemplateParams = MatchTemplateParametersToScopeSpecifier(TagLoc, NameLoc, SS, nullptr, TempParamLists, /*friend*/ true, IsMemberSpecialization, Invalid)) {\n    if (TemplateParams->size() > 0) {\n    // ...\n    } else {\n      // ...\n      Diag(TemplateParams->getTemplateLoc(), diag::err_template_tag_noparams) << TypeWithKeyword::getTagTypeKindName(Kind) << Name;"}},
		[l]={
			["clang/test/SemaTemplate/friend-template.cpp"]={"clang/test/SemaTemplate/friend-template.cpp:230:5: error: extraneous \'template<>\' in declaration of class \'B\'"}
		}
	},
	["err_template_template_parameter_not_at_least_as_constrained"]={
		[c]={{nil,t,"err_template_template_parameter_not_at_least_as_constrained"}},
		[d]={{nil,t,"template template argument %0 is more constrained than template template parameter %1"}},
		[e]={{nil,t,"template template argument A is more constrained than template template parameter B"}},
		[f]=j,
		[g]="template template argument (.*?) is more constrained than template template parameter (.*?)",
		[h]=a,
		[i]={{nil,t,m}},
		[b]={"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"},
		[k]={{o,7820,"/// Check a template argument against its corresponding\n/// template template parameter.\n///\n/// This routine implements the semantics of C++ [temp.arg.template].\n/// It returns true if an error occurred, and false otherwise.\nbool Sema::CheckTemplateTemplateArgument(TemplateTemplateParmDecl *Param, TemplateParameterList *Params, TemplateArgumentLoc &Arg) {\n  // ...\n  // C++1z [temp.arg.template]p3: (DR 150)\n  //   A template-argument matches a template template-parameter P when P\n  //   is at least as specialized as the template-argument A.\n  // FIXME: We should enable RelaxedTemplateTemplateArgs by default as it is a\n  //  defect report resolution from C++17 and shouldn\'t be introduced by\n  //  concepts.\n  if (getLangOpts().RelaxedTemplateTemplateArgs) {\n    // ...\n    if (isTemplateTemplateParameterAtLeastAsSpecializedAs(Params, Template, Arg.getLocation())) {\n      // ...\n      if (!IsParamAtLeastAsConstrained) {\n        Diag(Arg.getLocation(), diag::err_template_template_parameter_not_at_least_as_constrained) << Template << Param << Arg.getSourceRange();"}},
		[l]={
			["clang/test/CXX/temp/temp.arg/temp.arg.template/p3-2a.cpp"]={"clang/test/CXX/temp/temp.arg/temp.arg.template/p3-2a.cpp:14:4: error: template template argument \'Y\' is more constrained than template template parameter \'P\'","clang/test/CXX/temp/temp.arg/temp.arg.template/p3-2a.cpp:19:4: error: template template argument \'W\' is more constrained than template template parameter \'P\'","clang/test/CXX/temp/temp.arg/temp.arg.template/p3-2a.cpp:44:4: error: template template argument \'Y\' is more constrained than template template parameter \'P\'","clang/test/CXX/temp/temp.arg/temp.arg.template/p3-2a.cpp:49:4: error: template template argument \'W\' is more constrained than template template parameter \'P\'"}
		}
	},
	["err_template_template_parm_no_parms"]={
		[c]="err_template_template_parm_no_parms",
		[d]="template template parameter must have its own template parameters",
		[e]="template template parameter must have its own template parameters",
		[f]=j,
		[g]="template template parameter must have its own template parameters",
		[h]=a,
		[i]=m,
		[b]={"a02bb37a8c37",1287682009,"Diagnose the declaration of template template parameters that","Diagnose the declaration of template template parameters that\nthemselves have no template parameters. This is actually a restriction\ndue to the grammar of template template parameters, but we choose to\ndiagnose it in Sema to provide better recovery.\n\nllvm-svn: 117032"},
		[k]={{o,1659,"/// ActOnTemplateTemplateParameter - Called when a C++ template template\n/// parameter (e.g. T in template <template \\<typename> class T> class array)\n/// has been parsed. S is the current scope.\nNamedDecl *Sema::ActOnTemplateTemplateParameter(Scope *S, SourceLocation TmpLoc, TemplateParameterList *Params, SourceLocation EllipsisLoc, IdentifierInfo *Name, SourceLocation NameLoc, unsigned Depth, unsigned Position, SourceLocation EqualLoc, ParsedTemplateArgument Default) {\n  // ...\n  if (Params->size() == 0) {\n    Diag(Param->getLocation(), diag::err_template_template_parm_no_parms) << SourceRange(Params->getLAngleLoc(), Params->getRAngleLoc());"}},
		[l]={
			["clang/test/CXX/temp/temp.param/p1.cpp"]={"clang/test/CXX/temp/temp.param/p1.cpp:4:27: error: template template parameter must have its own template parameters"}
		}
	},
	["err_template_typedef"]={
		[c]="err_template_typedef",
		[d]="a typedef cannot be a template",
		[e]="a typedef cannot be a template",
		[f]=j,
		[g]="a typedef cannot be a template",
		[h]=a,
		[i]=m,
		[b]={"b52fabb2a8c2",1245798688,"Start propagating template parameter lists to the right places to","Start propagating template parameter lists to the right places to\nhandle function templates. There\'s no actual code for function\ntemplates yet, but at least we complain about typedef templates.\n\nllvm-svn: 74021"},
		[k]={{v,6430,"NamedDecl *Sema::HandleDeclarator(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParamLists) {\n  // ...\n  if (D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_typedef) {\n    if (TemplateParamLists.size()) {\n      Diag(D.getIdentifierLoc(), diag::err_template_typedef);"}},
		[l]={
			["clang/test/SemaTemplate/template-decl-fail.cpp"]={"clang/test/SemaTemplate/template-decl-fail.cpp:3:32: error: a typedef cannot be a template"}
		}
	},
	["err_template_unnamed_class"]={
		[c]="err_template_unnamed_class",
		[d]="cannot declare a class template with no name",
		[e]="cannot declare a class template with no name",
		[f]=j,
		[g]="cannot declare a class template with no name",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{o,1842,"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  // There is no such thing as an unnamed class template.\n  if (!Name) {\n    Diag(KWLoc, diag::err_template_unnamed_class);"}}
	},
	["err_template_variable_noparams"]={
		[c]="err_template_variable_noparams",
		[d]="extraneous \'template<>\' in declaration of variable %0",
		[e]="extraneous \'template<>\' in declaration of variable A",
		[f]=j,
		[g]="extraneous \'template\\<\\>\' in declaration of variable (.*?)",
		[h]=a,
		[i]=m,
		[b]={"b09f3d82cc7e",1248283117,"Implement parsing and semantic analysis for out-of-line definitions of static","Implement parsing and semantic analysis for out-of-line definitions of static\ndata members of class templates. We don\'t instantiate the definitions yet,\nhowever.\n\nllvm-svn: 76756"},
		[k]={{v,7631,"NamedDecl *Sema::ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope, ArrayRef<BindingDecl *> Bindings) {\n  // ...\n  if (!getLangOpts().CPlusPlus) {\n  // ...\n  } else {\n    // ...\n    if (TemplateParams) {\n      if (!TemplateParams->size() && D.getName().getKind() != UnqualifiedIdKind::IK_TemplateId) {\n        // ...\n        Diag(TemplateParams->getTemplateLoc(), diag::err_template_variable_noparams) << II << SourceRange(TemplateParams->getTemplateLoc(), TemplateParams->getRAngleLoc());"}},
		[l]={
			["clang/test/CXX/temp/temp.spec/temp.expl.spec/p17.cpp"]={"clang/test/CXX/temp/temp.spec/temp.expl.spec/p17.cpp:32:3: error: extraneous \'template<>\' in declaration of variable \'foo\'"}
		}
	},
	["err_templated_invalid_declaration"]={
		[c]="err_templated_invalid_declaration",
		[d]="a static_assert declaration cannot be a template",
		[e]="a static_assert declaration cannot be a template",
		[f]=j,
		[g]="a static_assert declaration cannot be a template",
		[h]=a,
		[i]=I,
		[b]={"e7c544d38800",1407184115,"A static_assert declaration cannot be a template; adding the diagnostic for this instead of silently...","A static_assert declaration cannot be a template; adding the diagnostic for this instead of silently accepting and producing possibly-unexpected behavior.\n\nllvm-svn: 214770"},
		[k]={{"clang/lib/Parse/ParseTemplate.cpp",197,"/// Parse a single declaration that declares a template,\n/// template specialization, or explicit instantiation of a template.\n///\n/// \\param DeclEnd will receive the source location of the last token\n/// within this declaration.\n///\n/// \\param AS the access specifier associated with this\n/// declaration. Will be AS_none for namespace-scope declarations.\n///\n/// \\returns the new declaration.\nDecl *Parser::ParseSingleDeclarationAfterTemplate(DeclaratorContext Context, const ParsedTemplateInfo &TemplateInfo, ParsingDeclRAIIObject &DiagsFromTParams, SourceLocation &DeclEnd, ParsedAttributes &AccessAttrs, AccessSpecifier AS) {\n  // ...\n  if (Tok.is(tok::kw_static_assert)) {\n    // ...\n    Diag(Tok.getLocation(), diag::err_templated_invalid_declaration) << TemplateInfo.getSourceRange();"}},
		[l]={
			["clang/test/Parser/cxx11-templates.cpp"]={"clang/test/Parser/cxx11-templates.cpp:5:3: error: a static_assert declaration cannot be a template","clang/test/Parser/cxx11-templates.cpp:9:1: error: a static_assert declaration cannot be a template"}
		}
	},
	["err_templated_using_directive_declaration"]={
		[c]="err_templated_using_directive_declaration",
		[d]="cannot template a using %select{directive|declaration}0",
		[e]={{nil,nil,{"cannot template a using ",{"directive","declaration"}}}},
		[f]=j,
		[g]="cannot template a using (?:directive|declaration)",
		[h]=a,
		[i]=I,
		[b]={"54a6a68c706b",1447524968,"Merge some similar diagnostics using %select.","Merge some similar diagnostics using %select.\n\nllvm-svn: 253136"},
		[k]={{Mb,503,"/// 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  // \'using namespace\' means this is a using-directive.\n  if (Tok.is(tok::kw_namespace)) {\n    // Template parameters are always an error here.\n    if (TemplateInfo.Kind) {\n      // ...\n      Diag(UsingLoc, diag::err_templated_using_directive_declaration) << 0 /* directive */ << R << FixItHint::CreateRemoval(R);"},{Mb,708,"/// 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 (TemplateInfo.Kind) {\n      // ...\n      Diag(UsingLoc, diag::err_templated_using_directive_declaration) << 1 /* declaration */ << R << FixItHint::CreateRemoval(R);"},{Mb,806,"/// 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  // Diagnose an attempt to declare a templated using-declaration.\n  // In C++11, alias-declarations can be templates:\n  //   template <...> using id = type;\n  if (TemplateInfo.Kind) {\n    // ...\n    Diag(UsingLoc, diag::err_templated_using_directive_declaration) << 1 /* declaration */ << R << FixItHint::CreateRemoval(R);"}},
		[l]={
			["clang/test/SemaCXX/using-directive.cpp"]={"clang/test/SemaCXX/using-directive.cpp:131:22: error: cannot template a using directive"}
		}
	},
	["err_tentative_def_incomplete_type"]={
		[c]="err_tentative_def_incomplete_type",
		[d]="tentative definition has type %0 that is never completed",
		[e]="tentative definition has type A that is never completed",
		[f]=j,
		[g]="tentative definition has type (.*?) that is never completed",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{Hb,1314,"/// ActOnEndOfTranslationUnit - This is called at the very end of the\n/// translation unit when EOF is reached and all but the top-level scope is\n/// popped.\nvoid Sema::ActOnEndOfTranslationUnit() {\n  // ...\n  for (TentativeDefinitionsType::iterator T = TentativeDefinitions.begin(ExternalSource.get()), TEnd = TentativeDefinitions.end(); T != TEnd; ++T) {\n    // ...\n    } else if (RequireCompleteType(VD->getLocation(), VD->getType(), diag::err_tentative_def_incomplete_type))"}},
		[l]={
			["clang/test/Misc/verify.c"]={"clang/test/Misc/verify.c:6:10: error: tentative definition has type \'struct s\' that is never completed","clang/test/Misc/verify.c:7:10: error: tentative definition has type \'struct s\' that is never completed","clang/test/Misc/verify.c:10:10: error: tentative definition has type \'struct s\' that is never completed","clang/test/Misc/verify.c:11:10: error: tentative definition has type \'struct s\' that is never completed","clang/test/Misc/verify.c:12:10: error: tentative definition has type \'struct s\' that is never completed","clang/test/Misc/verify.c:13:10: error: tentative definition has type \'struct s\' that is never completed","clang/test/Misc/verify.c:14:10: error: tentative definition has type \'struct s\' that is never completed"}
		}
	},
	["err_test_module_file_extension_format"]={
		[c]="err_test_module_file_extension_format",
		[d]="-ftest-module-file-extension argument \'%0\' is not of the required form \'blockname:major:minor:hashed:user info\'",
		[e]="-ftest-module-file-extension argument \'A\' is not of the required form \'blockname:major:minor:hashed:user info\'",
		[f]=j,
		[g]="\\-ftest\\-module\\-file\\-extension argument \'(.*?)\' is not of the required form \'blockname\\:major\\:minor\\:hashed\\:user info\'",
		[h]=a,
		[i]=z,
		[b]={"6623e1f10f95",1446575587,"Introduce module file extensions to piggy-back data onto module files.","Introduce module file extensions to piggy-back data onto module files.\n\nIntroduce the notion of a module file extension, which introduces\nadditional information into a module file at the time it is built that\ncan then be queried when the module file is read. Module file\nextensions are identified by a block name (which must be unique to the\nextension) and can write any bitstream records into their own\nextension block within the module file. When a module file is loaded,\nany extension blocks are matched up with module file extension\nreaders, that are per-module-file and are given access to the input\nbitstream.\n\nNote that module file extensions can only be introduced by\nprogrammatic clients that have access to the CompilerInvocation. There\nis only one such extension at the moment, which is used for testing\nthe module file extension harness. As a future direction, one could\nimagine allowing the plugin mechanism to introduce new module file\nextensions.\n\nllvm-svn: 251955"},
		[k]={{"clang/lib/Frontend/CompilerInvocation.cpp",2765,"#include \"clang/Driver/Options.inc\"\n  // ...\n  for (const std::string &Arg : Args.getAllArgValues(OPT_ftest_module_file_extension_EQ)) {\n    // ...\n    if (parseTestModuleFileExtensionArg(Arg, BlockName, MajorVersion, MinorVersion, Hashed, UserInfo)) {\n      Diags.Report(diag::err_test_module_file_extension_format) << Arg;"}}
	},
	["err_test_module_file_extension_version"]={
		[c]="err_test_module_file_extension_version",
		[d]="test module file extension \'%0\' has different version (%1.%2) than expected (%3.%4)",
		[e]="test module file extension \'A\' has different version (B.C) than expected (D.E)",
		[f]=j,
		[g]="test module file extension \'(.*?)\' has different version \\((.*?)\\.(.*?)\\) than expected \\((.*?)\\.(.*?)\\)",
		[h]=a,
		[i]=z,
		[b]={"6623e1f10f95",1446575587,"Introduce module file extensions to piggy-back data onto module files.","Introduce module file extensions to piggy-back data onto module files.\n\nIntroduce the notion of a module file extension, which introduces\nadditional information into a module file at the time it is built that\ncan then be queried when the module file is read. Module file\nextensions are identified by a block name (which must be unique to the\nextension) and can write any bitstream records into their own\nextension block within the module file. When a module file is loaded,\nany extension blocks are matched up with module file extension\nreaders, that are per-module-file and are given access to the input\nbitstream.\n\nNote that module file extensions can only be introduced by\nprogrammatic clients that have access to the CompilerInvocation. There\nis only one such extension at the moment, which is used for testing\nthe module file extension harness. As a future direction, one could\nimagine allowing the plugin mechanism to introduce new module file\nextensions.\n\nllvm-svn: 251955"},
		[k]={{"clang/lib/Frontend/TestModuleFileExtension.cpp",122,"std::unique_ptr<ModuleFileExtensionReader> TestModuleFileExtension::createExtensionReader(const ModuleFileExtensionMetadata &Metadata, ASTReader &Reader, serialization::ModuleFile &Mod, const llvm::BitstreamCursor &Stream) {\n  // ...\n  if (std::make_pair(Metadata.MajorVersion, Metadata.MinorVersion) != std::make_pair(MajorVersion, MinorVersion)) {\n    Reader.getDiags().Report(Mod.ImportLoc, diag::err_test_module_file_extension_version) << BlockName << Metadata.MajorVersion << Metadata.MinorVersion << MajorVersion << MinorVersion;"}},
		[l]={
			["clang/test/Modules/extensions.c"]={"clang/test/Modules/extensions.c:31:2: error: test module file extension \'clang.testA\' has different version (2.5) than expected (1.3)","clang/test/Modules/extensions.c:31:2: error: test module file extension \'clang.testB\' has different version (7.3) than expected (3.2)"}
		}
	},
	["err_this_capture"]={
		[c]="err_this_capture",
		[d]="\'this\' cannot be %select{implicitly |}0captured in this context",
		[e]={{nil,nil,{"\'this\' cannot be ",{"implicitly ",a},"captured in this context"}}},
		[f]=j,
		[g]="\'this\' cannot be (?:implicitly |)captured in this context",
		[h]=a,
		[i]="Lambda Issue",
		[b]={"cdd11d4e7ef7",1328115861,"Introduce the lambda scope before determining explicit captures, which","Introduce the lambda scope before determining explicit captures, which\ncleans up and improves a few things:\n  - We get rid of the ugly dance of computing all of the captures in\n  data structures that clone those of CapturingScopeInfo, centralizing\n  the logic for accessing/updating these data structures\n  - We re-use the existing capture logic for \'this\', which actually\n  works now.\n\nCleaned up some diagnostic wording in minor ways as well.\n\nllvm-svn: 149516"},
		[k]={{G,1330,"bool Sema::CheckCXXThisCapture(SourceLocation Loc, const bool Explicit, bool BuildAndDiagnose, const unsigned *const FunctionScopeIndexToStopAt, const bool ByCopy) {\n  // ...\n  for (int idx = MaxFunctionScopesIndex; idx >= 0; idx--) {\n    if (CapturingScopeInfo *CSI = dyn_cast<CapturingScopeInfo>(FunctionScopes[idx])) {\n      // ...\n      if (LSI && isGenericLambdaCallOperatorSpecialization(LSI->CallOperator)) {\n        // This context can\'t implicitly capture \'this\'; fail out.\n        if (BuildAndDiagnose) {\n          Diag(Loc, diag::err_this_capture) << (Explicit && idx == MaxFunctionScopesIndex);"},{G,1352,"bool Sema::CheckCXXThisCapture(SourceLocation Loc, const bool Explicit, bool BuildAndDiagnose, const unsigned *const FunctionScopeIndexToStopAt, const bool ByCopy) {\n  // ...\n  for (int idx = MaxFunctionScopesIndex; idx >= 0; idx--) {\n    if (CapturingScopeInfo *CSI = dyn_cast<CapturingScopeInfo>(FunctionScopes[idx])) {\n      // ...\n      // This context can\'t implicitly capture \'this\'; fail out.\n      if (BuildAndDiagnose)\n        Diag(Loc, diag::err_this_capture) << (Explicit && idx == MaxFunctionScopesIndex);"},{"clang/lib/Sema/SemaLambda.cpp",1051,"void Sema::ActOnLambdaExpressionAfterIntroducer(LambdaIntroducer &Intro, Scope *CurrentScope) {\n  // ...\n  for (auto C = Intro.Captures.begin(), E = Intro.Captures.end(); C != E; PrevCaptureLoc = C->Loc, ++C) {\n    if (C->Kind == LCK_This || C->Kind == LCK_StarThis) {\n      // ...\n      if (ThisCaptureType.isNull()) {\n        Diag(C->Loc, diag::err_this_capture) << true;"}},
		[l]={
			["clang/test/Parser/lambda-misplaced-capture-default.cpp"]={"clang/test/Parser/lambda-misplaced-capture-default.cpp:20:7: error: \'this\' cannot be captured in this context"}
		}
	},
	["err_this_captured_by_reference"]={
		[c]="err_this_captured_by_reference",
		[d]="\'this\' cannot be captured by reference",
		[e]="\'this\' cannot be captured by reference",
		[f]=j,
		[g]="\'this\' cannot be captured by reference",
		[h]=a,
		[i]=I,
		[b]={"db0b9f126459",1312471847,"Parsing of C++0x lambda expressions, from John Freeman with help from","Parsing of C++0x lambda expressions, from John Freeman with help from\nDavid Blaikie!\n\nllvm-svn: 136876"},
		[k]={{"clang/lib/Parse/ParseExprCXX.cpp",969,"/// Parse a lambda introducer.\n/// \\param Intro A LambdaIntroducer filled in with information about the\n///        contents of the lambda-introducer.\n/// \\param Tentative If non-null, we are disambiguating between a\n///        lambda-introducer and some other construct. In this mode, we do not\n///        produce any diagnostics or take any other irreversible action unless\n///        we\'re sure that this is a lambda-expression.\n/// \\return \\c true if parsing (or disambiguation) failed with a diagnostic and\n///         the caller should bail out / recover.\nbool Parser::ParseLambdaIntroducer(LambdaIntroducer &Intro, LambdaIntroducerTentativeParse *Tentative) {\n  // ...\n  while (Tok.isNot(tok::r_square)) {\n    // ...\n    if (Tok.is(tok::star)) {\n    // ...\n    } else if (Tok.is(tok::kw_this)) {\n    // ...\n    } else if (Tok.isOneOf(tok::amp, tok::equal) && NextToken().isOneOf(tok::comma, tok::r_square) && Intro.Default == LCD_None) {\n    // ...\n    } else {\n      // ...\n      if (Tok.is(tok::identifier)) {\n      // ...\n      } else if (Tok.is(tok::kw_this)) {\n        return Invalid([&] {\n          // ...\n          Diag(Tok.getLocation(), diag::err_this_captured_by_reference);"}},
		[l]={
			["clang/test/Parser/cxx0x-lambda-expressions.cpp"]={"clang/test/Parser/cxx0x-lambda-expressions.cpp:17:11: error: \'this\' cannot be captured by reference","clang/test/Parser/cxx0x-lambda-expressions.cpp:18:7: error: \'this\' cannot be captured by reference"}
		}
	},
	["err_this_static_member_func"]={
		[c]="err_this_static_member_func",
		[d]="\'this\' cannot be%select{| implicitly}0 used in a static member function declaration",
		[e]={{nil,nil,{"\'this\' cannot be",{a," implicitly"}," used in a static member function declaration"}}},
		[f]=j,
		[g]="\'this\' cannot be(?:| implicitly) used in a static member function declaration",
		[h]=a,
		[i]=m,
		[b]={"3024f07c1232",1334559922,"Implement C++11 [expr.prim.general]p3, which permits the use of \'this\'","Implement C++11 [expr.prim.general]p3, which permits the use of \'this\'\nin the declaration of a non-static member function after the\n(optional) cv-qualifier-seq, which in practice means in the exception\nspecification and late-specified return type. \n\nThe new scheme here used to manage \'this\' outside of a member function\nscope is more general than the Scope-based mechanism previously used\nfor non-static data member initializers and late-parsesd attributes,\nbecause it can also handle the cv-qualifiers on the member\nfunction. Note, however, that a separate pass is required for static\nmember functions to determine whether \'this\' was used, because we\nmight not know that we have a static function until after declaration\nmatching.\n\nFinally, this introduces name mangling for \'this\' and for the implicit\n\'this\', which is intended to match GCC\'s mangling. Independent\nverification for the new mangling test case would be appreciated.\n\nFixes PR10036 and PR12450.\n\nllvm-svn: 154799"},
		[k]={{Db,18588,"/// AST visitor that finds references to the \'this\' expression.\nclass FindCXXThisExpr : public RecursiveASTVisitor<FindCXXThisExpr> {\n  // ...\n  bool VisitCXXThisExpr(CXXThisExpr *E) {\n    S.Diag(E->getLocation(), diag::err_this_static_member_func) << E->isImplicit();"}},
		[l]={
			["clang/test/CXX/expr/expr.prim/expr.prim.general/p3-0x.cpp"]={"clang/test/CXX/expr/expr.prim/expr.prim.general/p3-0x.cpp:112:33: error: \'this\' cannot be implicitly used in a static member function declaration","clang/test/CXX/expr/expr.prim/expr.prim.general/p3-0x.cpp:113:33: error: \'this\' cannot be used in a static member function declaration","clang/test/CXX/expr/expr.prim/expr.prim.general/p3-0x.cpp:117:38: error: \'this\' cannot be implicitly used in a static member function declaration","clang/test/CXX/expr/expr.prim/expr.prim.general/p3-0x.cpp:120:28: error: \'this\' cannot be implicitly used in a static member function declaration"}
		}
	},
	["err_thread_dynamic_init"]={
		[c]="err_thread_dynamic_init",
		[d]="initializer for thread-local variable must be a constant expression",
		[e]="initializer for thread-local variable must be a constant expression",
		[f]=j,
		[g]="initializer for thread\\-local variable must be a constant expression",
		[h]=a,
		[i]=m,
		[b]={"6ea1a4d1dcd6",1365970291,"Diagnose if a __thread or _Thread_local variable has a non-constant initializer","Diagnose if a __thread or _Thread_local variable has a non-constant initializer\nor non-trivial destructor.\n\nllvm-svn: 179491"},
		[k]={{v,14108,"void Sema::CheckCompleteVariableDeclaration(VarDecl *var) {\n  // ...\n  if (var->getTLSKind() == VarDecl::TLS_Static) {\n    if (var->getType().isDestructedType()) {\n    // ...\n    } else if (getLangOpts().CPlusPlus && var->hasInit()) {\n      if (!checkConstInit()) {\n        // ...\n        Diag(CacheCulprit->getExprLoc(), diag::err_thread_dynamic_init) << CacheCulprit->getSourceRange();"}},
		[l]={
			["clang/test/SemaCXX/declspec-thread.cpp"]={"clang/test/SemaCXX/declspec-thread.cpp:12:28: error: initializer for thread-local variable must be a constant expression","clang/test/SemaCXX/declspec-thread.cpp:19:28: error: initializer for thread-local variable must be a constant expression","clang/test/SemaCXX/declspec-thread.cpp:26:28: error: initializer for thread-local variable must be a constant expression"}
		}
	},
	["err_thread_non_global"]={
		[c]="err_thread_non_global",
		[d]="\'%0\' variables must have global storage",
		[e]="\'A\' variables must have global storage",
		[f]=j,
		[g]="\'(.*?)\' variables must have global storage",
		[h]=a,
		[i]=m,
		[b]={"d5c0eeda7285",1240172875,"Add more thorough/correct checking for invalid __thread specifiers.","Add more thorough/correct checking for invalid __thread specifiers.\n\nllvm-svn: 69542"},
		[k]={{v,7764,"NamedDecl *Sema::ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope, ArrayRef<BindingDecl *> Bindings) {\n  // ...\n  if (DeclSpec::TSCS TSCS = D.getDeclSpec().getThreadStorageClassSpec()) {\n    // C++11 [dcl.stc]p4:\n    //   When thread_local is applied to a variable of block scope the\n    //   storage-class-specifier static is implied if it does not appear\n    //   explicitly.\n    // Core issue: \'static\' is not implied if the variable is declared\n    //   \'extern\'.\n    if (NewVD->hasLocalStorage() && (SCSpec != DeclSpec::SCS_unspecified || TSCS != DeclSpec::TSCS_thread_local || !DC->isFunctionOrMethod()))\n      Diag(D.getDeclSpec().getThreadStorageClassSpecLoc(), diag::err_thread_non_global) << DeclSpec::getSpecifierName(TSCS);"},{H,7314,"static void handleDeclspecThreadAttr(Sema &S, Decl *D, const ParsedAttr &AL) {\n  // ...\n  if (VD->hasLocalStorage()) {\n    S.Diag(AL.getLoc(), diag::err_thread_non_global) << \"__declspec(thread)\";"}},
		[l]={
			["clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p3-2b.cpp"]={"clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p3-2b.cpp:46:3: error: \'_Thread_local\' variables must have global storage","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p3-2b.cpp:54:3: error: \'__thread\' variables must have global storage"}
		}
	},
	["err_thread_non_thread"]={
		[c]="err_thread_non_thread",
		[d]="thread-local declaration of %0 follows non-thread-local declaration",
		[e]="thread-local declaration of A follows non-thread-local declaration",
		[f]=j,
		[g]="thread\\-local declaration of (.*?) follows non\\-thread\\-local declaration",
		[h]=a,
		[i]=m,
		[b]={"d5c0eeda7285",1240172875,"Add more thorough/correct checking for invalid __thread specifiers.","Add more thorough/correct checking for invalid __thread specifiers.\n\nllvm-svn: 69542"},
		[k]={{v,4707,"/// MergeVarDecl - We just parsed a variable \'New\' which has the same name\n/// and scope as a previous declaration \'Old\'.  Figure out how to resolve this\n/// situation, merging decls or emitting diagnostics as appropriate.\n///\n/// Tentative definition rules (C99 6.9.2p2) are checked by\n/// FinalizeDeclaratorGroup. Unfortunately, we can\'t analyze tentative\n/// definitions here, since the initializer hasn\'t been attached.\n///\nvoid Sema::MergeVarDecl(VarDecl *New, LookupResult &Previous) {\n  // ...\n  if (New->getTLSKind() != Old->getTLSKind()) {\n    if (!Old->getTLSKind()) {\n      Diag(New->getLocation(), diag::err_thread_non_thread) << New->getDeclName();"}},
		[l]={
			["clang/test/SemaCXX/cxx11-thread-local.cpp"]={"clang/test/SemaCXX/cxx11-thread-local.cpp:11:21: error: thread-local declaration of \'b\' follows non-thread-local declaration"}
		}
	},
	["err_thread_nontrivial_dtor"]={
		[c]="err_thread_nontrivial_dtor",
		[d]="type of thread-local variable has non-trivial destruction",
		[e]="type of thread-local variable has non-trivial destruction",
		[f]=j,
		[g]="type of thread\\-local variable has non\\-trivial destruction",
		[h]=a,
		[i]=m,
		[b]={"6ea1a4d1dcd6",1365970291,"Diagnose if a __thread or _Thread_local variable has a non-constant initializer","Diagnose if a __thread or _Thread_local variable has a non-constant initializer\nor non-trivial destructor.\n\nllvm-svn: 179491"},
		[k]={{v,14099,"void Sema::CheckCompleteVariableDeclaration(VarDecl *var) {\n  // ...\n  if (var->getTLSKind() == VarDecl::TLS_Static) {\n    if (var->getType().isDestructedType()) {\n      // ...\n      Diag(var->getLocation(), diag::err_thread_nontrivial_dtor);"}},
		[l]={
			["clang/test/Sema/thread-specifier.c"]={"clang/test/Sema/thread-specifier.c:109:12: error: type of thread-local variable has non-trivial destruction"}
		}
	},
	["err_thread_thread_different_kind"]={
		[c]="err_thread_thread_different_kind",
		[d]="thread-local declaration of %0 with %select{static|dynamic}1 initialization follows declaration with %select{dynamic|static}1 initialization",
		[e]={{nil,nil,{"thread-local declaration of A with ",{"static","dynamic"}," initialization follows declaration with ",{"dynamic","static"}," initialization"}}},
		[f]=j,
		[g]="thread\\-local declaration of (.*?) with (?:static|dynamic) initialization follows declaration with (?:dynamic|static) initialization",
		[h]=a,
		[i]=m,
		[b]={"fd3834f7a1cc",1365821034,"Annotate flavor of TLS variable (statically or dynamically initialized) onto the AST.","Annotate flavor of TLS variable (statically or dynamically initialized) onto the AST.\n\nllvm-svn: 179447"},
		[k]={{v,4717,"/// MergeVarDecl - We just parsed a variable \'New\' which has the same name\n/// and scope as a previous declaration \'Old\'.  Figure out how to resolve this\n/// situation, merging decls or emitting diagnostics as appropriate.\n///\n/// Tentative definition rules (C99 6.9.2p2) are checked by\n/// FinalizeDeclaratorGroup. Unfortunately, we can\'t analyze tentative\n/// definitions here, since the initializer hasn\'t been attached.\n///\nvoid Sema::MergeVarDecl(VarDecl *New, LookupResult &Previous) {\n  // ...\n  if (New->getTLSKind() != Old->getTLSKind()) {\n    if (!Old->getTLSKind()) {\n    // ...\n    } else if (!New->getTLSKind()) {\n    // ...\n    } else {\n      // ...\n      Diag(New->getLocation(), diag::err_thread_thread_different_kind) << New->getDeclName() << (New->getTLSKind() == VarDecl::TLS_Dynamic);"}},
		[l]={
			["clang/test/Sema/thread-specifier.c"]={"clang/test/Sema/thread-specifier.c:74:19: error: thread-local declaration of \'t17\' with static initialization follows declaration with dynamic initialization","clang/test/Sema/thread-specifier.c:78:18: error: thread-local declaration of \'t18\' with dynamic initialization follows declaration with static initialization"}
		}
	},
	["err_thread_unsupported"]={
		[c]="err_thread_unsupported",
		[d]="thread-local storage is not supported for the current target",
		[e]="thread-local storage is not supported for the current target",
		[f]=j,
		[g]="thread\\-local storage is not supported for the current target",
		[h]=a,
		[i]=m,
		[b]={"daea3f62b561",1240177713,"Print an error for uses of __thread on targets which don\'t support it.","Print an error for uses of __thread on targets which don\'t support it.\n\nllvm-svn: 69553"},
		[k]={{v,7779,"NamedDecl *Sema::ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope, ArrayRef<BindingDecl *> Bindings) {\n  // ...\n  if (DeclSpec::TSCS TSCS = D.getDeclSpec().getThreadStorageClassSpec()) {\n    // C++11 [dcl.stc]p4:\n    //   When thread_local is applied to a variable of block scope the\n    //   storage-class-specifier static is implied if it does not appear\n    //   explicitly.\n    // Core issue: \'static\' is not implied if the variable is declared\n    //   \'extern\'.\n    if (NewVD->hasLocalStorage() && (SCSpec != DeclSpec::SCS_unspecified || TSCS != DeclSpec::TSCS_thread_local || !DC->isFunctionOrMethod()))\n    // ...\n    else if (!Context.getTargetInfo().isTLSSupported()) {\n      if (getLangOpts().CUDA || getLangOpts().OpenMPIsTargetDevice || getLangOpts().SYCLIsDevice) {\n      // ...\n      } else\n        Diag(D.getDeclSpec().getThreadStorageClassSpecLoc(), diag::err_thread_unsupported);"},{v,7903,"NamedDecl *Sema::ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope, ArrayRef<BindingDecl *> Bindings) {\n  // ...\n  if (getLangOpts().CUDA || getLangOpts().OpenMPIsTargetDevice || getLangOpts().SYCLIsDevice) {\n    if (EmitTLSUnsupportedError && ((getLangOpts().CUDA && DeclAttrsMatchCUDAMode(getLangOpts(), NewVD)) || (getLangOpts().OpenMPIsTargetDevice && OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(NewVD))))\n      Diag(D.getDeclSpec().getThreadStorageClassSpecLoc(), diag::err_thread_unsupported);"},{v,7908,"NamedDecl *Sema::ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope, ArrayRef<BindingDecl *> Bindings) {\n  // ...\n  if (getLangOpts().CUDA || getLangOpts().OpenMPIsTargetDevice || getLangOpts().SYCLIsDevice) {\n    // ...\n    if (EmitTLSUnsupportedError && (LangOpts.SYCLIsDevice || (LangOpts.OpenMP && LangOpts.OpenMPIsTargetDevice)))\n      targetDiag(D.getIdentifierLoc(), diag::err_thread_unsupported);"},{H,7306,"static void handleDeclspecThreadAttr(Sema &S, Decl *D, const ParsedAttr &AL) {\n  // ...\n  if (!S.Context.getTargetInfo().isTLSSupported()) {\n    S.Diag(AL.getLoc(), diag::err_thread_unsupported);"},{n,396,"/// 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 (LangOpts.SYCLIsDevice || (LangOpts.OpenMP && LangOpts.OpenMPIsTargetDevice)) {\n    if (!Context.getTargetInfo().isTLSSupported())\n      if (const auto *VD = dyn_cast<VarDecl>(D))\n        if (VD->getTLSKind() != VarDecl::TLS_None)\n          targetDiag(*Locs.begin(), diag::err_thread_unsupported);"}},
		[l]={
			["clang/test/SemaSYCL/prohibit-thread-local.cpp"]={"clang/test/SemaSYCL/prohibit-thread-local.cpp:29:9: error: thread-local storage is not supported for the current target","clang/test/SemaSYCL/prohibit-thread-local.cpp:31:9: error: thread-local storage is not supported for the current target","clang/test/SemaSYCL/prohibit-thread-local.cpp:33:12: error: thread-local storage is not supported for the current target","clang/test/SemaSYCL/prohibit-thread-local.cpp:35:12: error: thread-local storage is not supported for the current target","clang/test/SemaSYCL/prohibit-thread-local.cpp:18:26: error: thread-local storage is not supported for the current target","clang/test/SemaSYCL/prohibit-thread-local.cpp:20:20: error: thread-local storage is not supported for the current target"}
		}
	},
	["err_three_way_vector_comparison"]={
		[c]={{nil,t,"err_three_way_vector_comparison"}},
		[d]={{nil,t,"three-way comparison between vectors is not supported"}},
		[e]={{nil,t,"three-way comparison between vectors is not supported"}},
		[f]=j,
		[g]="three\\-way comparison between vectors is not supported",
		[h]=a,
		[i]={{nil,t,z}},
		[b]={"fe17b30a7957",1575504770,"[attributes][analyzer] Add annotations for handles.","[attributes][analyzer] Add annotations for handles.\n\nThese annotations will be used in an upcomming static analyzer check\nthat finds handle leaks, use after releases, and double releases.\n\nDifferential Revision: https://reviews.llvm.org/D70469"},
		[k]={{n,13510,"/// CheckVectorCompareOperands - vector comparisons are a clang extension that\n/// operates on extended vector types.  Instead of producing an IntTy result,\n/// like a scalar comparison, a vector comparison produces a vector of integer\n/// types.\nQualType Sema::CheckVectorCompareOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc) {\n  if (Opc == BO_Cmp) {\n    Diag(Loc, diag::err_three_way_vector_comparison);"},{n,13671,"QualType Sema::CheckSizelessVectorCompareOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc) {\n  if (Opc == BO_Cmp) {\n    Diag(Loc, diag::err_three_way_vector_comparison);"}},
		[l]={
			["clang/test/SemaCXX/compare-cxx2a.cpp"]={"clang/test/SemaCXX/compare-cxx2a.cpp:419:15: error: three-way comparison between vectors is not supported"}
		}
	},
	["err_throw_abstract_type"]={
		[c]="err_throw_abstract_type",
		[d]="cannot throw an object of abstract type %0",
		[e]="cannot throw an object of abstract type A",
		[f]=j,
		[g]="cannot throw an object of abstract type (.*?)",
		[h]=a,
		[i]=m,
		[b]={"e8154339f46e",1271354739,"Diagnose attempts to throw an abstract class type.","Diagnose attempts to throw an abstract class type.\n\nllvm-svn: 101381"},
		[k]={{G,1011,"/// CheckCXXThrowOperand - Validate the operand of a throw.\nbool Sema::CheckCXXThrowOperand(SourceLocation ThrowLoc, QualType ExceptionObjectTy, Expr *E) {\n  // ...\n  if (!isPointer || !Ty->isVoidType()) {\n    // ...\n    if (RequireNonAbstractType(ThrowLoc, ExceptionObjectTy, diag::err_throw_abstract_type, E))"}},
		[l]={
			["clang/test/SemaCXX/exceptions.cpp"]={"clang/test/SemaCXX/exceptions.cpp:112:5: error: cannot throw an object of abstract type \'foo\'"}
		}
	},
	["err_throw_incomplete"]={
		[c]="err_throw_incomplete",
		[d]="cannot throw object of incomplete type %0",
		[e]="cannot throw object of incomplete type A",
		[f]=j,
		[g]="cannot throw object of incomplete type (.*?)",
		[h]=a,
		[i]=m,
		[b]={"4de47b445b96",1240864051,"Improve validation of C++ exception handling: diagnose throwing incomplete types and jumps into prot...","Improve validation of C++ exception handling: diagnose throwing incomplete types and jumps into protected try-catch scopes.\n\nllvm-svn: 70242"},
		[k]={{G,1001,"/// CheckCXXThrowOperand - Validate the operand of a throw.\nbool Sema::CheckCXXThrowOperand(SourceLocation ThrowLoc, QualType ExceptionObjectTy, Expr *E) {\n  // ...\n  if (!isPointer || !Ty->isVoidType()) {\n    if (RequireCompleteType(ThrowLoc, Ty, isPointer ? diag::err_throw_incomplete_ptr : diag::err_throw_incomplete, E->getSourceRange()))"}},
		[l]={
			["clang/test/SemaCXX/exceptions.cpp"]={"clang/test/SemaCXX/exceptions.cpp:37:3: error: cannot throw object of incomplete type \'void\'"}
		}
	},
	["err_throw_incomplete_ptr"]={
		[c]="err_throw_incomplete_ptr",
		[d]="cannot throw pointer to object of incomplete type %0",
		[e]="cannot throw pointer to object of incomplete type A",
		[f]=j,
		[g]="cannot throw pointer to object of incomplete type (.*?)",
		[h]=a,
		[i]=m,
		[b]={"4de47b445b96",1240864051,"Improve validation of C++ exception handling: diagnose throwing incomplete types and jumps into prot...","Improve validation of C++ exception handling: diagnose throwing incomplete types and jumps into protected try-catch scopes.\n\nllvm-svn: 70242"},
		[k]={{G,1000,"/// CheckCXXThrowOperand - Validate the operand of a throw.\nbool Sema::CheckCXXThrowOperand(SourceLocation ThrowLoc, QualType ExceptionObjectTy, Expr *E) {\n  // ...\n  if (!isPointer || !Ty->isVoidType()) {\n    if (RequireCompleteType(ThrowLoc, Ty, isPointer ? diag::err_throw_incomplete_ptr : diag::err_throw_incomplete, E->getSourceRange()))"}},
		[l]={
			["clang/test/SemaCXX/exceptions.cpp"]={"clang/test/SemaCXX/exceptions.cpp:38:3: error: cannot throw pointer to object of incomplete type \'A\'"}
		}
	},
	["err_throw_sizeless"]={
		[c]={{nil,u,"err_throw_sizeless"}},
		[d]={{nil,u,"cannot throw object of sizeless type %0"}},
		[e]={{nil,u,"cannot throw object of sizeless type A"}},
		[f]=j,
		[g]="cannot throw object of sizeless type (.*?)",
		[h]=a,
		[i]={{nil,u,m}},
		[b]={fb,1576908663,gb,hb},
		[k]={{G,1006,"/// CheckCXXThrowOperand - Validate the operand of a throw.\nbool Sema::CheckCXXThrowOperand(SourceLocation ThrowLoc, QualType ExceptionObjectTy, Expr *E) {\n  // ...\n  if (!isPointer || !Ty->isVoidType()) {\n    // ...\n    if (!isPointer && Ty->isSizelessType()) {\n      Diag(ThrowLoc, diag::err_throw_sizeless) << Ty << E->getSourceRange();"}},
		[l]={
			["clang/test/SemaCXX/sizeless-1.cpp"]={"clang/test/SemaCXX/sizeless-1.cpp:361:3: error: cannot throw object of sizeless type \'svint8_t\' (aka \'__SVInt8_t\')"}
		}
	},
	["err_tls_var_aligned_over_maximum"]={
		[c]="err_tls_var_aligned_over_maximum",
		[d]="alignment (%0) of thread-local variable %1 is greater than the maximum supported alignment (%2) for a thread-local variable on this target",
		[e]="alignment (A) of thread-local variable B is greater than the maximum supported alignment (C) for a thread-local variable on this target",
		[f]=j,
		[g]="alignment \\((.*?)\\) of thread\\-local variable (.*?) is greater than the maximum supported alignment \\((.*?)\\) for a thread\\-local variable on this target",
		[h]=a,
		[i]=m,
		[b]={"d30e2eefc3cf",1436907152,"Add a \"maximum TLS alignment\" characteristic to the target info, so it","Add a \"maximum TLS alignment\" characteristic to the target info, so it\ncan be different from the normal variable maximum.\nAdd an error diagnostic for when TLS variables exceed maximum TLS alignment.\nCurrenty only PS4 sets an explicit maximum TLS alignment.\n\nPatch by Charles Li!\n\nllvm-svn: 242198"},
		[k]={{v,14367,"void Sema::CheckThreadLocalForLargeAlignment(VarDecl *VD) {\n  // ...\n  // Perform TLS alignment check here after attributes attached to the variable\n  // which may affect the alignment have been processed. Only perform the check\n  // if the target has a maximum TLS alignment (zero means no constraints).\n  if (unsigned MaxAlign = Context.getTargetInfo().getMaxTLSAlign()) {\n    // Protect the check so that it\'s not performed on dependent types and\n    // dependent alignments (we can\'t determine the alignment in that case).\n    if (!VD->hasDependentAlignment()) {\n      // ...\n      if (Context.getDeclAlign(VD) > MaxAlignChars) {\n        Diag(VD->getLocation(), diag::err_tls_var_aligned_over_maximum) << (unsigned)Context.getDeclAlign(VD).getQuantity() << VD << (unsigned)MaxAlignChars.getQuantity();"},{H,4507,"void Sema::AddAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E, bool IsPackExpansion) {\n  // ...\n  if (VD) {\n    // ...\n    if (MaxTLSAlign && AlignVal > MaxTLSAlign && VD->getTLSKind() != VarDecl::TLS_None) {\n      Diag(VD->getLocation(), diag::err_tls_var_aligned_over_maximum) << (unsigned)AlignVal << VD << MaxTLSAlign;"}},
		[l]={
			["clang/test/Sema/tls_alignment.cpp"]={"clang/test/Sema/tls_alignment.cpp:37:44: error: alignment (64) of thread-local variable \'bar\' is greater than the maximum supported alignment (32) for a thread-local variable on this target","clang/test/Sema/tls_alignment.cpp:40:44: error: alignment (64) of thread-local variable \'bar2\' is greater than the maximum supported alignment (32) for a thread-local variable on this target","clang/test/Sema/tls_alignment.cpp:43:44: error: alignment (64) of thread-local variable \'bar3\' is greater than the maximum supported alignment (32) for a thread-local variable on this target","clang/test/Sema/tls_alignment.cpp:46:44: error: alignment (64) of thread-local variable \'bar4\' is greater than the maximum supported alignment (32) for a thread-local variable on this target","clang/test/Sema/tls_alignment.cpp:49:44: error: alignment (64) of thread-local variable \'bar5\' is greater than the maximum supported alignment (32) for a thread-local variable on this target","clang/test/Sema/tls_alignment.cpp:65:30: error: alignment (64) of thread-local variable \'blah\' is greater than the maximum supported alignment (32) for a thread-local variable on this target","clang/test/Sema/tls_alignment.cpp:76:51: error: alignment (64) of thread-local variable \'x\' is greater than the maximum supported alignment (32) for a thread-local variable on this target","clang/test/Sema/tls_alignment.cpp:75:50: error: alignment (64) of thread-local variable \'b<64>\' is greater than the maximum supported alignment (32) for a thread-local variable on this target","clang/test/Sema/tls_alignment.cpp:72:20: error: alignment (64) of thread-local variable \'b\' is greater than the maximum supported alignment (32) for a thread-local variable on this target","clang/test/Sema/tls_alignment.cpp:73:20: error: alignment (64) of thread-local variable \'c\' is greater than the maximum supported alignment (32) for a thread-local variable on this target"}
		}
	},
	["err_too_few_args_in_macro_invoc"]={
		[c]="err_too_few_args_in_macro_invoc",
		[d]="too few arguments provided to function-like macro invocation",
		[e]="too few arguments provided to function-like macro invocation",
		[f]=j,
		[g]="too few arguments provided to function\\-like macro invocation",
		[h]=a,
		[i]="Lexical or Preprocessor Issue",
		[b]={Pb,1236199783,Qb,Fb},
		[k]={{jc,1015,"/// ReadFunctionLikeMacroArgs - After reading \"MACRO\" and knowing that the next\n/// token is the \'(\' of the macro, this method is invoked to read all of the\n/// actual arguments specified for the macro invocation.  This returns null on\n/// error.\nMacroArgs *Preprocessor::ReadMacroCallArgumentList(Token &MacroName, MacroInfo *MI, SourceLocation &MacroEnd) {\n  // ...\n  if (NumActuals < MinArgsExpected) {\n    // There are several cases where too few arguments is ok, handle them now.\n    if (NumActuals == 0 && MinArgsExpected == 1) {\n    // ...\n    } else if ((FoundElidedComma || MI->isVariadic()) && (NumActuals + 1 == MinArgsExpected ||          // A(x, ...) -> A(X)\n    // ...\n    } else if (!ContainsCodeCompletionTok) {\n      // ...\n      Diag(Tok, diag::err_too_few_args_in_macro_invoc);"},{jc,1357,"/// 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::r_paren:\n      // ...\n      // The last \')\' has been reached; return the value if one found or\n      // a diagnostic and a dummy value.\n      if (Result) {\n      // ...\n      } else {\n        // ...\n        if (!SuppressDiagnostic)\n          PP.Diag(Tok.getLocation(), diag::err_too_few_args_in_macro_invoc);"}},
		[l]={
			["clang/test/Preprocessor/macro_fn.c"]={"clang/test/Preprocessor/macro_fn.c:20:5: error: too few arguments provided to function-like macro invocation","clang/test/Preprocessor/macro_fn.c:21:6: error: too few arguments provided to function-like macro invocation"}
		}
	},
	["err_too_large_for_fixed_point"]={
		[c]={{nil,bb,"err_too_large_for_fixed_point"}},
		[d]={{nil,bb,"this value is too large for this fixed point type"}},
		[e]={{nil,bb,"this value is too large for this fixed point type"}},
		[f]=j,
		[g]="this value is too large for this fixed point type",
		[h]=a,
		[i]={{nil,bb,z}},
		[b]={"db01c3adc6f9",1529515180,"[Fixed Point Arithmetic] Fixed Point Precision Bits and Fixed Point Literals","[Fixed Point Arithmetic] Fixed Point Precision Bits and Fixed Point Literals\n\nThis diff includes the logic for setting the precision bits for each primary fixed point type in the target info and logic for initializing a fixed point literal.\n\nFixed point literals are declared using the suffixes\n\n```\nhr: short _Fract\nuhr: unsigned short _Fract\nr: _Fract\nur: unsigned _Fract\nlr: long _Fract\nulr: unsigned long _Fract\nhk: short _Accum\nuhk: unsigned short _Accum\nk: _Accum\nuk: unsigned _Accum\n```\nErrors are also thrown for illegal literal values\n\n```\nunsigned short _Accum u_short_accum = 256.0uhk;   // expected-error{{the integral part of this literal is too large for this unsigned _Accum type}}\n```\n\nDifferential Revision: https://reviews.llvm.org/D46915\n\nllvm-svn: 335148"},
		[k]={{n,4010,"ExprResult Sema::ActOnNumericConstant(const Token &Tok, Scope *UDLScope) {\n  // ...\n  if (Literal.isFixedPointLiteral()) {\n    // ...\n    if (Literal.isFract && Val == MaxVal + 1 && !ValIsZero)\n    // ...\n    else if (Val.ugt(MaxVal) || Overflowed)\n      Diag(Tok.getLocation(), diag::err_too_large_for_fixed_point);"}},
		[l]={
			["clang/test/Frontend/fixed_point_errors.c"]={"clang/test/Frontend/fixed_point_errors.c:83:37: error: this value is too large for this fixed point type","clang/test/Frontend/fixed_point_errors.c:84:39: error: this value is too large for this fixed point type","clang/test/Frontend/fixed_point_errors.c:85:25: error: this value is too large for this fixed point type","clang/test/Frontend/fixed_point_errors.c:86:27: error: this value is too large for this fixed point type","clang/test/Frontend/fixed_point_errors.c:87:35: error: this value is too large for this fixed point type","clang/test/Frontend/fixed_point_errors.c:88:37: error: this value is too large for this fixed point type","clang/test/Frontend/fixed_point_errors.c:91:43: error: this value is too large for this fixed point type","clang/test/Frontend/fixed_point_errors.c:92:43: error: this value is too large for this fixed point type","clang/test/Frontend/fixed_point_errors.c:93:43: error: this value is too large for this fixed point type","clang/test/Frontend/fixed_point_errors.c:94:43: error: this value is too large for this fixed point type","clang/test/Frontend/fixed_point_errors.c:95:43: error: this value is too large for this fixed point type","clang/test/Frontend/fixed_point_errors.c:96:43: error: this value is too large for this fixed point type","clang/test/Frontend/fixed_point_errors.c:99:47: error: this value is too large for this fixed point type","clang/test/Frontend/fixed_point_errors.c:100:47: error: this value is too large for this fixed point type","clang/test/Frontend/fixed_point_errors.c:101:47: error: this value is too large for this fixed point type","clang/test/Frontend/fixed_point_errors.c:102:47: error: this value is too large for this fixed point type","clang/test/Frontend/fixed_point_errors.c:103:47: error: this value is too large for this fixed point type","clang/test/Frontend/fixed_point_errors.c:104:47: error: this value is too large for this fixed point type","clang/test/Frontend/fixed_point_errors.c:107:12: error: this value is too large for this fixed point type","clang/test/Frontend/fixed_point_errors.c:111:48: error: this value is too large for this fixed point type","clang/test/Frontend/fixed_point_errors.c:112:48: error: this value is too large for this fixed point type","clang/test/Frontend/fixed_point_errors.c:113:48: error: this value is too large for this fixed point type","clang/test/Frontend/fixed_point_errors.c:114:48: error: this value is too large for this fixed point type","clang/test/Frontend/fixed_point_errors.c:115:48: error: this value is too large for this fixed point type","clang/test/Frontend/fixed_point_errors.c:116:48: error: this value is too large for this fixed point type","clang/test/Frontend/fixed_point_errors.c:118:47: error: this value is too large for this fixed point type","clang/test/Frontend/fixed_point_errors.c:119:47: error: this value is too large for this fixed point type","clang/test/Frontend/fixed_point_errors.c:120:47: error: this value is too large for this fixed point type","clang/test/Frontend/fixed_point_errors.c:121:47: error: this value is too large for this fixed point type","clang/test/Frontend/fixed_point_errors.c:122:47: error: this value is too large for this fixed point type","clang/test/Frontend/fixed_point_errors.c:123:47: error: this value is too large for this fixed point type"}
		}
	},
	["err_too_many_args_in_macro_invoc"]={
		[c]="err_too_many_args_in_macro_invoc",
		[d]="too many arguments provided to function-like macro invocation",
		[e]="too many arguments provided to function-like macro invocation",
		[f]=j,
		[g]="too many arguments provided to function\\-like macro invocation",
		[h]=a,
		[i]="Lexical or Preprocessor Issue",
		[b]={Pb,1236199783,Qb,Fb},
		[k]={{jc,929,"/// ReadFunctionLikeMacroArgs - After reading \"MACRO\" and knowing that the next\n/// token is the \'(\' of the macro, this method is invoked to read all of the\n/// actual arguments specified for the macro invocation.  This returns null on\n/// error.\nMacroArgs *Preprocessor::ReadMacroCallArgumentList(Token &MacroName, MacroInfo *MI, SourceLocation &MacroEnd) {\n  // ...\n  // If this is not a variadic macro, and too many args were specified, emit\n  // an error.\n  if (!isVariadic && NumActuals > MinArgsExpected && !ContainsCodeCompletionTok) {\n    // ...\n    Diag(TooManyArgsLoc, diag::err_too_many_args_in_macro_invoc);"},{jc,1037,"/// ReadFunctionLikeMacroArgs - After reading \"MACRO\" and knowing that the next\n/// token is the \'(\' of the macro, this method is invoked to read all of the\n/// actual arguments specified for the macro invocation.  This returns null on\n/// error.\nMacroArgs *Preprocessor::ReadMacroCallArgumentList(Token &MacroName, MacroInfo *MI, SourceLocation &MacroEnd) {\n  // ...\n  if (NumActuals < MinArgsExpected) {\n  // ...\n  } else if (NumActuals > MinArgsExpected && !MI->isVariadic() && !ContainsCodeCompletionTok) {\n    // ...\n    Diag(MacroName, diag::err_too_many_args_in_macro_invoc);"},{jc,1327,"/// 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::comma:\n      if (!SuppressDiagnostic) {\n        PP.Diag(Tok.getLocation(), diag::err_too_many_args_in_macro_invoc);"}},
		[l]={
			["clang/test/Preprocessor/macro_fn.c"]={"clang/test/Preprocessor/macro_fn.c:11:6: error: too many arguments provided to function-like macro invocation","clang/test/Preprocessor/macro_fn.c:12:6: error: too many arguments provided to function-like macro invocation","clang/test/Preprocessor/macro_fn.c:16:6: error: too many arguments provided to function-like macro invocation","clang/test/Preprocessor/macro_fn.c:18:8: error: too many arguments provided to function-like macro invocation","clang/test/Preprocessor/macro_fn.c:24:9: error: too many arguments provided to function-like macro invocation","clang/test/Preprocessor/macro_fn.c:27:5: error: too many arguments provided to function-like macro invocation"}
		}
	},
	["err_toomany_element_decls"]={
		[c]="err_toomany_element_decls",
		[d]="only one element declaration is allowed",
		[e]="only one element declaration is allowed",
		[f]=j,
		[g]="only one element declaration is allowed",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{Ib,2296,"StmtResult Sema::ActOnObjCForCollectionStmt(SourceLocation ForLoc, Stmt *First, Expr *collection, SourceLocation RParenLoc) {\n  // ...\n  if (First) {\n    // ...\n    if (DeclStmt *DS = dyn_cast<DeclStmt>(First)) {\n      if (!DS->isSingleDecl())\n        return StmtError(Diag((*DS->decl_begin())->getLocation(), diag::err_toomany_element_decls));"}},
		[l]={
			["clang/test/Parser/objc-forcollection-neg-2.m"]={"clang/test/Parser/objc-forcollection-neg-2.m:28:17: error: only one element declaration is allowed"}
		}
	},
	["err_trailing_requires_clause_on_deduction_guide"]={
		[c]={{nil,t,"err_trailing_requires_clause_on_deduction_guide"}},
		[d]={{nil,t,"deduction guide cannot have a requires clause"}},
		[e]={{nil,t,"deduction guide cannot have a requires clause"}},
		[f]=j,
		[g]="deduction guide cannot have a requires clause",
		[h]=a,
		[i]={{nil,t,m}},
		[b]={"349636d2bfc3",1575555459,"Implement VectorType conditional operator GNU extension.","Implement VectorType conditional operator GNU extension.\n\nGCC supports the conditional operator on VectorTypes that acts as a\n\'select\' in C++ mode. This patch implements the support. Types are\nconverted as closely to GCC\'s behavior as possible, though in a few\nplaces consistency with our existing vector type support was preferred.\n\nNote that this implementation is different from the OpenCL version in a\nnumber of ways, so it unfortunately required a different implementation.\n\nFirst, the SEMA rules and promotion rules are significantly different.\n\nSecondly, GCC implements COND[i] != 0 ? LHS[i] : RHS[i] (where i is in\nthe range 0- VectorSize, for each element).  In OpenCL, the condition is\nCOND[i] < 0 ? LHS[i]: RHS[i].\n\nIn the process of implementing this, it was also required to make the\nexpression COND ? LHS : RHS type dependent if COND is type dependent,\nsince the type is now dependent on the condition.  For example:\n\n    T ? 1 : 2;\n\nIs not typically type dependent, since the result can be deduced from\nthe operands.  HOWEVER, if T is a VectorType now, it could change this\nto a \'select\' (basically a swizzle with a non-constant mask) with the 1\nand 2 being promoted to vectors themselves.\n\nWhile this is a change, it is NOT a standards incompatible change. Based\non my (and D. Gregor\'s, at the time of writing the code) reading of the\nstandard, the expression is supposed to be type dependent if ANY\nsub-expression is type dependent.\n\nDifferential Revision: https://reviews.llvm.org/D71463"},
		[k]={{v,9257,"static FunctionDecl *CreateNewFunctionDecl(Sema &SemaRef, Declarator &D, DeclContext *DC, QualType &R, TypeSourceInfo *TInfo, StorageClass SC, bool &IsVirtualOkay) {\n  // ...\n  if (Name.getNameKind() == DeclarationName::CXXConstructorName) {\n  // ...\n  } else if (Name.getNameKind() == DeclarationName::CXXDestructorName) {\n  // ...\n  } else if (Name.getNameKind() == DeclarationName::CXXConversionFunctionName) {\n  // ...\n  } else if (Name.getNameKind() == DeclarationName::CXXDeductionGuideName) {\n    if (TrailingRequiresClause)\n      SemaRef.Diag(TrailingRequiresClause->getBeginLoc(), diag::err_trailing_requires_clause_on_deduction_guide) << TrailingRequiresClause->getSourceRange();"}},
		[l]={
			["clang/test/CXX/dcl/dcl.decl/p3.cpp"]={"clang/test/CXX/dcl/dcl.decl/p3.cpp:68:23: error: deduction guide cannot have a requires clause"}
		}
	},
	["err_trailing_return_in_parens"]={
		[c]="err_trailing_return_in_parens",
		[d]="trailing return type may not be nested within parentheses",
		[e]="trailing return type may not be nested within parentheses",
		[f]=j,
		[g]="trailing return type may not be nested within parentheses",
		[h]=a,
		[i]=m,
		[b]={"59006e4338ce",1298335013,"Fix a few auto-related issues:","Fix a few auto-related issues:\n\n * \'auto\' was being rejected on abstract-declarators with trailing return\ntypes and on typedefs with trailing return types. \'auto\' is always\nallowed in these cases. This was found while testing the fix for PR 9278.\n\n * A very poor diagnostic was being issued for auto (f() -> int): \"return\ntype must be \'auto\', not \'auto\'\". This is closely related to PR 9060.\n\n * Trailing return type handling was happening slightly too late,\nresulting in the checks for functions returning arrays and functions\nreturning functions being missed.\n\nllvm-svn: 126166"},
		[k]={{B,5210,"static TypeSourceInfo *GetFullTypeForDeclarator(TypeProcessingState &state, QualType declSpecType, TypeSourceInfo *TInfo) {\n  // ...\n  for (unsigned i = 0, e = D.getNumTypeObjects(); i != e; ++i) {\n    // ...\n    case DeclaratorChunk::Function: {\n      // ...\n      // Check for auto functions and trailing return type and adjust the\n      // return type accordingly.\n      if (!D.isInvalidType()) {\n        // trailing-return-type is only required if we\'re declaring a function,\n        // and not, for instance, a pointer to a function.\n        if (D.getDeclSpec().hasAutoTypeSpec() && !FTI.hasTrailingReturnType() && chunkIndex == 0) {\n        // ...\n        } else if (FTI.hasTrailingReturnType()) {\n          // T must be exactly \'auto\' at this point. See CWG issue 681.\n          if (isa<ParenType>(T)) {\n            S.Diag(D.getBeginLoc(), diag::err_trailing_return_in_parens) << T << D.getSourceRange();"}},
		[l]={
			["clang/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p2-cxx0x.cpp"]={"clang/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p2-cxx0x.cpp:6:1: error: trailing return type may not be nested within parentheses"}
		}
	},
	["err_trailing_return_without_auto"]={
		[c]="err_trailing_return_without_auto",
		[d]="function with trailing return type must specify return type \'auto\', not %0",
		[e]="function with trailing return type must specify return type \'auto\', not A",
		[f]=j,
		[g]="function with trailing return type must specify return type \'auto\', not (.*?)",
		[h]=a,
		[i]=m,
		[b]={"7fb25418ed72",1285958690,"Implement the C++0x \"trailing return type\" feature, e.g.,","Implement the C++0x \"trailing return type\" feature, e.g.,\n\n  auto f(int) -> int\n\nfrom Daniel Wallin!\n\n(With a few minor bug fixes from me).\n\nllvm-svn: 115322"},
		[k]={{B,5231,"static TypeSourceInfo *GetFullTypeForDeclarator(TypeProcessingState &state, QualType declSpecType, TypeSourceInfo *TInfo) {\n  // ...\n  for (unsigned i = 0, e = D.getNumTypeObjects(); i != e; ++i) {\n    // ...\n    case DeclaratorChunk::Function: {\n      // ...\n      // Check for auto functions and trailing return type and adjust the\n      // return type accordingly.\n      if (!D.isInvalidType()) {\n        // trailing-return-type is only required if we\'re declaring a function,\n        // and not, for instance, a pointer to a function.\n        if (D.getDeclSpec().hasAutoTypeSpec() && !FTI.hasTrailingReturnType() && chunkIndex == 0) {\n        // ...\n        } else if (FTI.hasTrailingReturnType()) {\n          // T must be exactly \'auto\' at this point. See CWG issue 681.\n          if (isa<ParenType>(T)) {\n          // ...\n          } else if (D.getName().getKind() == UnqualifiedIdKind::IK_DeductionGuideName) {\n          // ...\n          } else if (D.getContext() != DeclaratorContext::LambdaExpr && (T.hasQualifiers() || !isa<AutoType>(T) || cast<AutoType>(T)->getKeyword() != AutoTypeKeyword::Auto || cast<AutoType>(T)->isConstrained())) {\n            S.Diag(D.getDeclSpec().getTypeSpecTypeLoc(), diag::err_trailing_return_without_auto) << T << D.getDeclSpec().getSourceRange();"}},
		[l]={
			["clang/test/CXX/dcl/dcl.spec/dcl.type/dcl.spec.auto/p6.cpp"]={"clang/test/CXX/dcl/dcl.spec/dcl.type/dcl.spec.auto/p6.cpp:41:7: error: function with trailing return type must specify return type \'auto\', not \'Large auto\'"}
		}
	},
	["err_two_right_angle_brackets_need_space"]={
		[c]="err_two_right_angle_brackets_need_space",
		[d]="a space is required between consecutive right angle brackets (use \'> >\')",
		[e]="a space is required between consecutive right angle brackets (use \'> >\')",
		[f]=j,
		[g]="a space is required between consecutive right angle brackets \\(use \'\\> \\>\'\\)",
		[h]=a,
		[i]=I,
		[b]={Pb,1236199783,Qb,Fb},
		[k]={{"clang/lib/Parse/ParseTemplate.cpp",1204,"/// Parses a \'>\' at the end of a template list.\n///\n/// If this function encounters \'>>\', \'>>>\', \'>=\', or \'>>=\', it tries\n/// to determine if these tokens were supposed to be a \'>\' followed by\n/// \'>\', \'>>\', \'>=\', or \'>=\'. It emits an appropriate diagnostic if necessary.\n///\n/// \\param RAngleLoc the location of the consumed \'>\'.\n///\n/// \\param ConsumeLastToken if true, the \'>\' is consumed.\n///\n/// \\param ObjCGenericList if true, this is the \'>\' closing an Objective-C\n/// type parameter or type argument list, rather than a C++ template parameter\n/// or argument list.\n///\n/// \\returns true, if current token does not start with \'>\', false otherwise.\nbool Parser::ParseGreaterThanInTemplateList(SourceLocation LAngleLoc, SourceLocation &RAngleLoc, bool ConsumeLastToken, bool ObjCGenericList) {\n  // ...\n  // Diagnose this situation as appropriate.\n  if (!ObjCGenericList) {\n    // ...\n    unsigned DiagId = diag::err_two_right_angle_brackets_need_space;"}},
		[l]={
			["clang/test/CXX/temp/temp.param/p15.cpp"]={"clang/test/CXX/temp/temp.param/p15.cpp:6:8: error: a space is required between consecutive right angle brackets (use \'> >\')","clang/test/CXX/temp/temp.param/p15.cpp:8:12: error: a space is required between consecutive right angle brackets (use \'> >\')","clang/test/CXX/temp/temp.param/p15.cpp:9:5: error: a space is required between consecutive right angle brackets (use \'> >\')"}
		}
	},
	["err_type_attribute_wrong_type"]={
		[c]="err_type_attribute_wrong_type",
		[d]="\'%0\' only applies to %select{function|pointer|Objective-C object or block pointer}1 types; type here is %2",
		[e]={{nil,nil,{"\'A\' only applies to ",{F,"pointer","Objective-C object or block pointer"}," types; type here is C"}}},
		[f]=j,
		[g]="\'(.*?)\' only applies to (?:function|pointer|Objective\\-C object or block pointer) types; type here is (.*?)",
		[h]=a,
		[i]=m,
		[b]={mb,1625925174,lb,kb},
		[k]={{B,108,"/// diagnoseBadTypeAttribute - Diagnoses a type attribute which\n/// doesn\'t apply to the given type.\nstatic void diagnoseBadTypeAttribute(Sema &S, const ParsedAttr &attr, QualType type) {\n  // ...\n  S.Diag(loc, attr.isRegularKeywordAttribute() ? diag::err_type_attribute_wrong_type : diag::warn_type_attribute_wrong_type) << name << WhichType << type;"}},
		[l]={
			["clang/test/Parser/cxx0x-keyword-attributes.cpp"]={"clang/test/Parser/cxx0x-keyword-attributes.cpp:38:1: error: \'__arm_streaming\' only applies to function types; type here is \'int\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:39:5: error: \'__arm_streaming\' only applies to function types; type here is \'int\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:41:16: error: \'__arm_streaming\' only applies to function types; type here is \'int\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:42:7: error: \'__arm_streaming\' only applies to function types; type here is \'int *\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:43:7: error: \'__arm_streaming\' only applies to function types; type here is \'int &\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:44:8: error: \'__arm_streaming\' only applies to function types; type here is \'int &&\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:45:20: error: \'__arm_streaming\' only applies to function types; type here is \'int[1]\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:72:9: error: \'__arm_streaming\' only applies to function types; type here is \'class c\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:72:25: error: \'__arm_streaming\' only applies to function types; type here is \'class c\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:73:9: error: \'__arm_streaming\' only applies to function types; type here is \'class c\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:73:25: error: \'__arm_streaming\' only applies to function types; type here is \'class c\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:73:43: error: \'__arm_streaming\' only applies to function types; type here is \'class c\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:73:59: error: \'__arm_streaming\' only applies to function types; type here is \'class c\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:91:1: error: \'__arm_streaming\' only applies to function types; type here is \'struct with_init_declarators\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:95:3: error: \'__arm_streaming\' only applies to function types; type here is \'struct with_init_declarators\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:107:14: error: \'__arm_streaming\' only applies to function types; type here is \'int\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:109:37: error: \'__arm_streaming\' only applies to function types; type here is \'int\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:109:53: error: \'__arm_streaming\' only applies to function types; type here is \'int\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:109:1: error: \'__arm_streaming\' only applies to function types; type here is \'int\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:109:17: error: \'__arm_streaming\' only applies to function types; type here is \'int\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:109:80: error: \'__arm_streaming\' only applies to function types; type here is \'int\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:109:96: error: \'__arm_streaming\' only applies to function types; type here is \'int\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:135:7: error: \'__arm_streaming\' only applies to function types; type here is \'int\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:135:34: error: \'__arm_streaming\' only applies to function types; type here is \'int\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:140:9: error: \'__arm_streaming\' only applies to function types; type here is \'int\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:141:30: error: \'__arm_streaming\' only applies to function types; type here is \'T\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:162:9: error: \'__arm_streaming\' only applies to function types; type here is \'int\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:166:30: error: \'__arm_streaming\' only applies to function types; type here is \'int\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:167:41: error: \'__arm_streaming\' only applies to function types; type here is \'struct struct_attr\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:212:15: error: \'__arm_streaming\' only applies to function types; type here is \'void\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:238:29: error: \'__arm_streaming\' only applies to function types; type here is \'int\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:238:52: error: \'__arm_streaming\' only applies to function types; type here is \'int\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:240:26: error: \'__arm_streaming\' only applies to function types; type here is \'int\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:248:32: error: \'__arm_streaming\' only applies to function types; type here is \'int[5]\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:253:7: error: \'__arm_streaming\' only applies to function types; type here is \'bool\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:254:13: error: \'__arm_streaming\' only applies to function types; type here is \'int\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:256:12: error: \'__arm_streaming\' only applies to function types; type here is \'int\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:256:39: error: \'__arm_streaming\' only applies to function types; type here is \'char\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:266:10: error: \'__arm_streaming\' only applies to function types; type here is \'bool\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:273:8: error: \'__arm_streaming\' only applies to function types; type here is \'int\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:283:37: error: \'__arm_streaming\' only applies to function types; type here is \'unsigned int\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:285:39: error: \'__arm_streaming\' only applies to function types; type here is \'unsigned long\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:287:29: error: \'__arm_streaming\' only applies to function types; type here is \'int\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:287:5: error: \'__arm_streaming\' only applies to function types; type here is \'int\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:292:5: error: \'__arm_streaming\' only applies to function types; type here is \'int\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:294:6: error: \'__arm_streaming\' only applies to function types; type here is \'int\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:313:10: error: \'__arm_streaming\' only applies to function types; type here is \'int\'","clang/test/Parser/cxx0x-keyword-attributes.cpp:318:15: error: \'__arm_streaming\' only applies to function types; type here is \'int\'"}
		}
	},
	["err_type_available_only_in_default_eval_method"]={
		[c]="err_type_available_only_in_default_eval_method",
		[d]="cannot use type \'%0\' within \'#pragma clang fp eval_method\'; type is set according to the default eval method for the translation unit",
		[e]="cannot use type \'A\' within \'#pragma clang fp eval_method\'; type is set according to the default eval method for the translation unit",
		[f]=j,
		[g]="cannot use type \'(.*?)\' within \'\\#pragma clang fp eval_method\'; type is set according to the default eval method for the translation unit",
		[h]=a,
		[i]=z,
		[b]={mb,1625925174,lb,kb},
		[k]={{n,384,"/// 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 (D->hasAttr<AvailableOnlyInDefaultEvalMethodAttr>()) {\n    if (getLangOpts().getFPEvalMethod() != LangOptions::FPEvalMethodKind::FEM_UnsetOnCommandLine && PP.getLastFPEvalPragmaLocation().isValid() && PP.getCurrentFPEvalMethod() != getLangOpts().getFPEvalMethod())\n      Diag(D->getLocation(), diag::err_type_available_only_in_default_eval_method) << D->getName();"}},
		[l]={
			["clang/test/Sema/fp-eval-pragma-with-float-double_t-1.c"]={Ab,ub,Ab,ub,Ab,ub,Ab,ub,Ab,ub,Ab,ub,Ab,ub,Ab,ub,Ab,ub}
		}
	},
	["err_type_constraint_missing_arguments"]={
		[c]={{nil,t,"err_type_constraint_missing_arguments"}},
		[d]={{nil,t,"%0 requires more than 1 template argument; provide the remaining arguments explicitly to use it here"}},
		[e]={{nil,t,"A requires more than 1 template argument; provide the remaining arguments explicitly to use it here"}},
		[f]=j,
		[g]="(.*?) requires more than 1 template argument; provide the remaining arguments explicitly to use it here",
		[h]=a,
		[i]={{nil,t,m}},
		[b]={"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"},
		[k]={{o,1130,"bool Sema::CheckTypeConstraint(TemplateIdAnnotation *TypeConstr) {\n  // ...\n  if (!WereArgsSpecified && CD->getTemplateParameters()->getMinRequiredArguments() > 1) {\n    Diag(TypeConstr->TemplateNameLoc, diag::err_type_constraint_missing_arguments) << CD;"}},
		[l]={
			["clang/test/Parser/cxx2a-placeholder-type-constraint.cpp"]={"clang/test/Parser/cxx2a-placeholder-type-constraint.cpp:65:15: error: \'C1\' requires more than 1 template argument; provide the remaining arguments explicitly to use it here","clang/test/Parser/cxx2a-placeholder-type-constraint.cpp:66:10: error: \'C1\' requires more than 1 template argument; provide the remaining arguments explicitly to use it here","clang/test/Parser/cxx2a-placeholder-type-constraint.cpp:67:3: error: \'C1\' requires more than 1 template argument; provide the remaining arguments explicitly to use it here","clang/test/Parser/cxx2a-placeholder-type-constraint.cpp:68:3: error: \'C1\' requires more than 1 template argument; provide the remaining arguments explicitly to use it here"}
		}
	},
	["err_type_constraint_non_type_concept"]={
		[c]={{nil,t,"err_type_constraint_non_type_concept"}},
		[d]={{nil,t,"concept named in type constraint is not a type concept"}},
		[e]={{nil,t,"concept named in type constraint is not a type concept"}},
		[f]=j,
		[g]="concept named in type constraint is not a type concept",
		[h]=a,
		[i]={{nil,t,m}},
		[b]={"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"},
		[k]={{o,1121,"bool Sema::CheckTypeConstraint(TemplateIdAnnotation *TypeConstr) {\n  // ...\n  // C++2a [temp.param]p4:\n  //     [...] The concept designated by a type-constraint shall be a type\n  //     concept ([temp.concept]).\n  if (!CD->isTypeConcept()) {\n    Diag(TypeConstr->TemplateNameLoc, diag::err_type_constraint_non_type_concept);"}},
		[l]={
			["clang/test/Parser/cxx2a-placeholder-type-constraint.cpp"]={"clang/test/Parser/cxx2a-placeholder-type-constraint.cpp:55:15: error: concept named in type constraint is not a type concept","clang/test/Parser/cxx2a-placeholder-type-constraint.cpp:56:10: error: concept named in type constraint is not a type concept","clang/test/Parser/cxx2a-placeholder-type-constraint.cpp:57:3: error: concept named in type constraint is not a type concept","clang/test/Parser/cxx2a-placeholder-type-constraint.cpp:58:3: error: concept named in type constraint is not a type concept"}
		}
	},
	["err_type_defined_in_alias_template"]={
		[c]="err_type_defined_in_alias_template",
		[d]="%0 cannot be defined in a type alias template",
		[e]="A cannot be defined in a type alias template",
		[f]=j,
		[g]="(.*?) cannot be defined in a type alias template",
		[h]=a,
		[i]=m,
		[b]={"3f1b5d077b7e",1304632627,"Implement support for C++0x alias templates.","Implement support for C++0x alias templates.\n\nllvm-svn: 130953"},
		[k]={{B,3782,"static QualType GetDeclSpecTypeForDeclarator(TypeProcessingState &state, TypeSourceInfo *&ReturnTypeInfo) {\n  // ...\n  if (SemaRef.getLangOpts().CPlusPlus && OwnedTagDecl && OwnedTagDecl->isCompleteDefinition()) {\n    // ...\n    case DeclaratorContext::AliasTemplate:\n      DiagID = diag::err_type_defined_in_alias_template;"}},
		[l]={
			["clang/test/CXX/dcl.dcl/dcl.spec/dcl.type/p3-0x.cpp"]={"clang/test/CXX/dcl.dcl/dcl.spec/dcl.type/p3-0x.cpp:5:32: error: \'(unnamed struct at clang/test/CXX/dcl.dcl/dcl.spec/dcl.type/p3-0x.cpp:5:32)\' cannot be defined in a type alias template"}
		}
	},
	["err_type_defined_in_condition"]={
		[c]="err_type_defined_in_condition",
		[d]="%0 cannot be defined in a condition",
		[e]="A cannot be defined in a condition",
		[f]=j,
		[g]="(.*?) cannot be defined in a condition",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{B,3810,"static QualType GetDeclSpecTypeForDeclarator(TypeProcessingState &state, TypeSourceInfo *&ReturnTypeInfo) {\n  // ...\n  if (SemaRef.getLangOpts().CPlusPlus && OwnedTagDecl && OwnedTagDecl->isCompleteDefinition()) {\n    // ...\n    case DeclaratorContext::Condition:\n      // ...\n      DiagID = diag::err_type_defined_in_condition;"}},
		[l]={
			["clang/test/SemaCXX/condition.cpp"]={"clang/test/SemaCXX/condition.cpp:20:17: error: \'S\' cannot be defined in a condition","clang/test/SemaCXX/condition.cpp:21:10: error: \'(unnamed struct at clang/test/SemaCXX/condition.cpp:21:10)\' cannot be defined in a condition","clang/test/SemaCXX/condition.cpp:22:11: error: \'(unnamed enum at clang/test/SemaCXX/condition.cpp:22:11)\' cannot be defined in a condition","clang/test/SemaCXX/condition.cpp:64:14: error: \'S\' cannot be defined in a condition"}
		}
	},
	["err_type_defined_in_enum"]={
		[c]={{nil,x,"err_type_defined_in_enum"}},
		[d]={{nil,x,"%0 cannot be defined in an enumeration"}},
		[e]={{nil,x,"A cannot be defined in an enumeration"}},
		[f]=j,
		[g]="(.*?) cannot be defined in an enumeration",
		[h]=a,
		[i]={{nil,x,m}},
		[b]={"8b0bbc6fe03b",1505505102,"[Sema] Error out early for tags defined inside an enumeration.","[Sema] Error out early for tags defined inside an enumeration.\n\nThis fixes PR28903 by avoiding access check for inner enum constant. We\nare performing access check because one enum constant references another\nand because enum is defined in CXXRecordDecl. But access check doesn\'t\nwork because FindDeclaringClass doesn\'t expect more than one EnumDecl\nand because inner enum has access AS_none due to not being an immediate\nchild of a record.\n\nThe change detects an enum is defined in wrong place and allows to skip\nparsing its body. Access check is skipped together with body parsing.\nThere was no crash in C, added test case to cover the new error.\n\nrdar://problem/28530809\n\nReviewers: rnk, doug.gregor, rsmith\n\nReviewed By: doug.gregor\n\nSubscribers: cfe-commits\n\nDifferential Revision: https://reviews.llvm.org/D37089\n\nllvm-svn: 313386"},
		[k]={{v,17563,"CreateNewDecl:\n  // ...\n  if (!Invalid && getLangOpts().CPlusPlus && TUK == TUK_Definition && DC->getDeclKind() == Decl::Enum) {\n    Diag(New->getLocation(), diag::err_type_defined_in_enum) << Context.getTagDeclType(New);"}},
		[l]={
			["clang/test/SemaCXX/enum.cpp"]={"clang/test/SemaCXX/enum.cpp:123:18: error: \'PR28903::(unnamed enum at clang/test/SemaCXX/enum.cpp:123:18)\' cannot be defined in an enumeration"}
		}
	},
	["err_type_defined_in_for_range"]={
		[c]="err_type_defined_in_for_range",
		[d]="types may not be defined in a for range declaration",
		[e]="types may not be defined in a for range declaration",
		[f]=j,
		[g]="types may not be defined in a for range declaration",
		[h]=a,
		[i]=m,
		[b]={"02e85f3bc5fc",1302818966,"Add support for C++0x\'s range-based for loops, as specified by the C++11 draft standard (N3291).","Add support for C++0x\'s range-based for loops, as specified by the C++11 draft standard (N3291).\n\nllvm-svn: 129541"},
		[k]={{Ib,2504,"/// ActOnCXXForRangeStmt - Check and build a C++11 for-range statement.\n///\n/// C++11 [stmt.ranged]:\n///   A range-based for statement is equivalent to\n///\n///   {\n///     auto && __range = range-init;\n///     for ( auto __begin = begin-expr,\n///           __end = end-expr;\n///           __begin != __end;\n///           ++__begin ) {\n///       for-range-declaration = *__begin;\n///       statement\n///     }\n///   }\n///\n/// The body of the loop is not available yet, since it cannot be analysed until\n/// we have determined the type of the for-range-declaration.\nStmtResult Sema::ActOnCXXForRangeStmt(Scope *S, SourceLocation ForLoc, SourceLocation CoawaitLoc, Stmt *InitStmt, Stmt *First, SourceLocation ColonLoc, Expr *Range, SourceLocation RParenLoc, BuildForRangeKind Kind) {\n  // ...\n  if (!DS->isSingleDecl()) {\n    Diag(DS->getBeginLoc(), diag::err_type_defined_in_for_range);"}},
		[l]={
			["clang/test/CXX/dcl.dcl/dcl.spec/dcl.type/p3-0x.cpp"]={"clang/test/CXX/dcl.dcl/dcl.spec/dcl.type/p3-0x.cpp:18:8: error: types may not be defined in a for range declaration","clang/test/CXX/dcl.dcl/dcl.spec/dcl.type/p3-0x.cpp:21:8: error: types may not be defined in a for range declaration"}
		}
	},
	["err_type_defined_in_param_type"]={
		[c]="err_type_defined_in_param_type",
		[d]="%0 cannot be defined in a parameter type",
		[e]="A cannot be defined in a parameter type",
		[f]=j,
		[g]="(.*?) cannot be defined in a parameter type",
		[h]=a,
		[i]=m,
		[b]={"d6ab8744dc68",1243553519,"When we parse a tag specifier, keep track of whether that tag","When we parse a tag specifier, keep track of whether that tag\nspecifier resulted in the creation of a new TagDecl node, which\nhappens either when the tag specifier was a definition or when the tag\nspecifier was the first declaration of that tag type. This information\nhas several uses, the first of which is implemented in this commit:\n\n  1) In C++, one is not allowed to define tag types within a type\n  specifier (e.g., static_cast<struct S { int x; } *>(0) is\n  ill-formed) or within the result or parameter types of a\n  function. We now diagnose this.\n\n  2) We can extend DeclGroups to contain information about any tags\n  that are declared/defined within the declaration specifiers of a\n  variable, e.g.,\n\n    struct Point { int x, y, z; } p;\n\n  This will help improve AST printing and template instantiation,\n  among other things.\n\n  3) For C99, we can keep track of whether a tag type is defined\n  within the type of a parameter, to properly cope with cases like,\n  e.g.,\n\n    int bar(struct T2 { int x; } y) {\n      struct T2 z;\n    }\n\n  We can also do similar things wherever there is a type specifier,\n  e.g., to keep track of where the definition of S occurs in this\n  legal C99 code:\n\n    (struct S { int x, y; } *)0\n\n  \n\nllvm-svn: 72555"},
		[k]={{v,17629,"CreateNewDecl:\n  // ...\n  // If we\'re declaring or defining a tag in function prototype scope in C,\n  // note that this type can only be used within the function and add it to\n  // the list of decls to inject into the function definition scope.\n  if ((Name || Kind == TTK_Enum) && getNonFieldDeclScope(S)->isFunctionPrototypeScope()) {\n    if (getLangOpts().CPlusPlus) {\n      // C++ [dcl.fct]p6:\n      //   Types shall not be defined in return or parameter types.\n      if (TUK == TUK_Definition && !IsTypeSpecifier) {\n        Diag(Loc, diag::err_type_defined_in_param_type) << Name;"},{B,3804,"static QualType GetDeclSpecTypeForDeclarator(TypeProcessingState &state, TypeSourceInfo *&ReturnTypeInfo) {\n  // ...\n  if (SemaRef.getLangOpts().CPlusPlus && OwnedTagDecl && OwnedTagDecl->isCompleteDefinition()) {\n    // ...\n    case DeclaratorContext::Prototype:\n    case DeclaratorContext::LambdaExprParameter:\n    case DeclaratorContext::ObjCParameter:\n    case DeclaratorContext::ObjCResult:\n    case DeclaratorContext::KNRTypeList:\n    case DeclaratorContext::RequiresExpr:\n      // ...\n      DiagID = diag::err_type_defined_in_param_type;"}},
		[l]={
			["clang/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p8.cpp"]={"clang/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p8.cpp:4:7: error: (null) cannot be defined in a parameter type","clang/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p8.cpp:5:11: error: (null) cannot be defined in a parameter type"}
		}
	},
	["err_type_defined_in_result_type"]={
		[c]="err_type_defined_in_result_type",
		[d]="%0 cannot be defined in the result type of a function",
		[e]="A cannot be defined in the result type of a function",
		[f]=j,
		[g]="(.*?) cannot be defined in the result type of a function",
		[h]=a,
		[i]=m,
		[b]={"d6ab8744dc68",1243553519,"When we parse a tag specifier, keep track of whether that tag","When we parse a tag specifier, keep track of whether that tag\nspecifier resulted in the creation of a new TagDecl node, which\nhappens either when the tag specifier was a definition or when the tag\nspecifier was the first declaration of that tag type. This information\nhas several uses, the first of which is implemented in this commit:\n\n  1) In C++, one is not allowed to define tag types within a type\n  specifier (e.g., static_cast<struct S { int x; } *>(0) is\n  ill-formed) or within the result or parameter types of a\n  function. We now diagnose this.\n\n  2) We can extend DeclGroups to contain information about any tags\n  that are declared/defined within the declaration specifiers of a\n  variable, e.g.,\n\n    struct Point { int x, y, z; } p;\n\n  This will help improve AST printing and template instantiation,\n  among other things.\n\n  3) For C99, we can keep track of whether a tag type is defined\n  within the type of a parameter, to properly cope with cases like,\n  e.g.,\n\n    int bar(struct T2 { int x; } y) {\n      struct T2 z;\n    }\n\n  We can also do similar things wherever there is a type specifier,\n  e.g., to keep track of where the definition of S occurs in this\n  legal C99 code:\n\n    (struct S { int x, y; } *)0\n\n  \n\nllvm-svn: 72555"},
		[k]={{B,5411,"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      if (LangOpts.CPlusPlus && D.getDeclSpec().hasTagDefinition()) {\n        // ...\n        S.Diag(Tag->getLocation(), diag::err_type_defined_in_result_type) << Context.getTypeDeclType(Tag);"}},
		[l]={
			["clang/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p8.cpp"]={"clang/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p8.cpp:7:1: error: \'(unnamed enum at clang/test/CXX/dcl.decl/dcl.meaning/dcl.fct/p8.cpp:7:1)\' cannot be defined in the result type of a function"}
		}
	},
	["err_type_defined_in_type_specifier"]={
		[c]="err_type_defined_in_type_specifier",
		[d]="%0 cannot be defined in a type specifier",
		[e]="A cannot be defined in a type specifier",
		[f]=j,
		[g]="(.*?) cannot be defined in a type specifier",
		[h]=a,
		[i]=m,
		[b]={"d6ab8744dc68",1243553519,"When we parse a tag specifier, keep track of whether that tag","When we parse a tag specifier, keep track of whether that tag\nspecifier resulted in the creation of a new TagDecl node, which\nhappens either when the tag specifier was a definition or when the tag\nspecifier was the first declaration of that tag type. This information\nhas several uses, the first of which is implemented in this commit:\n\n  1) In C++, one is not allowed to define tag types within a type\n  specifier (e.g., static_cast<struct S { int x; } *>(0) is\n  ill-formed) or within the result or parameter types of a\n  function. We now diagnose this.\n\n  2) We can extend DeclGroups to contain information about any tags\n  that are declared/defined within the declaration specifiers of a\n  variable, e.g.,\n\n    struct Point { int x, y, z; } p;\n\n  This will help improve AST printing and template instantiation,\n  among other things.\n\n  3) For C99, we can keep track of whether a tag type is defined\n  within the type of a parameter, to properly cope with cases like,\n  e.g.,\n\n    int bar(struct T2 { int x; } y) {\n      struct T2 z;\n    }\n\n  We can also do similar things wherever there is a type specifier,\n  e.g., to keep track of where the definition of S occurs in this\n  legal C99 code:\n\n    (struct S { int x, y; } *)0\n\n  \n\nllvm-svn: 72555"},
		[k]={{v,17556,"CreateNewDecl:\n  // ...\n  // C++11 [dcl.type]p3:\n  //   A type-specifier-seq shall not define a class or enumeration [...].\n  if (!Invalid && getLangOpts().CPlusPlus && (IsTypeSpecifier || IsTemplateParamOrArg) && TUK == TUK_Definition) {\n    Diag(New->getLocation(), diag::err_type_defined_in_type_specifier) << Context.getTagDeclType(New);"},{B,3794,"static QualType GetDeclSpecTypeForDeclarator(TypeProcessingState &state, TypeSourceInfo *&ReturnTypeInfo) {\n  // ...\n  if (SemaRef.getLangOpts().CPlusPlus && OwnedTagDecl && OwnedTagDecl->isCompleteDefinition()) {\n    // ...\n    case DeclaratorContext::TypeName:\n    case DeclaratorContext::FunctionalCast:\n    case DeclaratorContext::ConversionId:\n    case DeclaratorContext::TemplateParam:\n    case DeclaratorContext::CXXNew:\n    case DeclaratorContext::CXXCatch:\n    case DeclaratorContext::ObjCCatch:\n    case DeclaratorContext::TemplateArg:\n    case DeclaratorContext::TemplateTypeArg:\n    case DeclaratorContext::Association:\n      DiagID = diag::err_type_defined_in_type_specifier;"}},
		[l]={
			["clang/test/SemaCXX/PR16677.cpp"]={"clang/test/SemaCXX/PR16677.cpp:11:7: error: \'Derived\' cannot be defined in a type specifier"}
		}
	},
	["err_type_mismatch_continuation_class"]={
		[c]="err_type_mismatch_continuation_class",
		[d]="type of property %0 in class extension does not match property type in primary class",
		[e]="type of property A in class extension does not match property type in primary class",
		[f]=j,
		[g]="type of property (.*?) in class extension does not match property type in primary class",
		[h]=a,
		[i]=m,
		[b]={"22b405c7aa40",1322505507,"objc: turn warning for property type mismatch in ","objc: turn warning for property type mismatch in \nprimary and its continuation class into error.\n// rdar://10142679\n\nllvm-svn: 145255"},
		[k]={{Tb,544,"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  if (!Context.hasSameType(PIDecl->getType(), PDecl->getType())) {\n    // ...\n    if (!isa<ObjCObjectPointerType>(PrimaryClassPropertyT) || !isa<ObjCObjectPointerType>(ClassExtPropertyT) || (!isObjCPointerConversion(ClassExtPropertyT, PrimaryClassPropertyT, ConvertedType, IncompatibleObjC)) || IncompatibleObjC) {\n      Diag(AtLoc, diag::err_type_mismatch_continuation_class) << PDecl->getType();"}},
		[l]={
			["clang/test/SemaObjC/continuation-class-property.m"]={"clang/test/SemaObjC/continuation-class-property.m:41:1: error: type of property \'NSString *\' in class extension does not match property type in primary class","clang/test/SemaObjC/continuation-class-property.m:42:1: error: type of property \'NSRect\' in class extension does not match property type in primary class"}
		}
	},
	["err_type_pack_element_out_of_bounds"]={
		[c]="err_type_pack_element_out_of_bounds",
		[d]="a parameter pack may not be accessed at an out of bounds index",
		[e]="a parameter pack may not be accessed at an out of bounds index",
		[f]=j,
		[g]="a parameter pack may not be accessed at an out of bounds index",
		[h]=a,
		[i]=m,
		[b]={"6ad68551c3fb",1467336249,"[Feature] Add a builtin for indexing into parameter packs. Patch by Louis Dionne.","[Feature] Add a builtin for indexing into parameter packs. Patch by Louis Dionne.\n\nThis patch adds a __nth_element builtin that allows fetching the n-th type of a\nparameter pack with very little compile-time overhead. The patch was inspired by\nr252036 and r252115 by David Majnemer, which add a similar __make_integer_seq\nbuiltin for efficiently creating a std::integer_sequence.\n\nReviewed as D15421. http://reviews.llvm.org/D15421\n\nllvm-svn: 274316"},
		[k]={{o,3717,"static QualType checkBuiltinTemplateIdType(Sema &SemaRef, BuiltinTemplateDecl *BTD, ArrayRef<TemplateArgument> Converted, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs) {\n  // ...\n  case BTK__type_pack_element:\n    // ...\n    // If the Index is out of bounds, the program is ill-formed.\n    if (Index >= Ts.pack_size()) {\n      SemaRef.Diag(TemplateArgs[0].getLocation(), diag::err_type_pack_element_out_of_bounds);"}},
		[l]={
			["clang/test/SemaCXX/type_pack_element.cpp"]={"clang/test/SemaCXX/type_pack_element.cpp:44:51: error: a parameter pack may not be accessed at an out of bounds index"}
		}
	},
	["err_type_safety_unknown_flag"]={
		[c]="err_type_safety_unknown_flag",
		[d]="invalid comparison flag %0; use \'layout_compatible\' or \'must_be_null\'",
		[e]="invalid comparison flag A; use \'layout_compatible\' or \'must_be_null\'",
		[f]=j,
		[g]="invalid comparison flag (.*?); use \'layout_compatible\' or \'must_be_null\'",
		[h]=a,
		[i]=I,
		[b]={"e4a5a90e8d6b",1345162118,"Add support for \"type safety\" attributes that allow checking that \'void *\'","Add support for \"type safety\" attributes that allow checking that \'void *\'\nfunction arguments and arguments for variadic functions are of a particular\ntype which is determined by some other argument to the same function call.\n\nUsecases include:\n* MPI library implementations, where these attributes enable checking that\n  buffer type matches the passed MPI_Datatype;\n* for HDF5 library there is a similar usecase as MPI;\n* checking types of variadic functions\' arguments for functions like\n  fcntl() and ioctl().\n\nllvm-svn: 162067"},
		[k]={{rb,1639,"void Parser::ParseTypeTagForDatatypeAttribute(IdentifierInfo &AttrName, SourceLocation AttrNameLoc, ParsedAttributes &Attrs, SourceLocation *EndLoc, IdentifierInfo *ScopeName, SourceLocation ScopeLoc, ParsedAttr::Form Form) {\n  // ...\n  while (TryConsumeToken(tok::comma)) {\n    // ...\n    if (Flag->isStr(\"layout_compatible\"))\n    // ...\n    else if (Flag->isStr(\"must_be_null\"))\n    // ...\n    else {\n      Diag(Tok, diag::err_type_safety_unknown_flag) << Flag;"}},
		[l]={
			["clang/test/Sema/attr-type-safety.c"]={"clang/test/Sema/attr-type-safety.c:15:72: error: invalid comparison flag \'not_a_flag\'; use \'layout_compatible\' or \'must_be_null\'","clang/test/Sema/attr-type-safety.c:17:90: error: invalid comparison flag \'not_a_flag\'; use \'layout_compatible\' or \'must_be_null\'"}
		}
	},
	["err_type_tag_for_datatype_not_ice"]={
		[c]="err_type_tag_for_datatype_not_ice",
		[d]="\'type_tag_for_datatype\' attribute requires the initializer to be an %select{integer|integral}0 constant expression",
		[e]={{nil,nil,{"\'type_tag_for_datatype\' attribute requires the initializer to be an ",{"integer","integral"}," constant expression"}}},
		[f]=j,
		[g]="\'type_tag_for_datatype\' attribute requires the initializer to be an (?:integer|integral) constant expression",
		[h]=a,
		[i]=m,
		[b]={"e4a5a90e8d6b",1345162118,"Add support for \"type safety\" attributes that allow checking that \'void *\'","Add support for \"type safety\" attributes that allow checking that \'void *\'\nfunction arguments and arguments for variadic functions are of a particular\ntype which is determined by some other argument to the same function call.\n\nUsecases include:\n* MPI library implementations, where these attributes enable checking that\n  buffer type matches the passed MPI_Datatype;\n* for HDF5 library there is a similar usecase as MPI;\n* checking types of variadic functions\' arguments for functions like\n  fcntl() and ioctl().\n\nllvm-svn: 162067"},
		[k]={{v,14508,"/// FinalizeDeclaration - called by ParseDeclarationAfterDeclarator to perform\n/// any semantic actions necessary after any initializer has been attached.\nvoid Sema::FinalizeDeclaration(Decl *ThisDecl) {\n  // ...\n  for (const auto *I : ThisDecl->specific_attrs<TypeTagForDatatypeAttr>()) {\n    // ...\n    if (!(MagicValueInt = MagicValueExpr->getIntegerConstantExpr(Context))) {\n      Diag(I->getRange().getBegin(), diag::err_type_tag_for_datatype_not_ice) << LangOpts.CPlusPlus << MagicValueExpr->getSourceRange();"}},
		[l]={
			["clang/test/Sema/warn-type-safety.cpp"]={"clang/test/Sema/warn-type-safety.cpp:16:45: error: \'type_tag_for_datatype\' attribute requires the initializer to be an integral constant expression"}
		}
	},
	["err_type_tag_for_datatype_too_large"]={
		[c]="err_type_tag_for_datatype_too_large",
		[d]="\'type_tag_for_datatype\' attribute requires the initializer to be an %select{integer|integral}0 constant expression that can be represented by a 64 bit integer",
		[e]={{nil,nil,{"\'type_tag_for_datatype\' attribute requires the initializer to be an ",{"integer","integral"}," constant expression that can be represented by a 64 bit integer"}}},
		[f]=j,
		[g]="\'type_tag_for_datatype\' attribute requires the initializer to be an (?:integer|integral) constant expression that can be represented by a 64 bit integer",
		[h]=a,
		[i]=m,
		[b]={"e4a5a90e8d6b",1345162118,"Add support for \"type safety\" attributes that allow checking that \'void *\'","Add support for \"type safety\" attributes that allow checking that \'void *\'\nfunction arguments and arguments for variadic functions are of a particular\ntype which is determined by some other argument to the same function call.\n\nUsecases include:\n* MPI library implementations, where these attributes enable checking that\n  buffer type matches the passed MPI_Datatype;\n* for HDF5 library there is a similar usecase as MPI;\n* checking types of variadic functions\' arguments for functions like\n  fcntl() and ioctl().\n\nllvm-svn: 162067"},
		[k]={{v,14514,"/// FinalizeDeclaration - called by ParseDeclarationAfterDeclarator to perform\n/// any semantic actions necessary after any initializer has been attached.\nvoid Sema::FinalizeDeclaration(Decl *ThisDecl) {\n  // ...\n  for (const auto *I : ThisDecl->specific_attrs<TypeTagForDatatypeAttr>()) {\n    // ...\n    if (MagicValueInt->getActiveBits() > 64) {\n      Diag(I->getRange().getBegin(), diag::err_type_tag_for_datatype_too_large) << LangOpts.CPlusPlus << MagicValueExpr->getSourceRange();"}}
	},
	["err_type_trait_arity"]={
		[c]="err_type_trait_arity",
		[d]="type trait requires %0%select{| or more}1 argument%select{|s}2; have %3 argument%s3",
		[e]={{nil,nil,{"type trait requires A",{a," or more"}," argument",{a,kc},"; have D argumentD"}}},
		[f]=j,
		[g]="type trait requires (.*?)(?:| or more) argument(?:|s); have (.*?) argument(.*?)",
		[h]=a,
		[i]=I,
		[b]={"29c42f2a25d6",1330069114,"Implement a new type trait __is_trivially_constructible(T, Args...)","Implement a new type trait __is_trivially_constructible(T, Args...)\nthat provides the behavior of the C++11 library trait\nstd::is_trivially_constructible<T, Args...>, which can\'t be\nimplemented purely as a library.\n\nSince __is_trivially_constructible can have zero or more arguments, I\nneeded to add Yet Another Type Trait Expression Class, this one\nhandling arbitrary arguments. The next step will be to migrate\nUnaryTypeTrait and BinaryTypeTrait over to this new, more general\nTypeTrait class.\n\nFixes the Clang side of <rdar://problem/10895483> / PR12038.\n\nllvm-svn: 151352"},
		[k]={{G,5565,"bool Sema::CheckTypeTraitArity(unsigned Arity, SourceLocation Loc, size_t N) {\n  if (Arity && N != Arity) {\n    Diag(Loc, diag::err_type_trait_arity) << Arity << 0 << (Arity > 1) << (int)N << SourceRange(Loc);"},{G,5571,"bool Sema::CheckTypeTraitArity(unsigned Arity, SourceLocation Loc, size_t N) {\n  // ...\n  if (!Arity && N == 0) {\n    Diag(Loc, diag::err_type_trait_arity) << 1 << 1 << 1 << (int)N << SourceRange(Loc);"}},
		[l]={
			["clang/test/SemaCXX/type-trait-eval-crash-issue-57008.cpp"]={"clang/test/SemaCXX/type-trait-eval-crash-issue-57008.cpp:5:32: error: type trait requires 1 or more arguments; have 0 arguments"}
		}
	},
	["err_type_unsupported"]={
		[c]="err_type_unsupported",
		[d]="%0 is not supported on this target",
		[e]="A is not supported on this target",
		[f]=j,
		[g]="(.*?) is not supported on this target",
		[h]=a,
		[i]=m,
		[b]={"50f29e06a1b6",1460540985,"Enable support for __float128 in Clang","Enable support for __float128 in Clang\n\nThis patch corresponds to review:\nhttp://reviews.llvm.org/D15120\n\nIt adds support for the __float128 keyword, literals and a target feature to\nenable it. This support is disabled by default on all targets and any target\nthat has support for this type is free to add it.\n\nBased on feedback that I\'ve received from target maintainers, this appears to\nbe the right thing for most targets. I have not heard from the maintainers of\nX86 which I believe supports this type. I will subsequently investigate the\nimpact of enabling this on X86.\n\nllvm-svn: 266186"},
		[k]={{B,1447,"/// 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_bitint: {\n    if (!S.Context.getTargetInfo().hasBitIntType())\n      S.Diag(DS.getTypeSpecTypeLoc(), diag::err_type_unsupported) << \"_BitInt\";"},{B,1507,"/// 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_int128:\n    if (!S.Context.getTargetInfo().hasInt128Type() && !(S.getLangOpts().SYCLIsDevice || S.getLangOpts().CUDAIsDevice || (S.getLangOpts().OpenMP && S.getLangOpts().OpenMPIsTargetDevice)))\n      S.Diag(DS.getTypeSpecTypeLoc(), diag::err_type_unsupported) << \"__int128\";"},{B,1520,"/// 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_float16:\n    // CUDA host and device may have different _Float16 support, therefore\n    // do not diagnose _Float16 usage to avoid false alarm.\n    // ToDo: more precise diagnostics for CUDA.\n    if (!S.Context.getTargetInfo().hasFloat16Type() && !S.getLangOpts().CUDA && !(S.getLangOpts().OpenMP && S.getLangOpts().OpenMPIsTargetDevice))\n      S.Diag(DS.getTypeSpecTypeLoc(), diag::err_type_unsupported) << \"_Float16\";"},{B,1529,"/// 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_BFloat16:\n    if (!S.Context.getTargetInfo().hasBFloat16Type() && !(S.getLangOpts().OpenMP && S.getLangOpts().OpenMPIsTargetDevice) && !S.getLangOpts().SYCLIsDevice)\n      S.Diag(DS.getTypeSpecTypeLoc(), diag::err_type_unsupported) << \"__bf16\";"},{B,1553,"/// 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_float128:\n    if (!S.Context.getTargetInfo().hasFloat128Type() && !S.getLangOpts().SYCLIsDevice && !(S.getLangOpts().OpenMP && S.getLangOpts().OpenMPIsTargetDevice))\n      S.Diag(DS.getTypeSpecTypeLoc(), diag::err_type_unsupported) << \"__float128\";"},{B,1561,"/// 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_ibm128:\n    if (!S.Context.getTargetInfo().hasIbm128Type() && !S.getLangOpts().SYCLIsDevice && !(S.getLangOpts().OpenMP && S.getLangOpts().OpenMPIsTargetDevice))\n      S.Diag(DS.getTypeSpecTypeLoc(), diag::err_type_unsupported) << \"__ibm128\";"}}
	},
	["err_typecheck_address_of"]={
		[c]="err_typecheck_address_of",
		[d]={{nil,u,"address of %select{bit-field|vector element|property expression|register variable|matrix element}0 requested"},{t,nil,"address of %select{bit-field|vector element|property expression|register variable}0 requested"}},
		[e]={{nil,u,{"address of ",{"bit-field","vector element","property expression","register variable","matrix element"}," requested"}},{t,nil,{"address of ",{"bit-field","vector element","property expression","register variable"}," requested"}}},
		[f]=j,
		[g]="address of (?:bit\\-field|vector element|property expression|register variable|matrix element) requested",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{Hb,688,"#endif\n  // ...\n  if (Kind == CK_ArrayToPointerDecay) {\n    // ...\n    // C17 6.7.1p6 footnote 124: The implementation can treat any register\n    // declaration simply as an auto declaration. However, whether or not\n    // addressable storage is actually used, the address of any part of an\n    // object declared with storage-class specifier register cannot be\n    // computed, either explicitly(by use of the unary & operator as discussed\n    // in 6.5.3.2) or implicitly(by converting an array name to a pointer as\n    // discussed in 6.3.2.1).Thus, the only operator that can be applied to an\n    // array declared with storage-class specifier register is sizeof.\n    if (VK == VK_PRValue && !getLangOpts().CPlusPlus && !E->isPRValue()) {\n      if (const auto *DRE = dyn_cast<DeclRefExpr>(E)) {\n        if (const auto *VD = dyn_cast<VarDecl>(DRE->getDecl())) {\n          if (VD->getStorageClass() == SC_Register) {\n            Diag(E->getExprLoc(), diag::err_typecheck_address_of) << /*register variable*/ 3 << E->getSourceRange();"},{n,14861,"static void diagnoseAddressOfInvalidType(Sema &S, SourceLocation Loc, Expr *E, unsigned Type) { S.Diag(Loc, diag::err_typecheck_address_of) << Type << E->getSourceRange(); }"}},
		[l]={
			["clang/test/SemaObjC/property-expression-error.m"]={"clang/test/SemaObjC/property-expression-error.m:16:2: error: address of property expression requested"}
		}
	},
	["err_typecheck_addrof_dtor"]={
		[c]="err_typecheck_addrof_dtor",
		[d]="taking the address of a destructor",
		[e]="taking the address of a destructor",
		[f]=j,
		[g]="taking the address of a destructor",
		[h]=a,
		[i]=m,
		[b]={"915d169c6a73",1381398281,"Sema: Taking the address of a dtor is illegal per C++ [class.dtor]p2.","Sema: Taking the address of a dtor is illegal per C++ [class.dtor]p2.\n\nEmit a proper error instead of crashing in CodeGen. PR16892.\n\nllvm-svn: 192345"},
		[k]={{n,14994,"/// 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    // Taking the address of a dtor is illegal per C++ [class.dtor]p2.\n    if (isa<CXXDestructorDecl>(MD))\n      Diag(OpLoc, diag::err_typecheck_addrof_dtor) << op->getSourceRange();"}}
	},
	["err_typecheck_addrof_temporary"]={
		[c]="err_typecheck_addrof_temporary",
		[d]="taking the address of a temporary object of type %0",
		[e]="taking the address of a temporary object of type A",
		[f]=j,
		[g]="taking the address of a temporary object of type (.*?)",
		[h]=a,
		[i]=m,
		[b]={"c084bd288815",1359771285,"PR15132: Replace \"address expression must be an lvalue or a function","PR15132: Replace \"address expression must be an lvalue or a function\ndesignator\" diagnostic with more correct and more human-friendly \"cannot take\naddress of rvalue of type \'T\'\".\n\nFor the case of & &T::f, provide a custom diagnostic, rather than unhelpfully\nsaying \"cannot take address of rvalue of type \'<overloaded function type>\'\".\n\nFor the case of &array_temporary, treat it just like a class temporary\n(including allowing it as an extension); the existing diagnostic wording\nfor the class temporary case works fine.\n\nllvm-svn: 174262"},
		[k]={{n,14935,"/// 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    Diag(OpLoc, isSFINAEContext() ? diag::err_typecheck_addrof_temporary : diag::ext_typecheck_addrof_temporary) << op->getType() << op->getSourceRange();"}}
	},
	["err_typecheck_ambiguous_condition"]={
		[c]="err_typecheck_ambiguous_condition",
		[d]="conversion %diff{from $ to $|between types}0,1 is ambiguous",
		[e]={{nil,nil,{"conversion ",{"from A to B","between types"}," is ambiguous"}}},
		[f]=j,
		[g]="conversion (?:from (.*?) to (.*?)|between types) is ambiguous",
		[h]=a,
		[i]=m,
		[b]={"0b51c729c9c3",1253649195,"Issue good ambiguity diagnostic when convesion fails.","Issue good ambiguity diagnostic when convesion fails.\n\nllvm-svn: 82565"},
		[k]={{G,4248,"/// PerformImplicitConversion - Perform an implicit conversion of the\n/// expression From to the type ToType using the pre-computed implicit\n/// conversion sequence ICS. Returns the converted\n/// expression. Action is the kind of conversion we\'re performing,\n/// used in the error message.\nExprResult Sema::PerformImplicitConversion(Expr *From, QualType ToType, const ImplicitConversionSequence &ICS, AssignmentAction Action, CheckedConversionKind CCK) {\n  // ...\n  case ImplicitConversionSequence::AmbiguousConversion:\n    ICS.DiagnoseAmbiguousConversion(*this, From->getExprLoc(), PDiag(diag::err_typecheck_ambiguous_condition) << From->getSourceRange());"},{Cb,9648,"bool InitializationSequence::Diagnose(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, ArrayRef<Expr *> Args) {\n  // ...\n  case FK_ReferenceInitOverloadFailed:\n  case FK_UserConversionOverloadFailed:\n    // ...\n    case OR_Ambiguous:\n      FailedCandidateSet.NoteCandidates(PartialDiagnosticAt(Kind.getLocation(), Failure == FK_UserConversionOverloadFailed ? (S.PDiag(diag::err_typecheck_ambiguous_condition) << OnlyArg->getType() << DestType << Args[0]->getSourceRange()) : (S.PDiag(diag::err_ref_init_ambiguous) << DestType << OnlyArg->getType() << Args[0]->getSourceRange())), S, OCD_AmbiguousCandidates, Args);"},{db,3774,"bool Sema::DiagnoseMultipleUserDefinedConversion(Expr *From, QualType ToType) {\n  // ...\n  if (OvResult == OR_Ambiguous)\n    Diag(From->getBeginLoc(), diag::err_typecheck_ambiguous_condition) << From->getType() << ToType << From->getSourceRange();"}},
		[l]={
			["clang/test/CXX/dcl.dcl/p4-0x.cpp"]={"clang/test/CXX/dcl.dcl/p4-0x.cpp:19:15: error: conversion from \'U\' to \'bool\' is ambiguous"}
		}
	},
	["err_typecheck_arc_assign_externally_retained"]={
		[c]={{nil,eb,"err_typecheck_arc_assign_externally_retained"}},
		[d]={{nil,eb,"variable declared with \'objc_externally_retained\' cannot be modified in ARC"}},
		[e]={{nil,eb,"variable declared with \'objc_externally_retained\' cannot be modified in ARC"}},
		[f]=j,
		[g]="variable declared with \'objc_externally_retained\' cannot be modified in ARC",
		[h]=a,
		[i]={{nil,eb,"ARC Semantic Issue"}},
		[b]={"1e36882b5291",1546626786,"[ObjCARC] Add an new attribute, objc_externally_retained","[ObjCARC] Add an new attribute, objc_externally_retained\n\nThis attribute, called \"objc_externally_retained\", exposes clang\'s\nnotion of pseudo-__strong variables in ARC. Pseudo-strong variables\n\"borrow\" their initializer, meaning that they don\'t retain/release\nit, instead assuming that someone else is keeping their value alive.\n\nIf a function is annotated with this attribute, implicitly strong\nparameters of that function aren\'t implicitly retained/released in\nthe function body, and are implicitly const. This is useful to expose\nfor performance reasons, most functions don\'t need the extra safety\nof the retain/release, so programmers can opt out as needed.\n\nThis attribute can also apply to declarations of local variables,\nwith similar effect.\n\nDifferential revision: https://reviews.llvm.org/D55865\n\nllvm-svn: 350422"},
		[k]={{n,14313,"/// CheckForModifiableLvalue - Verify that E is a modifiable lvalue.  If not,\n/// emit an error and return true.  If so, return false.\nstatic bool CheckForModifiableLvalue(Expr *E, SourceLocation Loc, Sema &S) {\n  // ...\n  case Expr::MLV_ConstQualified:\n    // ...\n    // In ARC, use some specialized diagnostics for occasions where we\n    // infer \'const\'.  These are always pseudo-strong variables.\n    if (S.getLangOpts().ObjCAutoRefCount) {\n      // ...\n      if (declRef && isa<VarDecl>(declRef->getDecl())) {\n        // ...\n        // Use the normal diagnostic if it\'s pseudo-__strong but the\n        // user actually wrote \'const\'.\n        if (var->isARCPseudoStrong() && (!var->getTypeSourceInfo() || !var->getTypeSourceInfo()->getType().isConstQualified())) {\n          // ...\n          if (method && var == method->getSelfDecl()) {\n          // ...\n          } else if (var->hasAttr<ObjCExternallyRetainedAttr>() || isa<ParmVarDecl>(var)) {\n            DiagID = diag::err_typecheck_arc_assign_externally_retained;"}},
		[l]={
			["clang/test/SemaObjC/externally-retained.m"]={"clang/test/SemaObjC/externally-retained.m:18:5: error: variable declared with \'objc_externally_retained\' cannot be modified in ARC","clang/test/SemaObjC/externally-retained.m:19:5: error: variable declared with \'objc_externally_retained\' cannot be modified in ARC","clang/test/SemaObjC/externally-retained.m:20:5: error: variable declared with \'objc_externally_retained\' cannot be modified in ARC","clang/test/SemaObjC/externally-retained.m:26:5: error: variable declared with \'objc_externally_retained\' cannot be modified in ARC","clang/test/SemaObjC/externally-retained.m:36:5: error: variable declared with \'objc_externally_retained\' cannot be modified in ARC","clang/test/SemaObjC/externally-retained.m:45:9: error: variable declared with \'objc_externally_retained\' cannot be modified in ARC","clang/test/SemaObjC/externally-retained.m:51:9: error: variable declared with \'objc_externally_retained\' cannot be modified in ARC","clang/test/SemaObjC/externally-retained.m:61:10: error: variable declared with \'objc_externally_retained\' cannot be modified in ARC","clang/test/SemaObjC/externally-retained.m:68:10: error: variable declared with \'objc_externally_retained\' cannot be modified in ARC","clang/test/SemaObjC/externally-retained.m:74:10: error: variable declared with \'objc_externally_retained\' cannot be modified in ARC","clang/test/SemaObjC/externally-retained.m:81:9: error: variable declared with \'objc_externally_retained\' cannot be modified in ARC","clang/test/SemaObjC/externally-retained.m:85:9: error: variable declared with \'objc_externally_retained\' cannot be modified in ARC","clang/test/SemaObjC/externally-retained.m:91:9: error: variable declared with \'objc_externally_retained\' cannot be modified in ARC","clang/test/SemaObjC/externally-retained.m:95:9: error: variable declared with \'objc_externally_retained\' cannot be modified in ARC","clang/test/SemaObjC/externally-retained.m:103:11: error: variable declared with \'objc_externally_retained\' cannot be modified in ARC","clang/test/SemaObjC/externally-retained.m:107:11: error: variable declared with \'objc_externally_retained\' cannot be modified in ARC","clang/test/SemaObjC/externally-retained.m:114:9: error: variable declared with \'objc_externally_retained\' cannot be modified in ARC"}
		}
	},
	["err_typecheck_arc_assign_self"]={
		[c]="err_typecheck_arc_assign_self",
		[d]="cannot assign to \'self\' outside of a method in the init family",
		[e]="cannot assign to \'self\' outside of a method in the init family",
		[f]=j,
		[g]="cannot assign to \'self\' outside of a method in the init family",
		[h]=a,
		[i]="ARC Semantic Issue",
		[b]={"1fcdaa9c058e",1321307965,"ARC: make assignment to \'self\' within class methods illegal.  Fixes <rdar://problem/10416568>.","ARC: make assignment to \'self\' within class methods illegal.  Fixes <rdar://problem/10416568>.\n\nllvm-svn: 144572"},
		[k]={{n,14309,"/// CheckForModifiableLvalue - Verify that E is a modifiable lvalue.  If not,\n/// emit an error and return true.  If so, return false.\nstatic bool CheckForModifiableLvalue(Expr *E, SourceLocation Loc, Sema &S) {\n  // ...\n  case Expr::MLV_ConstQualified:\n    // ...\n    // In ARC, use some specialized diagnostics for occasions where we\n    // infer \'const\'.  These are always pseudo-strong variables.\n    if (S.getLangOpts().ObjCAutoRefCount) {\n      // ...\n      if (declRef && isa<VarDecl>(declRef->getDecl())) {\n        // ...\n        // Use the normal diagnostic if it\'s pseudo-__strong but the\n        // user actually wrote \'const\'.\n        if (var->isARCPseudoStrong() && (!var->getTypeSourceInfo() || !var->getTypeSourceInfo()->getType().isConstQualified())) {\n          // ...\n          if (method && var == method->getSelfDecl()) {\n            DiagID = method->isClassMethod() ? diag::err_typecheck_arc_assign_self_class_method : diag::err_typecheck_arc_assign_self;"}},
		[l]={
			["clang/test/ARCMT/checking.m"]={"clang/test/ARCMT/checking.m:142:8: error: cannot assign to \'self\' outside of a method in the init family"}
		}
	},
	["err_typecheck_arc_assign_self_class_method"]={
		[c]="err_typecheck_arc_assign_self_class_method",
		[d]="cannot assign to \'self\' in a class method",
		[e]="cannot assign to \'self\' in a class method",
		[f]=j,
		[g]="cannot assign to \'self\' in a class method",
		[h]=a,
		[i]="ARC Semantic Issue",
		[b]={"1fcdaa9c058e",1321307965,"ARC: make assignment to \'self\' within class methods illegal.  Fixes <rdar://problem/10416568>.","ARC: make assignment to \'self\' within class methods illegal.  Fixes <rdar://problem/10416568>.\n\nllvm-svn: 144572"},
		[k]={{n,14304,"/// CheckForModifiableLvalue - Verify that E is a modifiable lvalue.  If not,\n/// emit an error and return true.  If so, return false.\nstatic bool CheckForModifiableLvalue(Expr *E, SourceLocation Loc, Sema &S) {\n  // ...\n  case Expr::MLV_ConstQualified:\n    // ...\n    // In ARC, use some specialized diagnostics for occasions where we\n    // infer \'const\'.  These are always pseudo-strong variables.\n    if (S.getLangOpts().ObjCAutoRefCount) {\n      // ...\n      if (declRef && isa<VarDecl>(declRef->getDecl())) {\n        // ...\n        // Use the normal diagnostic if it\'s pseudo-__strong but the\n        // user actually wrote \'const\'.\n        if (var->isARCPseudoStrong() && (!var->getTypeSourceInfo() || !var->getTypeSourceInfo()->getType().isConstQualified())) {\n          // ...\n          if (method && var == method->getSelfDecl()) {\n            DiagID = method->isClassMethod() ? diag::err_typecheck_arc_assign_self_class_method : diag::err_typecheck_arc_assign_self;"}}
	},
	["err_typecheck_arithmetic_incomplete_or_sizeless_type"]={
		[c]={{nil,u,"err_typecheck_arithmetic_incomplete_or_sizeless_type"}},
		[d]={{nil,u,"arithmetic on a pointer to %select{an incomplete|sizeless}0 type %1"}},
		[e]={{nil,u,{"arithmetic on a pointer to ",{"an incomplete","sizeless"}," type B"}}},
		[f]=j,
		[g]="arithmetic on a pointer to (?:an incomplete|sizeless) type (.*?)",
		[h]=a,
		[i]={{nil,u,m}},
		[b]={fb,1576908663,gb,hb},
		[k]={{n,11577,"/// Emit error if Operand is incomplete pointer type\n///\n/// \\returns True if pointer has incomplete type\nstatic bool checkArithmeticIncompletePointerType(Sema &S, SourceLocation Loc, Expr *Operand) {\n  // ...\n  return S.RequireCompleteSizedType(Loc, PointeeTy, diag::err_typecheck_arithmetic_incomplete_or_sizeless_type, Operand->getSourceRange());"}},
		[l]={
			["clang/test/Sema/empty1.c"]={"clang/test/Sema/empty1.c:74:12: error: arithmetic on a pointer to an incomplete type \'struct A\'","clang/test/Sema/empty1.c:82:12: error: arithmetic on a pointer to an incomplete type \'struct emp_1[]\'"}
		}
	},
	["err_typecheck_arr_assign_enumeration"]={
		[c]="err_typecheck_arr_assign_enumeration",
		[d]="fast enumeration variables cannot be modified in ARC by default; declare the variable __strong to allow this",
		[e]="fast enumeration variables cannot be modified in ARC by default; declare the variable __strong to allow this",
		[f]=j,
		[g]="fast enumeration variables cannot be modified in ARC by default; declare the variable __strong to allow this",
		[h]=a,
		[i]="ARC Semantic Issue",
		[b]={"31168b077c36",1308178962,"Automatic Reference Counting.","Automatic Reference Counting.\n\nLanguage-design credit goes to a lot of people, but I particularly want\nto single out Blaine Garst and Patrick Beard for their contributions.\n\nCompiler implementation credit goes to Argyrios, Doug, Fariborz, and myself,\nin no particular order.\n\nllvm-svn: 133103"},
		[k]={{"clang/lib/ARCMigrate/TransARCAssign.cpp",58,"class ARCAssignChecker : public RecursiveASTVisitor<ARCAssignChecker> {\n  // ...\n  bool VisitBinaryOperator(BinaryOperator *Exp) {\n    // ...\n    if (declRef && isa<VarDecl>(declRef->getDecl())) {\n      // ...\n      if (var->isARCPseudoStrong()) {\n        // ...\n        if (Pass.TA.clearDiagnostic(diag::err_typecheck_arr_assign_enumeration, Exp->getOperatorLoc())) {"},{n,14343,"/// CheckForModifiableLvalue - Verify that E is a modifiable lvalue.  If not,\n/// emit an error and return true.  If so, return false.\nstatic bool CheckForModifiableLvalue(Expr *E, SourceLocation Loc, Sema &S) {\n  // ...\n  case Expr::MLV_ConstQualified:\n    // ...\n    // In ARC, use some specialized diagnostics for occasions where we\n    // infer \'const\'.  These are always pseudo-strong variables.\n    if (S.getLangOpts().ObjCAutoRefCount) {\n      // ...\n      if (declRef && isa<VarDecl>(declRef->getDecl())) {\n        // ...\n        // Use the normal diagnostic if it\'s pseudo-__strong but the\n        // user actually wrote \'const\'.\n        if (var->isARCPseudoStrong() && (!var->getTypeSourceInfo() || !var->getTypeSourceInfo()->getType().isConstQualified())) {\n          // ...\n          if (method && var == method->getSelfDecl()) {\n          // ...\n          } else if (var->hasAttr<ObjCExternallyRetainedAttr>() || isa<ParmVarDecl>(var)) {\n          // ...\n          } else {\n            DiagID = diag::err_typecheck_arr_assign_enumeration;"}},
		[l]={
			["clang/test/SemaObjC/arc.m"]={"clang/test/SemaObjC/arc.m:306:7: error: fast enumeration variables cannot be modified in ARC by default; declare the variable __strong to allow this"}
		}
	},
	["err_typecheck_array_not_modifiable_lvalue"]={
		[c]="err_typecheck_array_not_modifiable_lvalue",
		[d]="array type %0 is not assignable",
		[e]="array type A is not assignable",
		[f]=j,
		[g]="array type (.*?) is not assignable",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{n,14347,"/// CheckForModifiableLvalue - Verify that E is a modifiable lvalue.  If not,\n/// emit an error and return true.  If so, return false.\nstatic bool CheckForModifiableLvalue(Expr *E, SourceLocation Loc, Sema &S) {\n  // ...\n  case Expr::MLV_ArrayType:\n  case Expr::MLV_ArrayTemporary:\n    DiagID = diag::err_typecheck_array_not_modifiable_lvalue;"}}
	},
	["err_typecheck_assign_const"]={
		[c]="err_typecheck_assign_const",
		[d]={{nil,x,"%select{cannot assign to return value because function %1 returns a const value|cannot assign to variable %1 with const-qualified type %2|cannot assign to %select{non-|}1static data member %2 with const-qualified type %3|cannot assign to non-static data member within const member function %1|cannot assign to %select{variable %2|non-static data member %2|lvalue}1 with %select{|nested }3const-qualified data member %4|read-only variable is not assignable}0"},{C,nil,"%select{cannot assign to return value because function %1 returns a const value|cannot assign to variable %1 with const-qualified type %2|cannot assign to %select{non-|}1static data member %2 with const-qualified type %3|cannot assign to non-static data member within const member function %1|read-only variable is not assignable}0"}},
		[e]={{nil,x,{{"cannot assign to return value because function B returns a const value","cannot assign to variable B with const-qualified type C",{"cannot assign to ",{"non-",a},"static data member C with const-qualified type D"},"cannot assign to non-static data member within const member function B",{"cannot assign to ",{"variable C","non-static data member C","lvalue"}," with ",{a,"nested "},"const-qualified data member E"},"read-only variable is not assignable"}}},{C,nil,{{"cannot assign to return value because function B returns a const value","cannot assign to variable B with const-qualified type C",{"cannot assign to ",{"non-",a},"static data member C with const-qualified type D"},"cannot assign to non-static data member within const member function B","read-only variable is not assignable"}}}},
		[f]=j,
		[g]="(?:cannot assign to return value because function (.*?) returns a const value|cannot assign to variable (.*?) with const\\-qualified type (.*?)|cannot assign to (?:non\\-|)static data member (.*?) with const\\-qualified type (.*?)|cannot assign to non\\-static data member within const member function (.*?)|cannot assign to (?:variable (.*?)|non\\-static data member (.*?)|lvalue) with (?:|nested )const\\-qualified data member (.*?)|read\\-only variable is not assignable)",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{n,14105,"/// Emit the \"read-only variable not assignable\" error and print notes to give\n/// more information about why the variable is not assignable, such as pointing\n/// to the declaration of a const variable, showing that a method is const, or\n/// that the function is returning a const reference.\nstatic void DiagnoseConstAssignment(Sema &S, const Expr *E, SourceLocation Loc) {\n  // ...\n  // Loop to process MemberExpr chains.\n  while (true) {\n    // ...\n    if (const MemberExpr *ME = dyn_cast<MemberExpr>(E)) {\n      // ...\n      if (const FieldDecl *Field = dyn_cast<FieldDecl>(VD)) {\n        // ...\n        if (!IsTypeModifiable(Field->getType(), IsDereference)) {\n          if (!DiagnosticEmitted) {\n            S.Diag(Loc, diag::err_typecheck_assign_const) << ExprRange << ConstMember << false /*static*/ << Field << Field->getType();"},{n,14119,"/// Emit the \"read-only variable not assignable\" error and print notes to give\n/// more information about why the variable is not assignable, such as pointing\n/// to the declaration of a const variable, showing that a method is const, or\n/// that the function is returning a const reference.\nstatic void DiagnoseConstAssignment(Sema &S, const Expr *E, SourceLocation Loc) {\n  // ...\n  // Loop to process MemberExpr chains.\n  while (true) {\n    // ...\n    if (const MemberExpr *ME = dyn_cast<MemberExpr>(E)) {\n      // ...\n      if (const FieldDecl *Field = dyn_cast<FieldDecl>(VD)) {\n      // ...\n      } else if (const VarDecl *VDecl = dyn_cast<VarDecl>(VD)) {\n        if (VDecl->getType().isConstQualified()) {\n          if (!DiagnosticEmitted) {\n            S.Diag(Loc, diag::err_typecheck_assign_const) << ExprRange << ConstMember << true /*static*/ << VDecl << VDecl->getType();"},{n,14149,"/// Emit the \"read-only variable not assignable\" error and print notes to give\n/// more information about why the variable is not assignable, such as pointing\n/// to the declaration of a const variable, showing that a method is const, or\n/// that the function is returning a const reference.\nstatic void DiagnoseConstAssignment(Sema &S, const Expr *E, SourceLocation Loc) {\n  // ...\n  if (const CallExpr *CE = dyn_cast<CallExpr>(E)) {\n    // ...\n    if (FD && !IsTypeModifiable(FD->getReturnType(), IsDereference)) {\n      if (!DiagnosticEmitted) {\n        S.Diag(Loc, diag::err_typecheck_assign_const) << ExprRange << ConstFunction << FD;"},{n,14162,"/// Emit the \"read-only variable not assignable\" error and print notes to give\n/// more information about why the variable is not assignable, such as pointing\n/// to the declaration of a const variable, showing that a method is const, or\n/// that the function is returning a const reference.\nstatic void DiagnoseConstAssignment(Sema &S, const Expr *E, SourceLocation Loc) {\n  // ...\n  if (const CallExpr *CE = dyn_cast<CallExpr>(E)) {\n  // ...\n  } else if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) {\n    // Point to variable declaration.\n    if (const ValueDecl *VD = DRE->getDecl()) {\n      if (!IsTypeModifiable(VD->getType(), IsDereference)) {\n        if (!DiagnosticEmitted) {\n          S.Diag(Loc, diag::err_typecheck_assign_const) << ExprRange << ConstVariable << VD << VD->getType();"},{n,14175,"/// Emit the \"read-only variable not assignable\" error and print notes to give\n/// more information about why the variable is not assignable, such as pointing\n/// to the declaration of a const variable, showing that a method is const, or\n/// that the function is returning a const reference.\nstatic void DiagnoseConstAssignment(Sema &S, const Expr *E, SourceLocation Loc) {\n  // ...\n  if (const CallExpr *CE = dyn_cast<CallExpr>(E)) {\n  // ...\n  } else if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) {\n  // ...\n  } else if (isa<CXXThisExpr>(E)) {\n    if (const DeclContext *DC = S.getFunctionLevelDeclContext()) {\n      if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(DC)) {\n        if (MD->isConst()) {\n          if (!DiagnosticEmitted) {\n            S.Diag(Loc, diag::err_typecheck_assign_const) << ExprRange << ConstMethod << MD;"},{n,14213,"/// Emit the \"read-only variable not assignable\" error and print notes to give\n/// more information about why the variable is not assignable, such as pointing\n/// to the declaration of a const variable, showing that a method is const, or\n/// that the function is returning a const reference.\nstatic void DiagnoseConstAssignment(Sema &S, const Expr *E, SourceLocation Loc) {\n  // ...\n  S.Diag(Loc, diag::err_typecheck_assign_const) << ExprRange << ConstUnknown;"},{n,14218,"static void DiagnoseRecursiveConstFields(Sema &S, const ValueDecl *VD, const RecordType *Ty, SourceLocation Loc, SourceRange Range, OriginalExprKind OEK, bool &DiagnosticEmitted) {\n  // ...\n  // We walk the record hierarchy breadth-first to ensure that we print\n  // diagnostics in field nesting order.\n  while (RecordTypeList.size() > NextToCheckIndex) {\n    // ...\n    for (const FieldDecl *Field : RecordTypeList[NextToCheckIndex]->getDecl()->fields()) {\n      // ...\n      if (FieldTy.isConstQualified()) {\n        if (!DiagnosticEmitted) {\n          S.Diag(Loc, diag::err_typecheck_assign_const) << Range << NestedConstMember << OEK << VD << IsNested << Field;"}},
		[l]={
			["clang/test/SemaCXX/cxx0x-constexpr-const.cpp"]={"clang/test/SemaCXX/cxx0x-constexpr-const.cpp:7:5: error: cannot assign to variable \'x\' with const-qualified type \'const int\'"}
		}
	},
	["err_typecheck_bool_condition"]={
		[c]="err_typecheck_bool_condition",
		[d]="value of type %0 is not contextually convertible to \'bool\'",
		[e]="value of type A is not contextually convertible to \'bool\'",
		[f]=j,
		[g]="value of type (.*?) is not contextually convertible to \'bool\'",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{db,5744,"/// PerformContextuallyConvertToBool - Perform a contextual conversion\n/// of the expression From to bool (C++0x [conv]p3).\nExprResult Sema::PerformContextuallyConvertToBool(Expr *From) {\n  // ...\n  if (!DiagnoseMultipleUserDefinedConversion(From, Context.BoolTy))\n    return Diag(From->getBeginLoc(), diag::err_typecheck_bool_condition) << From->getType() << From->getSourceRange();"}},
		[l]={
			["clang/test/Parser/decomposed-condition.cpp"]={"clang/test/Parser/decomposed-condition.cpp:38:12: error: value of type \'Na\' is not contextually convertible to \'bool\'","clang/test/Parser/decomposed-condition.cpp:49:15: error: value of type \'Na\' is not contextually convertible to \'bool\'","clang/test/Parser/decomposed-condition.cpp:60:15: error: value of type \'Na\' is not contextually convertible to \'bool\'"}
		}
	},
	["err_typecheck_call_different_arg_types"]={
		[c]={{nil,s,"err_typecheck_call_different_arg_types"}},
		[d]={{nil,s,"arguments are of different types%diff{ ($ vs $)|}0,1"}},
		[e]={{nil,s,{"arguments are of different types",{" (A vs B)",a}}}},
		[f]=j,
		[g]="arguments are of different types(?: \\((.*?) vs (.*?)\\)|)",
		[h]=a,
		[i]={{nil,s,m}},
		[b]={Lb,1582847864,Gb,Nb},
		[k]={{w,2724,"#include \"clang/Basic/Builtins.def\"\n  // ...\n  case Builtin::BI__builtin_elementwise_copysign: {\n    // ...\n    if (MagnitudeTy.getCanonicalType() != SignTy.getCanonicalType()) {\n      return Diag(Sign.get()->getBeginLoc(), diag::err_typecheck_call_different_arg_types) << MagnitudeTy << SignTy;"},{w,8368,"/// Perform semantic analysis for a call to __builtin_complex.\nbool Sema::SemaBuiltinComplex(CallExpr *TheCall) {\n  // ...\n  if (!Context.hasSameType(Real->getType(), Imag->getType())) {\n    return Diag(Real->getBeginLoc(), diag::err_typecheck_call_different_arg_types) << Real->getType() << Imag->getType() << Real->getSourceRange() << Imag->getSourceRange();"},{w,18659,"bool Sema::SemaBuiltinElementwiseMath(CallExpr *TheCall) {\n  // ...\n  if (Res.isNull() || TyA.getCanonicalType() != TyB.getCanonicalType())\n    return Diag(A.get()->getBeginLoc(), diag::err_typecheck_call_different_arg_types) << TyA << TyB;"},{w,18694,"bool Sema::SemaBuiltinElementwiseTernaryMath(CallExpr *TheCall) {\n  // ...\n  for (int I = 1; I < 3; ++I) {\n    if (Args[0]->getType().getCanonicalType() != Args[I]->getType().getCanonicalType()) {\n      return Diag(Args[0]->getBeginLoc(), diag::err_typecheck_call_different_arg_types) << Args[0]->getType() << Args[I]->getType();"}},
		[l]={
			["clang/test/Sema/builtins-elementwise-math.c"]={"clang/test/Sema/builtins-elementwise-math.c:47:37: error: arguments are of different types (\'int *\' vs \'double\')","clang/test/Sema/builtins-elementwise-math.c:62:37: error: arguments are of different types (\'float4\' (vector of 4 \'float\' values) vs \'int3\' (vector of 3 \'int\' values))","clang/test/Sema/builtins-elementwise-math.c:65:37: error: arguments are of different types (\'unsigned3\' (vector of 3 \'unsigned int\' values) vs \'int3\' (vector of 3 \'int\' values))","clang/test/Sema/builtins-elementwise-math.c:105:37: error: arguments are of different types (\'int *\' vs \'double\')","clang/test/Sema/builtins-elementwise-math.c:120:37: error: arguments are of different types (\'float4\' (vector of 4 \'float\' values) vs \'int3\' (vector of 3 \'int\' values))","clang/test/Sema/builtins-elementwise-math.c:123:37: error: arguments are of different types (\'unsigned3\' (vector of 3 \'unsigned int\' values) vs \'int3\' (vector of 3 \'int\' values))","clang/test/Sema/builtins-elementwise-math.c:163:33: error: arguments are of different types (\'int *\' vs \'double\')","clang/test/Sema/builtins-elementwise-math.c:178:33: error: arguments are of different types (\'float4\' (vector of 4 \'float\' values) vs \'int3\' (vector of 3 \'int\' values))","clang/test/Sema/builtins-elementwise-math.c:181:33: error: arguments are of different types (\'unsigned3\' (vector of 3 \'unsigned int\' values) vs \'int3\' (vector of 3 \'int\' values))","clang/test/Sema/builtins-elementwise-math.c:218:33: error: arguments are of different types (\'int *\' vs \'double\')","clang/test/Sema/builtins-elementwise-math.c:233:33: error: arguments are of different types (\'float4\' (vector of 4 \'float\' values) vs \'int3\' (vector of 3 \'int\' values))","clang/test/Sema/builtins-elementwise-math.c:236:33: error: arguments are of different types (\'unsigned3\' (vector of 3 \'unsigned int\' values) vs \'int3\' (vector of 3 \'int\' values))","clang/test/Sema/builtins-elementwise-math.c:442:33: error: arguments are of different types (\'int *\' vs \'double\')","clang/test/Sema/builtins-elementwise-math.c:457:33: error: arguments are of different types (\'float4\' (vector of 4 \'float\' values) vs \'int3\' (vector of 3 \'int\' values))","clang/test/Sema/builtins-elementwise-math.c:460:33: error: arguments are of different types (\'unsigned3\' (vector of 3 \'unsigned int\' values) vs \'int3\' (vector of 3 \'int\' values))","clang/test/Sema/builtins-elementwise-math.c:690:53: error: arguments are of different types (\'double\' vs \'float\')","clang/test/Sema/builtins-elementwise-math.c:693:50: error: arguments are of different types (\'float\' vs \'double\')","clang/test/Sema/builtins-elementwise-math.c:697:55: error: arguments are of different types (\'float4\' (vector of 4 \'float\' values) vs \'float\')","clang/test/Sema/builtins-elementwise-math.c:700:50: error: arguments are of different types (\'float\' vs \'float4\' (vector of 4 \'float\' values))","clang/test/Sema/builtins-elementwise-math.c:705:56: error: arguments are of different types (\'double4\' (vector of 4 \'double\' values) vs \'float4\' (vector of 4 \'float\' values))","clang/test/Sema/builtins-elementwise-math.c:708:55: error: arguments are of different types (\'float4\' (vector of 4 \'float\' values) vs \'double4\' (vector of 4 \'double\' values))","clang/test/Sema/builtins-elementwise-math.c:711:55: error: arguments are of different types (\'float4\' (vector of 4 \'float\' values) vs \'float2\' (vector of 2 \'float\' values))","clang/test/Sema/builtins-elementwise-math.c:714:55: error: arguments are of different types (\'float2\' (vector of 2 \'float\' values) vs \'float4\' (vector of 4 \'float\' values))","clang/test/Sema/builtins-elementwise-math.c:739:35: error: arguments are of different types (\'double\' vs \'float\')","clang/test/Sema/builtins-elementwise-math.c:742:35: error: arguments are of different types (\'float\' vs \'double\')","clang/test/Sema/builtins-elementwise-math.c:745:35: error: arguments are of different types (\'float\' vs \'double\')","clang/test/Sema/builtins-elementwise-math.c:748:35: error: arguments are of different types (\'float\' vs \'double\')","clang/test/Sema/builtins-elementwise-math.c:751:35: error: arguments are of different types (\'double\' vs \'float\')","clang/test/Sema/builtins-elementwise-math.c:754:35: error: arguments are of different types (\'double\' vs \'float\')","clang/test/Sema/builtins-elementwise-math.c:757:35: error: arguments are of different types (\'double\' vs \'float\')","clang/test/Sema/builtins-elementwise-math.c:760:37: error: arguments are of different types (\'float2\' (vector of 2 \'float\' values) vs \'double\')","clang/test/Sema/builtins-elementwise-math.c:763:37: error: arguments are of different types (\'float2\' (vector of 2 \'float\' values) vs \'double2\' (vector of 2 \'double\' values))","clang/test/Sema/builtins-elementwise-math.c:766:37: error: arguments are of different types (\'float2\' (vector of 2 \'float\' values) vs \'double\')","clang/test/Sema/builtins-elementwise-math.c:769:37: error: arguments are of different types (\'double\' vs \'float2\' (vector of 2 \'float\' values))","clang/test/Sema/builtins-elementwise-math.c:772:37: error: arguments are of different types (\'double\' vs \'double2\' (vector of 2 \'double\' values))"}
		}
	},
	["err_typecheck_call_invalid_ordered_compare"]={
		[c]="err_typecheck_call_invalid_ordered_compare",
		[d]="ordered compare requires two args of floating point type%diff{ ($ and $)|}0,1",
		[e]={{nil,nil,{"ordered compare requires two args of floating point type",{Jb,a}}}},
		[f]=j,
		[g]="ordered compare requires two args of floating point type(?: \\((.*?) and (.*?)\\)|)",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{w,8269,"/// SemaBuiltinUnorderedCompare - Handle functions like __builtin_isgreater and\n/// friends.  This is declared to take (...), so we have to check everything.\nbool Sema::SemaBuiltinUnorderedCompare(CallExpr *TheCall) {\n  // ...\n  // If the common type isn\'t a real floating type, then the arguments were\n  // invalid for this operation.\n  if (Res.isNull() || !Res->isRealFloatingType())\n    return Diag(OrigArg0.get()->getBeginLoc(), diag::err_typecheck_call_invalid_ordered_compare) << OrigArg0.get()->getType() << OrigArg1.get()->getType() << SourceRange(OrigArg0.get()->getBeginLoc(), OrigArg1.get()->getEndLoc());"}},
		[l]={
			["clang/test/Sema/builtins.c"]={"clang/test/Sema/builtins.c:8:32: error: ordered compare requires two args of floating point type (\'int\' and \'int\')","clang/test/Sema/builtins.c:15:32: error: ordered compare requires two args of floating point type (\'int *\' and \'double\')"}
		}
	},
	["err_typecheck_call_invalid_unary_fp"]={
		[c]="err_typecheck_call_invalid_unary_fp",
		[d]="floating point classification requires argument of floating point type (passed in %0)",
		[e]="floating point classification requires argument of floating point type (passed in A)",
		[f]=j,
		[g]="floating point classification requires argument of floating point type \\(passed in (.*?)\\)",
		[h]=a,
		[i]=m,
		[b]={"7e4faaccda69",1251749160,"PR4836, part 1: add Sema support for __builtin_isnan and friends; they ","PR4836, part 1: add Sema support for __builtin_isnan and friends; they \nare apparently used by Solaris libc despite the fact that clang claims \nto be compatible with gcc 4.2, which doesn\'t support them.\n\nllvm-svn: 80610"},
		[k]={{w,8320,"/// SemaBuiltinSemaBuiltinFPClassification - Handle functions like\n/// __builtin_isnan and friends.  This is declared to take (...), so we have\n/// to check everything. We expect the last argument to be a floating point\n/// value.\nbool Sema::SemaBuiltinFPClassification(CallExpr *TheCall, unsigned NumArgs) {\n  // ...\n  // This operation requires a non-_Complex floating-point number.\n  if (!OrigArg->getType()->isRealFloatingType())\n    return Diag(OrigArg->getBeginLoc(), diag::err_typecheck_call_invalid_unary_fp) << OrigArg->getType() << OrigArg->getSourceRange();"}},
		[l]={
			["clang/test/Sema/builtin-unary-fp.c"]={"clang/test/Sema/builtin-unary-fp.c:9:28: error: floating point classification requires argument of floating point type (passed in \'int\')","clang/test/Sema/builtin-unary-fp.c:13:45: error: floating point classification requires argument of floating point type (passed in \'int\')"}
		}
	},
	["err_typecheck_call_not_function"]={
		[c]="err_typecheck_call_not_function",
		[d]="called object type %0 is not a function or function pointer",
		[e]="called object type A is not a function or function pointer",
		[f]=j,
		[g]="called object type (.*?) is not a function or function pointer",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{n,7417,"/// 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  retry:\n    if (const PointerType *PT = Fn->getType()->getAs<PointerType>()) {\n      // ...\n      if (!FuncT)\n        return ExprError(Diag(LParenLoc, diag::err_typecheck_call_not_function) << Fn->getType() << Fn->getSourceRange());"},{n,7483,"/// 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  retry:\n    if (const PointerType *PT = Fn->getType()->getAs<PointerType>()) {\n    // ...\n    } else if (const BlockPointerType *BPT = Fn->getType()->getAs<BlockPointerType>()) {\n    // ...\n    } else {\n      // ...\n      return ExprError(Diag(LParenLoc, diag::err_typecheck_call_not_function) << Fn->getType() << Fn->getSourceRange());"}},
		[l]={
			["clang/test/CXX/basic/basic.lookup/basic.lookup.argdep/p3.cpp"]={"clang/test/CXX/basic/basic.lookup/basic.lookup.argdep/p3.cpp:17:10: error: called object type \'test0::Test::E\' is not a function or function pointer"}
		}
	},
	["err_typecheck_call_requires_real_fp"]={
		[c]={{nil,s,"err_typecheck_call_requires_real_fp"}},
		[d]={{nil,s,"argument type %0 is not a real floating point type"}},
		[e]={{nil,s,"argument type A is not a real floating point type"}},
		[f]=j,
		[g]="argument type (.*?) is not a real floating point type",
		[h]=a,
		[i]={{nil,s,m}},
		[b]={Lb,1582847864,Gb,Nb},
		[k]={{w,8349,"/// Perform semantic analysis for a call to __builtin_complex.\nbool Sema::SemaBuiltinComplex(CallExpr *TheCall) {\n  // ...\n  for (unsigned I = 0; I != 2; ++I) {\n    // ...\n    // Despite supporting _Complex int, GCC requires a real floating point type\n    // for the operands of __builtin_complex.\n    if (!T->isRealFloatingType()) {\n      return Diag(Arg->getBeginLoc(), diag::err_typecheck_call_requires_real_fp) << Arg->getType() << Arg->getSourceRange();"}},
		[l]={
			["clang/test/Sema/builtins.c"]={"clang/test/Sema/builtins.c:373:21: error: argument type \'int\' is not a real floating point type","clang/test/Sema/builtins.c:374:21: error: argument type \'int\' is not a real floating point type","clang/test/Sema/builtins.c:375:26: error: argument type \'int\' is not a real floating point type"}
		}
	},
	["err_typecheck_call_too_few_args"]={
		[c]="err_typecheck_call_too_few_args",
		[d]="too few %select{|||execution configuration }0arguments to %select{function|block|method|kernel function}0 call, expected %1, have %2",
		[e]={{nil,nil,{bc,{a,a,a,V},U,{F,M,J,O}," call, expected B, have C"}}},
		[f]=j,
		[g]="too few (?:|||execution configuration )arguments to (?:function|block|method|kernel function) call, expected (.*?), have (.*?)",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{w,127,"/// Checks that a call expression\'s argument count is at least the desired\n/// number. This is useful when doing custom type-checking on a variadic\n/// function. Returns true on error.\nstatic bool checkArgCountAtLeast(Sema &S, CallExpr *Call, unsigned MinArgCount) {\n  // ...\n  return S.Diag(Call->getEndLoc(), diag::err_typecheck_call_too_few_args) << 0 /*function call*/ << MinArgCount << ArgCount << Call->getSourceRange();"},{w,7132,"ExprResult Sema::BuildAtomicExpr(SourceRange CallRange, SourceRange ExprRange, SourceLocation RParenLoc, MultiExprArg Args, AtomicExpr::AtomicOp Op, AtomicArgumentOrder ArgOrder) {\n  // ...\n  // Check we have the right number of arguments.\n  if (Args.size() < AdjustedNumArgs) {\n    Diag(CallRange.getEnd(), diag::err_typecheck_call_too_few_args) << 0 << AdjustedNumArgs << static_cast<unsigned>(Args.size()) << ExprRange;"},{w,8700,"bool Sema::SemaBuiltinOSLogFormat(CallExpr *TheCall) {\n  // ...\n  if (NumArgs < NumRequiredArgs) {\n    return Diag(TheCall->getEndLoc(), diag::err_typecheck_call_too_few_args) << 0 /* function call */ << NumRequiredArgs << NumArgs << TheCall->getSourceRange();"},{n,6471,"/// ConvertArgumentsForCall - Converts the arguments specified in\n/// Args/NumArgs to the parameter types of the function FDecl with\n/// function prototype Proto. Call is the call expression itself, and\n/// Fn is the function expression. For a C++ member function, this\n/// routine does not attempt to convert the object argument. Returns\n/// true if the call is ill-formed.\nbool Sema::ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, FunctionDecl *FDecl, const FunctionProtoType *Proto, ArrayRef<Expr *> Args, SourceLocation RParenLoc, bool IsExecConfig) {\n  // ...\n  // If too few arguments are available (and we don\'t have default\n  // arguments for the remaining parameters), don\'t make the call.\n  if (Args.size() < NumParams) {\n    if (Args.size() < MinArgs) {\n      // ...\n      if (FDecl && (TC = TryTypoCorrectionForCall(*this, Fn, FDecl, Args))) {\n      // ...\n      } else if (MinArgs == 1 && FDecl && FDecl->getParamDecl(0)->getDeclName())\n      // ...\n      else\n        Diag(RParenLoc, MinArgs == NumParams && !Proto->isVariadic() ? diag::err_typecheck_call_too_few_args : diag::err_typecheck_call_too_few_args_at_least) << FnKind << MinArgs << static_cast<unsigned>(Args.size()) << Fn->getSourceRange();"},{"clang/lib/Sema/SemaExprObjC.cpp",1803,"bool Sema::CheckMessageArgumentTypes(const Expr *Receiver, QualType ReceiverType, MultiExprArg Args, Selector Sel, ArrayRef<SourceLocation> SelectorLocs, ObjCMethodDecl *Method, bool isClassMessage, bool isSuperMessage, SourceLocation lbrac, SourceLocation rbrac, SourceRange RecRange, QualType &ReturnType, ExprValueKind &VK) {\n  // ...\n  // FIXME. This need be cleaned up.\n  if (Args.size() < NumNamedArgs) {\n    Diag(SelLoc, diag::err_typecheck_call_too_few_args) << 2 << NumNamedArgs << static_cast<unsigned>(Args.size());"}},
		[l]={
			["clang/test/Sema/builtin-unary-fp.c"]={"clang/test/Sema/builtin-unary-fp.c:10:25: error: too few arguments to function call, expected 1, have 0","clang/test/Sema/builtin-unary-fp.c:15:43: error: too few arguments to function call, expected 6, have 5"}
		}
	},
	["err_typecheck_call_too_few_args_at_least"]={
		[c]="err_typecheck_call_too_few_args_at_least",
		[d]="too few %select{|||execution configuration }0arguments to %select{function|block|method|kernel function}0 call, expected at least %1, have %2",
		[e]={{nil,nil,{bc,{a,a,a,V},U,{F,M,J,O}," call, expected at least B, have C"}}},
		[f]=j,
		[g]="too few (?:|||execution configuration )arguments to (?:function|block|method|kernel function) call, expected at least (.*?), have (.*?)",
		[h]=a,
		[i]=m,
		[b]={"abf1e18e32c9",1271393302,"Expand argument diagnostic for too few arguments to give the number","Expand argument diagnostic for too few arguments to give the number\nof arguments both seen and expected.\n\nFixes PR6501.\n\nllvm-svn: 101441"},
		[k]={{w,219,"static bool SemaBuiltinMSVCAnnotation(Sema &S, CallExpr *TheCall) {\n  // We need at least one argument.\n  if (TheCall->getNumArgs() < 1) {\n    S.Diag(TheCall->getEndLoc(), diag::err_typecheck_call_too_few_args_at_least) << 0 << 1 << TheCall->getNumArgs() << TheCall->getCallee()->getSourceRange();"},{w,1533,"/// OpenCL C v2.0, s6.13.17 - Enqueue kernel function contains four different\n/// overload formats specified in Table 6.13.17.1.\n/// int enqueue_kernel(queue_t queue,\n///                    kernel_enqueue_flags_t flags,\n///                    const ndrange_t ndrange,\n///                    void (^block)(void))\n/// int enqueue_kernel(queue_t queue,\n///                    kernel_enqueue_flags_t flags,\n///                    const ndrange_t ndrange,\n///                    uint num_events_in_wait_list,\n///                    clk_event_t *event_wait_list,\n///                    clk_event_t *event_ret,\n///                    void (^block)(void))\n/// int enqueue_kernel(queue_t queue,\n///                    kernel_enqueue_flags_t flags,\n///                    const ndrange_t ndrange,\n///                    void (^block)(local void*, ...),\n///                    uint size0, ...)\n/// int enqueue_kernel(queue_t queue,\n///                    kernel_enqueue_flags_t flags,\n///                    const ndrange_t ndrange,\n///                    uint num_events_in_wait_list,\n///                    clk_event_t *event_wait_list,\n///                    clk_event_t *event_ret,\n///                    void (^block)(local void*, ...),\n///                    uint size0, ...)\nstatic bool SemaOpenCLBuiltinEnqueueKernel(Sema &S, CallExpr *TheCall) {\n  // ...\n  if (NumArgs < 4) {\n    S.Diag(TheCall->getBeginLoc(), diag::err_typecheck_call_too_few_args_at_least) << 0 << 4 << NumArgs;"},{w,7535,"/// We have a call to a function like __sync_fetch_and_add, which is an\n/// overloaded function based on the pointer type of its first argument.\n/// The main BuildCallExpr routines have already promoted the types of\n/// arguments because all of these calls are prototyped as void(...).\n///\n/// This function goes through and does final semantic checking for these\n/// builtins, as well as generating any warnings.\nExprResult Sema::SemaBuiltinAtomicOverloaded(ExprResult TheCallResult) {\n  // ...\n  // Ensure that we have at least one argument to do type inference from.\n  if (TheCall->getNumArgs() < 1) {\n    Diag(TheCall->getEndLoc(), diag::err_typecheck_call_too_few_args_at_least) << 0 << 1 << TheCall->getNumArgs() << Callee->getSourceRange();"},{w,7811,"/// We have a call to a function like __sync_fetch_and_add, which is an\n/// overloaded function based on the pointer type of its first argument.\n/// The main BuildCallExpr routines have already promoted the types of\n/// arguments because all of these calls are prototyped as void(...).\n///\n/// This function goes through and does final semantic checking for these\n/// builtins, as well as generating any warnings.\nExprResult Sema::SemaBuiltinAtomicOverloaded(ExprResult TheCallResult) {\n  // ...\n  // Now that we know how many fixed arguments we expect, first check that we\n  // have at least that many.\n  if (TheCall->getNumArgs() < 1 + NumFixed) {\n    Diag(TheCall->getEndLoc(), diag::err_typecheck_call_too_few_args_at_least) << 0 << 1 + NumFixed << TheCall->getNumArgs() << Callee->getSourceRange();"},{w,8201,"bool Sema::SemaBuiltinVAStartARMMicrosoft(CallExpr *Call) {\n  // ...\n  if (Call->getNumArgs() < 3)\n    return Diag(Call->getEndLoc(), diag::err_typecheck_call_too_few_args_at_least) << 0 /*function call*/ << 3 << Call->getNumArgs();"},{w,8441,"/// SemaBuiltinShuffleVector - Handle __builtin_shufflevector.\n// This is declared to take (...), so we have to check everything.\nExprResult Sema::SemaBuiltinShuffleVector(CallExpr *TheCall) {\n  if (TheCall->getNumArgs() < 2)\n    return ExprError(Diag(TheCall->getEndLoc(), diag::err_typecheck_call_too_few_args_at_least) << 0 /*function call*/ << 2 << TheCall->getNumArgs() << TheCall->getSourceRange());"},{n,6477,"/// ConvertArgumentsForCall - Converts the arguments specified in\n/// Args/NumArgs to the parameter types of the function FDecl with\n/// function prototype Proto. Call is the call expression itself, and\n/// Fn is the function expression. For a C++ member function, this\n/// routine does not attempt to convert the object argument. Returns\n/// true if the call is ill-formed.\nbool Sema::ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, FunctionDecl *FDecl, const FunctionProtoType *Proto, ArrayRef<Expr *> Args, SourceLocation RParenLoc, bool IsExecConfig) {\n  // ...\n  // If too few arguments are available (and we don\'t have default\n  // arguments for the remaining parameters), don\'t make the call.\n  if (Args.size() < NumParams) {\n    if (Args.size() < MinArgs) {\n      // ...\n      if (FDecl && (TC = TryTypoCorrectionForCall(*this, Fn, FDecl, Args))) {\n      // ...\n      } else if (MinArgs == 1 && FDecl && FDecl->getParamDecl(0)->getDeclName())\n      // ...\n      else\n        Diag(RParenLoc, MinArgs == NumParams && !Proto->isVariadic() ? diag::err_typecheck_call_too_few_args : diag::err_typecheck_call_too_few_args_at_least) << FnKind << MinArgs << static_cast<unsigned>(Args.size()) << Fn->getSourceRange();"}},
		[l]={
			["clang/test/Sema/exprs.c"]={"clang/test/Sema/exprs.c:182:12: error: too few arguments to function call, expected at least 2, have 0"}
		}
	},
	["err_typecheck_call_too_few_args_at_least_one"]={
		[c]="err_typecheck_call_too_few_args_at_least_one",
		[d]="too few %select{|||execution configuration }0arguments to %select{function|block|method|kernel function}0 call, at least argument %1 must be specified",
		[e]={{nil,nil,{bc,{a,a,a,V},U,{F,M,J,O}," call, at least argument B must be specified"}}},
		[f]=j,
		[g]="too few (?:|||execution configuration )arguments to (?:function|block|method|kernel function) call, at least argument (.*?) must be specified",
		[h]=a,
		[i]=m,
		[b]={"10ff50d7d8d6",1336713401,"PR11857: When the wrong number of arguments are provided for a function","PR11857: When the wrong number of arguments are provided for a function\nwhich expects exactly one argument, include the name of the argument in\nthe diagnostic text. Patch by Terry Long!\n\nllvm-svn: 156607"},
		[k]={{n,6470,"/// ConvertArgumentsForCall - Converts the arguments specified in\n/// Args/NumArgs to the parameter types of the function FDecl with\n/// function prototype Proto. Call is the call expression itself, and\n/// Fn is the function expression. For a C++ member function, this\n/// routine does not attempt to convert the object argument. Returns\n/// true if the call is ill-formed.\nbool Sema::ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, FunctionDecl *FDecl, const FunctionProtoType *Proto, ArrayRef<Expr *> Args, SourceLocation RParenLoc, bool IsExecConfig) {\n  // ...\n  // If too few arguments are available (and we don\'t have default\n  // arguments for the remaining parameters), don\'t make the call.\n  if (Args.size() < NumParams) {\n    if (Args.size() < MinArgs) {\n      // ...\n      if (FDecl && (TC = TryTypoCorrectionForCall(*this, Fn, FDecl, Args))) {\n      // ...\n      } else if (MinArgs == 1 && FDecl && FDecl->getParamDecl(0)->getDeclName())\n        Diag(RParenLoc, MinArgs == NumParams && !Proto->isVariadic() ? diag::err_typecheck_call_too_few_args_one : diag::err_typecheck_call_too_few_args_at_least_one) << FnKind << FDecl->getParamDecl(0) << Fn->getSourceRange();"}},
		[l]={
			["clang/test/Sema/exprs.c"]={"clang/test/Sema/exprs.c:181:12: error: too few arguments to function call, at least argument \'a\' must be specified"}
		}
	},
	["err_typecheck_call_too_few_args_at_least_suggest"]={
		[c]="err_typecheck_call_too_few_args_at_least_suggest",
		[d]="too few %select{|||execution configuration }0arguments to %select{function|block|method|kernel function}0 call, expected at least %1, have %2; did you mean %3?",
		[e]={{nil,nil,{bc,{a,a,a,V},U,{F,M,J,O}," call, expected at least B, have C; did you mean D?"}}},
		[f]=j,
		[g]="too few (?:|||execution configuration )arguments to (?:function|block|method|kernel function) call, expected at least (.*?), have (.*?); did you mean (.*?)\\?",
		[h]=a,
		[i]=m,
		[b]={"476c823ec8fd",1373325224,"Attempt typo correction for function calls with the wrong number of arguments.","Attempt typo correction for function calls with the wrong number of arguments.\n\nCombined with typo correction\'s new ability to apply global/absolute nested\nname specifiers to possible corrections, cases such as in PR12287 where the\ndesired function is being shadowed by a lexically closer function with the\nsame name but a different number of parameters will now include a FixIt.\n\nOn a side note, since the test for this change caused\ntest/SemaCXX/typo-correction.cpp to exceed the typo correction limit for\na single file, I\'ve included a test case for exceeding the limit and added\nsome comments to both the original and part two of typo-correction.cpp\nwarning future editors of the files about the limit.\n\nllvm-svn: 185881"},
		[k]={{n,6465,"/// ConvertArgumentsForCall - Converts the arguments specified in\n/// Args/NumArgs to the parameter types of the function FDecl with\n/// function prototype Proto. Call is the call expression itself, and\n/// Fn is the function expression. For a C++ member function, this\n/// routine does not attempt to convert the object argument. Returns\n/// true if the call is ill-formed.\nbool Sema::ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, FunctionDecl *FDecl, const FunctionProtoType *Proto, ArrayRef<Expr *> Args, SourceLocation RParenLoc, bool IsExecConfig) {\n  // ...\n  // If too few arguments are available (and we don\'t have default\n  // arguments for the remaining parameters), don\'t make the call.\n  if (Args.size() < NumParams) {\n    if (Args.size() < MinArgs) {\n      // ...\n      if (FDecl && (TC = TryTypoCorrectionForCall(*this, Fn, FDecl, Args))) {\n        unsigned diag_id = MinArgs == NumParams && !Proto->isVariadic() ? diag::err_typecheck_call_too_few_args_suggest : diag::err_typecheck_call_too_few_args_at_least_suggest;"}}
	},
	["err_typecheck_call_too_few_args_one"]={
		[c]="err_typecheck_call_too_few_args_one",
		[d]="too few %select{|||execution configuration }0arguments to %select{function|block|method|kernel function}0 call, single argument %1 was not specified",
		[e]={{nil,nil,{bc,{a,a,a,V},U,{F,M,J,O}," call, single argument B was not specified"}}},
		[f]=j,
		[g]="too few (?:|||execution configuration )arguments to (?:function|block|method|kernel function) call, single argument (.*?) was not specified",
		[h]=a,
		[i]=m,
		[b]={"10ff50d7d8d6",1336713401,"PR11857: When the wrong number of arguments are provided for a function","PR11857: When the wrong number of arguments are provided for a function\nwhich expects exactly one argument, include the name of the argument in\nthe diagnostic text. Patch by Terry Long!\n\nllvm-svn: 156607"},
		[k]={{n,6466,"/// ConvertArgumentsForCall - Converts the arguments specified in\n/// Args/NumArgs to the parameter types of the function FDecl with\n/// function prototype Proto. Call is the call expression itself, and\n/// Fn is the function expression. For a C++ member function, this\n/// routine does not attempt to convert the object argument. Returns\n/// true if the call is ill-formed.\nbool Sema::ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, FunctionDecl *FDecl, const FunctionProtoType *Proto, ArrayRef<Expr *> Args, SourceLocation RParenLoc, bool IsExecConfig) {\n  // ...\n  // If too few arguments are available (and we don\'t have default\n  // arguments for the remaining parameters), don\'t make the call.\n  if (Args.size() < NumParams) {\n    if (Args.size() < MinArgs) {\n      // ...\n      if (FDecl && (TC = TryTypoCorrectionForCall(*this, Fn, FDecl, Args))) {\n      // ...\n      } else if (MinArgs == 1 && FDecl && FDecl->getParamDecl(0)->getDeclName())\n        Diag(RParenLoc, MinArgs == NumParams && !Proto->isVariadic() ? diag::err_typecheck_call_too_few_args_one : diag::err_typecheck_call_too_few_args_at_least_one) << FnKind << FDecl->getParamDecl(0) << Fn->getSourceRange();"}},
		[l]={
			["clang/test/Sema/exprs.c"]={"clang/test/Sema/exprs.c:177:12: error: too few arguments to function call, single argument \'a\' was not specified"}
		}
	},
	["err_typecheck_call_too_few_args_suggest"]={
		[c]="err_typecheck_call_too_few_args_suggest",
		[d]="too few %select{|||execution configuration }0arguments to %select{function|block|method|kernel function}0 call, expected %1, have %2; did you mean %3?",
		[e]={{nil,nil,{bc,{a,a,a,V},U,{F,M,J,O}," call, expected B, have C; did you mean D?"}}},
		[f]=j,
		[g]="too few (?:|||execution configuration )arguments to (?:function|block|method|kernel function) call, expected (.*?), have (.*?); did you mean (.*?)\\?",
		[h]=a,
		[i]=m,
		[b]={"476c823ec8fd",1373325224,"Attempt typo correction for function calls with the wrong number of arguments.","Attempt typo correction for function calls with the wrong number of arguments.\n\nCombined with typo correction\'s new ability to apply global/absolute nested\nname specifiers to possible corrections, cases such as in PR12287 where the\ndesired function is being shadowed by a lexically closer function with the\nsame name but a different number of parameters will now include a FixIt.\n\nOn a side note, since the test for this change caused\ntest/SemaCXX/typo-correction.cpp to exceed the typo correction limit for\na single file, I\'ve included a test case for exceeding the limit and added\nsome comments to both the original and part two of typo-correction.cpp\nwarning future editors of the files about the limit.\n\nllvm-svn: 185881"},
		[k]={{n,6458,"/// ConvertArgumentsForCall - Converts the arguments specified in\n/// Args/NumArgs to the parameter types of the function FDecl with\n/// function prototype Proto. Call is the call expression itself, and\n/// Fn is the function expression. For a C++ member function, this\n/// routine does not attempt to convert the object argument. Returns\n/// true if the call is ill-formed.\nbool Sema::ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, FunctionDecl *FDecl, const FunctionProtoType *Proto, ArrayRef<Expr *> Args, SourceLocation RParenLoc, bool IsExecConfig) {\n  // ...\n  // If too few arguments are available (and we don\'t have default\n  // arguments for the remaining parameters), don\'t make the call.\n  if (Args.size() < NumParams) {\n    if (Args.size() < MinArgs) {\n      // ...\n      if (FDecl && (TC = TryTypoCorrectionForCall(*this, Fn, FDecl, Args))) {\n        unsigned diag_id = MinArgs == NumParams && !Proto->isVariadic() ? diag::err_typecheck_call_too_few_args_suggest : diag::err_typecheck_call_too_few_args_at_least_suggest;"}},
		[l]={
			["clang/test/CXX/dcl.decl/dcl.meaning/dcl.fct.default/p10.cpp"]={"clang/test/CXX/dcl.decl/dcl.meaning/dcl.fct.default/p10.cpp:15:7: error: too few arguments to function call, expected 1, have 0; did you mean \'A::f\'?"}
		}
	},
	["err_typecheck_call_too_many_args"]={
		[c]="err_typecheck_call_too_many_args",
		[d]="too many %select{|||execution configuration }0arguments to %select{function|block|method|kernel function}0 call, expected %1, have %2",
		[e]={{nil,nil,{Xb,{a,a,a,V},U,{F,M,J,O}," call, expected B, have C"}}},
		[f]=j,
		[g]="too many (?:|||execution configuration )arguments to (?:function|block|method|kernel function) call, expected (.*?), have (.*?)",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{w,169,"/// Checks that a call expression\'s argument count is the desired number.\n/// This is useful when doing custom type-checking.  Returns true on error.\nstatic bool checkArgCount(Sema &S, CallExpr *Call, unsigned DesiredArgCount) {\n  // ...\n  return S.Diag(Range.getBegin(), diag::err_typecheck_call_too_many_args) << 0 /*function call*/ << DesiredArgCount << ArgCount << Call->getArg(1)->getSourceRange();"},{w,7138,"ExprResult Sema::BuildAtomicExpr(SourceRange CallRange, SourceRange ExprRange, SourceLocation RParenLoc, MultiExprArg Args, AtomicExpr::AtomicOp Op, AtomicArgumentOrder ArgOrder) {\n  // ...\n  // Check we have the right number of arguments.\n  if (Args.size() < AdjustedNumArgs) {\n  // ...\n  } else if (Args.size() > AdjustedNumArgs) {\n    Diag(Args[AdjustedNumArgs]->getBeginLoc(), diag::err_typecheck_call_too_many_args) << 0 << AdjustedNumArgs << static_cast<unsigned>(Args.size()) << ExprRange;"},{w,7502,"bool Sema::BuiltinWasmRefNullFunc(CallExpr *TheCall) {\n  if (TheCall->getNumArgs() != 0) {\n    Diag(TheCall->getBeginLoc(), diag::err_typecheck_call_too_many_args) << 0 /*function call*/ << 0 << TheCall->getNumArgs();"},{n,6515,"/// ConvertArgumentsForCall - Converts the arguments specified in\n/// Args/NumArgs to the parameter types of the function FDecl with\n/// function prototype Proto. Call is the call expression itself, and\n/// Fn is the function expression. For a C++ member function, this\n/// routine does not attempt to convert the object argument. Returns\n/// true if the call is ill-formed.\nbool Sema::ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, FunctionDecl *FDecl, const FunctionProtoType *Proto, ArrayRef<Expr *> Args, SourceLocation RParenLoc, bool IsExecConfig) {\n  // ...\n  // If too many are passed and not variadic, error on the extras and drop\n  // them.\n  if (Args.size() > NumParams) {\n    if (!Proto->isVariadic()) {\n      // ...\n      if (FDecl && (TC = TryTypoCorrectionForCall(*this, Fn, FDecl, Args))) {\n      // ...\n      } else if (NumParams == 1 && FDecl && FDecl->getParamDecl(0)->getDeclName())\n      // ...\n      else\n        Diag(Args[NumParams]->getBeginLoc(), MinArgs == NumParams ? diag::err_typecheck_call_too_many_args : diag::err_typecheck_call_too_many_args_at_most) << FnKind << NumParams << static_cast<unsigned>(Args.size()) << Fn->getSourceRange() << SourceRange(Args[NumParams]->getBeginLoc(), Args.back()->getEndLoc());"},{"clang/lib/Sema/SemaExprObjC.cpp",1900,"bool Sema::CheckMessageArgumentTypes(const Expr *Receiver, QualType ReceiverType, MultiExprArg Args, Selector Sel, ArrayRef<SourceLocation> SelectorLocs, ObjCMethodDecl *Method, bool isClassMessage, bool isSuperMessage, SourceLocation lbrac, SourceLocation rbrac, SourceRange RecRange, QualType &ReturnType, ExprValueKind &VK) {\n  // ...\n  // Promote additional arguments to variadic methods.\n  if (Method->isVariadic()) {\n  // ...\n  } else {\n    // Check for extra arguments to non-variadic methods.\n    if (Args.size() != NumNamedArgs) {\n      Diag(Args[NumNamedArgs]->getBeginLoc(), diag::err_typecheck_call_too_many_args) << 2 /*method*/ << NumNamedArgs << static_cast<unsigned>(Args.size()) << Method->getSourceRange() << SourceRange(Args[NumNamedArgs]->getBeginLoc(), Args.back()->getEndLoc());"}},
		[l]={
			["clang/test/Sema/builtin-unary-fp.c"]={"clang/test/Sema/builtin-unary-fp.c:11:27: error: too many arguments to function call, expected 1, have 2","clang/test/Sema/builtin-unary-fp.c:16:48: error: too many arguments to function call, expected 6, have 7"}
		}
	},
	["err_typecheck_call_too_many_args_at_most"]={
		[c]="err_typecheck_call_too_many_args_at_most",
		[d]="too many %select{|||execution configuration }0arguments to %select{function|block|method|kernel function}0 call, expected at most %1, have %2",
		[e]={{nil,nil,{Xb,{a,a,a,V},U,{F,M,J,O}," call, expected at most B, have C"}}},
		[f]=j,
		[g]="too many (?:|||execution configuration )arguments to (?:function|block|method|kernel function) call, expected at most (.*?), have (.*?)",
		[h]=a,
		[i]=m,
		[b]={"2a5aafff307a",1271393806,"Expand the argument diagnostics for too many arguments and give","Expand the argument diagnostics for too many arguments and give\nboth number seen and number expected.\n\nFinishes fixing PR6501.\n\nllvm-svn: 101442"},
		[k]={{w,140,"/// Checks that a call expression\'s argument count is at most the desired\n/// number. This is useful when doing custom type-checking on a variadic\n/// function. Returns true on error.\nstatic bool checkArgCountAtMost(Sema &S, CallExpr *Call, unsigned MaxArgCount) {\n  // ...\n  return S.Diag(Call->getEndLoc(), diag::err_typecheck_call_too_many_args_at_most) << 0 /*function call*/ << MaxArgCount << ArgCount << Call->getSourceRange();"},{w,8562,"/// SemaBuiltinPrefetch - Handle __builtin_prefetch.\n// This is declared to take (const void*, ...) and can take two\n// optional constant int args.\nbool Sema::SemaBuiltinPrefetch(CallExpr *TheCall) {\n  // ...\n  if (NumArgs > 3)\n    return Diag(TheCall->getEndLoc(), diag::err_typecheck_call_too_many_args_at_most) << 0 /*function call*/ << 3 << NumArgs << TheCall->getSourceRange();"},{w,8706,"bool Sema::SemaBuiltinOSLogFormat(CallExpr *TheCall) {\n  // ...\n  if (NumArgs >= NumRequiredArgs + 0x100) {\n    return Diag(TheCall->getEndLoc(), diag::err_typecheck_call_too_many_args_at_most) << 0 /* function call */ << (NumRequiredArgs + 0xff) << NumArgs << TheCall->getSourceRange();"},{n,6523,"/// ConvertArgumentsForCall - Converts the arguments specified in\n/// Args/NumArgs to the parameter types of the function FDecl with\n/// function prototype Proto. Call is the call expression itself, and\n/// Fn is the function expression. For a C++ member function, this\n/// routine does not attempt to convert the object argument. Returns\n/// true if the call is ill-formed.\nbool Sema::ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, FunctionDecl *FDecl, const FunctionProtoType *Proto, ArrayRef<Expr *> Args, SourceLocation RParenLoc, bool IsExecConfig) {\n  // ...\n  // If too many are passed and not variadic, error on the extras and drop\n  // them.\n  if (Args.size() > NumParams) {\n    if (!Proto->isVariadic()) {\n      // ...\n      if (FDecl && (TC = TryTypoCorrectionForCall(*this, Fn, FDecl, Args))) {\n      // ...\n      } else if (NumParams == 1 && FDecl && FDecl->getParamDecl(0)->getDeclName())\n      // ...\n      else\n        Diag(Args[NumParams]->getBeginLoc(), MinArgs == NumParams ? diag::err_typecheck_call_too_many_args : diag::err_typecheck_call_too_many_args_at_most) << FnKind << NumParams << static_cast<unsigned>(Args.size()) << Fn->getSourceRange() << SourceRange(Args[NumParams]->getBeginLoc(), Args.back()->getEndLoc());"}},
		[l]={
			["clang/test/Sema/builtin-prefetch.c"]={"clang/test/Sema/builtin-prefetch.c:8:33: error: too many arguments to function call, expected at most 3, have 4"}
		}
	},
	["err_typecheck_call_too_many_args_at_most_one"]={
		[c]="err_typecheck_call_too_many_args_at_most_one",
		[d]="too many %select{|||execution configuration }0arguments to %select{function|block|method|kernel function}0 call, expected at most single argument %1, have %2 arguments",
		[e]={{nil,nil,{Xb,{a,a,a,V},U,{F,M,J,O}," call, expected at most single argument B, have C arguments"}}},
		[f]=j,
		[g]="too many (?:|||execution configuration )arguments to (?:function|block|method|kernel function) call, expected at most single argument (.*?), have (.*?) arguments",
		[h]=a,
		[i]=m,
		[b]={"d72da1513aa9",1337062914,"Further improvement to wording of overload resolution diagnostics, and including","Further improvement to wording of overload resolution diagnostics, and including\nthe sole parameter name in the diagnostic in more cases. Patch by Terry Long!\n\nllvm-svn: 156807"},
		[k]={{n,6514,"/// ConvertArgumentsForCall - Converts the arguments specified in\n/// Args/NumArgs to the parameter types of the function FDecl with\n/// function prototype Proto. Call is the call expression itself, and\n/// Fn is the function expression. For a C++ member function, this\n/// routine does not attempt to convert the object argument. Returns\n/// true if the call is ill-formed.\nbool Sema::ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, FunctionDecl *FDecl, const FunctionProtoType *Proto, ArrayRef<Expr *> Args, SourceLocation RParenLoc, bool IsExecConfig) {\n  // ...\n  // If too many are passed and not variadic, error on the extras and drop\n  // them.\n  if (Args.size() > NumParams) {\n    if (!Proto->isVariadic()) {\n      // ...\n      if (FDecl && (TC = TryTypoCorrectionForCall(*this, Fn, FDecl, Args))) {\n      // ...\n      } else if (NumParams == 1 && FDecl && FDecl->getParamDecl(0)->getDeclName())\n        Diag(Args[NumParams]->getBeginLoc(), MinArgs == NumParams ? diag::err_typecheck_call_too_many_args_one : diag::err_typecheck_call_too_many_args_at_most_one) << FnKind << FDecl->getParamDecl(0) << static_cast<unsigned>(Args.size()) << Fn->getSourceRange() << SourceRange(Args[NumParams]->getBeginLoc(), Args.back()->getEndLoc());"}},
		[l]={
			["clang/test/SemaCXX/default1.cpp"]={"clang/test/SemaCXX/default1.cpp:69:10: error: too many arguments to function call, expected at most single argument \'f\', have 2 arguments"}
		}
	},
	["err_typecheck_call_too_many_args_at_most_suggest"]={
		[c]="err_typecheck_call_too_many_args_at_most_suggest",
		[d]="too many %select{|||execution configuration }0arguments to %select{function|block|method|kernel function}0 call, expected at most %1, have %2; did you mean %3?",
		[e]={{nil,nil,{Xb,{a,a,a,V},U,{F,M,J,O}," call, expected at most B, have C; did you mean D?"}}},
		[f]=j,
		[g]="too many (?:|||execution configuration )arguments to (?:function|block|method|kernel function) call, expected at most (.*?), have (.*?); did you mean (.*?)\\?",
		[h]=a,
		[i]=m,
		[b]={"476c823ec8fd",1373325224,"Attempt typo correction for function calls with the wrong number of arguments.","Attempt typo correction for function calls with the wrong number of arguments.\n\nCombined with typo correction\'s new ability to apply global/absolute nested\nname specifiers to possible corrections, cases such as in PR12287 where the\ndesired function is being shadowed by a lexically closer function with the\nsame name but a different number of parameters will now include a FixIt.\n\nOn a side note, since the test for this change caused\ntest/SemaCXX/typo-correction.cpp to exceed the typo correction limit for\na single file, I\'ve included a test case for exceeding the limit and added\nsome comments to both the original and part two of typo-correction.cpp\nwarning future editors of the files about the limit.\n\nllvm-svn: 185881"},
		[k]={{n,6505,"/// ConvertArgumentsForCall - Converts the arguments specified in\n/// Args/NumArgs to the parameter types of the function FDecl with\n/// function prototype Proto. Call is the call expression itself, and\n/// Fn is the function expression. For a C++ member function, this\n/// routine does not attempt to convert the object argument. Returns\n/// true if the call is ill-formed.\nbool Sema::ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, FunctionDecl *FDecl, const FunctionProtoType *Proto, ArrayRef<Expr *> Args, SourceLocation RParenLoc, bool IsExecConfig) {\n  // ...\n  // If too many are passed and not variadic, error on the extras and drop\n  // them.\n  if (Args.size() > NumParams) {\n    if (!Proto->isVariadic()) {\n      // ...\n      if (FDecl && (TC = TryTypoCorrectionForCall(*this, Fn, FDecl, Args))) {\n        unsigned diag_id = MinArgs == NumParams && !Proto->isVariadic() ? diag::err_typecheck_call_too_many_args_suggest : diag::err_typecheck_call_too_many_args_at_most_suggest;"}}
	},
	["err_typecheck_call_too_many_args_one"]={
		[c]="err_typecheck_call_too_many_args_one",
		[d]="too many %select{|||execution configuration }0arguments to %select{function|block|method|kernel function}0 call, expected single argument %1, have %2 arguments",
		[e]={{nil,nil,{Xb,{a,a,a,V},U,{F,M,J,O}," call, expected single argument B, have C arguments"}}},
		[f]=j,
		[g]="too many (?:|||execution configuration )arguments to (?:function|block|method|kernel function) call, expected single argument (.*?), have (.*?) arguments",
		[h]=a,
		[i]=m,
		[b]={"d72da1513aa9",1337062914,"Further improvement to wording of overload resolution diagnostics, and including","Further improvement to wording of overload resolution diagnostics, and including\nthe sole parameter name in the diagnostic in more cases. Patch by Terry Long!\n\nllvm-svn: 156807"},
		[k]={{n,6506,"/// ConvertArgumentsForCall - Converts the arguments specified in\n/// Args/NumArgs to the parameter types of the function FDecl with\n/// function prototype Proto. Call is the call expression itself, and\n/// Fn is the function expression. For a C++ member function, this\n/// routine does not attempt to convert the object argument. Returns\n/// true if the call is ill-formed.\nbool Sema::ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, FunctionDecl *FDecl, const FunctionProtoType *Proto, ArrayRef<Expr *> Args, SourceLocation RParenLoc, bool IsExecConfig) {\n  // ...\n  // If too many are passed and not variadic, error on the extras and drop\n  // them.\n  if (Args.size() > NumParams) {\n    if (!Proto->isVariadic()) {\n      // ...\n      if (FDecl && (TC = TryTypoCorrectionForCall(*this, Fn, FDecl, Args))) {\n      // ...\n      } else if (NumParams == 1 && FDecl && FDecl->getParamDecl(0)->getDeclName())\n        Diag(Args[NumParams]->getBeginLoc(), MinArgs == NumParams ? diag::err_typecheck_call_too_many_args_one : diag::err_typecheck_call_too_many_args_at_most_one) << FnKind << FDecl->getParamDecl(0) << static_cast<unsigned>(Args.size()) << Fn->getSourceRange() << SourceRange(Args[NumParams]->getBeginLoc(), Args.back()->getEndLoc());"}},
		[l]={
			["clang/test/Sema/exprs.c"]={"clang/test/Sema/exprs.c:176:15: error: too many arguments to function call, expected single argument \'a\', have 2 arguments"}
		}
	},
	["err_typecheck_call_too_many_args_suggest"]={
		[c]="err_typecheck_call_too_many_args_suggest",
		[d]="too many %select{|||execution configuration }0arguments to %select{function|block|method|kernel function}0 call, expected %1, have %2; did you mean %3?",
		[e]={{nil,nil,{Xb,{a,a,a,V},U,{F,M,J,O}," call, expected B, have C; did you mean D?"}}},
		[f]=j,
		[g]="too many (?:|||execution configuration )arguments to (?:function|block|method|kernel function) call, expected (.*?), have (.*?); did you mean (.*?)\\?",
		[h]=a,
		[i]=m,
		[b]={"476c823ec8fd",1373325224,"Attempt typo correction for function calls with the wrong number of arguments.","Attempt typo correction for function calls with the wrong number of arguments.\n\nCombined with typo correction\'s new ability to apply global/absolute nested\nname specifiers to possible corrections, cases such as in PR12287 where the\ndesired function is being shadowed by a lexically closer function with the\nsame name but a different number of parameters will now include a FixIt.\n\nOn a side note, since the test for this change caused\ntest/SemaCXX/typo-correction.cpp to exceed the typo correction limit for\na single file, I\'ve included a test case for exceeding the limit and added\nsome comments to both the original and part two of typo-correction.cpp\nwarning future editors of the files about the limit.\n\nllvm-svn: 185881"},
		[k]={{n,6497,"/// ConvertArgumentsForCall - Converts the arguments specified in\n/// Args/NumArgs to the parameter types of the function FDecl with\n/// function prototype Proto. Call is the call expression itself, and\n/// Fn is the function expression. For a C++ member function, this\n/// routine does not attempt to convert the object argument. Returns\n/// true if the call is ill-formed.\nbool Sema::ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, FunctionDecl *FDecl, const FunctionProtoType *Proto, ArrayRef<Expr *> Args, SourceLocation RParenLoc, bool IsExecConfig) {\n  // ...\n  // If too many are passed and not variadic, error on the extras and drop\n  // them.\n  if (Args.size() > NumParams) {\n    if (!Proto->isVariadic()) {\n      // ...\n      if (FDecl && (TC = TryTypoCorrectionForCall(*this, Fn, FDecl, Args))) {\n        unsigned diag_id = MinArgs == NumParams && !Proto->isVariadic() ? diag::err_typecheck_call_too_many_args_suggest : diag::err_typecheck_call_too_many_args_at_most_suggest;"}},
		[l]={
			["clang/test/CXX/basic/basic.lookup/basic.lookup.argdep/p3.cpp"]={"clang/test/CXX/basic/basic.lookup/basic.lookup.argdep/p3.cpp:33:7: error: too many arguments to function call, expected 0, have 1; did you mean \'N::f\'?"}
		}
	},
	["err_typecheck_cast_to_incomplete"]={
		[c]="err_typecheck_cast_to_incomplete",
		[d]="cast to incomplete type %0",
		[e]="cast to incomplete type A",
		[f]=j,
		[g]="cast to incomplete type (.*?)",
		[h]=a,
		[i]=m,
		[b]={"e98194d9e8d2",1279399429,"Check for casts to an incomplete type in C.  Improves diagnostics for cast to","Check for casts to an incomplete type in C.  Improves diagnostics for cast to\nincomplete union (PR5692) and incomplete enum, and fixes obscure\naccepts-invalid on cast to incomplete struct.\n\nllvm-svn: 108630"},
		[k]={{Rb,2975,"/// Check the semantics of a C-style cast operation, in C.\nvoid CastOperation::CheckCStyleCast() {\n  // ...\n  if (Self.RequireCompleteType(OpRange.getBegin(), DestType, diag::err_typecheck_cast_to_incomplete)) {"},{Rb,3257,"void CastOperation::CheckBuiltinBitCast() {\n  // ...\n  if (Self.RequireCompleteType(OpRange.getBegin(), DestType, diag::err_typecheck_cast_to_incomplete) || Self.RequireCompleteType(OpRange.getBegin(), SrcType, diag::err_incomplete_type)) {"},{n,21464,"/// Check a cast of an unknown-any type.  We intentionally only\n/// trigger this for C-style casts.\nExprResult Sema::checkUnknownAnyCast(SourceRange TypeRange, QualType CastType, Expr *CastExpr, CastKind &CastKind, ExprValueKind &VK, CXXCastPath &Path) {\n  // ...\n  if (!CastType->isVoidType() && RequireCompleteType(TypeRange.getBegin(), CastType, diag::err_typecheck_cast_to_incomplete))"}},
		[l]={
			["clang/test/Sema/cast-incomplete.c"]={"clang/test/Sema/cast-incomplete.c:9:3: error: cast to incomplete type \'enum x\'","clang/test/Sema/cast-incomplete.c:10:3: error: cast to incomplete type \'struct y\'","clang/test/Sema/cast-incomplete.c:11:3: error: cast to incomplete type \'union z\'","clang/test/Sema/cast-incomplete.c:12:3: error: cast to incomplete type \'union z\'"}
		}
	},
	["err_typecheck_cast_to_union_no_type"]={
		[c]="err_typecheck_cast_to_union_no_type",
		[d]="cast to union type from type %0 not present in union",
		[e]="cast to union type from type A not present in union",
		[f]=j,
		[g]="cast to union type from type (.*?) not present in union",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{Rb,3022,"/// Check the semantics of a C-style cast operation, in C.\nvoid CastOperation::CheckCStyleCast() {\n  // ...\n  if (!DestType->isScalarType() && !DestType->isVectorType() && !DestType->isMatrixType()) {\n    // ...\n    // GCC\'s cast to union extension.\n    if (DestRecordTy && DestRecordTy->getDecl()->isUnion()) {\n      // ...\n      if (CastExpr::getTargetFieldForToUnionCast(RD, SrcType)) {\n      // ...\n      } else {\n        Self.Diag(OpRange.getBegin(), diag::err_typecheck_cast_to_union_no_type) << SrcType << SrcExpr.get()->getSourceRange();"}},
		[l]={
			["clang/test/Sema/cast-to-union.c"]={"clang/test/Sema/cast-to-union.c:8:5: error: cast to union type from type \'int *\' not present in union","clang/test/Sema/cast-to-union.c:9:5: error: cast to union type from type \'unsigned int\' not present in union","clang/test/Sema/cast-to-union.c:13:14: error: cast to union type from type \'double\' not present in union"}
		}
	},
	["err_typecheck_choose_expr_requires_constant"]={
		[c]="err_typecheck_choose_expr_requires_constant",
		[d]="\'__builtin_choose_expr\' requires a constant expression",
		[e]="\'__builtin_choose_expr\' requires a constant expression",
		[f]=j,
		[g]="\'__builtin_choose_expr\' requires a constant expression",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{n,16896,"ExprResult Sema::ActOnChooseExpr(SourceLocation BuiltinLoc, Expr *CondExpr, Expr *LHSExpr, Expr *RHSExpr, SourceLocation RPLoc) {\n  // ...\n  if (CondExpr->isTypeDependent() || CondExpr->isValueDependent()) {\n  // ...\n  } else {\n    // ...\n    ExprResult CondICE = VerifyIntegerConstantExpression(CondExpr, &condEval, diag::err_typecheck_choose_expr_requires_constant);"}},
		[l]={
			["clang/test/Parser/builtin_types_compatible.c"]={"clang/test/Parser/builtin_types_compatible.c:37:29: error: \'__builtin_choose_expr\' requires a constant expression"}
		}
	},
	["err_typecheck_comparison_of_distinct_blocks"]={
		[c]="err_typecheck_comparison_of_distinct_blocks",
		[d]="comparison of distinct block types%diff{ ($ and $)|}0,1",
		[e]={{nil,nil,{"comparison of distinct block types",{Jb,a}}}},
		[f]=j,
		[g]="comparison of distinct block types(?: \\((.*?) and (.*?)\\)|)",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{n,13258,"// C99 6.5.8, C++ [expr.rel]\nQualType Sema::CheckCompareOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc) {\n  // ...\n  // Handle block pointer types.\n  if (!IsOrdered && LHSType->isBlockPointerType() && RHSType->isBlockPointerType()) {\n    // ...\n    if (!LHSIsNull && !RHSIsNull && !Context.typesAreCompatible(lpointee, rpointee)) {\n      Diag(Loc, diag::err_typecheck_comparison_of_distinct_blocks) << LHSType << RHSType << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();"},{n,13348,"// C99 6.5.8, C++ [expr.rel]\nQualType Sema::CheckCompareOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc) {\n  // ...\n  // Allow block pointers to be compared with null pointer constants.\n  if (!IsOrdered && ((LHSType->isBlockPointerType() && RHSType->isPointerType()) || (LHSType->isPointerType() && RHSType->isBlockPointerType()))) {\n    if (!LHSIsNull && !RHSIsNull) {\n      if (!((RHSType->isPointerType() && RHSType->castAs<PointerType>()->getPointeeType()->isVoidType()) || (LHSType->isPointerType() && LHSType->castAs<PointerType>()->getPointeeType()->isVoidType())))\n        Diag(Loc, diag::err_typecheck_comparison_of_distinct_blocks) << LHSType << RHSType << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();"}}
	},
	["err_typecheck_comparison_of_distinct_pointers"]={
		[c]="err_typecheck_comparison_of_distinct_pointers",
		[d]="comparison of distinct pointer types%diff{ ($ and $)|}0,1",
		[e]={{nil,nil,{"comparison of distinct pointer types",{Jb,a}}}},
		[f]=j,
		[g]="comparison of distinct pointer types(?: \\((.*?) and (.*?)\\)|)",
		[h]=a,
		[i]=m,
		[b]={"5b07c7ec057d",1241417232,"Implement support for comparing pointers with <, >, <=, >=, ==, and !=","Implement support for comparing pointers with <, >, <=, >=, ==, and !=\nin C++, taking into account conversions to the \"composite pointer\ntype\" so that we can compare, e.g., a pointer to a derived class to a\npointer to a base class. \n\nAlso, upgrade the \"comparing distinct pointer types\" from a warning to\nan error for C++, since this is clearly an error. Turns out that we\nhadn\'t gone through and audited this code for C++, ever. \n\nFixes <rdar://problem/6816420>.\n\nllvm-svn: 70829"},
		[k]={{n,12324,"static void diagnoseDistinctPointerComparison(Sema &S, SourceLocation Loc, ExprResult &LHS, ExprResult &RHS, bool IsError) { S.Diag(Loc, IsError ? diag::err_typecheck_comparison_of_distinct_pointers : diag::ext_typecheck_comparison_of_distinct_pointers) << LHS.get()->getType() << RHS.get()->getType() << LHS.get()->getSourceRange() << RHS.get()->getSourceRange(); }"}},
		[l]={
			["clang/test/SemaCXX/compare-function-pointer.cpp"]={"clang/test/SemaCXX/compare-function-pointer.cpp:17:14: error: comparison of distinct pointer types (\'fp0_t\' (aka \'void (*)()\') and \'fp1_t\' (aka \'int (*)()\'))","clang/test/SemaCXX/compare-function-pointer.cpp:18:14: error: comparison of distinct pointer types (\'fp0_t\' (aka \'void (*)()\') and \'fp1_t\' (aka \'int (*)()\'))","clang/test/SemaCXX/compare-function-pointer.cpp:19:14: error: comparison of distinct pointer types (\'fp0_t\' (aka \'void (*)()\') and \'fp1_t\' (aka \'int (*)()\'))","clang/test/SemaCXX/compare-function-pointer.cpp:21:14: error: comparison of distinct pointer types (\'fp0_t\' (aka \'void (*)()\') and \'fp1_t\' (aka \'int (*)()\'))","clang/test/SemaCXX/compare-function-pointer.cpp:23:14: error: comparison of distinct pointer types (\'fp0_t\' (aka \'void (*)()\') and \'fp1_t\' (aka \'int (*)()\'))","clang/test/SemaCXX/compare-function-pointer.cpp:25:14: error: comparison of distinct pointer types (\'fp0_t\' (aka \'void (*)()\') and \'fp1_t\' (aka \'int (*)()\'))"}
		}
	},
	["err_typecheck_comparison_of_fptr_to_void"]={
		[c]="err_typecheck_comparison_of_fptr_to_void",
		[d]="equality comparison between function pointer and void pointer (%0 and %1)",
		[e]="equality comparison between function pointer and void pointer (A and B)",
		[f]=j,
		[g]="equality comparison between function pointer and void pointer \\((.*?) and (.*?)\\)",
		[h]=a,
		[i]=m,
		[b]={"f267edd8ac6f",1276637920,"Update equality and relationship comparisons of pointers to reflect","Update equality and relationship comparisons of pointers to reflect\nC++ semantics, eliminating an extension diagnostic that doesn\'t match\nC++ semantics (ordered comparison with NULL) and tightening some\nextwarns to errors in C++ to match GCC and maintain conformance in\nSFINAE contexts. Fixes <rdar://problem/7941392>.\n\nllvm-svn: 106050"},
		[k]={{n,12365,"static void diagnoseFunctionPointerToVoidComparison(Sema &S, SourceLocation Loc, ExprResult &LHS, ExprResult &RHS, bool IsError) { S.Diag(Loc, IsError ? diag::err_typecheck_comparison_of_fptr_to_void : diag::ext_typecheck_comparison_of_fptr_to_void) << LHS.get()->getType() << RHS.get()->getType() << LHS.get()->getSourceRange() << RHS.get()->getSourceRange(); }"}}
	},
	["err_typecheck_comparison_of_pointer_integer"]={
		[c]="err_typecheck_comparison_of_pointer_integer",
		[d]="comparison between pointer and integer (%0 and %1)",
		[e]="comparison between pointer and integer (A and B)",
		[f]=j,
		[g]="comparison between pointer and integer \\((.*?) and (.*?)\\)",
		[h]=a,
		[i]=m,
		[b]={"f267edd8ac6f",1276637920,"Update equality and relationship comparisons of pointers to reflect","Update equality and relationship comparisons of pointers to reflect\nC++ semantics, eliminating an extension diagnostic that doesn\'t match\nC++ semantics (ordered comparison with NULL) and tightening some\nextwarns to errors in C++ to match GCC and maintain conformance in\nSFINAE contexts. Fixes <rdar://problem/7941392>.\n\nllvm-svn: 106050"},
		[k]={{n,13355,"// C99 6.5.8, C++ [expr.rel]\nQualType Sema::CheckCompareOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc) {\n  // ...\n  if ((LHSType->isAnyPointerType() && RHSType->isIntegerType()) || (LHSType->isIntegerType() && RHSType->isAnyPointerType())) {\n    // ...\n    if (LangOpts.DebuggerSupport) {\n    // ...\n    } else if ((LHSIsNull && LHSType->isIntegerType()) || (RHSIsNull && RHSType->isIntegerType())) {\n    // ...\n    } else if (getLangOpts().CPlusPlus) {\n      DiagID = diag::err_typecheck_comparison_of_pointer_integer;"}},
		[l]={
			["clang/test/CXX/over/over.built/spaceship.cpp"]={"clang/test/CXX/over/over.built/spaceship.cpp:16:12: error: comparison between pointer and integer (\'int\' and \'int *\')"}
		}
	},
	["err_typecheck_cond_expect_int_float"]={
		[c]="err_typecheck_cond_expect_int_float",
		[d]="used type %0 where integer or floating point type is required",
		[e]="used type A where integer or floating point type is required",
		[f]=j,
		[g]="used type (.*?) where integer or floating point type is required",
		[h]=a,
		[i]=m,
		[b]={"e8d2aaf32021",1423031898,"OpenCL: handle ternary operator when the condition is a vector","OpenCL: handle ternary operator when the condition is a vector\n\nWhen the condition is a vector, OpenCL specifies additional\nrequirements on the operand types, and also the operations\nrequired to determine the result type of the operator. This is a\ncombination of OpenCL v1.1 s6.3.i and s6.11.6, and the semantics\nremain unchanged in later versions of OpenCL.\n\nllvm-svn: 228118"},
		[k]={{n,8889,"/// Simple conversion between integer and floating point types.\n///\n/// Used when handling the OpenCL conditional operator where the\n/// condition is a vector while the other operands are scalar.\n///\n/// OpenCL v1.1 s6.3.i and s6.11.6 together require that the scalar\n/// types are either integer or floating type. Between the two\n/// operands, the type with the higher rank is defined as the \"result\n/// type\". The other operand needs to be promoted to the same type. No\n/// other type promotion is allowed. We cannot use\n/// UsualArithmeticConversions() for this purpose, since it always\n/// promotes promotable types.\nstatic QualType OpenCLArithmeticConversions(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation QuestionLoc) {\n  // ...\n  if (!LHSType->isIntegerType() && !LHSType->isRealFloatingType()) {\n    S.Diag(QuestionLoc, diag::err_typecheck_cond_expect_int_float) << LHSType << LHS.get()->getSourceRange();"},{n,8941,"/// Simple conversion between integer and floating point types.\n///\n/// Used when handling the OpenCL conditional operator where the\n/// condition is a vector while the other operands are scalar.\n///\n/// OpenCL v1.1 s6.3.i and s6.11.6 together require that the scalar\n/// types are either integer or floating type. Between the two\n/// operands, the type with the higher rank is defined as the \"result\n/// type\". The other operand needs to be promoted to the same type. No\n/// other type promotion is allowed. We cannot use\n/// UsualArithmeticConversions() for this purpose, since it always\n/// promotes promotable types.\nstatic QualType OpenCLArithmeticConversions(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation QuestionLoc) {\n  // ...\n  if (!RHSType->isIntegerType() && !RHSType->isRealFloatingType()) {\n    S.Diag(QuestionLoc, diag::err_typecheck_cond_expect_int_float) << RHSType << RHS.get()->getSourceRange();"}},
		[l]={
			["clang/test/SemaOpenCL/cond.cl"]={"clang/test/SemaOpenCL/cond.cl:113:12: error: used type \'__global int *\' where integer or floating point type is required"}
		}
	},
	["err_typecheck_cond_expect_nonfloat"]={
		[c]="err_typecheck_cond_expect_nonfloat",
		[d]="used type %0 where floating point type is not allowed",
		[e]="used type A where floating point type is not allowed",
		[f]=j,
		[g]="used type (.*?) where floating point type is not allowed",
		[h]=a,
		[i]=m,
		[b]={"e8d2aaf32021",1423031898,"OpenCL: handle ternary operator when the condition is a vector","OpenCL: handle ternary operator when the condition is a vector\n\nWhen the condition is a vector, OpenCL specifies additional\nrequirements on the operand types, and also the operations\nrequired to determine the result type of the operator. This is a\ncombination of OpenCL v1.1 s6.3.i and s6.11.6, and the semantics\nremain unchanged in later versions of OpenCL.\n\nllvm-svn: 228118"},
		[k]={{n,8619,"/// Return false if the condition expression is valid, true otherwise.\nstatic bool checkCondition(Sema &S, Expr *Cond, SourceLocation QuestionLoc) {\n  // ...\n  // OpenCL v1.1 s6.3.i says the condition cannot be a floating point type.\n  if (S.getLangOpts().OpenCL && CondTy->isFloatingType()) {\n    S.Diag(QuestionLoc, diag::err_typecheck_cond_expect_nonfloat) << CondTy << Cond->getSourceRange();"},{n,8981,"/// Return false if this is a valid OpenCL condition vector\nstatic bool checkOpenCLConditionVector(Sema &S, Expr *Cond, SourceLocation QuestionLoc) {\n  // ...\n  S.Diag(QuestionLoc, diag::err_typecheck_cond_expect_nonfloat) << Cond->getType() << Cond->getSourceRange();"}},
		[l]={
			["clang/test/SemaOpenCL/cond.cl"]={"clang/test/SemaOpenCL/cond.cl:102:12: error: used type \'float\' where floating point type is not allowed","clang/test/SemaOpenCL/cond.cl:107:12: error: used type \'float2\' (vector of 2 \'float\' values) where floating point type is not allowed"}
		}
	},
	["err_typecheck_cond_expect_scalar"]={
		[c]="err_typecheck_cond_expect_scalar",
		[d]="used type %0 where arithmetic or pointer type is required",
		[e]="used type A where arithmetic or pointer type is required",
		[f]=j,
		[g]="used type (.*?) where arithmetic or pointer type is required",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{Rb,3047,"/// Check the semantics of a C-style cast operation, in C.\nvoid CastOperation::CheckCStyleCast() {\n  // ...\n  if (!DestType->isScalarType() && !DestType->isVectorType() && !DestType->isMatrixType()) {\n    // ...\n    Self.Diag(OpRange.getBegin(), diag::err_typecheck_cond_expect_scalar) << DestType << SrcExpr.get()->getSourceRange();"},{n,8686,"/// Return false if the condition expression is valid, true otherwise.\nstatic bool checkCondition(Sema &S, Expr *Cond, SourceLocation QuestionLoc) {\n  // ...\n  S.Diag(QuestionLoc, diag::err_typecheck_cond_expect_scalar) << CondTy << Cond->getSourceRange();"}},
		[l]={
			["clang/test/Parser/check_cast.c"]={"clang/test/Parser/check_cast.c:10:9: error: used type \'struct foo\' where arithmetic or pointer type is required"}
		}
	},
	["err_typecheck_cond_incompatible_operands"]={
		[c]="err_typecheck_cond_incompatible_operands",
		[d]="incompatible operand types%diff{ ($ and $)|}0,1",
		[e]={{nil,nil,{"incompatible operand types",{Jb,a}}}},
		[f]=j,
		[g]="incompatible operand types(?: \\((.*?) and (.*?)\\)|)",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{n,8845,"/// Return the resulting type when the operands are both block pointers.\nstatic QualType checkConditionalBlockPointerCompatibility(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc) {\n  // ...\n  if (!LHSTy->isBlockPointerType() || !RHSTy->isBlockPointerType()) {\n    // ...\n    S.Diag(Loc, diag::err_typecheck_cond_incompatible_operands) << LHSTy << RHSTy << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();"},{n,9143,"/// 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  // Diagnose attempts to convert between __ibm128, __float128 and long double\n  // where such conversions currently can\'t be handled.\n  if (unsupportedTypeConversion(*this, LHSTy, RHSTy)) {\n    Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands) << LHSTy << RHSTy << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();"},{n,9180,"/// 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 both operands have arithmetic type, do the usual arithmetic conversions\n  // to find a common type: C99 6.5.15p3,5.\n  if (LHSTy->isArithmeticType() && RHSTy->isArithmeticType()) {\n    // Disallow invalid arithmetic conversions, such as those between bit-\n    // precise integers types of different sizes, or between a bit-precise\n    // integer and another type.\n    if (ResTy.isNull() && (LHSTy->isBitIntType() || RHSTy->isBitIntType())) {\n      Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands) << LHSTy << RHSTy << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();"},{n,9334,"/// 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  Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands) << LHSTy << RHSTy << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();"},{G,6261,"/// Try to find a common type for two according to C++0x 5.16p5.\n///\n/// This is part of the parameter validation for the ? operator. If either\n/// value operand is a class type, overload resolution is used to find a\n/// conversion to a common type.\nstatic bool FindConditionalOverload(Sema &Self, ExprResult &LHS, ExprResult &RHS, SourceLocation QuestionLoc) {\n  // ...\n  case OR_No_Viable_Function:\n    // ...\n    Self.Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands) << LHS.get()->getType() << RHS.get()->getType() << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();"},{G,6766,"/// 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  //   -- The second and third operands have arithmetic or enumeration type;\n  //      the usual arithmetic conversions are performed to bring them to a\n  //      common type, and the result is of that type.\n  if (LTy->isArithmeticType() && RTy->isArithmeticType()) {\n    // ...\n    if (ResTy.isNull()) {\n      Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands) << LTy << RTy << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();"},{G,6804,"/// 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  Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands) << LHS.get()->getType() << RHS.get()->getType() << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();"}},
		[l]={
			["clang/test/Sema/block-misc.c"]={"clang/test/Sema/block-misc.c:175:7: error: incompatible operand types (\'void (^)(int)\' and \'void (*)(int)\')"}
		}
	},
	["err_typecheck_cond_incompatible_operands_null"]={
		[c]="err_typecheck_cond_incompatible_operands_null",
		[d]="non-pointer operand type %0 incompatible with %select{NULL|nullptr}1",
		[e]={{nil,nil,{"non-pointer operand type A incompatible with ",{"NULL","nullptr"}}}},
		[f]=j,
		[g]="non\\-pointer operand type (.*?) incompatible with (?:NULL|nullptr)",
		[h]=a,
		[i]=m,
		[b]={"a8bea4b90ec7",1298073290,"Initial steps to improve diagnostics when there is a NULL and","Initial steps to improve diagnostics when there is a NULL and\na non-pointer on the two sides of a conditional expression.\n\nPatch by Stephen Hines and Mihai Rusu.\n\nllvm-svn: 125995"},
		[k]={{n,8611,"/// Emit a specialized diagnostic when one expression is a null pointer\n/// constant and the other is not a pointer.  Returns true if a diagnostic is\n/// emitted.\nbool Sema::DiagnoseConditionalForNull(Expr *LHSExpr, Expr *RHSExpr, SourceLocation QuestionLoc) {\n  // ...\n  Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands_null) << NonPointerExpr->getType() << DiagType << NonPointerExpr->getSourceRange();"}},
		[l]={
			["clang/test/SemaCXX/nullptr.cpp"]={"clang/test/SemaCXX/nullptr.cpp:51:12: error: non-pointer operand type \'A\' incompatible with nullptr","clang/test/SemaCXX/nullptr.cpp:52:12: error: non-pointer operand type \'A\' incompatible with nullptr"}
		}
	},
	["err_typecheck_convert_discards_qualifiers"]={
		[c]={{nil,u,"err_typecheck_convert_discards_qualifiers"}},
		[d]={{nil,u,"%select{%diff{assigning to $ from $|assigning to different types}0,1|%diff{passing $ to parameter of type $|passing to parameter of different type}0,1|%diff{returning $ from a function with result type $|returning from function with different return type}0,1|%diff{converting $ to type $|converting between types}0,1|%diff{initializing $ with an expression of type $|initializing with expression of different type}0,1|%diff{sending $ to parameter of type $|sending to parameter of different type}0,1|%diff{casting $ to type $|casting between types}0,1}2 discards qualifiers"}},
		[e]={{nil,u,{{{{wb,Z}},{{X,N}},{{ab,L}},{{K,P}},{{R,Q}},{{S,T}},{{W,Y}}}," discards qualifiers"}}},
		[f]=j,
		[g]="(?:(?:assigning to (.*?) from (.*?)|assigning to different types)|(?:passing (.*?) to parameter of type (.*?)|passing to parameter of different type)|(?:returning (.*?) from a function with result type (.*?)|returning from function with different return type)|(?:converting (.*?) to type (.*?)|converting between types)|(?:initializing (.*?) with an expression of type (.*?)|initializing with expression of different type)|(?:sending (.*?) to parameter of type (.*?)|sending to parameter of different type)|(?:casting (.*?) to type (.*?)|casting between types)) discards qualifiers",
		[h]=a,
		[i]={{nil,u,m}},
		[b]={fb,1576908663,gb,hb},
		[k]={{n,17631,"bool Sema::DiagnoseAssignmentResult(AssignConvertType ConvTy, SourceLocation Loc, QualType DstType, QualType SrcType, Expr *SrcExpr, AssignmentAction Action, bool *Complained) {\n  // ...\n  case CompatiblePointerDiscardsQualifiers:\n    // ...\n    if (getLangOpts().CPlusPlus) {\n      DiagKind = diag::err_typecheck_convert_discards_qualifiers;"}},
		[l]={
			["clang/test/CXX/drs/dr3xx.cpp"]={"clang/test/CXX/drs/dr3xx.cpp:405:9: error: assigning to \'T\' (aka \'const int *(*)[]\') from \'S\' (aka \'const int *const (*)[]\') discards qualifiers"}
		}
	},
	["err_typecheck_convert_incompatible"]={
		[c]="err_typecheck_convert_incompatible",
		[d]={{nil,eb,"%select{%diff{assigning to $ from incompatible type $|assigning to type from incompatible type}0,1|%diff{passing $ to parameter of incompatible type $|passing type to parameter of incompatible type}0,1|%diff{returning $ from a function with incompatible result type $|returning type from a function with incompatible result type}0,1|%diff{converting $ to incompatible type $|converting type to incompatible type}0,1|%diff{initializing $ with an expression of incompatible type $|initializing type with an expression of incompatible type}0,1|%diff{sending $ to parameter of incompatible type $|sending type to parameter of incompatible type}0,1|%diff{casting $ to incompatible type $|casting type to incompatible type}0,1}2%select{|; dereference with *|; take the address with &|; remove *|; remove &}3%select{|: different classes%diff{ ($ vs $)|}5,6|: different number of parameters (%5 vs %6)|: type mismatch at %ordinal5 parameter%diff{ ($ vs $)|}6,7|: different return type%diff{ ($ vs $)|}5,6|: different qualifiers (%5 vs %6)|: different exception specifications}4"},{"7.1",nil,"%select{%diff{assigning to $ from incompatible type $|assigning to type from incompatible type}0,1|%diff{passing $ to parameter of incompatible type $|passing type to parameter of incompatible type}0,1|%diff{returning $ from a function with incompatible result type $|returning type from a function with incompatible result type}0,1|%diff{converting $ to incompatible type $|converting type to incompatible type}0,1|%diff{initializing $ with an expression of incompatible type $|initializing type with an expression of incompatible type}0,1|%diff{sending $ to parameter of incompatible type $|sending type to parameter of incompatible type}0,1|%diff{casting $ to incompatible type $|casting type to incompatible type}0,1}2%select{|; dereference with *|; take the address with &|; remove *|; remove &}3%select{|: different classes%diff{ ($ vs $)|}5,6|: different number of parameters (%5 vs %6)|: type mismatch at %ordinal5 parameter%diff{ ($ vs $)|}6,7|: different return type%diff{ ($ vs $)|}5,6|: different qualifiers (%select{none|const|restrict|const and restrict|volatile|const and volatile|volatile and restrict|const, volatile, and restrict}5 vs %select{none|const|restrict|const and restrict|volatile|const and volatile|volatile and restrict|const, volatile, and restrict}6)|: different exception specifications}4"}},
		[e]={{nil,eb,{{{{"assigning to A from incompatible type B","assigning to type from incompatible type"}},{{"passing A to parameter of incompatible type B","passing type to parameter of incompatible type"}},{{"returning A from a function with incompatible result type B","returning type from a function with incompatible result type"}},{{"converting A to incompatible type B","converting type to incompatible type"}},{{"initializing A with an expression of incompatible type B","initializing type with an expression of incompatible type"}},{{"sending A to parameter of incompatible type B","sending type to parameter of incompatible type"}},{{"casting A to incompatible type B","casting type to incompatible type"}}},{a,Yb,Vb,Ub,Zb},{a,{": different classes",{" (F vs G)",a}},": different number of parameters (F vs G)",{": type mismatch at F parameter",{" (G vs H)",a}},{": different return type",{" (F vs G)",a}},": different qualifiers (F vs G)",": different exception specifications"}}},{"7.1",nil,{{{{"assigning to A from incompatible type B","assigning to type from incompatible type"}},{{"passing A to parameter of incompatible type B","passing type to parameter of incompatible type"}},{{"returning A from a function with incompatible result type B","returning type from a function with incompatible result type"}},{{"converting A to incompatible type B","converting type to incompatible type"}},{{"initializing A with an expression of incompatible type B","initializing type with an expression of incompatible type"}},{{"sending A to parameter of incompatible type B","sending type to parameter of incompatible type"}},{{"casting A to incompatible type B","casting type to incompatible type"}}},{a,Yb,Vb,Ub,Zb},{a,{": different classes",{" (F vs G)",a}},": different number of parameters (F vs G)",{": type mismatch at F parameter",{" (G vs H)",a}},{": different return type",{" (F vs G)",a}},{": different qualifiers (",{"none","const","restrict","const and restrict","volatile","const and volatile","volatile and restrict","const, volatile, and restrict"}," vs ",{"none","const","restrict","const and restrict","volatile","const and volatile","volatile and restrict","const, volatile, and restrict"},")"},": different exception specifications"}}}},
		[f]=j,
		[g]="(?:(?:assigning to (.*?) from incompatible type (.*?)|assigning to type from incompatible type)|(?:passing (.*?) to parameter of incompatible type (.*?)|passing type to parameter of incompatible type)|(?:returning (.*?) from a function with incompatible result type (.*?)|returning type from a function with incompatible result type)|(?:converting (.*?) to incompatible type (.*?)|converting type to incompatible type)|(?:initializing (.*?) with an expression of incompatible type (.*?)|initializing type with an expression of incompatible type)|(?:sending (.*?) to parameter of incompatible type (.*?)|sending type to parameter of incompatible type)|(?:casting (.*?) to incompatible type (.*?)|casting type to incompatible type))(?:|; dereference with \\*|; take the address with &|; remove \\*|; remove &)(?:|\\: different classes(?: \\((.*?) vs (.*?)\\)|)|\\: different number of parameters \\((.*?) vs (.*?)\\)|\\: type mismatch at (.*?) parameter(?: \\((.*?) vs (.*?)\\)|)|\\: different return type(?: \\((.*?) vs (.*?)\\)|)|\\: different qualifiers \\((.*?) vs (.*?)\\)|\\: different exception specifications)",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{w,4387,"bool Sema::CheckPPCBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID, CallExpr *TheCall) {\n  // ...\n  case PPC::BI__builtin_ppc_maxfe:\n  case PPC::BI__builtin_ppc_minfe:\n  case PPC::BI__builtin_ppc_maxfl:\n  case PPC::BI__builtin_ppc_minfl:\n  case PPC::BI__builtin_ppc_maxfs:\n  case PPC::BI__builtin_ppc_minfs: {\n    // ...\n    for (unsigned I = 0, E = TheCall->getNumArgs(); I < E; ++I)\n      if (TheCall->getArg(I)->getType() != ArgType)\n        return Diag(TheCall->getBeginLoc(), diag::err_typecheck_convert_incompatible) << TheCall->getArg(I)->getType() << ArgType << 1 << 0 << 0;"},{w,8223,"bool Sema::SemaBuiltinVAStartARMMicrosoft(CallExpr *Call) {\n  // ...\n  if (!Arg1Ty->isPointerType() || !IsSuitablyTypedFormatArgument(Arg1))\n    Diag(Arg1->getBeginLoc(), diag::err_typecheck_convert_incompatible) << Arg1->getType() << ConstCharPtrTy << 1 /* different class */"},{w,8231,"bool Sema::SemaBuiltinVAStartARMMicrosoft(CallExpr *Call) {\n  // ...\n  if (Arg2Ty->getCanonicalTypeInternal().withoutLocalFastQualifiers() != SizeTy)\n    Diag(Arg2->getBeginLoc(), diag::err_typecheck_convert_incompatible) << Arg2->getType() << SizeTy << 1 /* different class */"},{w,9278,"/// SemaBuiltinPPCMMACall - Check the call to a PPC MMA builtin for validity.\n/// Emit an error and return true on failure; return false on success.\n/// TypeStr is a string containing the type descriptor of the value returned by\n/// the builtin and the descriptors of the expected type of the arguments.\nbool Sema::SemaBuiltinPPCMMACall(CallExpr *TheCall, unsigned BuiltinID, const char *TypeStr) {\n  // ...\n  while (*TypeStr != \'\\0\') {\n    // ...\n    // The only case where the argument type and expected type are allowed to\n    // mismatch is if the argument type is a non-void pointer (or array) and\n    // expected type is a void pointer.\n    if (StrippedRVType != ExpectedType)\n      if (!(ExpectedType->isVoidPointerType() && (StrippedRVType->isPointerType() || StrippedRVType->isArrayType())))\n        return Diag(Arg->getBeginLoc(), diag::err_typecheck_convert_incompatible) << PassedType << ExpectedType << 1 << 0 << 0;"},{n,17742,"bool Sema::DiagnoseAssignmentResult(AssignConvertType ConvTy, SourceLocation Loc, QualType DstType, QualType SrcType, Expr *SrcExpr, AssignmentAction Action, bool *Complained) {\n  // ...\n  case Incompatible:\n    // ...\n    DiagKind = diag::err_typecheck_convert_incompatible;"}},
		[l]={
			["clang/test/CXX/expr/p13.cpp"]={"clang/test/CXX/expr/p13.cpp:17:7: error: assigning to \'C\' (aka \'void (X::*)() noexcept\') from incompatible type \'void (X::*)()\': different exception specifications","clang/test/CXX/expr/p13.cpp:20:7: error: assigning to \'E\' (aka \'void (Y::*)() noexcept\') from incompatible type \'void (Y::*)()\': different exception specifications","clang/test/CXX/expr/p13.cpp:21:7: error: assigning to \'E\' (aka \'void (Y::*)() noexcept\') from incompatible type \'void (Y::*)()\': different exception specifications"}
		}
	},
	["err_typecheck_convert_incompatible_block_pointer"]={
		[c]="err_typecheck_convert_incompatible_block_pointer",
		[d]="incompatible block pointer types %select{%diff{assigning to $ from $|assigning to different types}0,1|%diff{passing $ to parameter of type $|passing to parameter of different type}0,1|%diff{returning $ from a function with result type $|returning from function with different return type}0,1|%diff{converting $ to type $|converting between types}0,1|%diff{initializing $ with an expression of type $|initializing with expression of different type}0,1|%diff{sending $ to parameter of type $|sending to parameter of different type}0,1|%diff{casting $ to type $|casting between types}0,1}2",
		[e]={{nil,nil,{"incompatible block pointer types ",{{{wb,Z}},{{X,N}},{{ab,L}},{{K,P}},{{R,Q}},{{S,T}},{{W,Y}}}}}},
		[f]=j,
		[g]="incompatible block pointer types (?:(?:assigning to (.*?) from (.*?)|assigning to different types)|(?:passing (.*?) to parameter of type (.*?)|passing to parameter of different type)|(?:returning (.*?) from a function with result type (.*?)|returning from function with different return type)|(?:converting (.*?) to type (.*?)|converting between types)|(?:initializing (.*?) with an expression of type (.*?)|initializing with expression of different type)|(?:sending (.*?) to parameter of type (.*?)|sending to parameter of different type)|(?:casting (.*?) to type (.*?)|casting between types))",
		[h]=a,
		[i]=m,
		[b]={"d79b5a85b059",1240354302,"Tighten up blocks type checking.  This was discussed back in the","Tighten up blocks type checking.  This was discussed back in the\nr56595 timeframe, but left undone.  Radar 6812711\n\nllvm-svn: 69745"},
		[k]={{n,17679,"bool Sema::DiagnoseAssignmentResult(AssignConvertType ConvTy, SourceLocation Loc, QualType DstType, QualType SrcType, Expr *SrcExpr, AssignmentAction Action, bool *Complained) {\n  // ...\n  case IncompatibleBlockPointer:\n    DiagKind = diag::err_typecheck_convert_incompatible_block_pointer;"}},
		[l]={
			["clang/test/SemaObjC/block-omitted-return-type.m"]={"clang/test/SemaObjC/block-omitted-return-type.m:26:10: error: incompatible block pointer types initializing \'void (^)(void)\' with an expression of type \'const void (^)(void)\'"}
		}
	},
	["err_typecheck_convert_incompatible_function_pointer"]={
		[c]={{nil,u,"err_typecheck_convert_incompatible_function_pointer"}},
		[d]={{nil,u,"incompatible function pointer types %select{%diff{assigning to $ from $|assigning to different types}0,1|%diff{passing $ to parameter of type $|passing to parameter of different type}0,1|%diff{returning $ from a function with result type $|returning from function with different return type}0,1|%diff{converting $ to type $|converting between types}0,1|%diff{initializing $ with an expression of type $|initializing with expression of different type}0,1|%diff{sending $ to parameter of type $|sending to parameter of different type}0,1|%diff{casting $ to type $|casting between types}0,1}2%select{|; dereference with *|; take the address with &|; remove *|; remove &}3"}},
		[e]={{nil,u,{"incompatible function pointer types ",{{{wb,Z}},{{X,N}},{{ab,L}},{{K,P}},{{R,Q}},{{S,T}},{{W,Y}}},{a,Yb,Vb,Ub,Zb}}}},
		[f]=j,
		[g]="incompatible function pointer types (?:(?:assigning to (.*?) from (.*?)|assigning to different types)|(?:passing (.*?) to parameter of type (.*?)|passing to parameter of different type)|(?:returning (.*?) from a function with result type (.*?)|returning from function with different return type)|(?:converting (.*?) to type (.*?)|converting between types)|(?:initializing (.*?) with an expression of type (.*?)|initializing with expression of different type)|(?:sending (.*?) to parameter of type (.*?)|sending to parameter of different type)|(?:casting (.*?) to type (.*?)|casting between types))(?:|; dereference with \\*|; take the address with &|; remove \\*|; remove &)",
		[h]=a,
		[i]={{nil,u,m}},
		[b]={fb,1576908663,gb,hb},
		[k]={{n,17554,"bool Sema::DiagnoseAssignmentResult(AssignConvertType ConvTy, SourceLocation Loc, QualType DstType, QualType SrcType, Expr *SrcExpr, AssignmentAction Action, bool *Complained) {\n  // ...\n  case IncompatibleFunctionPointer:\n    if (getLangOpts().CPlusPlus) {\n      DiagKind = diag::err_typecheck_convert_incompatible_function_pointer;"}},
		[l]={
			["clang/test/CXX/expr/p13.cpp"]={"clang/test/CXX/expr/p13.cpp:14:7: error: incompatible function pointer types assigning to \'A\' (aka \'void (*)() noexcept\') from \'void (*)()\'"}
		}
	},
	["err_typecheck_convert_incompatible_pointer"]={
		[c]={{nil,u,"err_typecheck_convert_incompatible_pointer"}},
		[d]={{nil,u,"incompatible pointer types %select{%diff{assigning to $ from $|assigning to different types}0,1|%diff{passing $ to parameter of type $|passing to parameter of different type}0,1|%diff{returning $ from a function with result type $|returning from function with different return type}0,1|%diff{converting $ to type $|converting between types}0,1|%diff{initializing $ with an expression of type $|initializing with expression of different type}0,1|%diff{sending $ to parameter of type $|sending to parameter of different type}0,1|%diff{casting $ to type $|casting between types}0,1}2%select{|; dereference with *|; take the address with &|; remove *|; remove &}3"}},
		[e]={{nil,u,{"incompatible pointer types ",{{{wb,Z}},{{X,N}},{{ab,L}},{{K,P}},{{R,Q}},{{S,T}},{{W,Y}}},{a,Yb,Vb,Ub,Zb}}}},
		[f]=j,
		[g]="incompatible pointer types (?:(?:assigning to (.*?) from (.*?)|assigning to different types)|(?:passing (.*?) to parameter of type (.*?)|passing to parameter of different type)|(?:returning (.*?) from a function with result type (.*?)|returning from function with different return type)|(?:converting (.*?) to type (.*?)|converting between types)|(?:initializing (.*?) with an expression of type (.*?)|initializing with expression of different type)|(?:sending (.*?) to parameter of type (.*?)|sending to parameter of different type)|(?:casting (.*?) to type (.*?)|casting between types))(?:|; dereference with \\*|; take the address with &|; remove \\*|; remove &)",
		[h]=a,
		[i]={{nil,u,m}},
		[b]={fb,1576908663,gb,hb},
		[k]={{n,17566,"bool Sema::DiagnoseAssignmentResult(AssignConvertType ConvTy, SourceLocation Loc, QualType DstType, QualType SrcType, Expr *SrcExpr, AssignmentAction Action, bool *Complained) {\n  // ...\n  case IncompatiblePointer:\n    if (Action == AA_Passing_CFAudited) {\n    // ...\n    } else if (getLangOpts().CPlusPlus) {\n      DiagKind = diag::err_typecheck_convert_incompatible_pointer;"}},
		[l]={
			["clang/test/CXX/temp/temp.decls/temp.class/temp.mem.class/p1.cpp"]={"clang/test/CXX/temp/temp.decls/temp.class/temp.mem.class/p1.cpp:13:18: error: incompatible pointer types assigning to \'int *\' from \'float *\'"}
		}
	},
	["err_typecheck_convert_incompatible_pointer_sign"]={
		[c]={{nil,u,"err_typecheck_convert_incompatible_pointer_sign"}},
		[d]={{nil,s,"%select{%diff{assigning to $ from $|assigning to different types}0,1|%diff{passing $ to parameter of type $|passing to parameter of different type}0,1|%diff{returning $ from a function with result type $|returning from function with different return type}0,1|%diff{converting $ to type $|converting between types}0,1|%diff{initializing $ with an expression of type $|initializing with expression of different type}0,1|%diff{sending $ to parameter of type $|sending to parameter of different type}0,1|%diff{casting $ to type $|casting between types}0,1}2 converts between pointers to integer types %select{with different sign|where one is of the unique plain \'char\' type and the other is not}3"},{Eb,u,"%select{%diff{assigning to $ from $|assigning to different types}0,1|%diff{passing $ to parameter of type $|passing to parameter of different type}0,1|%diff{returning $ from a function with result type $|returning from function with different return type}0,1|%diff{converting $ to type $|converting between types}0,1|%diff{initializing $ with an expression of type $|initializing with expression of different type}0,1|%diff{sending $ to parameter of type $|sending to parameter of different type}0,1|%diff{casting $ to type $|casting between types}0,1}2 converts between pointers to integer types with different sign"}},
		[e]={{nil,s,{{{{wb,Z}},{{X,N}},{{ab,L}},{{K,P}},{{R,Q}},{{S,T}},{{W,Y}}}," converts between pointers to integer types ",{"with different sign","where one is of the unique plain \'char\' type and the other is not"}}},{Eb,u,{{{{wb,Z}},{{X,N}},{{ab,L}},{{K,P}},{{R,Q}},{{S,T}},{{W,Y}}}," converts between pointers to integer types with different sign"}}},
		[f]=j,
		[g]="(?:(?:assigning to (.*?) from (.*?)|assigning to different types)|(?:passing (.*?) to parameter of type (.*?)|passing to parameter of different type)|(?:returning (.*?) from a function with result type (.*?)|returning from function with different return type)|(?:converting (.*?) to type (.*?)|converting between types)|(?:initializing (.*?) with an expression of type (.*?)|initializing with expression of different type)|(?:sending (.*?) to parameter of type (.*?)|sending to parameter of different type)|(?:casting (.*?) to type (.*?)|casting between types)) converts between pointers to integer types (?:with different sign|where one is of the unique plain \'char\' type and the other is not)",
		[h]=a,
		[i]={{nil,u,m}},
		[b]={fb,1576908663,gb,hb},
		[k]={{n,17583,"bool Sema::DiagnoseAssignmentResult(AssignConvertType ConvTy, SourceLocation Loc, QualType DstType, QualType SrcType, Expr *SrcExpr, AssignmentAction Action, bool *Complained) {\n  // ...\n  case IncompatiblePointerSign:\n    if (getLangOpts().CPlusPlus) {\n      DiagKind = diag::err_typecheck_convert_incompatible_pointer_sign;"},{n,17764,"bool Sema::DiagnoseAssignmentResult(AssignConvertType ConvTy, SourceLocation Loc, QualType DstType, QualType SrcType, Expr *SrcExpr, AssignmentAction Action, bool *Complained) {\n  // ...\n  if (DiagKind == diag::ext_typecheck_convert_incompatible_pointer_sign || DiagKind == diag::err_typecheck_convert_incompatible_pointer_sign) {"}},
		[l]={
			["clang/test/Sema/incompatible-sign.cpp"]={"clang/test/Sema/incompatible-sign.cpp:7:7: error: assigning to \'signed char *\' from \'char *\' converts between pointers to integer types where one is of the unique plain \'char\' type and the other is not","clang/test/Sema/incompatible-sign.cpp:13:7: error: assigning to \'char *\' from \'unsigned char *\' converts between pointers to integer types where one is of the unique plain \'char\' type and the other is not"}
		}
	},
	["err_typecheck_convert_int_pointer"]={
		[c]={{nil,u,"err_typecheck_convert_int_pointer"}},
		[d]={{nil,u,"incompatible integer to pointer conversion %select{%diff{assigning to $ from $|assigning to different types}0,1|%diff{passing $ to parameter of type $|passing to parameter of different type}0,1|%diff{returning $ from a function with result type $|returning from function with different return type}0,1|%diff{converting $ to type $|converting between types}0,1|%diff{initializing $ with an expression of type $|initializing with expression of different type}0,1|%diff{sending $ to parameter of type $|sending to parameter of different type}0,1|%diff{casting $ to type $|casting between types}0,1}2%select{|; dereference with *|; take the address with &|; remove *|; remove &}3"}},
		[e]={{nil,u,{"incompatible integer to pointer conversion ",{{{wb,Z}},{{X,N}},{{ab,L}},{{K,P}},{{R,Q}},{{S,T}},{{W,Y}}},{a,Yb,Vb,Ub,Zb}}}},
		[f]=j,
		[g]="incompatible integer to pointer conversion (?:(?:assigning to (.*?) from (.*?)|assigning to different types)|(?:passing (.*?) to parameter of type (.*?)|passing to parameter of different type)|(?:returning (.*?) from a function with result type (.*?)|returning from function with different return type)|(?:converting (.*?) to type (.*?)|converting between types)|(?:initializing (.*?) with an expression of type (.*?)|initializing with expression of different type)|(?:sending (.*?) to parameter of type (.*?)|sending to parameter of different type)|(?:casting (.*?) to type (.*?)|casting between types))(?:|; dereference with \\*|; take the address with &|; remove \\*|; remove &)",
		[h]=a,
		[i]={{nil,u,m}},
		[b]={fb,1576908663,gb,hb},
		[k]={{n,17538,"bool Sema::DiagnoseAssignmentResult(AssignConvertType ConvTy, SourceLocation Loc, QualType DstType, QualType SrcType, Expr *SrcExpr, AssignmentAction Action, bool *Complained) {\n  // ...\n  case IntToPointer:\n    if (getLangOpts().CPlusPlus) {\n      DiagKind = diag::err_typecheck_convert_int_pointer;"}},
		[l]={
			["clang/test/SemaCXX/goto.cpp"]={"clang/test/SemaCXX/goto.cpp:43:9: error: incompatible integer to pointer conversion assigning to \'double *\' from \'int\'"}
		}
	},
	["err_typecheck_convert_pointer_int"]={
		[c]={{nil,u,"err_typecheck_convert_pointer_int"}},
		[d]={{nil,u,"incompatible pointer to integer conversion %select{%diff{assigning to $ from $|assigning to different types}0,1|%diff{passing $ to parameter of type $|passing to parameter of different type}0,1|%diff{returning $ from a function with result type $|returning from function with different return type}0,1|%diff{converting $ to type $|converting between types}0,1|%diff{initializing $ with an expression of type $|initializing with expression of different type}0,1|%diff{sending $ to parameter of type $|sending to parameter of different type}0,1|%diff{casting $ to type $|casting between types}0,1}2%select{|; dereference with *|; take the address with &|; remove *|; remove &}3"}},
		[e]={{nil,u,{"incompatible pointer to integer conversion ",{{{wb,Z}},{{X,N}},{{ab,L}},{{K,P}},{{R,Q}},{{S,T}},{{W,Y}}},{a,Yb,Vb,Ub,Zb}}}},
		[f]=j,
		[g]="incompatible pointer to integer conversion (?:(?:assigning to (.*?) from (.*?)|assigning to different types)|(?:passing (.*?) to parameter of type (.*?)|passing to parameter of different type)|(?:returning (.*?) from a function with result type (.*?)|returning from function with different return type)|(?:converting (.*?) to type (.*?)|converting between types)|(?:initializing (.*?) with an expression of type (.*?)|initializing with expression of different type)|(?:sending (.*?) to parameter of type (.*?)|sending to parameter of different type)|(?:casting (.*?) to type (.*?)|casting between types))(?:|; dereference with \\*|; take the address with &|; remove \\*|; remove &)",
		[h]=a,
		[i]={{nil,u,m}},
		[b]={fb,1576908663,gb,hb},
		[k]={{n,17528,"bool Sema::DiagnoseAssignmentResult(AssignConvertType ConvTy, SourceLocation Loc, QualType DstType, QualType SrcType, Expr *SrcExpr, AssignmentAction Action, bool *Complained) {\n  // ...\n  case PointerToInt:\n    if (getLangOpts().CPlusPlus) {\n      DiagKind = diag::err_typecheck_convert_pointer_int;"}},
		[l]={
			["clang/test/SemaObjCXX/comptypes-7.mm"]={"clang/test/SemaObjCXX/comptypes-7.mm:38:7: error: incompatible pointer to integer conversion assigning to \'int\' from \'id\'","clang/test/SemaObjCXX/comptypes-7.mm:39:7: error: incompatible pointer to integer conversion assigning to \'int\' from \'id<MyProtocol>\'","clang/test/SemaObjCXX/comptypes-7.mm:40:7: error: incompatible pointer to integer conversion assigning to \'int\' from \'MyClass *\'","clang/test/SemaObjCXX/comptypes-7.mm:41:7: error: incompatible pointer to integer conversion assigning to \'int\' from \'Class\'"}
		}
	},
	["err_typecheck_convert_pointer_void_func"]={
		[c]={{nil,u,"err_typecheck_convert_pointer_void_func"}},
		[d]={{nil,u,"%select{%diff{assigning to $ from $|assigning to different types}0,1|%diff{passing $ to parameter of type $|passing to parameter of different type}0,1|%diff{returning $ from a function with result type $|returning from function with different return type}0,1|%diff{converting $ to type $|converting between types}0,1|%diff{initializing $ with an expression of type $|initializing with expression of different type}0,1|%diff{sending $ to parameter of type $|sending to parameter of different type}0,1|%diff{casting $ to type $|casting between types}0,1}2 converts between void pointer and function pointer"}},
		[e]={{nil,u,{{{{wb,Z}},{{X,N}},{{ab,L}},{{K,P}},{{R,Q}},{{S,T}},{{W,Y}}}," converts between void pointer and function pointer"}}},
		[f]=j,
		[g]="(?:(?:assigning to (.*?) from (.*?)|assigning to different types)|(?:passing (.*?) to parameter of type (.*?)|passing to parameter of different type)|(?:returning (.*?) from a function with result type (.*?)|returning from function with different return type)|(?:converting (.*?) to type (.*?)|converting between types)|(?:initializing (.*?) with an expression of type (.*?)|initializing with expression of different type)|(?:sending (.*?) to parameter of type (.*?)|sending to parameter of different type)|(?:casting (.*?) to type (.*?)|casting between types)) converts between void pointer and function pointer",
		[h]=a,
		[i]={{nil,u,m}},
		[b]={fb,1576908663,gb,hb},
		[k]={{n,17591,"bool Sema::DiagnoseAssignmentResult(AssignConvertType ConvTy, SourceLocation Loc, QualType DstType, QualType SrcType, Expr *SrcExpr, AssignmentAction Action, bool *Complained) {\n  // ...\n  case FunctionVoidPointer:\n    if (getLangOpts().CPlusPlus) {\n      DiagKind = diag::err_typecheck_convert_pointer_void_func;"}}
	},
	["err_typecheck_converted_constant_expression"]={
		[c]="err_typecheck_converted_constant_expression",
		[d]="value of type %0 is not implicitly convertible to %1",
		[e]="value of type A is not implicitly convertible to B",
		[f]=j,
		[g]="value of type (.*?) is not implicitly convertible to (.*?)",
		[h]=a,
		[i]=m,
		[b]={"f8379a0fc359",1326930952,"constexpr: converted constant expression handling for enumerator values, case","constexpr: converted constant expression handling for enumerator values, case\nvalues and non-type template arguments of integral and enumeration types.\n\nThis change causes some legal C++98 code to no longer compile in C++11 mode, by\nenforcing the C++11 rule that narrowing integral conversions are not permitted\nin the final implicit conversion sequence for the above cases.\n\nllvm-svn: 148439"},
		[k]={{db,5859,"/// 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 ImplicitConversionSequence::AmbiguousConversion:\n  case ImplicitConversionSequence::BadConversion:\n    if (!S.DiagnoseMultipleUserDefinedConversion(From, T))\n      return S.Diag(From->getBeginLoc(), diag::err_typecheck_converted_constant_expression) << From->getType() << From->getSourceRange() << T;"}},
		[l]={
			["clang/test/Misc/integer-literal-printing.cpp"]={"clang/test/Misc/integer-literal-printing.cpp:71:27: error: value of type \'const char[2]\' is not implicitly convertible to \'typename Type3Helper<(boolTy)false>::Ty\' (aka \'boolTy\')","clang/test/Misc/integer-literal-printing.cpp:73:27: error: value of type \'const char[2]\' is not implicitly convertible to \'typename Type4Helper<(charTy)\'\\x00\'>::Ty\' (aka \'charTy\')","clang/test/Misc/integer-literal-printing.cpp:74:28: error: value of type \'const char[2]\' is not implicitly convertible to \'typename Type5Helper<(scharTy)\'\\x00\'>::Ty\' (aka \'scharTy\')","clang/test/Misc/integer-literal-printing.cpp:75:28: error: value of type \'const char[2]\' is not implicitly convertible to \'typename Type6Helper<(ucharTy)\'\\x00\'>::Ty\' (aka \'ucharTy\')","clang/test/Misc/integer-literal-printing.cpp:76:28: error: value of type \'const char[2]\' is not implicitly convertible to \'typename Type7Helper<(wcharTy)L\'\\x00\'>::Ty\' (aka \'wcharTy\')","clang/test/Misc/integer-literal-printing.cpp:77:29: error: value of type \'const char[2]\' is not implicitly convertible to \'typename Type8Helper<(char16Ty)u\'\\x00\'>::Ty\' (aka \'char16Ty\')","clang/test/Misc/integer-literal-printing.cpp:78:29: error: value of type \'const char[2]\' is not implicitly convertible to \'typename Type9Helper<(char32Ty)u\'\\x00\'>::Ty\' (aka \'char32Ty\')"}
		}
	},
	["err_typecheck_converted_constant_expression_disallowed"]={
		[c]="err_typecheck_converted_constant_expression_disallowed",
		[d]="conversion from %0 to %1 is not allowed in a converted constant expression",
		[e]="conversion from A to B is not allowed in a converted constant expression",
		[f]=j,
		[g]="conversion from (.*?) to (.*?) is not allowed in a converted constant expression",
		[h]=a,
		[i]=m,
		[b]={"f8379a0fc359",1326930952,"constexpr: converted constant expression handling for enumerator values, case","constexpr: converted constant expression handling for enumerator values, case\nvalues and non-type template arguments of integral and enumeration types.\n\nThis change causes some legal C++98 code to no longer compile in C++11 mode, by\nenforcing the C++11 rule that narrowing integral conversions are not permitted\nin the final implicit conversion sequence for the above cases.\n\nllvm-svn: 148439"},
		[k]={{db,5871,"/// 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  // Check that we would only use permitted conversions.\n  if (!CheckConvertedConstantConversions(S, *SCS)) {\n    return S.Diag(From->getBeginLoc(), diag::err_typecheck_converted_constant_expression_disallowed) << From->getType() << From->getSourceRange() << T;"}},
		[l]={
			["clang/test/Misc/explicit.cpp"]={"clang/test/Misc/explicit.cpp:5:13: error: conversion from \'void *\' to \'bool\' is not allowed in a converted constant expression"}
		}
	},
	["err_typecheck_converted_constant_expression_indirect"]={
		[c]="err_typecheck_converted_constant_expression_indirect",
		[d]="conversion from %0 to %1 in converted constant expression would bind reference to a temporary",
		[e]="conversion from A to B in converted constant expression would bind reference to a temporary",
		[f]=j,
		[g]="conversion from (.*?) to (.*?) in converted constant expression would bind reference to a temporary",
		[h]=a,
		[i]=m,
		[b]={"410cc893745e",1416972413,"[c++1z] Most of N4268 (allow constant evaluation for non-type template arguments).","[c++1z] Most of N4268 (allow constant evaluation for non-type template arguments).\n\nWe don\'t yet support pointer-to-member template arguments that have undergone\npointer-to-member conversions, mostly because we don\'t have a mangling for them yet.\n\nllvm-svn: 222807"},
		[k]={{db,5877,"/// 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  // [...] and where the reference binding (if any) binds directly.\n  if (SCS->ReferenceBinding && !SCS->DirectBinding) {\n    return S.Diag(From->getBeginLoc(), diag::err_typecheck_converted_constant_expression_indirect) << From->getType() << From->getSourceRange() << T;"}},
		[l]={
			["clang/test/SemaTemplate/temp_arg_nontype_cxx20.cpp"]={"clang/test/SemaTemplate/temp_arg_nontype_cxx20.cpp:231:5: error: conversion from \'int\' to \'const int &\' in converted constant expression would bind reference to a temporary"}
		}
	},
	["err_typecheck_decl_incomplete_type"]={
		[c]="err_typecheck_decl_incomplete_type",
		[d]="variable has incomplete type %0",
		[e]="variable has incomplete type A",
		[f]=j,
		[g]="variable has incomplete type (.*?)",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{w,16640,"/// 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() && (RequireCompleteType(Param->getLocation(), Param->getType(), diag::err_typecheck_decl_incomplete_type) || RequireNonAbstractType(Param->getBeginLoc(), Param->getOriginalType(), diag::err_abstract_type_in_decl, AbstractParamType))) {"},{v,8734,"void Sema::CheckVariableDeclarationType(VarDecl *NewVD) {\n  // ...\n  if (T->isVoidType()) {\n    // C++98 [dcl.stc]p5: The extern specifier can be applied only to the names\n    //                    of objects and functions.\n    if (NewVD->isThisDeclarationADefinition() || getLangOpts().CPlusPlus) {\n      Diag(NewVD->getLocation(), diag::err_typecheck_decl_incomplete_type) << T;"},{v,13202,"/// 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->getType()->isDependentType()) {\n    // ...\n    if (RequireCompleteType(VDecl->getLocation(), BaseDeclType, diag::err_typecheck_decl_incomplete_type)) {"},{v,13636,"/// ActOnInitializerError - Given that there was an error parsing an\n/// initializer for the given declaration, try to at least re-establish\n/// invariants such as whether a variable\'s type is either dependent or\n/// complete.\nvoid Sema::ActOnInitializerError(Decl *D) {\n  // ...\n  if (RequireCompleteType(VD->getLocation(), Context.getBaseElementType(Ty), diag::err_typecheck_decl_incomplete_type)) {"},{v,13728,"void Sema::ActOnUninitializedDecl(Decl *RealDecl) {\n  // ...\n  if (VarDecl *Var = dyn_cast<VarDecl>(RealDecl)) {\n    // ...\n    if (!Var->isInvalidDecl() && RealDecl->hasAttr<LoaderUninitializedAttr>()) {\n      // ...\n      if (RequireCompleteType(Var->getLocation(), Var->getType(), diag::err_typecheck_decl_incomplete_type)) {"},{v,13770,"void Sema::ActOnUninitializedDecl(Decl *RealDecl) {\n  // ...\n  if (VarDecl *Var = dyn_cast<VarDecl>(RealDecl)) {\n    // ...\n    case VarDecl::DeclarationOnly:\n      // ...\n      if (!Type->isDependentType() && Var->isLocalVarDecl() && !Var->hasLinkage() && !Var->isInvalidDecl() && RequireCompleteType(Var->getLocation(), Type, diag::err_typecheck_decl_incomplete_type))"},{v,13858,"void Sema::ActOnUninitializedDecl(Decl *RealDecl) {\n  // ...\n  if (VarDecl *Var = dyn_cast<VarDecl>(RealDecl)) {\n    // ...\n    if (!Var->hasAttr<AliasAttr>()) {\n      if (RequireCompleteType(Var->getLocation(), Context.getBaseElementType(Type), diag::err_typecheck_decl_incomplete_type)) {"},{Db,278,"ExprResult Sema::ConvertParamDefaultArgument(ParmVarDecl *Param, Expr *Arg, SourceLocation EqualLoc) {\n  if (RequireCompleteType(Param->getLocation(), Param->getType(), diag::err_typecheck_decl_incomplete_type))"},{n,7741,"ExprResult Sema::BuildCompoundLiteralExpr(SourceLocation LParenLoc, TypeSourceInfo *TInfo, SourceLocation RParenLoc, Expr *LiteralExpr) {\n  // ...\n  } else if (!literalType->isDependentType() && RequireCompleteType(LParenLoc, literalType, diag::err_typecheck_decl_incomplete_type, SourceRange(LParenLoc, LiteralExpr->getSourceRange().getEnd())))"}},
		[l]={
			["clang/test/CXX/temp/temp.spec/temp.expl.spec/p10.cpp"]={"clang/test/CXX/temp/temp.spec/temp.expl.spec/p10.cpp:7:8: error: variable has incomplete type \'X<int>\'"}
		}
	},
	["err_typecheck_deleted_function"]={
		[c]="err_typecheck_deleted_function",
		[d]="conversion function %diff{from $ to $|between types}0,1 invokes a deleted function",
		[e]={{nil,nil,{"conversion function ",{"from A to B","between types"}," invokes a deleted function"}}},
		[f]=j,
		[g]="conversion function (?:from (.*?) to (.*?)|between types) invokes a deleted function",
		[h]=a,
		[i]=m,
		[b]={"3e1e52782604",1260399737,"Reimplement reference initialization (C++ [dcl.init.ref]) using the","Reimplement reference initialization (C++ [dcl.init.ref]) using the\nnew notion of an \"initialization sequence\", which encapsulates the\ncomputation of the initialization sequence along with diagnostic\ninformation and the capability to turn the computed sequence into an\nexpression. At present, I\'ve only switched one CheckReferenceInit\ncallers over to this new mechanism; more will follow.\n\nAside from (hopefully) being much more true to the standard, the\ndiagnostics provided by this reference-initialization code are a bit\nbetter than before. Some examples:\n\np5-var.cpp:54:12: error: non-const lvalue reference to type \'struct\nDerived\'\n      cannot bind to a value of unrelated type \'struct Base\'\n  Derived &dr2 = b; // expected-error{{non-const lvalue reference to\n  ...\n           ^     ~\np5-var.cpp:55:9: error: binding of reference to type \'struct Base\' to\na value of\n      type \'struct Base const\' drops qualifiers\n  Base &br3 = bc; // expected-error{{drops qualifiers}}\n        ^     ~~\n\np5-var.cpp:57:15: error: ambiguous conversion from derived class\n      \'struct Diamond\' to base class \'struct Base\':\n    struct Diamond -> struct Derived -> struct Base\n    struct Diamond -> struct Derived2 -> struct Base\n  Base &br5 = diamond; // expected-error{{ambiguous conversion from\n      ...\n              ^~~~~~~\np5-var.cpp:59:9: error: non-const lvalue reference to type \'long\'\n      cannot bind to\n      a value of unrelated type \'int\'\n  long &lr = i; // expected-error{{non-const lvalue reference to type\n      ...\n        ^    ~\n\np5-var.cpp:74:9: error: non-const lvalue reference to type \'struct\nBase\' cannot\n      bind to a temporary of type \'struct Base\'\n  Base &br1 = Base(); // expected-error{{non-const lvalue reference to\n  ...\n        ^     ~~~~~~\n\np5-var.cpp:102:9: error: non-const reference cannot bind to bit-field\n\'i\'\n  int & ir1 = (ib.i); // expected-error{{non-const reference cannot\n  ...\n        ^     ~~~~~~\np5-var.cpp:98:7: note: bit-field is declared here\n  int i : 17; // expected-note{{bit-field is declared here}}\n      ^\n\nllvm-svn: 90992"},
		[k]={{Cb,9672,"bool InitializationSequence::Diagnose(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, ArrayRef<Expr *> Args) {\n  // ...\n  case FK_ReferenceInitOverloadFailed:\n  case FK_UserConversionOverloadFailed:\n    // ...\n    case OR_Deleted: {\n      S.Diag(Kind.getLocation(), diag::err_typecheck_deleted_function) << OnlyArg->getType() << DestType.getNonReferenceType() << Args[0]->getSourceRange();"}},
		[l]={
			["clang/test/SemaCXX/deleted-function.cpp"]={"clang/test/SemaCXX/deleted-function.cpp:34:7: error: conversion function from \'WithDel\' to \'int\' invokes a deleted function","clang/test/SemaCXX/deleted-function.cpp:74:9: error: conversion function from \'int\' to \'DelCtor\' invokes a deleted function","clang/test/SemaCXX/deleted-function.cpp:83:19: error: conversion function from \'int\' to \'DelCtor\' invokes a deleted function","clang/test/SemaCXX/deleted-function.cpp:85:19: error: conversion function from \'int\' to \'DelCtor\' invokes a deleted function"}
		}
	},
	["err_typecheck_duplicate_vector_components_not_mlvalue"]={
		[c]="err_typecheck_duplicate_vector_components_not_mlvalue",
		[d]="vector is not assignable (contains duplicate components)",
		[e]="vector is not assignable (contains duplicate components)",
		[f]=j,
		[g]="vector is not assignable \\(contains duplicate components\\)",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{n,14370,"/// CheckForModifiableLvalue - Verify that E is a modifiable lvalue.  If not,\n/// emit an error and return true.  If so, return false.\nstatic bool CheckForModifiableLvalue(Expr *E, SourceLocation Loc, Sema &S) {\n  // ...\n  case Expr::MLV_DuplicateVectorComponents:\n    DiagID = diag::err_typecheck_duplicate_vector_components_not_mlvalue;"}},
		[l]={
			["clang/test/Sema/ext_vector_components.c"]={"clang/test/Sema/ext_vector_components.c:29:17: error: vector is not assignable (contains duplicate components)","clang/test/Sema/ext_vector_components.c:30:17: error: vector is not assignable (contains duplicate components)","clang/test/Sema/ext_vector_components.c:31:17: error: vector is not assignable (contains duplicate components)","clang/test/Sema/ext_vector_components.c:33:13: error: vector is not assignable (contains duplicate components)","clang/test/Sema/ext_vector_components.c:56:17: error: vector is not assignable (contains duplicate components)","clang/test/Sema/ext_vector_components.c:57:17: error: vector is not assignable (contains duplicate components)","clang/test/Sema/ext_vector_components.c:58:17: error: vector is not assignable (contains duplicate components)","clang/test/Sema/ext_vector_components.c:60:13: error: vector is not assignable (contains duplicate components)"}
		}
	},
	["err_typecheck_expect_flt_or_vector"]={
		[c]={{nil,y,"err_typecheck_expect_flt_or_vector"}},
		[d]={{nil,y,"invalid operand of type %0 where floating, complex or a vector of such types is required"}},
		[e]={{nil,y,"invalid operand of type A where floating, complex or a vector of such types is required"}},
		[f]=j,
		[g]="invalid operand of type (.*?) where floating, complex or a vector of such types is required",
		[h]=a,
		[i]={{nil,y,m}},
		[b]={"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"},
		[k]={{w,8587,"/// SemaBuiltinArithmeticFence - Handle __arithmetic_fence.\nbool Sema::SemaBuiltinArithmeticFence(CallExpr *TheCall) {\n  // ...\n  if (!ArgTy->hasFloatingRepresentation())\n    return Diag(TheCall->getEndLoc(), diag::err_typecheck_expect_flt_or_vector) << ArgTy;"}},
		[l]={
			["clang/test/Sema/arithmetic-fence-builtin.c"]={"clang/test/Sema/arithmetic-fence-builtin.c:21:27: error: invalid operand of type \'stype\' where floating, complex or a vector of such types is required","clang/test/Sema/arithmetic-fence-builtin.c:32:31: error: invalid operand of type \'int\' where floating, complex or a vector of such types is required","clang/test/Sema/arithmetic-fence-builtin.c:9:31: error: invalid operand of type \'float *\' where floating, complex or a vector of such types is required","clang/test/Sema/arithmetic-fence-builtin.c:9:31: error: invalid operand of type \'int *\' where floating, complex or a vector of such types is required","clang/test/Sema/arithmetic-fence-builtin.c:12:34: error: invalid operand of type \'int\' where floating, complex or a vector of such types is required"}
		}
	},
	["err_typecheck_expect_int"]={
		[c]="err_typecheck_expect_int",
		[d]="used type %0 where integer is required",
		[e]="used type A where integer is required",
		[f]=j,
		[g]="used type (.*?) where integer is required",
		[h]=a,
		[i]=m,
		[b]={"c65605d008dd",1423201495,"OpenCL: handle shift operator with vector operands","OpenCL: handle shift operator with vector operands\n\nIntroduce a number of checks:\n1. If LHS is a scalar, then RHS cannot be a vector.\n2. Operands must be of integer type.\n3. If both are vectors, then the number of elements must match.\n\nRelax the requirement for \"usual arithmetic conversions\":\nWhen LHS is a vector, a scalar RHS can simply be expanded into a\nvector; OpenCL does not require that its rank be lower than the LHS.\nFor example, the following code is not an error even if the implicit\ntype of the constant literal is \"int\".\n\n  char2 foo(char2 v) { return v << 1; }\n\nConsolidate existing tests under CodeGenOpenCL, and add more tests\nunder SemaOpenCL.\n\nllvm-svn: 228382"},
		[k]={{w,316,"/// Check that the value argument for __builtin_is_aligned(value, alignment) and\n/// __builtin_aligned_{up,down}(value, alignment) is an integer or a pointer\n/// type (but not a function pointer) and that the alignment is a power-of-two.\nstatic bool SemaBuiltinAlignment(Sema &S, CallExpr *TheCall, unsigned ID) {\n  // ...\n  if (!IsValidIntegerType(AlignOp->getType())) {\n    S.Diag(AlignOp->getExprLoc(), diag::err_typecheck_expect_int) << AlignOp->getType();"},{w,4441,"bool Sema::CheckAMDGCNBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {\n  // ...\n  if (!ArgExpr->EvaluateAsInt(ArgResult, Context))\n    return Diag(ArgExpr->getExprLoc(), diag::err_typecheck_expect_int) << ArgExpr->getType();"},{n,12117,"/// Return the resulting type when a vector is shifted\n///        by a scalar or vector shift amount.\nstatic QualType checkVectorShift(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign) {\n  // ...\n  // The operands need to be integers.\n  if (!LHSEleType->isIntegerType()) {\n    S.Diag(Loc, diag::err_typecheck_expect_int) << LHS.get()->getType() << LHS.get()->getSourceRange();"},{n,12139,"/// Return the resulting type when a vector is shifted\n///        by a scalar or vector shift amount.\nstatic QualType checkVectorShift(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign) {\n  // ...\n  if (!RHSEleType->isIntegerType()) {\n    S.Diag(Loc, diag::err_typecheck_expect_int) << RHS.get()->getType() << RHS.get()->getSourceRange();"},{n,12204,"static QualType checkSizelessVectorShift(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign) {\n  // ...\n  if (!LHSEleType->isIntegerType()) {\n    S.Diag(Loc, diag::err_typecheck_expect_int) << LHS.get()->getType() << LHS.get()->getSourceRange();"},{n,12212,"static QualType checkSizelessVectorShift(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign) {\n  // ...\n  if (!RHSEleType->isIntegerType()) {\n    S.Diag(Loc, diag::err_typecheck_expect_int) << RHS.get()->getType() << RHS.get()->getSourceRange();"}},
		[l]={
			["clang/test/Sema/ext_vector_ops.c"]={"clang/test/Sema/ext_vector_ops.c:129:15: error: used type \'v2f\' (vector of 2 \'float\' values) where integer is required","clang/test/Sema/ext_vector_ops.c:130:15: error: used type \'v2f\' (vector of 2 \'float\' values) where integer is required","clang/test/Sema/ext_vector_ops.c:131:13: error: used type \'float\' where integer is required","clang/test/Sema/ext_vector_ops.c:132:13: error: used type \'v2f\' (vector of 2 \'float\' values) where integer is required","clang/test/Sema/ext_vector_ops.c:133:15: error: used type \'v2f\' (vector of 2 \'float\' values) where integer is required","clang/test/Sema/ext_vector_ops.c:134:15: error: used type \'v2f\' (vector of 2 \'float\' values) where integer is required","clang/test/Sema/ext_vector_ops.c:135:13: error: used type \'float\' where integer is required","clang/test/Sema/ext_vector_ops.c:136:13: error: used type \'v2f\' (vector of 2 \'float\' values) where integer is required","clang/test/Sema/ext_vector_ops.c:146:8: error: used type \'v2f\' (vector of 2 \'float\' values) where integer is required","clang/test/Sema/ext_vector_ops.c:147:8: error: used type \'v2f\' (vector of 2 \'float\' values) where integer is required","clang/test/Sema/ext_vector_ops.c:157:6: error: used type \'float\' where integer is required","clang/test/Sema/ext_vector_ops.c:158:6: error: used type \'float\' where integer is required"}
		}
	},
	["err_typecheck_expect_scalar_operand"]={
		[c]="err_typecheck_expect_scalar_operand",
		[d]="operand of type %0 where arithmetic or pointer type is required",
		[e]="operand of type A where arithmetic or pointer type is required",
		[f]=j,
		[g]="operand of type (.*?) where arithmetic or pointer type is required",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{Rb,3059,"/// Check the semantics of a C-style cast operation, in C.\nvoid CastOperation::CheckCStyleCast() {\n  // ...\n  // Require the operand to be a scalar, a vector, or a matrix.\n  if (!SrcType->isScalarType() && !SrcType->isVectorType() && !SrcType->isMatrixType()) {\n    Self.Diag(SrcExpr.get()->getExprLoc(), diag::err_typecheck_expect_scalar_operand) << SrcType << SrcExpr.get()->getSourceRange();"},{w,309,"/// Check that the value argument for __builtin_is_aligned(value, alignment) and\n/// __builtin_aligned_{up,down}(value, alignment) is an integer or a pointer\n/// type (but not a function pointer) and that the alignment is a power-of-two.\nstatic bool SemaBuiltinAlignment(Sema &S, CallExpr *TheCall, unsigned ID) {\n  // ...\n  if ((!SrcTy->isPointerType() && !IsValidIntegerType(SrcTy)) || SrcTy->isFunctionPointerType()) {\n    // ...\n    S.Diag(Source->getExprLoc(), diag::err_typecheck_expect_scalar_operand) << SrcTy;"}},
		[l]={
			["clang/test/Parser/check_cast.c"]={"clang/test/Parser/check_cast.c:11:12: error: operand of type \'struct foo\' where arithmetic or pointer type is required"}
		}
	},
	["err_typecheck_expression_not_modifiable_lvalue"]={
		[c]="err_typecheck_expression_not_modifiable_lvalue",
		[d]="expression is not assignable",
		[e]="expression is not assignable",
		[f]=j,
		[g]="expression is not assignable",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{n,14363,"/// CheckForModifiableLvalue - Verify that E is a modifiable lvalue.  If not,\n/// emit an error and return true.  If so, return false.\nstatic bool CheckForModifiableLvalue(Expr *E, SourceLocation Loc, Sema &S) {\n  // ...\n  case Expr::MLV_InvalidExpression:\n  case Expr::MLV_MemberFunction:\n  case Expr::MLV_ClassTemporary:\n    DiagID = diag::err_typecheck_expression_not_modifiable_lvalue;"}}
	},
	["err_typecheck_field_variable_size"]={
		[c]="err_typecheck_field_variable_size",
		[d]="fields must have a constant size: \'variable length array in structure\' extension will never be supported",
		[e]="fields must have a constant size: \'variable length array in structure\' extension will never be supported",
		[f]=j,
		[g]="fields must have a constant size\\: \'variable length array in structure\' extension will never be supported",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{v,18160,"/// 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  // C99 6.7.2.1p8: A member of a structure or union may have any type other\n  // than a variably modified type.\n  if (!InvalidDecl && T->isVariablyModifiedType()) {\n    if (!tryToFixVariablyModifiedVarType(TInfo, T, Loc, diag::err_typecheck_field_variable_size))"}},
		[l]={
			["clang/test/Sema/vla.c"]={"clang/test/Sema/vla.c:17:28: error: fields must have a constant size: \'variable length array in structure\' extension will never be supported","clang/test/Sema/vla.c:74:7: error: fields must have a constant size: \'variable length array in structure\' extension will never be supported"}
		}
	},
	["err_typecheck_illegal_increment_decrement"]={
		[c]="err_typecheck_illegal_increment_decrement",
		[d]="cannot %select{decrement|increment}1 value of type %0",
		[e]={{nil,nil,{"cannot ",{"decrement","increment"}," value of type A"}}},
		[f]=j,
		[g]="cannot (?:decrement|increment) value of type (.*?)",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{n,14751,"/// CheckIncrementDecrementOperand - unlike most \"Check\" methods, this routine\n/// doesn\'t need to call UsualUnaryConversions or UsualArithmeticConversions.\nstatic QualType CheckIncrementDecrementOperand(Sema &S, Expr *Op, ExprValueKind &VK, ExprObjectKind &OK, SourceLocation OpLoc, bool IsInc, bool IsPrefix) {\n  // ...\n  if (S.getLangOpts().CPlusPlus && ResType->isBooleanType()) {\n  // ...\n  } else if (S.getLangOpts().CPlusPlus && ResType->isEnumeralType()) {\n  // ...\n  } else if (ResType->isRealType()) {\n  // ...\n  } else if (ResType->isPointerType()) {\n  // ...\n  } else if (ResType->isObjCObjectPointerType()) {\n  // ...\n  } else if (ResType->isAnyComplexType()) {\n  // ...\n  } else if (ResType->isPlaceholderType()) {\n  // ...\n  } else if (S.getLangOpts().AltiVec && ResType->isVectorType()) {\n  // ...\n  } else if (S.getLangOpts().ZVector && ResType->isVectorType() && (ResType->castAs<VectorType>()->getVectorKind() != VectorType::AltiVecBool)) {\n  // ...\n  } else if (S.getLangOpts().OpenCL && ResType->isVectorType() && ResType->castAs<VectorType>()->getElementType()->isIntegerType()) {\n  // ...\n  } else {\n    S.Diag(OpLoc, diag::err_typecheck_illegal_increment_decrement) << ResType << int(IsInc) << Op->getSourceRange();"}},
		[l]={
			["clang/test/SemaCXX/overloaded-builtin-operators-cxx17.cpp"]={"clang/test/SemaCXX/overloaded-builtin-operators-cxx17.cpp:9:14: error: cannot increment value of type \'BoolRef\'"}
		}
	},
	["err_typecheck_incompatible_address_space"]={
		[c]="err_typecheck_incompatible_address_space",
		[d]="%select{%diff{assigning $ to $|assigning to different types}1,0|%diff{passing $ to parameter of type $|passing to parameter of different type}0,1|%diff{returning $ from a function with result type $|returning from function with different return type}0,1|%diff{converting $ to type $|converting between types}0,1|%diff{initializing $ with an expression of type $|initializing with expression of different type}0,1|%diff{sending $ to parameter of type $|sending to parameter of different type}0,1|%diff{casting $ to type $|casting between types}0,1}2 changes address space of pointer",
		[e]={{nil,nil,{{{{"assigning B to A",Z}},{{X,N}},{{ab,L}},{{K,P}},{{R,Q}},{{S,T}},{{W,Y}}}," changes address space of pointer"}}},
		[f]=j,
		[g]="(?:(?:assigning (.*?) to (.*?)|assigning to different types)|(?:passing (.*?) to parameter of type (.*?)|passing to parameter of different type)|(?:returning (.*?) from a function with result type (.*?)|returning from function with different return type)|(?:converting (.*?) to type (.*?)|converting between types)|(?:initializing (.*?) with an expression of type (.*?)|initializing with expression of different type)|(?:sending (.*?) to parameter of type (.*?)|sending to parameter of different type)|(?:casting (.*?) to type (.*?)|casting between types)) changes address space of pointer",
		[h]=a,
		[i]=m,
		[b]={"4fff8f6cff1c",1296519029,"Perform the bad-address-space conversions check as part of ","Perform the bad-address-space conversions check as part of \nCheckPointerTypesForAssignment.\n\nllvm-svn: 124632"},
		[k]={{Rb,2655,"void CastOperation::checkAddressSpaceCast(QualType SrcType, QualType DestType) {\n  // ...\n  // Converting the top level pointee addrspace is permitted for compatible\n  // addrspaces (such as \'generic int *\' to \'local int *\' or vice versa), but\n  // if any of the nested pointee addrspaces differ, we emit a warning\n  // regardless of addrspace compatibility. This makes\n  //   local int ** p;\n  //   return (generic int **) p;\n  // warn even though local -> generic is permitted.\n  if (Self.getLangOpts().OpenCL) {\n    // ...\n    unsigned DiagID = diag::err_typecheck_incompatible_address_space;"},{n,17607,"bool Sema::DiagnoseAssignmentResult(AssignConvertType ConvTy, SourceLocation Loc, QualType DstType, QualType SrcType, Expr *SrcExpr, AssignmentAction Action, bool *Complained) {\n  // ...\n  case IncompatiblePointerDiscardsQualifiers: {\n    // ...\n    if (lhq.getAddressSpace() != rhq.getAddressSpace()) {\n      DiagKind = diag::err_typecheck_incompatible_address_space;"}},
		[l]={
			["clang/test/SemaSYCL/address-space-conversions.cpp"]={"clang/test/SemaSYCL/address-space-conversions.cpp:20:10: error: assigning \'__private int *\' to \'__global int *\' changes address space of pointer","clang/test/SemaSYCL/address-space-conversions.cpp:21:10: error: assigning \'__local int *\' to \'__global int *\' changes address space of pointer","clang/test/SemaSYCL/address-space-conversions.cpp:72:15: error: assigning \'__global int *\' to \'__global_host int *\' changes address space of pointer","clang/test/SemaSYCL/address-space-conversions.cpp:78:17: error: assigning \'__global int *\' to \'__global_device int *\' changes address space of pointer"}
		}
	},
	["err_typecheck_incompatible_nested_address_space"]={
		[c]={{nil,D,"err_typecheck_incompatible_nested_address_space"}},
		[d]={{nil,D,"%select{%diff{assigning $ to $|assigning to different types}1,0|%diff{passing $ to parameter of type $|passing to parameter of different type}0,1|%diff{returning $ from a function with result type $|returning from function with different return type}0,1|%diff{converting $ to type $|converting between types}0,1|%diff{initializing $ with an expression of type $|initializing with expression of different type}0,1|%diff{sending $ to parameter of type $|sending to parameter of different type}0,1|%diff{casting $ to type $|casting between types}0,1}2 changes address space of nested pointer"}},
		[e]={{nil,D,{{{{"assigning B to A",Z}},{{X,N}},{{ab,L}},{{K,P}},{{R,Q}},{{S,T}},{{W,Y}}}," changes address space of nested pointer"}}},
		[f]=j,
		[g]="(?:(?:assigning (.*?) to (.*?)|assigning to different types)|(?:passing (.*?) to parameter of type (.*?)|passing to parameter of different type)|(?:returning (.*?) from a function with result type (.*?)|returning from function with different return type)|(?:converting (.*?) to type (.*?)|converting between types)|(?:initializing (.*?) with an expression of type (.*?)|initializing with expression of different type)|(?:sending (.*?) to parameter of type (.*?)|sending to parameter of different type)|(?:casting (.*?) to type (.*?)|casting between types)) changes address space of nested pointer",
		[h]=a,
		[i]={{nil,D,m}},
		[b]={"5b6dda33d122",1557325429,"[Sema][OpenCL] Make address space conversions a bit stricter.","[Sema][OpenCL] Make address space conversions a bit stricter.\n\nThe semantics for converting nested pointers between address\nspaces are not very well defined. Some conversions which do not\nreally carry any meaning only produce warnings, and in some cases\nwarnings hide invalid conversions, such as \'global int*\' to\n\'local float*\'!\n\nThis patch changes the logic in checkPointerTypesForAssignment\nand checkAddressSpaceCast to fail properly on implicit conversions\nthat should definitely not be permitted. We also dig deeper into the\npointer types and warn on explicit conversions where the address\nspace in a nested pointer changes, regardless of whether the address\nspace is compatible with the corresponding pointer nesting level\non the destination type.\n\nFixes PR39674!\n\nPatch by ebevhan (Bevin Hansson)!\n\nDifferential Revision: https://reviews.llvm.org/D58236\n\nllvm-svn: 360258"},
		[k]={{n,17648,"bool Sema::DiagnoseAssignmentResult(AssignConvertType ConvTy, SourceLocation Loc, QualType DstType, QualType SrcType, Expr *SrcExpr, AssignmentAction Action, bool *Complained) {\n  // ...\n  case IncompatibleNestedPointerAddressSpaceMismatch:\n    DiagKind = diag::err_typecheck_incompatible_nested_address_space;"}},
		[l]={
			["clang/test/SemaOpenCL/address-spaces.cl"]={"clang/test/SemaOpenCL/address-spaces.cl:196:8: error: assigning \'__local int *__private *__private\' to \'__global int *__private *\' changes address space of nested pointer","clang/test/SemaOpenCL/address-spaces.cl:207:8: error: assigning \'__global int *__private *__private\' to \'__local int *__private *\' changes address space of nested pointer","clang/test/SemaOpenCL/address-spaces.cl:209:8: error: assigning \'__global float *__private *__private\' to \'__local int *__private *\' changes address space of nested pointer","clang/test/SemaOpenCL/address-spaces.cl:215:10: error: assigning \'__local int *__private *__private\' to \'__global float *__private *\' changes address space of nested pointer","clang/test/SemaOpenCL/address-spaces.cl:222:8: error: assigning \'__private l_t *__private\' (aka \'__local int *__private *__private\') to \'__global int *__private *\' changes address space of nested pointer","clang/test/SemaOpenCL/address-spaces.cl:223:8: error: assigning \'__global int *__private *__private\' to \'__private l_t *\' (aka \'__local int *__private *\') changes address space of nested pointer","clang/test/SemaOpenCL/address-spaces.cl:226:8: error: assigning \'__private l_t *__private\' (aka \'__local int *__private *__private\') to \'__private g_t *\' (aka \'__global int *__private *\') changes address space of nested pointer","clang/test/SemaOpenCL/address-spaces.cl:227:8: error: assigning \'__private g_t *__private\' (aka \'__global int *__private *__private\') to \'__private l_t *\' (aka \'__local int *__private *\') changes address space of nested pointer"}
		}
	},
	["err_typecheck_incompatible_ownership"]={
		[c]="err_typecheck_incompatible_ownership",
		[d]="%select{%diff{assigning $ to $|assigning to different types}1,0|%diff{passing $ to parameter of type $|passing to parameter of different type}0,1|%diff{returning $ from a function with result type $|returning from function with different return type}0,1|%diff{converting $ to type $|converting between types}0,1|%diff{initializing $ with an expression of type $|initializing with expression of different type}0,1|%diff{sending $ to parameter of type $|sending to parameter of different type}0,1|%diff{casting $ to type $|casting between types}0,1}2 changes retain/release properties of pointer",
		[e]={{nil,nil,{{{{"assigning B to A",Z}},{{X,N}},{{ab,L}},{{K,P}},{{R,Q}},{{S,T}},{{W,Y}}}," changes retain/release properties of pointer"}}},
		[f]=j,
		[g]="(?:(?:assigning (.*?) to (.*?)|assigning to different types)|(?:passing (.*?) to parameter of type (.*?)|passing to parameter of different type)|(?:returning (.*?) from a function with result type (.*?)|returning from function with different return type)|(?:converting (.*?) to type (.*?)|converting between types)|(?:initializing (.*?) with an expression of type (.*?)|initializing with expression of different type)|(?:sending (.*?) to parameter of type (.*?)|sending to parameter of different type)|(?:casting (.*?) to type (.*?)|casting between types)) changes retain\\/release properties of pointer",
		[h]=a,
		[i]=m,
		[b]={"cff00d9c127c",1308874139,"Rename objc_lifetime -> objc_ownership, and modify diagnostics to talk about \'ownership\', not \'lifet...","Rename objc_lifetime -> objc_ownership, and modify diagnostics to talk about \'ownership\', not \'lifetime\'.\n\nrdar://9477613.\n\nllvm-svn: 133779"},
		[k]={{Rb,3206,"/// Check the semantics of a C-style cast operation, in C.\nvoid CastOperation::CheckCStyleCast() {\n  // ...\n  // ARC imposes extra restrictions on casts.\n  if (Self.getLangOpts().allowsNonTrivialObjCLifetimeQualifiers()) {\n    // ...\n    if (Self.getLangOpts().ObjCAutoRefCount && CastPtr) {\n      if (const PointerType *ExprPtr = SrcType->getAs<PointerType>()) {\n        // ...\n        if (CastPtr->getPointeeType()->isObjCLifetimeType() && ExprPtr->getPointeeType()->isObjCLifetimeType() && !CastQuals.compatiblyIncludesObjCLifetime(ExprQuals)) {\n          Self.Diag(SrcExpr.get()->getBeginLoc(), diag::err_typecheck_incompatible_ownership) << SrcType << DestType << Sema::AA_Casting << SrcExpr.get()->getSourceRange();"},{n,17628,"bool Sema::DiagnoseAssignmentResult(AssignConvertType ConvTy, SourceLocation Loc, QualType DstType, QualType SrcType, Expr *SrcExpr, AssignmentAction Action, bool *Complained) {\n  // ...\n  case IncompatiblePointerDiscardsQualifiers: {\n    // ...\n    if (lhq.getAddressSpace() != rhq.getAddressSpace()) {\n    // ...\n    } else if (lhq.getObjCLifetime() != rhq.getObjCLifetime()) {\n      DiagKind = diag::err_typecheck_incompatible_ownership;"}},
		[l]={
			["clang/test/SemaObjC/mrc-weak.m"]={"clang/test/SemaObjC/mrc-weak.m:53:7: error: initializing \'id *\' with an expression of type \'__weak id *\' changes retain/release properties of pointer","clang/test/SemaObjC/mrc-weak.m:54:14: error: initializing \'__weak id *\' with an expression of type \'id *\' changes retain/release properties of pointer","clang/test/SemaObjC/mrc-weak.m:65:27: error: initializing \'id *\' with an expression of type \'__weak id *\' changes retain/release properties of pointer"}
		}
	},
	["err_typecheck_incomplete_array_needs_initializer"]={
		[c]="err_typecheck_incomplete_array_needs_initializer",
		[d]="definition of variable with array type needs an explicit size or an initializer",
		[e]="definition of variable with array type needs an explicit size or an initializer",
		[f]=j,
		[g]="definition of variable with array type needs an explicit size or an initializer",
		[h]=a,
		[i]=m,
		[b]={"1060067dd11a",1257450467,"Don\'t allow definitions of array variables without some size information in C++. Fixed PR5401","Don\'t allow definitions of array variables without some size information in C++. Fixed PR5401\n\nllvm-svn: 86165"},
		[k]={{v,13834,"void Sema::ActOnUninitializedDecl(Decl *RealDecl) {\n  // ...\n  if (VarDecl *Var = dyn_cast<VarDecl>(RealDecl)) {\n    // ...\n    // Provide a specific diagnostic for uninitialized variable\n    // definitions with incomplete array type.\n    if (Type->isIncompleteArrayType()) {\n      if (Var->isConstexpr())\n      // ...\n      else\n        Diag(Var->getLocation(), diag::err_typecheck_incomplete_array_needs_initializer);"}},
		[l]={
			["clang/test/CXX/dcl.decl/dcl.meaning/dcl.array/p1.cpp"]={"clang/test/CXX/dcl.decl/dcl.meaning/dcl.array/p1.cpp:23:5: error: definition of variable with array type needs an explicit size or an initializer"}
		}
	},
	["err_typecheck_incomplete_tag"]={
		[c]="err_typecheck_incomplete_tag",
		[d]="incomplete definition of type %0",
		[e]="incomplete definition of type A",
		[f]=j,
		[g]="incomplete definition of type (.*?)",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{cb,655,"static bool LookupMemberExprInRecord(Sema &SemaRef, LookupResult &R, Expr *BaseExpr, const RecordType *RTy, SourceLocation OpLoc, bool IsArrow, CXXScopeSpec &SS, bool HasTemplateArgs, SourceLocation TemplateKWLoc, TypoExpr *&TE) {\n  // ...\n  if (!SemaRef.isThisOutsideMemberFunctionBody(QualType(RTy, 0)) && SemaRef.RequireCompleteType(OpLoc, QualType(RTy, 0), diag::err_typecheck_incomplete_tag, BaseRange))"},{cb,675,"static bool LookupMemberExprInRecord(Sema &SemaRef, LookupResult &R, Expr *BaseExpr, const RecordType *RTy, SourceLocation OpLoc, bool IsArrow, CXXScopeSpec &SS, bool HasTemplateArgs, SourceLocation TemplateKWLoc, TypoExpr *&TE) {\n  // ...\n  if (SS.isSet()) {\n    // ...\n    if (SemaRef.RequireCompleteDeclContext(SS, DC)) {\n      SemaRef.Diag(SS.getRange().getEnd(), diag::err_typecheck_incomplete_tag) << SS.getRange() << DC;"},{cb,1361,"/// Look up the given member of the given non-type-dependent\n/// expression.  This can return in one of two ways:\n///  * If it returns a sentinel null-but-valid result, the caller will\n///    assume that lookup was performed and the results written into\n///    the provided structure.  It will take over from there.\n///  * Otherwise, the returned expression will be produced in place of\n///    an ordinary member expression.\n///\n/// The ObjCImpDecl bit is a gross hack that will need to be properly\n/// fixed for ObjC++.\nstatic ExprResult LookupMemberExpr(Sema &S, LookupResult &R, ExprResult &BaseExpr, bool &IsArrow, SourceLocation OpLoc, CXXScopeSpec &SS, Decl *ObjCImpDecl, bool HasTemplateArgs, SourceLocation TemplateKWLoc) {\n  // ...\n  // Handle ivar access to Objective-C objects.\n  if (const ObjCObjectType *OTy = BaseType->getAs<ObjCObjectType>()) {\n    // ...\n    if (S.RequireCompleteType(OpLoc, BaseType, diag::err_typecheck_incomplete_tag, BaseExpr.get()))"},{db,15242,"/// BuildOverloadedArrowExpr - Build a call to an overloaded @c operator->\n///  (if one exists), where @c Base is an expression of class type and\n/// @c Member is the name of the member we\'re trying to find.\nExprResult Sema::BuildOverloadedArrowExpr(Scope *S, Expr *Base, SourceLocation OpLoc, bool *NoArrowOperatorFound) {\n  // ...\n  if (RequireCompleteType(Loc, Base->getType(), diag::err_typecheck_incomplete_tag, Base))"}},
		[l]={
			["clang/test/Parser/recovery.c"]={"clang/test/Parser/recovery.c:70:36: error: incomplete definition of type \'struct forward\'"}
		}
	},
	["err_typecheck_incomplete_type_not_modifiable_lvalue"]={
		[c]="err_typecheck_incomplete_type_not_modifiable_lvalue",
		[d]="incomplete type %0 is not assignable",
		[e]="incomplete type A is not assignable",
		[f]=j,
		[g]="incomplete type (.*?) is not assignable",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{n,14365,"/// CheckForModifiableLvalue - Verify that E is a modifiable lvalue.  If not,\n/// emit an error and return true.  If so, return false.\nstatic bool CheckForModifiableLvalue(Expr *E, SourceLocation Loc, Sema &S) {\n  // ...\n  case Expr::MLV_IncompleteType:\n  case Expr::MLV_IncompleteVoidType:\n    return S.RequireCompleteType(Loc, E->getType(), diag::err_typecheck_incomplete_type_not_modifiable_lvalue, E);"}},
		[l]={
			["clang/test/Sema/conditional-expr.c"]={"clang/test/Sema/conditional-expr.c:5:41: error: incomplete type \'void\' is not assignable","clang/test/Sema/conditional-expr.c:7:44: error: incomplete type \'void\' is not assignable","clang/test/Sema/conditional-expr.c:9:41: error: incomplete type \'void\' is not assignable","clang/test/Sema/conditional-expr.c:13:17: error: incomplete type \'void\' is not assignable"}
		}
	},
	["err_typecheck_indirection_requires_pointer"]={
		[c]="err_typecheck_indirection_requires_pointer",
		[d]="indirection requires pointer operand (%0 invalid)",
		[e]="indirection requires pointer operand (A invalid)",
		[f]=j,
		[g]="indirection requires pointer operand \\((.*?) invalid\\)",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{n,15152,"/// CheckIndirectionOperand - Type check unary indirection (prefix \'*\').\nstatic QualType CheckIndirectionOperand(Sema &S, Expr *Op, ExprValueKind &VK, SourceLocation OpLoc, bool IsAfterAmp = false) {\n  // ...\n  if (Result.isNull()) {\n    S.Diag(OpLoc, diag::err_typecheck_indirection_requires_pointer) << OpTy << Op->getSourceRange();"}},
		[l]={
			["clang/test/SemaTemplate/instantiate-case.cpp"]={"clang/test/SemaTemplate/instantiate-case.cpp:6:12: error: indirection requires pointer operand (\'int\' invalid)"}
		}
	},
	["err_typecheck_indirection_through_void_pointer_cpp"]={
		[c]="err_typecheck_indirection_through_void_pointer_cpp",
		[d]="indirection not permitted on operand of type %0",
		[e]="indirection not permitted on operand of type A",
		[f]=j,
		[g]="indirection not permitted on operand of type (.*?)",
		[h]=a,
		[i]=m,
		[b]={mb,1625925174,lb,kb},
		[k]={{n,15155,"/// CheckIndirectionOperand - Type check unary indirection (prefix \'*\').\nstatic QualType CheckIndirectionOperand(Sema &S, Expr *Op, ExprValueKind &VK, SourceLocation OpLoc, bool IsAfterAmp = false) {\n  // ...\n  if (Result->isVoidType()) {\n    // ...\n    if (LO.CPlusPlus)\n      S.Diag(OpLoc, diag::err_typecheck_indirection_through_void_pointer_cpp) << OpTy << Op->getSourceRange();"}},
		[l]={
			["clang/test/SemaCXX/reinterpret-cast.cpp"]={"clang/test/SemaCXX/reinterpret-cast.cpp:217:9: error: indirection not permitted on operand of type \'void *\'","clang/test/SemaCXX/reinterpret-cast.cpp:218:9: error: indirection not permitted on operand of type \'void *\'","clang/test/SemaCXX/reinterpret-cast.cpp:219:9: error: indirection not permitted on operand of type \'void *\'","clang/test/SemaCXX/reinterpret-cast.cpp:220:9: error: indirection not permitted on operand of type \'void *\'","clang/test/SemaCXX/reinterpret-cast.cpp:221:9: error: indirection not permitted on operand of type \'void *\'"}
		}
	},
	["err_typecheck_invalid_lvalue_addrof"]={
		[c]="err_typecheck_invalid_lvalue_addrof",
		[d]="cannot take the address of an rvalue of type %0",
		[e]="cannot take the address of an rvalue of type A",
		[f]=j,
		[g]="cannot take the address of an rvalue of type (.*?)",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{n,15031,"/// 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  } else if (lval != Expr::LV_Valid && lval != Expr::LV_IncompleteVoidType) {\n    // C99 6.5.3.2p1\n    // The operand must be either an l-value or a function designator\n    if (!op->getType()->isFunctionType()) {\n      // Use a special diagnostic for loads from property references.\n      if (isa<PseudoObjectExpr>(op)) {\n      // ...\n      } else {\n        Diag(OpLoc, diag::err_typecheck_invalid_lvalue_addrof) << op->getType() << op->getSourceRange();"}},
		[l]={
			["clang/test/SemaObjC/property-not-lvalue.m"]={"clang/test/SemaObjC/property-not-lvalue.m:41:20: error: cannot take the address of an rvalue of type \'simd_float2\' (vector of 2 \'float\' values)"}
		}
	},
	["err_typecheck_invalid_lvalue_addrof_addrof_function"]={
		[c]="err_typecheck_invalid_lvalue_addrof_addrof_function",
		[d]="extra \'&\' taking address of overloaded function",
		[e]="extra \'&\' taking address of overloaded function",
		[f]=j,
		[g]="extra \'&\' taking address of overloaded function",
		[h]=a,
		[i]=m,
		[b]={"c084bd288815",1359771285,"PR15132: Replace \"address expression must be an lvalue or a function","PR15132: Replace \"address expression must be an lvalue or a function\ndesignator\" diagnostic with more correct and more human-friendly \"cannot take\naddress of rvalue of type \'T\'\".\n\nFor the case of & &T::f, provide a custom diagnostic, rather than unhelpfully\nsaying \"cannot take address of rvalue of type \'<overloaded function type>\'\".\n\nFor the case of &array_temporary, treat it just like a class temporary\n(including allowing it as an extension); the existing diagnostic wording\nfor the class temporary case works fine.\n\nllvm-svn: 174262"},
		[k]={{n,14869,"/// 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  if (const BuiltinType *PTy = OrigOp.get()->getType()->getAsPlaceholderType()) {\n    if (PTy->getKind() == BuiltinType::Overload) {\n      // ...\n      if (!isa<OverloadExpr>(E)) {\n        // ...\n        Diag(OpLoc, diag::err_typecheck_invalid_lvalue_addrof_addrof_function) << OrigOp.get()->getSourceRange();"}},
		[l]={
			["clang/test/SemaCXX/address-of.cpp"]={"clang/test/SemaCXX/address-of.cpp:44:30: error: extra \'&\' taking address of overloaded function"}
		}
	},
	["err_typecheck_invalid_operands"]={
		[c]="err_typecheck_invalid_operands",
		[d]="invalid operands to binary expression (%0 and %1)",
		[e]="invalid operands to binary expression (A and B)",
		[f]=j,
		[g]="invalid operands to binary expression \\((.*?) and (.*?)\\)",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{n,10632,"QualType Sema::InvalidOperands(SourceLocation Loc, ExprResult &LHS, ExprResult &RHS) {\n  // ...\n  Diag(Loc, diag::err_typecheck_invalid_operands) << OrigLHS.getType() << OrigRHS.getType() << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();"},{n,11218,"QualType Sema::CheckSizelessVectorOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign, ArithConvKind OperationKind) {\n  // ...\n  unsigned DiagID = diag::err_typecheck_invalid_operands;"},{n,12111,"/// Return the resulting type when a vector is shifted\n///        by a scalar or vector shift amount.\nstatic QualType checkVectorShift(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign) {\n  // ...\n  // Do not allow shifts for boolean vectors.\n  if ((LHSVecTy && LHSVecTy->isExtVectorBoolType()) || (RHSVecTy && RHSVecTy->isExtVectorBoolType())) {\n    S.Diag(Loc, diag::err_typecheck_invalid_operands) << LHS.get()->getType() << RHS.get()->getType() << LHS.get()->getSourceRange();"},{n,12198,"static QualType checkSizelessVectorShift(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign) {\n  // ...\n  if ((LHSBuiltinTy && LHSBuiltinTy->isSVEBool()) || (RHSBuiltinTy && RHSBuiltinTy->isSVEBool())) {\n    S.Diag(Loc, diag::err_typecheck_invalid_operands) << LHSType << RHSType << LHS.get()->getSourceRange();"},{n,12235,"static QualType checkSizelessVectorShift(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign) {\n  // ...\n  if (LHSType->isVLSTBuiltinType() && RHSType->isVLSTBuiltinType() && (S.Context.getBuiltinVectorTypeInfo(LHSBuiltinTy).EC != S.Context.getBuiltinVectorTypeInfo(RHSBuiltinTy).EC)) {\n    S.Diag(Loc, diag::err_typecheck_invalid_operands) << LHSType << RHSType << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();"}},
		[l]={
			["clang/test/SemaObjC/arc-invalid.m"]={"clang/test/SemaObjC/arc-invalid.m:12:24: error: invalid operands to binary expression (\'id\' and \'const __strong id\')"}
		}
	},
	["err_typecheck_invalid_restrict_invalid_pointee"]={
		[c]="err_typecheck_invalid_restrict_invalid_pointee",
		[d]="pointer to function type %0 may not be \'restrict\' qualified",
		[e]="pointer to function type A may not be \'restrict\' qualified",
		[f]=j,
		[g]="pointer to function type (.*?) may not be \'restrict\' qualified",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{B,1965,"QualType Sema::BuildQualifiedType(QualType T, SourceLocation Loc, Qualifiers Qs, const DeclSpec *DS) {\n  // ...\n  // Enforce C99 6.7.3p2: \"Types other than pointer types derived from\n  // object or incomplete types shall not be restrict-qualified.\"\n  if (Qs.hasRestrict()) {\n    // ...\n    if (T->isAnyPointerType() || T->isReferenceType() || T->isMemberPointerType()) {\n      // ...\n      // If we have a pointer or reference, the pointee must have an object\n      // incomplete type.\n      if (!EltTy->isIncompleteOrObjectType()) {\n        DiagID = diag::err_typecheck_invalid_restrict_invalid_pointee;"}},
		[l]={
			["clang/test/Sema/declspec.c"]={"clang/test/Sema/declspec.c:23:1: error: pointer to function type \'f\' (aka \'int (void)\') may not be \'restrict\' qualified","clang/test/Sema/declspec.c:24:3: error: pointer to function type \'f\' (aka \'int (void)\') may not be \'restrict\' qualified"}
		}
	},
	["err_typecheck_invalid_restrict_not_pointer"]={
		[c]="err_typecheck_invalid_restrict_not_pointer",
		[d]="restrict requires a pointer or reference (%0 is invalid)",
		[e]="restrict requires a pointer or reference (A is invalid)",
		[f]=j,
		[g]="restrict requires a pointer or reference \\((.*?) is invalid\\)",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{B,1972,"QualType Sema::BuildQualifiedType(QualType T, SourceLocation Loc, Qualifiers Qs, const DeclSpec *DS) {\n  // ...\n  // Enforce C99 6.7.3p2: \"Types other than pointer types derived from\n  // object or incomplete types shall not be restrict-qualified.\"\n  if (Qs.hasRestrict()) {\n    // ...\n    if (T->isAnyPointerType() || T->isReferenceType() || T->isMemberPointerType()) {\n    // ...\n    } else if (!isDependentOrGNUAutoType(T)) {\n      // ...\n      DiagID = diag::err_typecheck_invalid_restrict_not_pointer;"}},
		[l]={
			["clang/test/Sema/declspec.c"]={"clang/test/Sema/declspec.c:22:1: error: restrict requires a pointer or reference (\'f\' (aka \'int (void)\') is invalid)"}
		}
	},
	["err_typecheck_invalid_restrict_not_pointer_noarg"]={
		[c]="err_typecheck_invalid_restrict_not_pointer_noarg",
		[d]="restrict requires a pointer or reference",
		[e]="restrict requires a pointer or reference",
		[f]=j,
		[g]="restrict requires a pointer or reference",
		[h]=a,
		[i]=m,
		[b]={"e9823fab83ac",1261049726,"implement PR3962: diagnose more faulty cases of usage of the restrict qualifier. this also removes a...","implement PR3962: diagnose more faulty cases of usage of the restrict qualifier. this also removes a FIXME\n\nllvm-svn: 91601"},
		[k]={{v,5109,"/// ParsedFreeStandingDeclSpec - This method is invoked when a declspec with\n/// no declarator (e.g. \"struct foo;\") is parsed. It also accepts template\n/// parameters to cope with template friend declarations.\nDecl *Sema::ParsedFreeStandingDeclSpec(Scope *S, AccessSpecifier AS, DeclSpec &DS, const ParsedAttributesView &DeclAttrs, MultiTemplateParamsArg TemplateParams, bool IsExplicitInstantiation, RecordDecl *&AnonRecord) {\n  // ...\n  if (unsigned TypeQuals = DS.getTypeQualifiers()) {\n    // Enforce C99 6.7.3p2: \"Types other than pointer types derived from object\n    // or incomplete types shall not be restrict-qualified.\"\n    if (TypeQuals & DeclSpec::TQ_restrict)\n      Diag(DS.getRestrictSpecLoc(), diag::err_typecheck_invalid_restrict_not_pointer_noarg) << DS.getSourceRange();"}},
		[l]={
			["clang/test/CXX/class.access/class.friend/p3-cxx0x.cpp"]={"clang/test/CXX/class.access/class.friend/p3-cxx0x.cpp:66:10: error: restrict requires a pointer or reference"}
		}
	},
	["err_typecheck_ivar_variable_size"]={
		[c]="err_typecheck_ivar_variable_size",
		[d]="instance variables must have a constant size",
		[e]="instance variables must have a constant size",
		[f]=j,
		[g]="instance variables must have a constant size",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{v,18386,"/// ActOnIvar - Each ivar field of an objective-c class is passed into this\n/// in order to create an IvarDecl object for it.\nDecl *Sema::ActOnIvar(Scope *S, SourceLocation DeclStart, Declarator &D, Expr *BitfieldWidth, tok::ObjCKeywordKind Visibility) {\n  // ...\n  }\n  // C99 6.7.2.1p8: A member of a structure or union may have any type other\n  // than a variably modified type.\n  else if (T->isVariablyModifiedType()) {\n    if (!tryToFixVariablyModifiedVarType(TInfo, T, Loc, diag::err_typecheck_ivar_variable_size))"}},
		[l]={
			["clang/test/SemaObjC/variable-size-ivar.m"]={"clang/test/SemaObjC/variable-size-ivar.m:9:7: error: instance variables must have a constant size"}
		}
	},
	["err_typecheck_logical_vector_expr_gnu_cpp_restrict"]={
		[c]={{nil,C,"err_typecheck_logical_vector_expr_gnu_cpp_restrict"}},
		[d]={{nil,C,"logical expression with vector %select{type %1 and non-vector type %2|types %1 and %2}0 is only supported in C++"}},
		[e]={{nil,C,{"logical expression with vector ",{"type B and non-vector type C","types B and C"}," is only supported in C++"}}},
		[f]=j,
		[g]="logical expression with vector (?:type (.*?) and non\\-vector type (.*?)|types (.*?) and (.*?)) is only supported in C\\+\\+",
		[h]=a,
		[i]={{nil,C,m}},
		[b]={"7cd5876e6031",1494616266,"[Sema] Support implicit scalar to vector conversions","[Sema] Support implicit scalar to vector conversions\n\nThis patch teaches clang to perform implicit scalar to vector conversions\nwhen one of the operands of a binary vector expression is a scalar which\ncan be converted to the element type of the vector without truncation\nfollowing GCC\'s implementation.\n\nIf the (constant) scalar is can be casted safely, it is implicitly casted to the\nvector elements type and splatted to produce a vector of the same type.\n\nContributions from: Petar Jovanovic\n\nReviewers: bruno, vkalintiris\n\nDifferential Revision: https://reviews.llvm.org/D25866\n\nllvm-svn: 302935"},
		[k]={{n,10664,"// Diagnose cases where a scalar was implicitly converted to a vector and\n// diagnose the underlying types. Otherwise, diagnose the error\n// as invalid vector logical operands for non-C++ cases.\nQualType Sema::InvalidLogicalVectorOperands(SourceLocation Loc, ExprResult &LHS, ExprResult &RHS) {\n  // ...\n  if (!(LHSNatVec && RHSNatVec)) {\n    // ...\n    Diag(Loc, diag::err_typecheck_logical_vector_expr_gnu_cpp_restrict) << 0 << Vector->getType() << NonVector->IgnoreImpCasts()->getType() << Vector->getSourceRange();"},{n,10696,"// Diagnose cases where a scalar was implicitly converted to a vector and\n// diagnose the underlying types. Otherwise, diagnose the error\n// as invalid vector logical operands for non-C++ cases.\nQualType Sema::InvalidLogicalVectorOperands(SourceLocation Loc, ExprResult &LHS, ExprResult &RHS) {\n  // ...\n  Diag(Loc, diag::err_typecheck_logical_vector_expr_gnu_cpp_restrict) << 1 << LHSType << RHSType << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();"}},
		[l]={
			["clang/test/Sema/vector-ops.c"]={
				[1]="clang/test/Sema/vector-ops.c:32:15: error: logical expression with vector types \'v2u\' (vector of 2 \'unsigned int\' values) and \'v2u\' is only supported in C++",
				[2]="clang/test/Sema/vector-ops.c:33:15: error: logical expression with vector types \'v2u\' (vector of 2 \'unsigned int\' values) and \'v2u\' is only supported in C++",
				[3]="clang/test/Sema/vector-ops.c:35:15: error: logical expression with vector types \'v2s\' (vector of 2 \'int\' values) and \'v2u\' (vector of 2 \'unsigned int\' values) is only supported in C++",
				[4]="clang/test/Sema/vector-ops.c:36:15: error: logical expression with vector types \'v2s\' (vector of 2 \'int\' values) and \'v2u\' (vector of 2 \'unsigned int\' values) is only supported in C++",
				[5]="clang/test/Sema/vector-ops.c:38:15: error: logical expression with vector types \'v2u\' (vector of 2 \'unsigned int\' values) and \'v2f\' (vector of 2 \'float\' values) is only supported in C++",
				[6]="clang/test/Sema/vector-ops.c:39:15: error: logical expression with vector types \'v2u\' (vector of 2 \'unsigned int\' values) and \'v2f\' (vector of 2 \'float\' values) is only supported in C++",
				[7]="clang/test/Sema/vector-ops.c:41:15: error: logical expression with vector types \'v2s\' (vector of 2 \'int\' values) and \'v2f\' (vector of 2 \'float\' values) is only supported in C++",
				[8]="clang/test/Sema/vector-ops.c:42:15: error: logical expression with vector types \'v2s\' (vector of 2 \'int\' values) and \'v2f\' (vector of 2 \'float\' values) is only supported in C++",
				[9]="clang/test/Sema/vector-ops.c:44:15: error: logical expression with vector types \'v2s\' (vector of 2 \'int\' values) and \'v2s\' is only supported in C++",
				[10]="clang/test/Sema/vector-ops.c:45:15: error: logical expression with vector types \'v2s\' (vector of 2 \'int\' values) and \'v2s\' is only supported in C++",
				[11]="clang/test/Sema/vector-ops.c:47:15: error: logical expression with vector types \'v2u\' (vector of 2 \'unsigned int\' values) and \'v2u\' is only supported in C++",
				[12]="clang/test/Sema/vector-ops.c:48:15: error: logical expression with vector types \'v2u\' (vector of 2 \'unsigned int\' values) and \'v2u\' is only supported in C++",
				[13]="clang/test/Sema/vector-ops.c:50:15: error: logical expression with vector types \'v2s\' (vector of 2 \'int\' values) and \'v2u\' (vector of 2 \'unsigned int\' values) is only supported in C++",
				[14]="clang/test/Sema/vector-ops.c:51:15: error: logical expression with vector types \'v2s\' (vector of 2 \'int\' values) and \'v2u\' (vector of 2 \'unsigned int\' values) is only supported in C++",
				[15]="clang/test/Sema/vector-ops.c:53:15: error: logical expression with vector types \'v2s\' (vector of 2 \'int\' values) and \'v2f\' (vector of 2 \'float\' values) is only supported in C++",
				[16]="clang/test/Sema/vector-ops.c:54:15: error: logical expression with vector types \'v2s\' (vector of 2 \'int\' values) and \'v2f\' (vector of 2 \'float\' values) is only supported in C++",
				[17]="clang/test/Sema/vector-ops.c:56:15: error: logical expression with vector types \'v2u\' (vector of 2 \'unsigned int\' values) and \'v2f\' (vector of 2 \'float\' values) is only supported in C++",
				[18]="clang/test/Sema/vector-ops.c:57:15: error: logical expression with vector types \'v2u\' (vector of 2 \'unsigned int\' values) and \'v2f\' (vector of 2 \'float\' values) is only supported in C++",
				[19]="clang/test/Sema/vector-ops.c:59:15: error: logical expression with vector types \'v2f\' (vector of 2 \'float\' values) and \'v2f\' is only supported in C++",
				[20]="clang/test/Sema/vector-ops.c:60:15: error: logical expression with vector types \'v2f\' (vector of 2 \'float\' values) and \'v2f\' is only supported in C++",
				[21]="clang/test/Sema/vector-ops.c:62:15: error: logical expression with vector types \'v2s\' (vector of 2 \'int\' values) and \'v2f\' (vector of 2 \'float\' values) is only supported in C++",
				[22]="clang/test/Sema/vector-ops.c:63:15: error: logical expression with vector types \'v2s\' (vector of 2 \'int\' values) and \'v2f\' (vector of 2 \'float\' values) is only supported in C++",
				[23]="clang/test/Sema/vector-ops.c:65:15: error: logical expression with vector types \'v2u\' (vector of 2 \'unsigned int\' values) and \'v2f\' (vector of 2 \'float\' values) is only supported in C++",
				[24]="clang/test/Sema/vector-ops.c:66:15: error: logical expression with vector types \'v2u\' (vector of 2 \'unsigned int\' values) and \'v2f\' (vector of 2 \'float\' values) is only supported in C++",
				[25]="clang/test/Sema/vector-ops.c:68:15: error: logical expression with vector types \'v2u\' (vector of 2 \'unsigned int\' values) and \'v2u\' is only supported in C++",
				[26]="clang/test/Sema/vector-ops.c:69:15: error: logical expression with vector types \'v2u\' (vector of 2 \'unsigned int\' values) and \'v2u\' is only supported in C++",
				[27]="clang/test/Sema/vector-ops.c:71:15: error: logical expression with vector types \'v2s\' (vector of 2 \'int\' values) and \'v2s\' is only supported in C++",
				[28]="clang/test/Sema/vector-ops.c:72:15: error: logical expression with vector types \'v2s\' (vector of 2 \'int\' values) and \'v2s\' is only supported in C++",
				[29]="clang/test/Sema/vector-ops.c:74:15: error: logical expression with vector types \'v2s\' (vector of 2 \'int\' values) and \'v2u\' (vector of 2 \'unsigned int\' values) is only supported in C++",
				[30]="clang/test/Sema/vector-ops.c:75:15: error: logical expression with vector types \'v2s\' (vector of 2 \'int\' values) and \'v2u\' (vector of 2 \'unsigned int\' values) is only supported in C++",
				[31]="clang/test/Sema/vector-ops.c:80:15: error: logical expression with vector type \'v2u\' (vector of 2 \'unsigned int\' values) and non-vector type \'unsigned int\' is only supported in C++",
				[32]="clang/test/Sema/vector-ops.c:81:15: error: logical expression with vector type \'v2u\' (vector of 2 \'unsigned int\' values) and non-vector type \'unsigned int\' is only supported in C++",
				[33]="clang/test/Sema/vector-ops.c:88:15: error: logical expression with vector type \'v2u\' (vector of 2 \'unsigned int\' values) and non-vector type \'unsigned int\' is only supported in C++",
				[34]="clang/test/Sema/vector-ops.c:89:15: error: logical expression with vector type \'v2u\' (vector of 2 \'unsigned int\' values) and non-vector type \'unsigned int\' is only supported in C++",
				[35]="clang/test/Sema/vector-ops.c:98:15: error: logical expression with vector type \'v2u\' (vector of 2 \'unsigned int\' values) and non-vector type \'int\' is only supported in C++",
				[36]="clang/test/Sema/vector-ops.c:99:15: error: logical expression with vector type \'v2u\' (vector of 2 \'unsigned int\' values) and non-vector type \'int\' is only supported in C++",
				[37]="clang/test/Sema/vector-ops.c:101:15: error: logical expression with vector type \'v2s\' (vector of 2 \'int\' values) and non-vector type \'int\' is only supported in C++",
				[38]="clang/test/Sema/vector-ops.c:102:15: error: logical expression with vector type \'v2s\' (vector of 2 \'int\' values) and non-vector type \'int\' is only supported in C++",
				[39]="clang/test/Sema/vector-ops.c:104:15: error: logical expression with vector type \'v2s\' (vector of 2 \'int\' values) and non-vector type \'int\' is only supported in C++",
				[40]="clang/test/Sema/vector-ops.c:105:15: error: logical expression with vector type \'v2s\' (vector of 2 \'int\' values) and non-vector type \'int\' is only supported in C++",
				[41]="clang/test/Sema/vector-ops.c:107:15: error: logical expression with vector type \'v2u\' (vector of 2 \'unsigned int\' values) and non-vector type \'int\' is only supported in C++",
				[42]="clang/test/Sema/vector-ops.c:108:15: error: logical expression with vector type \'v2u\' (vector of 2 \'unsigned int\' values) and non-vector type \'int\' is only supported in C++",
				[43]="clang/test/Sema/vector-ops.c:117:15: error: logical expression with vector type \'v2u\' (vector of 2 \'unsigned int\' values) and non-vector type \'float\' is only supported in C++",
				[44]="clang/test/Sema/vector-ops.c:118:15: error: logical expression with vector type \'v2u\' (vector of 2 \'unsigned int\' values) and non-vector type \'float\' is only supported in C++",
				[45]="clang/test/Sema/vector-ops.c:120:15: error: logical expression with vector type \'v2s\' (vector of 2 \'int\' values) and non-vector type \'float\' is only supported in C++",
				[46]="clang/test/Sema/vector-ops.c:121:15: error: logical expression with vector type \'v2s\' (vector of 2 \'int\' values) and non-vector type \'float\' is only supported in C++",
				[47]="clang/test/Sema/vector-ops.c:123:15: error: logical expression with vector type \'v2s\' (vector of 2 \'int\' values) and non-vector type \'float\' is only supported in C++",
				[48]="clang/test/Sema/vector-ops.c:124:15: error: logical expression with vector type \'v2s\' (vector of 2 \'int\' values) and non-vector type \'float\' is only supported in C++",
				[49]="clang/test/Sema/vector-ops.c:126:15: error: logical expression with vector type \'v2u\' (vector of 2 \'unsigned int\' values) and non-vector type \'float\' is only supported in C++",
				[50]="clang/test/Sema/vector-ops.c:127:15: error: logical expression with vector type \'v2u\' (vector of 2 \'unsigned int\' values) and non-vector type \'float\' is only supported in C++",
				[51]="clang/test/Sema/vector-ops.c:129:15: error: logical expression with vector type \'v2f\' (vector of 2 \'float\' values) and non-vector type \'float\' is only supported in C++",
				[52]="clang/test/Sema/vector-ops.c:130:15: error: logical expression with vector type \'v2f\' (vector of 2 \'float\' values) and non-vector type \'float\' is only supported in C++",
				[53]="clang/test/Sema/vector-ops.c:132:15: error: logical expression with vector type \'v2f\' (vector of 2 \'float\' values) and non-vector type \'float\' is only supported in C++",
				[54]="clang/test/Sema/vector-ops.c:133:15: error: logical expression with vector type \'v2f\' (vector of 2 \'float\' values) and non-vector type \'float\' is only supported in C++"
			}
		}
	},
	["err_typecheck_lvalue_casts_not_supported"]={
		[c]="err_typecheck_lvalue_casts_not_supported",
		[d]="assignment to cast is illegal, lvalue casts are not supported",
		[e]="assignment to cast is illegal, lvalue casts are not supported",
		[f]=j,
		[g]="assignment to cast is illegal, lvalue casts are not supported",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{n,14358,"/// CheckForModifiableLvalue - Verify that E is a modifiable lvalue.  If not,\n/// emit an error and return true.  If so, return false.\nstatic bool CheckForModifiableLvalue(Expr *E, SourceLocation Loc, Sema &S) {\n  // ...\n  case Expr::MLV_LValueCast:\n    DiagID = diag::err_typecheck_lvalue_casts_not_supported;"}},
		[l]={
			["clang/test/Sema/block-misc.c"]={"clang/test/Sema/block-misc.c:33:3: error: assignment to cast is illegal, lvalue casts are not supported"}
		}
	},
	["err_typecheck_member_reference_arrow"]={
		[c]="err_typecheck_member_reference_arrow",
		[d]="member reference type %0 is not a pointer",
		[e]="member reference type A is not a pointer",
		[f]=j,
		[g]="member reference type (.*?) is not a pointer",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{G,7614,"ExprResult Sema::ActOnStartCXXMemberReference(Scope *S, Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind, ParsedType &ObjectType, bool &MayBePseudoDestructor) {\n  // ...\n  // C++ [over.match.oper]p8:\n  //   [...] When operator->returns, the operator-> is applied  to the value\n  //   returned, with the original second operand.\n  if (OpKind == tok::arrow) {\n    // ...\n    while (BaseType->isRecordType()) {\n      // ...\n      if (Result.isInvalid()) {\n        if (NoArrowOperatorFound) {\n          // ...\n          Diag(OpLoc, diag::err_typecheck_member_reference_arrow) << BaseType << Base->getSourceRange();"},{cb,1293,"/// Look up the given member of the given non-type-dependent\n/// expression.  This can return in one of two ways:\n///  * If it returns a sentinel null-but-valid result, the caller will\n///    assume that lookup was performed and the results written into\n///    the provided structure.  It will take over from there.\n///  * Otherwise, the returned expression will be produced in place of\n///    an ordinary member expression.\n///\n/// The ObjCImpDecl bit is a gross hack that will need to be properly\n/// fixed for ObjC++.\nstatic ExprResult LookupMemberExpr(Sema &S, LookupResult &R, ExprResult &BaseExpr, bool &IsArrow, SourceLocation OpLoc, CXXScopeSpec &SS, Decl *ObjCImpDecl, bool HasTemplateArgs, SourceLocation TemplateKWLoc) {\n  // ...\n  // For later type-checking purposes, turn arrow accesses into dot\n  // accesses.  The only access type we support that doesn\'t follow\n  // the C equivalence \"a->b === (*a).b\" is ObjC property accesses,\n  // and those never use arrows, so this is unaffected.\n  if (IsArrow) {\n    if (const PointerType *Ptr = BaseType->getAs<PointerType>())\n    // ...\n    else if (const ObjCObjectPointerType *Ptr = BaseType->getAs<ObjCObjectPointerType>())\n    // ...\n    else if (BaseType->isRecordType()) {\n    // ...\n    } else if (BaseType->isFunctionType()) {\n    // ...\n    } else {\n      S.Diag(MemberLoc, diag::err_typecheck_member_reference_arrow) << BaseType << BaseExpr.get()->getSourceRange();"},{db,15275,"/// BuildOverloadedArrowExpr - Build a call to an overloaded @c operator->\n///  (if one exists), where @c Base is an expression of class type and\n/// @c Member is the name of the member we\'re trying to find.\nExprResult Sema::BuildOverloadedArrowExpr(Scope *S, Expr *Base, SourceLocation OpLoc, bool *NoArrowOperatorFound) {\n  // ...\n  case OR_No_Viable_Function: {\n    // ...\n    if (CandidateSet.empty()) {\n      // ...\n      Diag(OpLoc, diag::err_typecheck_member_reference_arrow) << BaseType << Base->getSourceRange();"}},
		[l]={
			["clang/test/SemaHLSL/prohibit_pointer.hlsl"]={"clang/test/SemaHLSL/prohibit_pointer.hlsl:79:14: error: member reference type \'Fins\' is not a pointer"}
		}
	},
	["err_typecheck_member_reference_ivar"]={
		[c]="err_typecheck_member_reference_ivar",
		[d]="%0 does not have a member named %1",
		[e]="A does not have a member named B",
		[f]=j,
		[g]="(.*?) does not have a member named (.*?)",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{cb,1404,"/// Look up the given member of the given non-type-dependent\n/// expression.  This can return in one of two ways:\n///  * If it returns a sentinel null-but-valid result, the caller will\n///    assume that lookup was performed and the results written into\n///    the provided structure.  It will take over from there.\n///  * Otherwise, the returned expression will be produced in place of\n///    an ordinary member expression.\n///\n/// The ObjCImpDecl bit is a gross hack that will need to be properly\n/// fixed for ObjC++.\nstatic ExprResult LookupMemberExpr(Sema &S, LookupResult &R, ExprResult &BaseExpr, bool &IsArrow, SourceLocation OpLoc, CXXScopeSpec &SS, Decl *ObjCImpDecl, bool HasTemplateArgs, SourceLocation TemplateKWLoc) {\n  // ...\n  // Handle ivar access to Objective-C objects.\n  if (const ObjCObjectType *OTy = BaseType->getAs<ObjCObjectType>()) {\n    // ...\n    if (!IV) {\n      // ...\n      if (TypoCorrection Corrected = S.CorrectTypo(R.getLookupNameInfo(), Sema::LookupMemberName, nullptr, nullptr, Validator, Sema::CTK_ErrorRecovery, IDecl)) {\n      // ...\n      } else {\n        // ...\n        S.Diag(MemberLoc, diag::err_typecheck_member_reference_ivar) << IDecl->getDeclName() << MemberName << BaseExpr.get()->getSourceRange();"}},
		[l]={
			["clang/test/SemaObjC/ivar-in-class-extension.m"]={"clang/test/SemaObjC/ivar-in-class-extension.m:6:14: error: \'SomeClass\' does not have a member named \'privateIvar\'","clang/test/SemaObjC/ivar-in-class-extension.m:7:21: error: \'SomeClass\' does not have a member named \'publicIvar\'"}
		}
	},
	["err_typecheck_member_reference_ivar_suggest"]={
		[c]="err_typecheck_member_reference_ivar_suggest",
		[d]="%0 does not have a member named %1; did you mean %2?",
		[e]="A does not have a member named B; did you mean C?",
		[f]=j,
		[g]="(.*?) does not have a member named (.*?); did you mean (.*?)\\?",
		[h]=a,
		[i]=m,
		[b]={"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"},
		[k]={{cb,1378,"/// Look up the given member of the given non-type-dependent\n/// expression.  This can return in one of two ways:\n///  * If it returns a sentinel null-but-valid result, the caller will\n///    assume that lookup was performed and the results written into\n///    the provided structure.  It will take over from there.\n///  * Otherwise, the returned expression will be produced in place of\n///    an ordinary member expression.\n///\n/// The ObjCImpDecl bit is a gross hack that will need to be properly\n/// fixed for ObjC++.\nstatic ExprResult LookupMemberExpr(Sema &S, LookupResult &R, ExprResult &BaseExpr, bool &IsArrow, SourceLocation OpLoc, CXXScopeSpec &SS, Decl *ObjCImpDecl, bool HasTemplateArgs, SourceLocation TemplateKWLoc) {\n  // ...\n  // Handle ivar access to Objective-C objects.\n  if (const ObjCObjectType *OTy = BaseType->getAs<ObjCObjectType>()) {\n    // ...\n    if (!IV) {\n      // ...\n      if (TypoCorrection Corrected = S.CorrectTypo(R.getLookupNameInfo(), Sema::LookupMemberName, nullptr, nullptr, Validator, Sema::CTK_ErrorRecovery, IDecl)) {\n        // ...\n        S.diagnoseTypo(Corrected, S.PDiag(diag::err_typecheck_member_reference_ivar_suggest) << IDecl->getDeclName() << MemberName);"}},
		[l]={
			["clang/test/SemaObjC/typo-correction.m"]={"clang/test/SemaObjC/typo-correction.m:48:15: error: \'I\' does not have a member named \'implementation\'; did you mean \'_implementation\'?","clang/test/SemaObjC/typo-correction.m:49:15: error: \'I\' does not have a member named \'interface\'; did you mean \'_interface\'?","clang/test/SemaObjC/typo-correction.m:50:15: error: \'I\' does not have a member named \'extension\'; did you mean \'_extension\'?"}
		}
	},
	["err_typecheck_member_reference_struct_union"]={
		[c]="err_typecheck_member_reference_struct_union",
		[d]="member reference base type %0 is not a structure or union",
		[e]="member reference base type A is not a structure or union",
		[f]=j,
		[g]="member reference base type (.*?) is not a structure or union",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{cb,505,"ExprResult Sema::ActOnDependentMemberExpr(Expr *BaseExpr, QualType BaseType, bool IsArrow, SourceLocation OpLoc, const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs) {\n  // Even in dependent contexts, try to diagnose base expressions with\n  // obviously wrong types, e.g.:\n  //\n  // T* t;\n  // t.f;\n  //\n  // In Obj-C++, however, the above expression is valid, since it could be\n  // accessing the \'f\' property if T is an Obj-C interface. The extra check\n  // allows this, while still reporting an error if T is a struct pointer.\n  if (!IsArrow) {\n    // ...\n    if (PT && (!getLangOpts().ObjC || PT->getPointeeType()->isRecordType())) {\n      // ...\n      Diag(OpLoc, diag::err_typecheck_member_reference_struct_union) << BaseType << BaseExpr->getSourceRange() << NameInfo.getSourceRange();"},{cb,1691,"fail:\n  // ...\n  S.Diag(OpLoc, diag::err_typecheck_member_reference_struct_union) << BaseType << BaseExpr.get()->getSourceRange() << MemberLoc;"}},
		[l]={
			["clang/test/SemaObjC/conditional-expr-4.m"]={"clang/test/SemaObjC/conditional-expr-4.m:66:24: error: member reference base type \'void *\' is not a structure or union"}
		}
	},
	["err_typecheck_member_reference_suggestion"]={
		[c]="err_typecheck_member_reference_suggestion",
		[d]="member reference type %0 is %select{a|not a}1 pointer; did you mean to use \'%select{->|.}1\'?",
		[e]={{nil,nil,{"member reference type A is ",{"a","not a"}," pointer; did you mean to use \'",{"->","."},"\'?"}}},
		[f]=j,
		[g]="member reference type (.*?) is (?:a|not a) pointer; did you mean to use \'(?:\\-\\>|\\.)\'\\?",
		[h]=a,
		[i]=m,
		[b]={"a928c652bec1",1260226019,"Recover from dot accesses to record pointers and arrow accesses to records.","Recover from dot accesses to record pointers and arrow accesses to records.\nPatch by Nicola Gigante!\n\nllvm-svn: 90814"},
		[k]={{G,7608,"ExprResult Sema::ActOnStartCXXMemberReference(Scope *S, Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind, ParsedType &ObjectType, bool &MayBePseudoDestructor) {\n  // ...\n  // C++ [over.match.oper]p8:\n  //   [...] When operator->returns, the operator-> is applied  to the value\n  //   returned, with the original second operand.\n  if (OpKind == tok::arrow) {\n    // ...\n    while (BaseType->isRecordType()) {\n      // ...\n      if (Result.isInvalid()) {\n        if (NoArrowOperatorFound) {\n          if (FirstIteration) {\n            Diag(OpLoc, diag::err_typecheck_member_reference_suggestion) << BaseType << 1 << Base->getSourceRange() << FixItHint::CreateReplacement(OpLoc, \".\");"},{G,7720,"static bool CheckArrow(Sema &S, QualType &ObjectType, Expr *&Base, tok::TokenKind &OpKind, SourceLocation OpLoc) {\n  // ...\n  // C++ [expr.pseudo]p2:\n  //   The left-hand side of the dot operator shall be of scalar type. The\n  //   left-hand side of the arrow operator shall be of pointer to scalar type.\n  //   This scalar type is the object type.\n  // Note that this is rather different from the normal handling for the\n  // arrow operator.\n  if (OpKind == tok::arrow) {\n    // ...\n    if (const PointerType *Ptr = ObjectType->getAs<PointerType>()) {\n    // ...\n    } else if (!Base->isTypeDependent()) {\n      // ...\n      S.Diag(OpLoc, diag::err_typecheck_member_reference_suggestion) << ObjectType << true << FixItHint::CreateReplacement(OpLoc, \".\");"},{G,7792,"ExprResult Sema::BuildPseudoDestructorExpr(Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind, const CXXScopeSpec &SS, TypeSourceInfo *ScopeTypeInfo, SourceLocation CCLoc, SourceLocation TildeLoc, PseudoDestructorTypeStorage Destructed) {\n  // ...\n  // C++ [expr.pseudo]p2:\n  //   [...] The cv-unqualified versions of the object type and of the type\n  //   designated by the pseudo-destructor-name shall be the same type.\n  if (DestructedTypeInfo) {\n    // ...\n    if (!DestructedType->isDependentType() && !ObjectType->isDependentType()) {\n      if (!Context.hasSameUnqualifiedType(DestructedType, ObjectType)) {\n        // Detect dot pseudo destructor calls on pointer objects, e.g.:\n        //   Foo *foo;\n        //   foo.~Foo();\n        if (OpKind == tok::period && ObjectType->isPointerType() && Context.hasSameUnqualifiedType(DestructedType, ObjectType->getPointeeType())) {\n          auto Diagnostic = Diag(OpLoc, diag::err_typecheck_member_reference_suggestion) << ObjectType << /*IsArrow=*/0 << Base->getSourceRange();"},{cb,1285,"/// Look up the given member of the given non-type-dependent\n/// expression.  This can return in one of two ways:\n///  * If it returns a sentinel null-but-valid result, the caller will\n///    assume that lookup was performed and the results written into\n///    the provided structure.  It will take over from there.\n///  * Otherwise, the returned expression will be produced in place of\n///    an ordinary member expression.\n///\n/// The ObjCImpDecl bit is a gross hack that will need to be properly\n/// fixed for ObjC++.\nstatic ExprResult LookupMemberExpr(Sema &S, LookupResult &R, ExprResult &BaseExpr, bool &IsArrow, SourceLocation OpLoc, CXXScopeSpec &SS, Decl *ObjCImpDecl, bool HasTemplateArgs, SourceLocation TemplateKWLoc) {\n  // ...\n  // For later type-checking purposes, turn arrow accesses into dot\n  // accesses.  The only access type we support that doesn\'t follow\n  // the C equivalence \"a->b === (*a).b\" is ObjC property accesses,\n  // and those never use arrows, so this is unaffected.\n  if (IsArrow) {\n    if (const PointerType *Ptr = BaseType->getAs<PointerType>())\n    // ...\n    else if (const ObjCObjectPointerType *Ptr = BaseType->getAs<ObjCObjectPointerType>())\n    // ...\n    else if (BaseType->isRecordType()) {\n      // Recover from arrow accesses to records, e.g.:\n      //   struct MyRecord foo;\n      //   foo->bar\n      // This is actually well-formed in C++ if MyRecord has an\n      // overloaded operator->, but that should have been dealt with\n      // by now--or a diagnostic message already issued if a problem\n      // was encountered while looking for the overloaded operator->.\n      if (!S.getLangOpts().CPlusPlus) {\n        S.Diag(OpLoc, diag::err_typecheck_member_reference_suggestion) << BaseType << int(IsArrow) << BaseExpr.get()->getSourceRange() << FixItHint::CreateReplacement(OpLoc, \".\");"},{cb,1664,"fail:\n  // Recover from dot accesses to pointers, e.g.:\n  //   type *foo;\n  //   foo.bar\n  // This is actually well-formed in two cases:\n  //   - \'type\' is an Objective C type\n  //   - \'bar\' is a pseudo-destructor name which happens to refer to\n  //     the appropriate pointer type\n  if (const PointerType *Ptr = BaseType->getAs<PointerType>()) {\n    if (!IsArrow && Ptr->getPointeeType()->isRecordType() && MemberName.getNameKind() != DeclarationName::CXXDestructorName) {\n      S.Diag(OpLoc, diag::err_typecheck_member_reference_suggestion) << BaseType << int(IsArrow) << BaseExpr.get()->getSourceRange() << FixItHint::CreateReplacement(OpLoc, \"->\");"}},
		[l]={
			["clang/test/Sema/member-reference.c"]={"clang/test/Sema/member-reference.c:23:11: error: member reference type \'struct simple\' is not a pointer; did you mean to use \'.\'?"}
		}
	},
	["err_typecheck_member_reference_type"]={
		[c]="err_typecheck_member_reference_type",
		[d]="cannot refer to type member %0 in %1 with \'%select{.|->}2\'",
		[e]={{nil,nil,{"cannot refer to type member A in B with \'",{".","->"},"\'"}}},
		[f]=j,
		[g]="cannot refer to type member (.*?) in (.*?) with \'(?:\\.|\\-\\>)\'",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{cb,1176,"ExprResult Sema::BuildMemberReferenceExpr(Expr *BaseExpr, QualType BaseExprType, SourceLocation OpLoc, bool IsArrow, const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierInScope, LookupResult &R, const TemplateArgumentListInfo *TemplateArgs, const Scope *S, bool SuppressQualifierCheck, ActOnMemberAccessExtraArgs *ExtraArgs) {\n  // ...\n  // We found something that we didn\'t expect. Complain.\n  if (isa<TypeDecl>(MemberDecl))\n    Diag(MemberLoc, diag::err_typecheck_member_reference_type) << MemberName << BaseType << int(IsArrow);"}},
		[l]={
			["clang/test/SemaCXX/member-expr.cpp"]={"clang/test/SemaCXX/member-expr.cpp:16:5: error: cannot refer to type member \'E\' in \'X\' with \'.\'","clang/test/SemaCXX/member-expr.cpp:17:7: error: cannot refer to type member \'E\' in \'X\' with \'->\'"}
		}
	},
	["err_typecheck_member_reference_unknown"]={
		[c]="err_typecheck_member_reference_unknown",
		[d]="cannot refer to member %0 in %1 with \'%select{.|->}2\'",
		[e]={{nil,nil,{"cannot refer to member A in B with \'",{".","->"},"\'"}}},
		[f]=j,
		[g]="cannot refer to member (.*?) in (.*?) with \'(?:\\.|\\-\\>)\'",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{cb,1179,"ExprResult Sema::BuildMemberReferenceExpr(Expr *BaseExpr, QualType BaseExprType, SourceLocation OpLoc, bool IsArrow, const CXXScopeSpec &SS, SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierInScope, LookupResult &R, const TemplateArgumentListInfo *TemplateArgs, const Scope *S, bool SuppressQualifierCheck, ActOnMemberAccessExtraArgs *ExtraArgs) {\n  // ...\n  // We found something that we didn\'t expect. Complain.\n  if (isa<TypeDecl>(MemberDecl))\n  // ...\n  else\n    Diag(MemberLoc, diag::err_typecheck_member_reference_unknown) << MemberName << BaseType << int(IsArrow);"}}
	},
	["err_typecheck_missing_return_type_incompatible"]={
		[c]="err_typecheck_missing_return_type_incompatible",
		[d]="%diff{return type $ must match previous return type $|return type must match previous return type}0,1 when %select{block literal|lambda expression}2 has unspecified explicit return type",
		[e]={{nil,nil,{{"return type A must match previous return type B","return type must match previous return type"}," when ",{"block literal","lambda expression"}," has unspecified explicit return type"}}},
		[f]=j,
		[g]="(?:return type (.*?) must match previous return type (.*?)|return type must match previous return type) when (?:block literal|lambda expression) has unspecified explicit return type",
		[h]=a,
		[i]=m,
		[b]={"dd5eb9df0cd2",1322934473,"If block literal return type is not specified, return type of the block is ","If block literal return type is not specified, return type of the block is \ninferred from return types. All the return statements have to agree about the type.\n// rdar://10466373\n\nllvm-svn: 145774"},
		[k]={{"clang/lib/Sema/SemaLambda.cpp",704,"void Sema::deduceClosureReturnType(CapturingScopeInfo &CSI) {\n  // ...\n  // We require the return types to strictly match here.\n  // Note that we\'ve already done the required promotions as part of\n  // processing the return statement.\n  for (const ReturnStmt *RS : CSI.Returns) {\n    // ...\n    Diag(RS->getBeginLoc(), diag::err_typecheck_missing_return_type_incompatible) << ReturnType << CSI.ReturnType << isa<LambdaScopeInfo>(CSI);"},{Ib,3860,"/// Deduce the return type for a function from a returned expression, per\n/// C++1y [dcl.spec.auto]p6.\nbool Sema::DeduceFunctionTypeFromReturnExpr(FunctionDecl *FD, SourceLocation ReturnLoc, Expr *RetExpr, const AutoType *AT) {\n  // ...\n  {\n    // ...\n    case TDK_Inconsistent: {\n      // ...\n      if (LambdaSI && LambdaSI->HasImplicitReturnType)\n        Diag(ReturnLoc, diag::err_typecheck_missing_return_type_incompatible) << Info.SecondArg << Info.FirstArg << true /*IsLambda*/;"}},
		[l]={
			["clang/test/SemaCXX/instantiate-blocks.cpp"]={"clang/test/SemaCXX/instantiate-blocks.cpp:22:7: error: return type \'double\' must match previous return type \'float\' when block literal has unspecified explicit return type"}
		}
	},
	["err_typecheck_negative_array_size"]={
		[c]="err_typecheck_negative_array_size",
		[d]="array size is negative",
		[e]="array size is negative",
		[f]=j,
		[g]="array size is negative",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{v,6609,"/// Attempt to fold a variable-sized type to a constant-sized type, returning\n/// true if we were successful.\nbool Sema::tryToFixVariablyModifiedVarType(TypeSourceInfo *&TInfo, QualType &T, SourceLocation Loc, unsigned FailedFoldDiagID) {\n  // ...\n  if (SizeIsNegative)\n    Diag(Loc, diag::err_typecheck_negative_array_size);"},{v,6726,"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          Diag(NewTD->getLocation(), diag::err_typecheck_negative_array_size);"},{G,2221,"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    // We\'ve already performed any required implicit conversion to integer or\n    // unscoped enumeration type.\n    // FIXME: Per CWG1464, we are required to check the value prior to\n    // converting to size_t. This will never find a negative array size in\n    // C++14 onwards, because Value is always unsigned here!\n    if (std::optional<llvm::APSInt> Value = (*ArraySize)->getIntegerConstantExpr(Context)) {\n      if (Value->isSigned() && Value->isNegative()) {\n        return ExprError(Diag((*ArraySize)->getBeginLoc(), diag::err_typecheck_negative_array_size) << (*ArraySize)->getSourceRange());"},{B,2640,"/// 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 (!ArraySize) {\n  // ...\n  } else if (ArraySize->isTypeDependent() || ArraySize->isValueDependent()) {\n  // ...\n  } else {\n    // ...\n    if (!R.isUsable()) {\n    // ...\n    } else if (!T->isDependentType() && !T->isIncompleteType() && !T->isConstantSizeType()) {\n    // ...\n    } else {\n      // C99 6.7.5.2p1: If the expression is a constant expression, it shall\n      // have a value greater than zero.\n      // In C++, this follows from narrowing conversions being disallowed.\n      if (ConstVal.isSigned() && ConstVal.isNegative()) {\n        if (Entity)\n        // ...\n        else\n          Diag(ArraySize->getBeginLoc(), diag::err_typecheck_negative_array_size) << ArraySize->getSourceRange();"}},
		[l]={
			[ic]={"clang/test/CXX/dcl.dcl/dcl.spec/dcl.typedef/p2-0x.cpp:76:19: error: array size is negative"}
		}
	},
	["err_typecheck_non_object_not_modifiable_lvalue"]={
		[c]="err_typecheck_non_object_not_modifiable_lvalue",
		[d]="non-object type %0 is not assignable",
		[e]="non-object type A is not assignable",
		[f]=j,
		[g]="non\\-object type (.*?) is not assignable",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{n,14351,"/// CheckForModifiableLvalue - Verify that E is a modifiable lvalue.  If not,\n/// emit an error and return true.  If so, return false.\nstatic bool CheckForModifiableLvalue(Expr *E, SourceLocation Loc, Sema &S) {\n  // ...\n  case Expr::MLV_NotObjectType:\n    DiagID = diag::err_typecheck_non_object_not_modifiable_lvalue;"}},
		[l]={
			["clang/test/Sema/ucn-identifiers.c"]={"clang/test/Sema/ucn-identifiers.c:26:13: error: non-object type \'void (int)\' is not assignable"}
		}
	},
	["err_typecheck_nonviable_condition"]={
		[c]="err_typecheck_nonviable_condition",
		[d]="no viable conversion%select{%diff{ from $ to $|}1,2|%diff{ from returned value of type $ to function return type $|}1,2}0",
		[e]={{nil,nil,{"no viable conversion",{{{" from B to C",a}},{{" from returned value of type B to function return type C",a}}}}}},
		[f]=j,
		[g]="no viable conversion(?:(?: from (.*?) to (.*?)|)|(?: from returned value of type (.*?) to function return type (.*?)|))",
		[h]=a,
		[i]=m,
		[b]={"76197416ac15",1258568789,"Improve on diagnosing type mismatches because of ","Improve on diagnosing type mismatches because of \nlack of viable convesion functions.\n\nllvm-svn: 89216"},
		[k]={{Cb,9663,"bool InitializationSequence::Diagnose(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, ArrayRef<Expr *> Args) {\n  // ...\n  case FK_ReferenceInitOverloadFailed:\n  case FK_UserConversionOverloadFailed:\n    // ...\n    case OR_No_Viable_Function: {\n      // ...\n      if (!S.RequireCompleteType(Kind.getLocation(), DestType.getNonReferenceType(), diag::err_typecheck_nonviable_condition_incomplete, OnlyArg->getType(), Args[0]->getSourceRange()))\n        S.Diag(Kind.getLocation(), diag::err_typecheck_nonviable_condition) << (Entity.getKind() == InitializedEntity::EK_Result) << OnlyArg->getType() << Args[0]->getSourceRange() << DestType.getNonReferenceType();"},{db,3780,"bool Sema::DiagnoseMultipleUserDefinedConversion(Expr *From, QualType ToType) {\n  // ...\n  if (OvResult == OR_Ambiguous)\n  // ...\n  else { // OR_No_Viable_Function && !CandidateSet.empty()\n    if (!RequireCompleteType(From->getBeginLoc(), ToType, diag::err_typecheck_nonviable_condition_incomplete, From->getType(), From->getSourceRange()))\n      Diag(From->getBeginLoc(), diag::err_typecheck_nonviable_condition) << false << From->getType() << From->getSourceRange() << ToType;"}},
		[l]={
			["clang/test/SemaHLSL/BuiltIns/vector-constructors-erros.hlsl"]={"clang/test/SemaHLSL/BuiltIns/vector-constructors-erros.hlsl:19:34: error: no viable conversion from \'S\' to \'float\'","clang/test/SemaHLSL/BuiltIns/vector-constructors-erros.hlsl:19:37: error: no viable conversion from \'S\' to \'float\'","clang/test/SemaHLSL/BuiltIns/vector-constructors-erros.hlsl:21:32: error: no viable conversion from \'S2\' to \'float\'"}
		}
	},
	["err_typecheck_nonviable_condition_incomplete"]={
		[c]="err_typecheck_nonviable_condition_incomplete",
		[d]="no viable conversion%diff{ from $ to incomplete type $|}0,1",
		[e]={{nil,nil,{"no viable conversion",{" from A to incomplete type B",a}}}},
		[f]=j,
		[g]="no viable conversion(?: from (.*?) to incomplete type (.*?)|)",
		[h]=a,
		[i]=m,
		[b]={"64cf3efd47bc",1372297825,"Fix a conversion to incomplete type bug -- The error message now specifically states that the type i...","Fix a conversion to incomplete type bug -- The error message now specifically states that the type is incomplete and points to the forward declaration of the incomplete type.\n\nllvm-svn: 185056"},
		[k]={{Cb,9661,"bool InitializationSequence::Diagnose(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, ArrayRef<Expr *> Args) {\n  // ...\n  case FK_ReferenceInitOverloadFailed:\n  case FK_UserConversionOverloadFailed:\n    // ...\n    case OR_No_Viable_Function: {\n      // ...\n      if (!S.RequireCompleteType(Kind.getLocation(), DestType.getNonReferenceType(), diag::err_typecheck_nonviable_condition_incomplete, OnlyArg->getType(), Args[0]->getSourceRange()))"},{db,3778,"bool Sema::DiagnoseMultipleUserDefinedConversion(Expr *From, QualType ToType) {\n  // ...\n  if (OvResult == OR_Ambiguous)\n  // ...\n  else { // OR_No_Viable_Function && !CandidateSet.empty()\n    if (!RequireCompleteType(From->getBeginLoc(), ToType, diag::err_typecheck_nonviable_condition_incomplete, From->getType(), From->getSourceRange()))"}},
		[l]={
			["clang/test/SemaCXX/conversion-incomplete-type.cpp"]={"clang/test/SemaCXX/conversion-incomplete-type.cpp:12:23: error: no viable conversion from \'const string\' to incomplete type \'const StringPiece\'","clang/test/SemaCXX/conversion-incomplete-type.cpp:20:23: error: no viable conversion from \'const string\' to incomplete type \'const StringPiece\'"}
		}
	},
	["err_typecheck_op_on_nonoverlapping_address_space_pointers"]={
		[c]="err_typecheck_op_on_nonoverlapping_address_space_pointers",
		[d]="%select{comparison between %diff{ ($ and $)|}0,1|arithmetic operation with operands of type %diff{ ($ and $)|}0,1|conditional operator with the second and third operands of type %diff{ ($ and $)|}0,1}2 which are pointers to non-overlapping address spaces",
		[e]={{nil,nil,{{{"comparison between ",{Jb,a}},{"arithmetic operation with operands of type ",{Jb,a}},{"conditional operator with the second and third operands of type ",{Jb,a}}}," which are pointers to non-overlapping address spaces"}}},
		[f]=j,
		[g]="(?:comparison between (?: \\((.*?) and (.*?)\\)|)|arithmetic operation with operands of type (?: \\((.*?) and (.*?)\\)|)|conditional operator with the second and third operands of type (?: \\((.*?) and (.*?)\\)|)) which are pointers to non\\-overlapping address spaces",
		[h]=a,
		[i]=m,
		[b]={"5d8ad8a7b891",1417016201,"[OpenCL] Implemented restrictions for pointer conversions specified in OpenCL v2.0.","[OpenCL] Implemented restrictions for pointer conversions specified in OpenCL v2.0.\n\nOpenCL v2.0 s6.5.5 restricts conversion of pointers to different address spaces:\n- the named address spaces (__global, __local, and __private) => __generic - implicitly converted;\n- __generic => named - with an explicit cast;\n- named <=> named - disallowed;\n- __constant <=> any other - disallowed.\n\nllvm-svn: 222834"},
		[k]={{n,8738,"/// Checks compatibility between two pointers and return the resulting\n/// type.\nstatic QualType checkConditionalPointerCompatibility(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc) {\n  // ...\n  // OpenCL v1.1 s6.5 - Conversion between pointers to distinct address\n  // spaces is disallowed.\n  if (lhQual.isAddressSpaceSupersetOf(rhQual))\n  // ...\n  else if (rhQual.isAddressSpaceSupersetOf(lhQual))\n  // ...\n  else {\n    S.Diag(Loc, diag::err_typecheck_op_on_nonoverlapping_address_space_pointers) << LHSTy << RHSTy << 2 << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();"},{n,11631,"/// Check the validity of a binary arithmetic operation w.r.t. pointer\n/// operands.\n///\n/// This routine will diagnose any invalid arithmetic on pointer operands much\n/// like \\see checkArithmeticOpPointerOperand. However, it has special logic\n/// for emitting a single diagnostic even for operations where both LHS and RHS\n/// are (potentially problematic) pointers.\n///\n/// \\returns True when the operand is valid to use (even if as an extension).\nstatic bool checkArithmeticBinOpPointerOperands(Sema &S, SourceLocation Loc, Expr *LHSExpr, Expr *RHSExpr) {\n  // ...\n  // if both are pointers check if operation is valid wrt address spaces\n  if (isLHSPointer && isRHSPointer) {\n    if (!LHSPointeeTy.isAddressSpaceOverlapping(RHSPointeeTy)) {\n      S.Diag(Loc, diag::err_typecheck_op_on_nonoverlapping_address_space_pointers) << LHSExpr->getType() << RHSExpr->getType() << 1 /*arithmetic op*/"},{n,13241,"// C99 6.5.8, C++ [expr.rel]\nQualType Sema::CheckCompareOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc) {\n  // ...\n  if ((LHSType->isIntegerType() && !LHSIsNull) || (RHSType->isIntegerType() && !RHSIsNull)) {\n  // ...\n  } else if (getLangOpts().CPlusPlus) {\n  // ...\n  } else if (LHSType->isPointerType() && RHSType->isPointerType()) { // C99 6.5.8p2\n    // ...\n    if (LCanPointeeTy != RCanPointeeTy) {\n      // Treat NULL constant as a special case in OpenCL.\n      if (getLangOpts().OpenCL && !LHSIsNull && !RHSIsNull) {\n        if (!LCanPointeeTy.isAddressSpaceOverlapping(RCanPointeeTy)) {\n          Diag(Loc, diag::err_typecheck_op_on_nonoverlapping_address_space_pointers) << LHSType << RHSType << 0 /* comparison */"}},
		[l]={
			["clang/test/SemaCXX/address-space-arithmetic.cpp"]={"clang/test/SemaCXX/address-space-arithmetic.cpp:5:12: error: arithmetic operation with operands of type  (\'__private int *\' and \'__local int *\') which are pointers to non-overlapping address spaces"}
		}
	},
	["err_typecheck_ordered_comparison_of_function_pointers"]={
		[c]={{nil,y,"err_typecheck_ordered_comparison_of_function_pointers"}},
		[d]={{nil,y,"ordered comparison of function pointers (%0 and %1)"}},
		[e]={{nil,y,"ordered comparison of function pointers (A and B)"}},
		[f]=j,
		[g]="ordered comparison of function pointers \\((.*?) and (.*?)\\)",
		[h]=a,
		[i]={{nil,y,m}},
		[b]={"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"},
		[k]={{n,13039,"// C99 6.5.8, C++ [expr.rel]\nQualType Sema::CheckCompareOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc) {\n  // ...\n  if (IsOrdered && LHSType->isFunctionPointerType() && RHSType->isFunctionPointerType()) {\n    // ...\n    auto DiagID = IsError ? diag::err_typecheck_ordered_comparison_of_function_pointers : getLangOpts().CPlusPlus ? diag::warn_typecheck_ordered_comparison_of_function_pointers : diag::ext_typecheck_ordered_comparison_of_function_pointers;"}},
		[l]={
			["clang/test/SemaCXX/compare-function-pointer.cpp"]={"clang/test/SemaCXX/compare-function-pointer.cpp:15:14: error: ordered comparison of function pointers (\'fp0_t\' (aka \'void (*)()\') and \'fp0_t\')","clang/test/SemaCXX/compare-function-pointer.cpp:27:14: error: ordered comparison of function pointers (\'fp0_t\' (aka \'void (*)()\') and \'fp1_t\' (aka \'int (*)()\'))"}
		}
	},
	["err_typecheck_ordered_comparison_of_pointer_and_zero"]={
		[c]="err_typecheck_ordered_comparison_of_pointer_and_zero",
		[d]="ordered comparison between pointer and zero (%0 and %1)",
		[e]="ordered comparison between pointer and zero (A and B)",
		[f]=j,
		[g]="ordered comparison between pointer and zero \\((.*?) and (.*?)\\)",
		[h]=a,
		[i]=m,
		[b]={"0c1c53e3fad7",1477017397,"DR583, DR1512: Implement a rewrite to C++\'s \'composite pointer type\' rules.","DR583, DR1512: Implement a rewrite to C++\'s \'composite pointer type\' rules.\nThis has two significant effects:\n\n1) Direct relational comparisons between null pointer constants (0 and nullopt)\n   and pointers are now ill-formed. This was always the case for C, and it\n   appears that C++ only ever permitted by accident. For instance, cases like\n     nullptr < &a\n   are now rejected.\n\n2) Comparisons and conditional operators between differently-cv-qualified\n   pointer types now work, and produce a composite type that both source\n   pointer types can convert to (when possible). For instance, comparison\n   between \'int **\' and \'const int **\' is now valid, and uses an intermediate\n   type of \'const int *const *\'.\n\nClang previously supported #2 as an extension.\n\nWe do not accept the cases in #1 as an extension. I\'ve tested a fair amount of\ncode to check that this doesn\'t break it, but if it turns out that someone is\nrelying on this, we can easily add it back as an extension.\n\nllvm-svn: 284800"},
		[k]={{n,13349,"// C99 6.5.8, C++ [expr.rel]\nQualType Sema::CheckCompareOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc) {\n  // ...\n  if ((LHSType->isAnyPointerType() && RHSType->isIntegerType()) || (LHSType->isIntegerType() && RHSType->isAnyPointerType())) {\n    // ...\n    if (LangOpts.DebuggerSupport) {\n    // ...\n    } else if ((LHSIsNull && LHSType->isIntegerType()) || (RHSIsNull && RHSType->isIntegerType())) {\n      if (IsOrdered) {\n        // ...\n        DiagID = isError ? diag::err_typecheck_ordered_comparison_of_pointer_and_zero : diag::ext_typecheck_ordered_comparison_of_pointer_and_zero;"}},
		[l]={
			["clang/test/SemaCXX/null_in_arithmetic_ops.cpp"]={"clang/test/SemaCXX/null_in_arithmetic_ops.cpp:74:10: error: ordered comparison between pointer and zero (\'int *\' and \'long\')","clang/test/SemaCXX/null_in_arithmetic_ops.cpp:74:25: error: ordered comparison between pointer and zero (\'long\' and \'int *\')","clang/test/SemaCXX/null_in_arithmetic_ops.cpp:74:36: error: ordered comparison between pointer and zero (\'int *\' and \'long\')","clang/test/SemaCXX/null_in_arithmetic_ops.cpp:74:51: error: ordered comparison between pointer and zero (\'long\' and \'int *\')","clang/test/SemaCXX/null_in_arithmetic_ops.cpp:75:10: error: ordered comparison between pointer and zero (\'int *\' and \'long\')","clang/test/SemaCXX/null_in_arithmetic_ops.cpp:75:26: error: ordered comparison between pointer and zero (\'long\' and \'int *\')","clang/test/SemaCXX/null_in_arithmetic_ops.cpp:75:38: error: ordered comparison between pointer and zero (\'int *\' and \'long\')","clang/test/SemaCXX/null_in_arithmetic_ops.cpp:75:54: error: ordered comparison between pointer and zero (\'long\' and \'int *\')"}
		}
	},
	["err_typecheck_pointer_arith_function_type"]={
		[c]="err_typecheck_pointer_arith_function_type",
		[d]="arithmetic on%select{ a|}0 pointer%select{|s}0 to%select{ the|}2 function type%select{|s}2 %1%select{| and %3}2",
		[e]={{nil,nil,{"arithmetic on",{" a",a}," pointer",{a,kc}," to",{" the",a}," function type",{a,kc}," B",{a," and D"}}}},
		[f]=j,
		[g]="arithmetic on(?: a|) pointer(?:|s) to(?: the|) function type(?:|s) (.*?)(?:| and (.*?))",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{n,11485,"/// Diagnose invalid arithmetic on two function pointers.\nstatic void diagnoseArithmeticOnTwoFunctionPointers(Sema &S, SourceLocation Loc, Expr *LHS, Expr *RHS) {\n  // ...\n  S.Diag(Loc, S.getLangOpts().CPlusPlus ? diag::err_typecheck_pointer_arith_function_type : diag::ext_gnu_ptr_func_arith) << 1 /* two pointers */"},{n,11500,"/// Diagnose invalid arithmetic on a function pointer.\nstatic void diagnoseArithmeticOnFunctionPointer(Sema &S, SourceLocation Loc, Expr *Pointer) {\n  // ...\n  S.Diag(Loc, S.getLangOpts().CPlusPlus ? diag::err_typecheck_pointer_arith_function_type : diag::ext_gnu_ptr_func_arith) << 0 /* one pointer */ << Pointer->getType()->getPointeeType() << 0 /* one pointer, so only one type */"}},
		[l]={
			["clang/test/SemaCXX/null_in_arithmetic_ops.cpp"]={"clang/test/SemaCXX/null_in_arithmetic_ops.cpp:36:16: error: arithmetic on a pointer to the function type \'void ()\'","clang/test/SemaCXX/null_in_arithmetic_ops.cpp:36:24: error: arithmetic on a pointer to the function type \'void ()\'"}
		}
	},
	["err_typecheck_pointer_arith_void_type"]={
		[c]="err_typecheck_pointer_arith_void_type",
		[d]="arithmetic on%select{ a|}0 pointer%select{|s}0 to void",
		[e]={{nil,nil,{"arithmetic on",{" a",a}," pointer",{a,kc}," to void"}}},
		[f]=j,
		[g]="arithmetic on(?: a|) pointer(?:|s) to void",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{n,11431,"static void diagnoseArithmeticOnTwoVoidPointers(Sema &S, SourceLocation Loc, Expr *LHSExpr, Expr *RHSExpr) { S.Diag(Loc, S.getLangOpts().CPlusPlus ? diag::err_typecheck_pointer_arith_void_type : diag::ext_gnu_void_ptr) << 1 /* two pointers */ << LHSExpr->getSourceRange() << RHSExpr->getSourceRange(); }"},{n,11441,"static void diagnoseArithmeticOnVoidPointer(Sema &S, SourceLocation Loc, Expr *Pointer) { S.Diag(Loc, S.getLangOpts().CPlusPlus ? diag::err_typecheck_pointer_arith_void_type : diag::ext_gnu_void_ptr) << 0 /* one pointer */ << Pointer->getSourceRange(); }"}},
		[l]={
			["clang/test/CXX/stmt.stmt/stmt.iter/stmt.ranged/p1.cpp"]={"clang/test/CXX/stmt.stmt/stmt.iter/stmt.ranged/p1.cpp:178:15: error: arithmetic on a pointer to void"}
		}
	},
	["err_typecheck_sclass_fscope"]={
		[c]="err_typecheck_sclass_fscope",
		[d]="illegal storage class on file-scoped variable",
		[e]="illegal storage class on file-scoped variable",
		[f]=j,
		[g]="illegal storage class on file\\-scoped variable",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{v,7508,"NamedDecl *Sema::ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope, ArrayRef<BindingDecl *> Bindings) {\n  // ...\n  if (!DC->isRecord() && S->getFnParent() == nullptr) {\n    // C99 6.9p2: The storage-class specifiers auto and register shall not\n    // appear in the declaration specifiers in an external declaration.\n    // Global Register+Asm is a GNU extension we support.\n    if (SC == SC_Auto || (SC == SC_Register && !D.getAsmLabel())) {\n      Diag(D.getIdentifierLoc(), diag::err_typecheck_sclass_fscope);"}},
		[l]={
			["clang/test/Sema/decl-invalid.c"]={"clang/test/Sema/decl-invalid.c:26:14: error: illegal storage class on file-scoped variable"}
		}
	},
	["err_typecheck_sclass_func"]={
		[c]="err_typecheck_sclass_func",
		[d]="illegal storage class on function",
		[e]="illegal storage class on function",
		[f]=j,
		[g]="illegal storage class on function",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{v,9104,"static StorageClass getFunctionStorageClass(Sema &SemaRef, Declarator &D) {\n  // ...\n  case DeclSpec::SCS_auto:\n  case DeclSpec::SCS_register:\n  case DeclSpec::SCS_mutable:\n    SemaRef.Diag(D.getDeclSpec().getStorageClassSpecLoc(), diag::err_typecheck_sclass_func);"}},
		[l]={
			["clang/test/Sema/function.c"]={"clang/test/Sema/function.c:59:3: error: illegal storage class on function"}
		}
	},
	["err_typecheck_statement_requires_integer"]={
		[c]="err_typecheck_statement_requires_integer",
		[d]="statement requires expression of integer type (%0 invalid)",
		[e]="statement requires expression of integer type (A invalid)",
		[f]=j,
		[g]="statement requires expression of integer type \\((.*?) invalid\\)",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{Ib,1040,"ExprResult Sema::CheckSwitchCondition(SourceLocation SwitchLoc, Expr *Cond) {\n  class SwitchConvertDiagnoser : public ICEConvertDiagnoser {\n    // ...\n    SemaDiagnosticBuilder diagnoseNotInt(Sema &S, SourceLocation Loc, QualType T) override { return S.Diag(Loc, diag::err_typecheck_statement_requires_integer) << T; }"}},
		[l]={
			["clang/test/SemaTemplate/non-integral-switch-cond.cpp"]={"clang/test/SemaTemplate/non-integral-switch-cond.cpp:9:5: error: statement requires expression of integer type (\'NOT_AN_INTEGRAL_TYPE\' invalid)"}
		}
	},
	["err_typecheck_statement_requires_scalar"]={
		[c]="err_typecheck_statement_requires_scalar",
		[d]="statement requires expression of scalar type (%0 invalid)",
		[e]="statement requires expression of scalar type (A invalid)",
		[f]=j,
		[g]="statement requires expression of scalar type \\((.*?) invalid\\)",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{n,21002,"ExprResult Sema::CheckBooleanCondition(SourceLocation Loc, Expr *E, bool IsConstexpr) {\n  // ...\n  if (!E->isTypeDependent()) {\n    // ...\n    if (!T->isScalarType()) { // C99 6.8.4.1p1\n      Diag(Loc, diag::err_typecheck_statement_requires_scalar) << T << E->getSourceRange();"}},
		[l]={
			["clang/test/Sema/enum.c"]={"clang/test/Sema/enum.c:43:3: error: statement requires expression of scalar type (\'enum some_undefined_enum\' invalid)"}
		}
	},
	["err_typecheck_sub_ptr_compatible"]={
		[c]="err_typecheck_sub_ptr_compatible",
		[d]="%diff{$ and $ are not pointers to compatible types|pointers to incompatible types}0,1",
		[e]={{nil,nil,{{"A and B are not pointers to compatible types","pointers to incompatible types"}}}},
		[f]=j,
		[g]="(?:(.*?) and (.*?) are not pointers to compatible types|pointers to incompatible types)",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{w,9078,"/// SemaBuiltinARMMemoryTaggingCall - Handle calls of memory tagging extensions\nbool Sema::SemaBuiltinARMMemoryTaggingCall(unsigned BuiltinID, CallExpr *TheCall) {\n  // ...\n  if (BuiltinID == AArch64::BI__builtin_arm_subp) {\n    // ...\n    // Ensure Pointee types are compatible\n    if (ArgTypeA->isAnyPointerType() && !isNull(ArgA) && ArgTypeB->isAnyPointerType() && !isNull(ArgB)) {\n      // ...\n      if (!Context.typesAreCompatible(Context.getCanonicalType(pointeeA).getUnqualifiedType(), Context.getCanonicalType(pointeeB).getUnqualifiedType())) {\n        return Diag(TheCall->getBeginLoc(), diag::err_typecheck_sub_ptr_compatible) << ArgTypeA << ArgTypeB << ArgA->getSourceRange() << ArgB->getSourceRange();"},{n,11948,"/// Emit error when two pointers are incompatible.\nstatic void diagnosePointerIncompatibility(Sema &S, SourceLocation Loc, Expr *LHSExpr, Expr *RHSExpr) {\n  // ...\n  S.Diag(Loc, diag::err_typecheck_sub_ptr_compatible) << LHSExpr->getType() << RHSExpr->getType() << LHSExpr->getSourceRange() << RHSExpr->getSourceRange();"}},
		[l]={
			["clang/test/CXX/over/over.built/p15.cpp"]={"clang/test/CXX/over/over.built/p15.cpp:6:13: error: \'int *\' and \'float *\' are not pointers to compatible types"}
		}
	},
	["err_typecheck_subscript_not_integer"]={
		[c]="err_typecheck_subscript_not_integer",
		[d]="array subscript is not an integer",
		[e]="array subscript is not an integer",
		[f]=j,
		[g]="array subscript is not an integer",
		[h]=a,
		[i]=m,
		[b]={"003af249275a",1240699855,"minor diagnostics improvements.","minor diagnostics improvements.\n\nllvm-svn: 70092"},
		[k]={{n,5956,"ExprResult Sema::CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc, Expr *Idx, SourceLocation RLoc) {\n  // ...\n  // C99 6.5.2.1p1\n  if (!IndexExpr->getType()->isIntegerType() && !IndexExpr->isTypeDependent())\n    return ExprError(Diag(LLoc, diag::err_typecheck_subscript_not_integer) << IndexExpr->getSourceRange());"},{n,16636,"ExprResult Sema::BuildBuiltinOffsetOf(SourceLocation BuiltinLoc, TypeSourceInfo *TInfo, ArrayRef<OffsetOfComponent> Components, SourceLocation RParenLoc) {\n  // ...\n  for (const OffsetOfComponent &OC : Components) {\n    if (OC.isBrackets) {\n      // ...\n      // The expression must be an integral expression.\n      // FIXME: An integral constant expression?\n      if (!Idx->isTypeDependent() && !Idx->isValueDependent() && !Idx->getType()->isIntegerType())\n        return ExprError(Diag(Idx->getBeginLoc(), diag::err_typecheck_subscript_not_integer) << Idx->getSourceRange());"}},
		[l]={
			["clang/test/Sema/vector-ops.c"]={"clang/test/Sema/vector-ops.c:23:16: error: array subscript is not an integer"}
		}
	},
	["err_typecheck_subscript_value"]={
		[c]="err_typecheck_subscript_value",
		[d]="subscripted value is not an array, pointer, or vector",
		[e]="subscripted value is not an array, pointer, or vector",
		[f]=j,
		[g]="subscripted value is not an array, pointer, or vector",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{n,5950,"ExprResult Sema::CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc, Expr *Idx, SourceLocation RLoc) {\n  // ...\n  if (LHSTy->isDependentType() || RHSTy->isDependentType()) {\n  // ...\n  } else if (const PointerType *PTy = LHSTy->getAs<PointerType>()) {\n  // ...\n  } else if (const ObjCObjectPointerType *PTy = LHSTy->getAs<ObjCObjectPointerType>()) {\n  // ...\n  } else if (const PointerType *PTy = RHSTy->getAs<PointerType>()) {\n  // ...\n  } else if (const ObjCObjectPointerType *PTy = RHSTy->getAs<ObjCObjectPointerType>()) {\n  // ...\n  } else if (const VectorType *VTy = LHSTy->getAs<VectorType>()) {\n  // ...\n  } else if (LHSTy->isBuiltinType() && LHSTy->getAs<BuiltinType>()->isVLSTBuiltinType()) {\n  // ...\n  } else if (LHSTy->isArrayType()) {\n  // ...\n  } else if (RHSTy->isArrayType()) {\n  // ...\n  } else {\n    return ExprError(Diag(LLoc, diag::err_typecheck_subscript_value) << LHSExp->getSourceRange() << RHSExp->getSourceRange());"}},
		[l]={
			["clang/test/SemaObjC/matrix-type-operators.m"]={"clang/test/SemaObjC/matrix-type-operators.m:20:17: error: subscripted value is not an array, pointer, or vector"}
		}
	},
	["err_typecheck_sve_rvv_ambiguous"]={
		[c]="err_typecheck_sve_rvv_ambiguous",
		[d]="cannot combine fixed-length and sizeless %select{SVE|RVV}0 vectors in expression, result is ambiguous (%1 and %2)",
		[e]={{nil,nil,{"cannot combine fixed-length and sizeless ",{"SVE","RVV"}," vectors in expression, result is ambiguous (B and C)"}}},
		[f]=j,
		[g]="cannot combine fixed\\-length and sizeless (?:SVE|RVV) vectors in expression, result is ambiguous \\((.*?) and (.*?)\\)",
		[h]=a,
		[i]=m,
		[b]={mb,1625925174,lb,kb},
		[k]={{n,11066,"QualType Sema::CheckVectorOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign, bool AllowBothBool, bool AllowBoolConversions, bool AllowBoolOperation, bool ReportInvalid) {\n  // ...\n  if (IsSveRVVConversion(LHSType, RHSType, SVEorRVV) || IsSveRVVConversion(RHSType, LHSType, SVEorRVV)) {\n    Diag(Loc, diag::err_typecheck_sve_rvv_ambiguous) << SVEorRVV << LHSType << RHSType;"}},
		[l]={
			["clang/test/Sema/attr-arm-sve-vector-bits.c"]={"clang/test/Sema/attr-arm-sve-vector-bits.c:131:11: error: cannot combine fixed-length and sizeless SVE vectors in expression, result is ambiguous (\'svint8_t\' (aka \'__SVInt8_t\') and \'fixed_int8_t\' (vector of 256 \'signed char\' values))","clang/test/Sema/attr-arm-sve-vector-bits.c:132:11: error: cannot combine fixed-length and sizeless SVE vectors in expression, result is ambiguous (\'fixed_int8_t\' (vector of 256 \'signed char\' values) and \'svint8_t\' (aka \'__SVInt8_t\'))","clang/test/Sema/attr-arm-sve-vector-bits.c:141:13: error: cannot combine fixed-length and sizeless SVE vectors in expression, result is ambiguous (\'svint8_t\' (aka \'__SVInt8_t\') and \'fixed_int8_t\' (vector of 256 \'signed char\' values))","clang/test/Sema/attr-arm-sve-vector-bits.c:144:13: error: cannot combine fixed-length and sizeless SVE vectors in expression, result is ambiguous (\'fixed_int8_t\' (vector of 256 \'signed char\' values) and \'svint8_t\' (aka \'__SVInt8_t\'))","clang/test/Sema/attr-arm-sve-vector-bits.c:150:7: error: cannot combine fixed-length and sizeless SVE vectors in expression, result is ambiguous (\'svint8_t\' (aka \'__SVInt8_t\') and \'fixed_int8_t\' (vector of 256 \'signed char\' values))","clang/test/Sema/attr-arm-sve-vector-bits.c:153:7: error: cannot combine fixed-length and sizeless SVE vectors in expression, result is ambiguous (\'fixed_int8_t\' (vector of 256 \'signed char\' values) and \'svint8_t\' (aka \'__SVInt8_t\'))","clang/test/Sema/attr-arm-sve-vector-bits.c:159:13: error: cannot combine fixed-length and sizeless SVE vectors in expression, result is ambiguous (\'svint8_t\' (aka \'__SVInt8_t\') and \'fixed_int8_t\' (vector of 256 \'signed char\' values))","clang/test/Sema/attr-arm-sve-vector-bits.c:162:13: error: cannot combine fixed-length and sizeless SVE vectors in expression, result is ambiguous (\'fixed_int8_t\' (vector of 256 \'signed char\' values) and \'svint8_t\' (aka \'__SVInt8_t\'))","clang/test/Sema/attr-arm-sve-vector-bits.c:168:13: error: cannot combine fixed-length and sizeless SVE vectors in expression, result is ambiguous (\'svint8_t\' (aka \'__SVInt8_t\') and \'fixed_int8_t\' (vector of 256 \'signed char\' values))","clang/test/Sema/attr-arm-sve-vector-bits.c:171:13: error: cannot combine fixed-length and sizeless SVE vectors in expression, result is ambiguous (\'fixed_int8_t\' (vector of 256 \'signed char\' values) and \'svint8_t\' (aka \'__SVInt8_t\'))"}
		}
	},
	["err_typecheck_sve_rvv_gnu_ambiguous"]={
		[c]="err_typecheck_sve_rvv_gnu_ambiguous",
		[d]="cannot combine GNU and %select{SVE|RVV}0 vectors in expression, result is ambiguous (%1 and %2)",
		[e]={{nil,nil,{"cannot combine GNU and ",{"SVE","RVV"}," vectors in expression, result is ambiguous (B and C)"}}},
		[f]=j,
		[g]="cannot combine GNU and (?:SVE|RVV) vectors in expression, result is ambiguous \\((.*?) and (.*?)\\)",
		[h]=a,
		[i]=m,
		[b]={mb,1625925174,lb,kb},
		[k]={{n,11073,"QualType Sema::CheckVectorOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign, bool AllowBothBool, bool AllowBoolConversions, bool AllowBoolOperation, bool ReportInvalid) {\n  // ...\n  if (IsSveRVVGnuConversion(LHSType, RHSType, SVEorRVV) || IsSveRVVGnuConversion(RHSType, LHSType, SVEorRVV)) {\n    Diag(Loc, diag::err_typecheck_sve_rvv_gnu_ambiguous) << SVEorRVV << LHSType << RHSType;"}},
		[l]={
			["clang/test/Sema/attr-arm-sve-vector-bits.c"]={"clang/test/Sema/attr-arm-sve-vector-bits.c:134:11: error: cannot combine GNU and SVE vectors in expression, result is ambiguous (\'gnu_int8_t\' (vector of 256 \'int8_t\' values) and \'svint8_t\' (aka \'__SVInt8_t\'))","clang/test/Sema/attr-arm-sve-vector-bits.c:135:11: error: cannot combine GNU and SVE vectors in expression, result is ambiguous (\'svint8_t\' (aka \'__SVInt8_t\') and \'gnu_int8_t\' (vector of 256 \'int8_t\' values))","clang/test/Sema/attr-arm-sve-vector-bits.c:137:11: error: cannot combine GNU and SVE vectors in expression, result is ambiguous (\'gnu_int8_t\' (vector of 256 \'int8_t\' values) and \'fixed_int8_t\' (vector of 256 \'signed char\' values))","clang/test/Sema/attr-arm-sve-vector-bits.c:138:11: error: cannot combine GNU and SVE vectors in expression, result is ambiguous (\'fixed_int8_t\' (vector of 256 \'signed char\' values) and \'gnu_int8_t\' (vector of 256 \'int8_t\' values))","clang/test/Sema/attr-arm-sve-vector-bits.c:142:13: error: cannot combine GNU and SVE vectors in expression, result is ambiguous (\'svint8_t\' (aka \'__SVInt8_t\') and \'gnu_int8_t\' (vector of 256 \'int8_t\' values))","clang/test/Sema/attr-arm-sve-vector-bits.c:145:13: error: cannot combine GNU and SVE vectors in expression, result is ambiguous (\'fixed_int8_t\' (vector of 256 \'signed char\' values) and \'gnu_int8_t\' (vector of 256 \'int8_t\' values))","clang/test/Sema/attr-arm-sve-vector-bits.c:147:13: error: cannot combine GNU and SVE vectors in expression, result is ambiguous (\'gnu_int8_t\' (vector of 256 \'int8_t\' values) and \'svint8_t\' (aka \'__SVInt8_t\'))","clang/test/Sema/attr-arm-sve-vector-bits.c:148:13: error: cannot combine GNU and SVE vectors in expression, result is ambiguous (\'gnu_int8_t\' (vector of 256 \'int8_t\' values) and \'fixed_int8_t\' (vector of 256 \'signed char\' values))","clang/test/Sema/attr-arm-sve-vector-bits.c:151:7: error: cannot combine GNU and SVE vectors in expression, result is ambiguous (\'svint8_t\' (aka \'__SVInt8_t\') and \'gnu_int8_t\' (vector of 256 \'int8_t\' values))","clang/test/Sema/attr-arm-sve-vector-bits.c:154:7: error: cannot combine GNU and SVE vectors in expression, result is ambiguous (\'fixed_int8_t\' (vector of 256 \'signed char\' values) and \'gnu_int8_t\' (vector of 256 \'int8_t\' values))","clang/test/Sema/attr-arm-sve-vector-bits.c:156:7: error: cannot combine GNU and SVE vectors in expression, result is ambiguous (\'gnu_int8_t\' (vector of 256 \'int8_t\' values) and \'svint8_t\' (aka \'__SVInt8_t\'))","clang/test/Sema/attr-arm-sve-vector-bits.c:157:7: error: cannot combine GNU and SVE vectors in expression, result is ambiguous (\'gnu_int8_t\' (vector of 256 \'int8_t\' values) and \'fixed_int8_t\' (vector of 256 \'signed char\' values))","clang/test/Sema/attr-arm-sve-vector-bits.c:160:13: error: cannot combine GNU and SVE vectors in expression, result is ambiguous (\'svint8_t\' (aka \'__SVInt8_t\') and \'gnu_int8_t\' (vector of 256 \'int8_t\' values))","clang/test/Sema/attr-arm-sve-vector-bits.c:163:13: error: cannot combine GNU and SVE vectors in expression, result is ambiguous (\'fixed_int8_t\' (vector of 256 \'signed char\' values) and \'gnu_int8_t\' (vector of 256 \'int8_t\' values))","clang/test/Sema/attr-arm-sve-vector-bits.c:165:13: error: cannot combine GNU and SVE vectors in expression, result is ambiguous (\'gnu_int8_t\' (vector of 256 \'int8_t\' values) and \'svint8_t\' (aka \'__SVInt8_t\'))","clang/test/Sema/attr-arm-sve-vector-bits.c:166:13: error: cannot combine GNU and SVE vectors in expression, result is ambiguous (\'gnu_int8_t\' (vector of 256 \'int8_t\' values) and \'fixed_int8_t\' (vector of 256 \'signed char\' values))","clang/test/Sema/attr-arm-sve-vector-bits.c:169:13: error: cannot combine GNU and SVE vectors in expression, result is ambiguous (\'svint8_t\' (aka \'__SVInt8_t\') and \'gnu_int8_t\' (vector of 256 \'int8_t\' values))","clang/test/Sema/attr-arm-sve-vector-bits.c:172:13: error: cannot combine GNU and SVE vectors in expression, result is ambiguous (\'fixed_int8_t\' (vector of 256 \'signed char\' values) and \'gnu_int8_t\' (vector of 256 \'int8_t\' values))","clang/test/Sema/attr-arm-sve-vector-bits.c:174:13: error: cannot combine GNU and SVE vectors in expression, result is ambiguous (\'gnu_int8_t\' (vector of 256 \'int8_t\' values) and \'svint8_t\' (aka \'__SVInt8_t\'))","clang/test/Sema/attr-arm-sve-vector-bits.c:175:13: error: cannot combine GNU and SVE vectors in expression, result is ambiguous (\'gnu_int8_t\' (vector of 256 \'int8_t\' values) and \'fixed_int8_t\' (vector of 256 \'signed char\' values))"}
		}
	},
	["err_typecheck_three_way_comparison_of_pointer_and_zero"]={
		[c]={{nil,t,"err_typecheck_three_way_comparison_of_pointer_and_zero"}},
		[d]={{nil,t,"three-way comparison between pointer and zero"}},
		[e]={{nil,t,"three-way comparison between pointer and zero"}},
		[f]=j,
		[g]="three\\-way comparison between pointer and zero",
		[h]=a,
		[i]={{nil,t,m}},
		[b]={"fe17b30a7957",1575504770,"[attributes][analyzer] Add annotations for handles.","[attributes][analyzer] Add annotations for handles.\n\nThese annotations will be used in an upcomming static analyzer check\nthat finds handle leaks, use after releases, and double releases.\n\nDifferential Revision: https://reviews.llvm.org/D70469"},
		[k]={{n,13037,"// C99 6.5.8, C++ [expr.rel]\nQualType Sema::CheckCompareOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, BinaryOperatorKind Opc) {\n  // ...\n  auto computeResultTy = [&]() {\n    // ...\n    if (CompositeTy->isPointerType() && LHSIsNull != RHSIsNull) {\n      // ...\n      Diag(Loc, diag::err_typecheck_three_way_comparison_of_pointer_and_zero) << (LHSIsNull ? LHS.get()->getSourceRange() : RHS.get()->getSourceRange());"}}
	},
	["err_typecheck_unary_expr"]={
		[c]="err_typecheck_unary_expr",
		[d]="invalid argument type %0 to unary expression",
		[e]="invalid argument type A to unary expression",
		[f]=j,
		[g]="invalid argument type (.*?) to unary expression",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{n,16161,"ExprResult Sema::CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *InputExpr, bool IsAfterAmp) {\n  // ...\n  if (getLangOpts().OpenCL) {\n    // ...\n    // The only legal unary operation for atomics is \'&\'.\n    if ((Opc != UO_AddrOf && Ty->isAtomicType()) ||\n      // ...\n      return ExprError(Diag(OpLoc, diag::err_typecheck_unary_expr) << InputExpr->getType() << Input.get()->getSourceRange());"},{n,16237,"ExprResult Sema::CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *InputExpr, bool IsAfterAmp) {\n  // ...\n  case UO_Plus:\n  case UO_Minus:\n    // ...\n    return ExprError(Diag(OpLoc, diag::err_typecheck_unary_expr) << resultType << Input.get()->getSourceRange());"},{n,16249,"ExprResult Sema::CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *InputExpr, bool IsAfterAmp) {\n  // ...\n  case UO_Not: // bitwise complement\n    // ...\n    // C99 6.5.3.3p1. We allow complex int and float as a GCC extension.\n    if (resultType->isComplexType() || resultType->isComplexIntegerType())\n    // ...\n    else if (resultType->hasIntegerRepresentation())\n    // ...\n    else if (resultType->isExtVectorType() && Context.getLangOpts().OpenCL) {\n      // ...\n      if (!T->isIntegerType())\n        return ExprError(Diag(OpLoc, diag::err_typecheck_unary_expr) << resultType << Input.get()->getSourceRange());"},{n,16269,"ExprResult Sema::CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *InputExpr, bool IsAfterAmp) {\n  // ...\n  case UO_Not: // bitwise complement\n    // ...\n    // C99 6.5.3.3p1. We allow complex int and float as a GCC extension.\n    if (resultType->isComplexType() || resultType->isComplexIntegerType())\n    // ...\n    else if (resultType->hasIntegerRepresentation())\n    // ...\n    else if (resultType->isExtVectorType() && Context.getLangOpts().OpenCL) {\n    // ...\n    } else {\n      return ExprError(Diag(OpLoc, diag::err_typecheck_unary_expr) << resultType << Input.get()->getSourceRange());"},{n,16287,"ExprResult Sema::CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *InputExpr, bool IsAfterAmp) {\n  // ...\n  case UO_LNot: // logical negation\n    // ...\n    // WebAsembly tables can\'t be used in unary expressions.\n    if (resultType->isPointerType() && resultType->getPointeeType().isWebAssemblyReferenceType()) {\n      return ExprError(Diag(OpLoc, diag::err_typecheck_unary_expr) << resultType << Input.get()->getSourceRange());"},{n,16297,"ExprResult Sema::CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *InputExpr, bool IsAfterAmp) {\n  // ...\n  case UO_LNot: // logical negation\n    // ...\n    if (resultType->isScalarType() && !isScopedEnumerationType(resultType)) {\n      // C99 6.5.3.3p1: ok, fallthrough;\n      if (Context.getLangOpts().CPlusPlus) {\n      // ...\n      } else if (Context.getLangOpts().OpenCL && Context.getLangOpts().OpenCLVersion < 120) {\n        // OpenCL v1.1 6.3.h: The logical operator not (!) does not\n        // operate on scalar float types.\n        if (!resultType->isIntegerType() && !resultType->isPointerType())\n          return ExprError(Diag(OpLoc, diag::err_typecheck_unary_expr) << resultType << Input.get()->getSourceRange());"},{n,16306,"ExprResult Sema::CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *InputExpr, bool IsAfterAmp) {\n  // ...\n  case UO_LNot: // logical negation\n    // ...\n    if (resultType->isScalarType() && !isScopedEnumerationType(resultType)) {\n    // ...\n    } else if (resultType->isExtVectorType()) {\n      if (Context.getLangOpts().OpenCL && Context.getLangOpts().getOpenCLCompatibleVersion() < 120) {\n        // ...\n        if (!T->isIntegerType())\n          return ExprError(Diag(OpLoc, diag::err_typecheck_unary_expr) << resultType << Input.get()->getSourceRange());"},{n,16313,"ExprResult Sema::CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *InputExpr, bool IsAfterAmp) {\n  // ...\n  case UO_LNot: // logical negation\n    // ...\n    if (resultType->isScalarType() && !isScopedEnumerationType(resultType)) {\n    // ...\n    } else if (resultType->isExtVectorType()) {\n    // ...\n    } else if (Context.getLangOpts().CPlusPlus && resultType->isVectorType()) {\n      // ...\n      if (VTy->getVectorKind() != VectorType::GenericVector)\n        return ExprError(Diag(OpLoc, diag::err_typecheck_unary_expr) << resultType << Input.get()->getSourceRange());"},{n,16580,"ExprResult Sema::CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *InputExpr, bool IsAfterAmp) {\n  // ...\n  case UO_LNot: // logical negation\n    // ...\n    if (resultType->isScalarType() && !isScopedEnumerationType(resultType)) {\n    // ...\n    } else if (resultType->isExtVectorType()) {\n    // ...\n    } else if (Context.getLangOpts().CPlusPlus && resultType->isVectorType()) {\n    // ...\n    } else {\n      return ExprError(Diag(OpLoc, diag::err_typecheck_unary_expr) << resultType << Input.get()->getSourceRange());"}},
		[l]={
			["clang/test/Sema/vector-ops.c"]={"clang/test/Sema/vector-ops.c:13:10: error: invalid argument type \'v2f\' (vector of 2 \'float\' values) to unary expression"}
		}
	},
	["err_typecheck_vector_lengths_not_equal"]={
		[c]="err_typecheck_vector_lengths_not_equal",
		[d]="vector operands do not have the same number of elements (%0 and %1)",
		[e]="vector operands do not have the same number of elements (A and B)",
		[f]=j,
		[g]="vector operands do not have the same number of elements \\((.*?) and (.*?)\\)",
		[h]=a,
		[i]=m,
		[b]={"c65605d008dd",1423201495,"OpenCL: handle shift operator with vector operands","OpenCL: handle shift operator with vector operands\n\nIntroduce a number of checks:\n1. If LHS is a scalar, then RHS cannot be a vector.\n2. Operands must be of integer type.\n3. If both are vectors, then the number of elements must match.\n\nRelax the requirement for \"usual arithmetic conversions\":\nWhen LHS is a vector, a scalar RHS can simply be expanded into a\nvector; OpenCL does not require that its rank be lower than the LHS.\nFor example, the following code is not an error even if the implicit\ntype of the constant literal is \"int\".\n\n  char2 foo(char2 v) { return v << 1; }\n\nConsolidate existing tests under CodeGenOpenCL, and add more tests\nunder SemaOpenCL.\n\nllvm-svn: 228382"},
		[k]={{n,11239,"QualType Sema::CheckSizelessVectorOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign, ArithConvKind OperationKind) {\n  // ...\n  if (LHSType->isVLSTBuiltinType() && RHSType->isVLSTBuiltinType() && Context.getBuiltinVectorTypeInfo(LHSBuiltinTy).EC != Context.getBuiltinVectorTypeInfo(RHSBuiltinTy).EC) {\n    Diag(Loc, diag::err_typecheck_vector_lengths_not_equal) << LHSType << RHSType << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();"},{n,12149,"/// Return the resulting type when a vector is shifted\n///        by a scalar or vector shift amount.\nstatic QualType checkVectorShift(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign) {\n  // ...\n  if (!LHSVecTy) {\n  // ...\n  } else if (RHSVecTy) {\n    // OpenCL v1.1 s6.3.j says that for vector types, the operators\n    // are applied component-wise. So if RHS is a vector, then ensure\n    // that the number of elements is the same as LHS...\n    if (RHSVecTy->getNumElements() != LHSVecTy->getNumElements()) {\n      S.Diag(Loc, diag::err_typecheck_vector_lengths_not_equal) << LHS.get()->getType() << RHS.get()->getType() << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();"},{n,12323,"static QualType checkSizelessVectorShift(Sema &S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign) {\n  // ...\n  if (!LHSType->isVLSTBuiltinType()) {\n  // ...\n  } else if (RHSBuiltinTy && RHSBuiltinTy->isVLSTBuiltinType()) {\n    if (S.Context.getTypeSize(RHSBuiltinTy) != S.Context.getTypeSize(LHSBuiltinTy)) {\n      S.Diag(Loc, diag::err_typecheck_vector_lengths_not_equal) << LHSType << RHSType << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();"}},
		[l]={
			["clang/test/Sema/shift.c"]={"clang/test/Sema/shift.c:82:11: error: vector operands do not have the same number of elements (\'vec16\' (vector of 4 \'unsigned int\' values) and \'vec8\' (vector of 2 \'unsigned int\' values))"}
		}
	},
	["err_typecheck_vector_not_convertable"]={
		[c]="err_typecheck_vector_not_convertable",
		[d]="cannot convert between vector values of different size (%0 and %1)",
		[e]="cannot convert between vector values of different size (A and B)",
		[f]=j,
		[g]="cannot convert between vector values of different size \\((.*?) and (.*?)\\)",
		[h]=a,
		[i]=m,
		[b]={Pb,1236199783,Qb,Fb},
		[k]={{n,11109,"QualType Sema::CheckVectorOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign, bool AllowBothBool, bool AllowBoolConversions, bool AllowBoolOperation, bool ReportInvalid) {\n  // ...\n  unsigned DiagID = diag::err_typecheck_vector_not_convertable;"}},
		[l]={
			["clang/test/Sema/ext_vector_casts.c"]={"clang/test/Sema/ext_vector_casts.c:25:10: error: cannot convert between vector values of different size (\'float3\' (vector of 3 \'float\' values) and \'float2\' (vector of 2 \'float\' values))","clang/test/Sema/ext_vector_casts.c:26:10: error: cannot convert between vector values of different size (\'float4\' (vector of 4 \'float\' values) and \'float3\' (vector of 3 \'float\' values))","clang/test/Sema/ext_vector_casts.c:49:11: error: cannot convert between vector values of different size (\'int4\' (vector of 4 \'int\' values) and \'float4\' (vector of 4 \'float\' values))","clang/test/Sema/ext_vector_casts.c:107:11: error: cannot convert between vector values of different size (\'short8\' (vector of 8 \'short\' values) and \'float\')","clang/test/Sema/ext_vector_casts.c:111:11: error: cannot convert between vector values of different size (\'int4\' (vector of 4 \'int\' values) and \'double\')"}
		}
	},
	["err_typecheck_vector_not_convertable_implict_truncation"]={
		[c]={{nil,C,"err_typecheck_vector_not_convertable_implict_truncation"}},
		[d]={{nil,C,"cannot convert between %select{scalar|vector}0 type %1 and vector type %2 as implicit conversion would cause truncation"}},
		[e]={{nil,C,{"cannot convert between ",{"scalar","vector"}," type B and vector type C as implicit conversion would cause truncation"}}},
		[f]=j,
		[g]="cannot convert between (?:scalar|vector) type (.*?) and vector type (.*?) as implicit conversion would cause truncation",
		[h]=a,
		[i]={{nil,C,m}},
		[b]={"7cd5876e6031",1494616266,"[Sema] Support implicit scalar to vector conversions","[Sema] Support implicit scalar to vector conversions\n\nThis patch teaches clang to perform implicit scalar to vector conversions\nwhen one of the operands of a binary vector expression is a scalar which\ncan be converted to the element type of the vector without truncation\nfollowing GCC\'s implementation.\n\nIf the (constant) scalar is can be casted safely, it is implicitly casted to the\nvector elements type and splatted to produce a vector of the same type.\n\nContributions from: Petar Jovanovic\n\nReviewers: bruno, vkalintiris\n\nDifferential Revision: https://reviews.llvm.org/D25866\n\nllvm-svn: 302935"},
		[k]={{n,11194,"QualType Sema::CheckVectorOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign, bool AllowBothBool, bool AllowBoolConversions, bool AllowBoolOperation, bool ReportInvalid) {\n  // ...\n  // If there is a vector type that is not a ExtVector and a scalar, we reach\n  // this point if scalar could not be converted to the vector\'s element type\n  // without truncation.\n  if ((RHSVecType && !isa<ExtVectorType>(RHSVecType)) || (LHSVecType && !isa<ExtVectorType>(LHSVecType))) {\n    // ...\n    Diag(Loc, diag::err_typecheck_vector_not_convertable_implict_truncation) << ScalarOrVector << Scalar << Vector;"},{n,11272,"QualType Sema::CheckSizelessVectorOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign, ArithConvKind OperationKind) {\n  // ...\n  if (LHSType->isVLSTBuiltinType() || RHSType->isVLSTBuiltinType()) {\n    // ...\n    Diag(Loc, diag::err_typecheck_vector_not_convertable_implict_truncation) << ScalarOrVector << Scalar << Vector;"}},
		[l]={
			["clang/test/SemaCXX/vector-no-lax.cpp"]={"clang/test/SemaCXX/vector-no-lax.cpp:7:5: error: cannot convert between vector type \'vUInt32\' (vector of 4 \'unsigned int\' values) and vector type \'vSInt32\' (vector of 4 \'int\' values) as implicit conversion would cause truncation"}
		}
	},
	["err_typecheck_vector_not_convertable_non_scalar"]={
		[c]="err_typecheck_vector_not_convertable_non_scalar",
		[d]="cannot convert between vector and non-scalar values (%0 and %1)",
		[e]="cannot convert between vector and non-scalar values (A and B)",
		[f]=j,
		[g]="cannot convert between vector and non\\-scalar values \\((.*?) and (.*?)\\)",
		[h]=a,
		[i]=m,
		[b]={"d07dcdb9588b",1389081571,"For areVectorOperandsLaxBitCastable(), only return false if both opearands are vector types","For areVectorOperandsLaxBitCastable(), only return false if both opearands are vector types\nand add a diagnostic when the operand is a vector and non-scalar value.\n\nrdar://15722301\n\nllvm-svn: 198680"},
		[k]={{n,11147,"QualType Sema::CheckVectorOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign, bool AllowBothBool, bool AllowBoolConversions, bool AllowBoolOperation, bool ReportInvalid) {\n  // ...\n  // If there\'s a non-vector, non-real operand, diagnose that.\n  if ((!RHSVecType && !RHSType->isRealType()) || (!LHSVecType && !LHSType->isRealType())) {\n    Diag(Loc, diag::err_typecheck_vector_not_convertable_non_scalar) << LHSType << RHSType << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();"},{n,11227,"QualType Sema::CheckSizelessVectorOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign, ArithConvKind OperationKind) {\n  // ...\n  if ((!LHSType->isVLSTBuiltinType() && !LHSType->isRealType()) || (!RHSType->isVLSTBuiltinType() && !RHSType->isRealType())) {\n    Diag(Loc, diag::err_typecheck_vector_not_convertable_non_scalar) << LHSType << RHSType << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();"}},
		[l]={
			["clang/test/SemaCXX/vector-casts.cpp"]={"clang/test/SemaCXX/vector-casts.cpp:62:11: error: cannot convert between vector and non-scalar values (\'__v2si\' (vector of 2 \'int\' values) and \'testvec\')","clang/test/SemaCXX/vector-casts.cpp:65:11: error: cannot convert between vector and non-scalar values (\'__v2si\' (vector of 2 \'int\' values) and \'testvec\')"}
		}
	},
	["err_typecheck_wasm_table_must_have_zero_length"]={
		[c]="err_typecheck_wasm_table_must_have_zero_length",
		[d]="only zero-length WebAssembly tables are currently supported",
		[e]="only zero-length WebAssembly tables are currently supported",
		[f]=j,
		[g]="only zero\\-length WebAssembly tables are currently supported",
		[h]=a,
		[i]=z,
		[b]={mb,1625925174,lb,kb},
		[k]={{v,8671,"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 (!ATy || ATy->getSize().getSExtValue() != 0) {\n      Diag(NewVD->getLocation(), diag::err_typecheck_wasm_table_must_have_zero_length);"}},
		[l]={
			["clang/test/Sema/wasm-refs-and-tables.c"]={"clang/test/Sema/wasm-refs-and-tables.c:15:22: error: only zero-length WebAssembly tables are currently supported","clang/test/Sema/wasm-refs-and-tables.c:16:22: error: only zero-length WebAssembly tables are currently supported","clang/test/Sema/wasm-refs-and-tables.c:17:22: error: only zero-length WebAssembly tables are currently supported","clang/test/Sema/wasm-refs-and-tables.c:24:22: error: only zero-length WebAssembly tables are currently supported"}
		}
	},
	["err_typecheck_zero_array_size"]={
		[c]="err_typecheck_zero_array_size",
		[d]={{nil,A,"zero-length arrays are not permitted in %select{C++|SYCL device code}0"},{y,nil,"zero-length arrays are not permitted in C++"}},
		[e]={{nil,A,{"zero-length arrays are not permitted in ",{"C++","SYCL device code"}}},{y,nil,"zero-length arrays are not permitted in C++"}},
		[f]=j,
		[g]="zero\\-length arrays are not permitted in (?:C\\+\\+|SYCL device code)",
		[h]=a,
		[i]=m,
		[b]={"d5cb1ddb2cf4",1269744163,"After performing template argument deduction for a function template,","After performing template argument deduction for a function template,\ncheck deduced non-type template arguments and template template\narguments against the template parameters for which they were deduced,\nperforming conversions as appropriate so that deduced template\narguments get the same treatment as explicitly-specified template\narguments. This is the bulk of PR6723.\n\nAlso keep track of whether deduction of a non-type template argument\ncame from an array bound (vs. anywhere else). With this information,\nwe enforce C++ [temp.deduct.type]p17, which requires exact type\nmatches when deduction deduces a non-type template argument from\nsomething that is not an array bound.\n\nFinally, when in a SFINAE context, translate the \"zero sized\narrays are an extension\" extension diagnostic into a hard error (for\nbetter standard conformance), which was a minor part of PR6723.\n\nllvm-svn: 99734"},
		[k]={{"clang/lib/Sema/SemaSYCL.cpp",55,"void Sema::deepTypeCheckForSYCLDevice(SourceLocation UsedAt, llvm::DenseSet<QualType> Visited, ValueDecl *DeclToCheck) {\n  // ...\n  auto Check = [&](QualType TypeToCheck, const ValueDecl *D) {\n    // ...\n    if (isZeroSizedArray(*this, TypeToCheck)) {\n      SYCLDiagIfDeviceCode(UsedAt, diag::err_typecheck_zero_array_size) << 1;"},{B,2648,"/// 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 (!ArraySize) {\n  // ...\n  } else if (ArraySize->isTypeDependent() || ArraySize->isValueDependent()) {\n  // ...\n  } else {\n    // ...\n    if (!R.isUsable()) {\n    // ...\n    } else if (!T->isDependentType() && !T->isIncompleteType() && !T->isConstantSizeType()) {\n    // ...\n    } else {\n      // ...\n      if (ConstVal == 0 && !T.isWebAssemblyReferenceType()) {\n        // ...\n        Diag(ArraySize->getBeginLoc(), isSFINAEContext() ? diag::err_typecheck_zero_array_size : diag::ext_typecheck_zero_array_size) << 0 << ArraySize->getSourceRange();"}},
		[l]={
			["clang/test/SemaSYCL/zero-length-arrays.cpp"]={E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,E,"clang/test/SemaSYCL/zero-length-arrays.cpp:69:11: error: zero-length arrays are not permitted in SYCL device code","clang/test/SemaSYCL/zero-length-arrays.cpp:70:11: error: zero-length arrays are not permitted in SYCL device code","clang/test/SemaSYCL/zero-length-arrays.cpp:72:11: error: zero-length arrays are not permitted in SYCL device code","clang/test/SemaSYCL/zero-length-arrays.cpp:77:26: error: zero-length arrays are not permitted in SYCL device code","clang/test/SemaSYCL/zero-length-arrays.cpp:84:11: error: zero-length arrays are not permitted in SYCL device code","clang/test/SemaSYCL/zero-length-arrays.cpp:84:11: error: zero-length arrays are not permitted in SYCL device code","clang/test/SemaSYCL/zero-length-arrays.cpp:84:14: error: zero-length arrays are not permitted in SYCL device code","clang/test/SemaSYCL/zero-length-arrays.cpp:84:16: error: zero-length arrays are not permitted in SYCL device code","clang/test/SemaSYCL/zero-length-arrays.cpp:89:32: error: zero-length arrays are not permitted in SYCL device code","clang/test/SemaSYCL/zero-length-arrays.cpp:89:32: error: zero-length arrays are not permitted in SYCL device code","clang/test/SemaSYCL/zero-length-arrays.cpp:99:11: error: zero-length arrays are not permitted in SYCL device code","clang/test/SemaSYCL/zero-length-arrays.cpp:99:11: error: zero-length arrays are not permitted in SYCL device code","clang/test/SemaSYCL/zero-length-arrays.cpp:101:13: error: zero-length arrays are not permitted in SYCL device code","clang/test/SemaSYCL/zero-length-arrays.cpp:101:13: error: zero-length arrays are not permitted in SYCL device code","clang/test/SemaSYCL/zero-length-arrays.cpp:108:32: error: zero-length arrays are not permitted in SYCL device code","clang/test/SemaSYCL/zero-length-arrays.cpp:108:32: error: zero-length arrays are not permitted in SYCL device code","clang/test/SemaSYCL/zero-length-arrays.cpp:53:11: error: zero-length arrays are not permitted in SYCL device code","clang/test/SemaSYCL/zero-length-arrays.cpp:53:11: error: zero-length arrays are not permitted in SYCL device code","clang/test/SemaSYCL/zero-length-arrays.cpp:19:8: error: zero-length arrays are not permitted in SYCL device code","clang/test/SemaSYCL/zero-length-arrays.cpp:19:8: error: zero-length arrays are not permitted in SYCL device code"}
		}
	},
	["err_typedef_changes_linkage"]={
		[c]="err_typedef_changes_linkage",
		[d]={{nil,u,"unsupported: anonymous type given name for linkage purposes by %select{typedef|alias}0 declaration after its linkage was computed; add a tag name here to establish linkage prior to definition"},{t,nil,"unsupported: typedef changes linkage of anonymous type, but linkage was already computed"}},
		[e]={{nil,u,{"unsupported: anonymous type given name for linkage purposes by ",{"typedef","alias"}," declaration after its linkage was computed; add a tag name here to establish linkage prior to definition"}},{t,nil,"unsupported: typedef changes linkage of anonymous type, but linkage was already computed"}},
		[f]=j,
		[g]="unsupported\\: anonymous type given name for linkage purposes by (?:typedef|alias) declaration after its linkage was computed; add a tag name here to establish linkage prior to definition",
		[h]=a,
		[i]=m,
		[b]={"2575d8805927",1391044373,"Diagnose typedef names for linkage purposes that would change","Diagnose typedef names for linkage purposes that would change\na previously-computed linkage as an unsupportable error condition.\n\nPer discussion on cfe-commits, this appears to be a\ndifficult-to-resolve flaw in our implementation approach;\nwe may pursue this as a language defect, but for now it\'s\nbetter to diagnose it as unsupported than to produce\ninconsistent results (or assertions).  Anything that we can\ndo to limit how often this diagnostic fires, such as the\nchanges in r200380, is probably for the best, though.\n\nllvm-svn: 200438"},
		[k]={{v,5015,"void Sema::setTagNameForLinkagePurposes(TagDecl *TagFromDeclSpec, TypedefNameDecl *NewTD) {\n  // ...\n  if (NonCLike || ChangesLinkage) {\n    // ...\n    if (ChangesLinkage) {\n      // If the linkage changes, we can\'t accept this as an extension.\n      if (NonCLike.Kind == NonCLikeKind::None)\n        DiagID = diag::err_typedef_changes_linkage;"}},
		[l]={
			["clang/test/SemaCXX/anonymous-struct.cpp"]={"clang/test/SemaCXX/anonymous-struct.cpp:115:17: error: unsupported: anonymous type given name for linkage purposes by typedef declaration after its linkage was computed; add a tag name here to establish linkage prior to definition","clang/test/SemaCXX/anonymous-struct.cpp:131:17: error: unsupported: anonymous type given name for linkage purposes by typedef declaration after its linkage was computed; add a tag name here to establish linkage prior to definition"}
		}
	},
	["err_typedef_not_bitfield"]={
		[c]="err_typedef_not_bitfield",
		[d]="typedef member %0 cannot be a bit-field",
		[e]="typedef member A cannot be a bit-field",
		[f]=j,
		[g]="typedef member (.*?) cannot be a bit\\-field",
		[h]=a,
		[i]=m,
		[b]={q,1237025389,r,p},
		[k]={{Db,3630,"/// ActOnCXXMemberDeclarator - This is invoked when a C++ class member\n/// declarator is parsed. \'AS\' is the access specifier, \'BW\' specifies the\n/// bitfield width if there is one, \'InitExpr\' specifies the initializer if\n/// one has been parsed, and \'InitStyle\' is set if an in-class initializer is\n/// present (but parsing it has been deferred).\nNamedDecl *Sema::ActOnCXXMemberDeclarator(Scope *S, AccessSpecifier AS, Declarator &D, MultiTemplateParamsArg TemplateParameterLists, Expr *BW, const VirtSpecifiers &VS, InClassInitStyle InitStyle) {\n  // ...\n  if (isInstField) {\n  // ...\n  } else {\n    // ...\n    // Non-instance-fields can\'t have a bitfield.\n    if (BitWidth) {\n      if (Member->isInvalidDecl()) {\n      // ...\n      } else if (isa<VarDecl>(Member) || isa<VarTemplateDecl>(Member)) {\n      // ...\n      } else if (isa<TypedefDecl>(Member)) {\n        // ...\n        Diag(Loc, diag::err_typedef_not_bitfield) << Name << BitWidth->getSourceRange();"}},
		[l]={
			["clang/test/SemaCXX/class.cpp"]={"clang/test/SemaCXX/class.cpp:33:15: error: typedef member \'E\' cannot be a bit-field"}
		}
	},
	["err_typedef_not_identifier"]={
		[c]="err_typedef_not_identifier",
		[d]="typedef name must be an identifier",
		[e]="typedef name must be an identifier",
		[f]=j,
		[g]="typedef name must be an identifier",
		[h]=a,
		[i]=m,
		[b]={"d8f446f1b2db",1279003021,"Diagnose typedef of an operator name. Fixes PR7462","Diagnose typedef of an operator name. Fixes PR7462\n\nllvm-svn: 108233"},
		[k]={{v,6684,"NamedDecl *Sema::ActOnTypedefDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous) {\n  // ...\n  if (D.getName().getKind() != UnqualifiedIdKind::IK_Identifier) {\n    if (D.getName().getKind() == UnqualifiedIdKind::IK_DeductionGuideName)\n    // ...\n    else\n      Diag(D.getName().StartLocation, diag::err_typedef_not_identifier) << D.getName().getSourceRange();"}},
		[l]={
			["clang/test/SemaCXX/typedef-redecl.cpp"]={"clang/test/SemaCXX/typedef-redecl.cpp:54:15: error: typedef name must be an identifier"}
		}
	},
	["err_typename_identifiers_only"]={
		[c]="err_typename_identifiers_only",
		[d]="typename is allowed for identifiers only",
		[e]="typename is allowed for identifiers only",
		[f]=j,
		[g]="typename is allowed for identifiers only",
		[h]=a,
		[i]=I,
		[b]={"882a61a64035",1317047428,"Diagnose attempts to use \'using typename\' with a non-identifier name,","Diagnose attempts to use \'using typename\' with a non-identifier name,\nfrom Stepan Dyatkovskiy. Fixes PR10925.\n\nllvm-svn: 140528"},
		[k]={{Mb,830,"/// 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  while (true) {\n    // ...\n    if (InvalidDeclarator)\n    // ...\n    else {\n      // \"typename\" keyword is allowed for identifiers only,\n      // because it may be a type definition.\n      if (D.TypenameLoc.isValid() && D.Name.getKind() != UnqualifiedIdKind::IK_Identifier) {\n        Diag(D.Name.getSourceRange().getBegin(), diag::err_typename_identifiers_only) << FixItHint::CreateRemoval(SourceRange(D.TypenameLoc));"}},
		[l]={
			["clang/test/SemaTemplate/typename-specifier.cpp"]={"clang/test/SemaTemplate/typename-specifier.cpp:136:47: error: typename is allowed for identifiers only"}
		}
	},
	["err_typename_invalid_constexpr"]={
		[c]="err_typename_invalid_constexpr",
		[d]={{nil,t,"type name does not allow %select{<ERROR>|constexpr|consteval|constinit}0 specifier to be specified"},{D,D,"type name does not allow %select{constexpr|consteval}0 specifier to be specified"},{eb,nil,"type name does not allow constexpr specifier to be specified"}},
		[e]={{nil,t,{"type name does not allow ",{"constexpr","consteval","constinit"}," specifier to be specified"}},{D,D,{"type name does not allow ",{"constexpr","consteval"}," specifier to be specified"}},{eb,nil,"type name does not allow constexpr specifier to be specified"}},
		[f]=j,
		[g]="type name does not allow (?:constexpr|consteval|constinit) specifier to be specified",
		[h]=a,
		[i]=I,
		[b]={"c5b05520550a",1331538975,"Fix parsing of type-specifier-seq\'s. Types are syntactically allowed to be","Fix parsing of type-specifier-seq\'s. Types are syntactically allowed to be\ndefined here, but not semantically, so\n\n  new struct S {};\n\nis always ill-formed, even if there is a struct S in scope.\n\nWe also had a couple of bugs in ParseOptionalTypeSpecifier caused by it being\nunder-loved (due to it only being used in a few places) so merge it into\nParseDeclarationSpecifiers with a new DeclSpecContext. To avoid regressing, this\nrequired improving ParseDeclarationSpecifiers\' diagnostics in some cases. This\nalso required teaching ParseSpecifierQualifierList about constexpr... which\nincidentally fixes an issue where we\'d allow the constexpr specifier in other\nbad places.\n\nllvm-svn: 152549"},
		[k]={{rb,2688,"/// 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  // Issue diagnostic and remove constexpr specifier if present.\n  if (DS.hasConstexprSpecifier() && DSC != DeclSpecContext::DSC_condition) {\n    Diag(DS.getConstexprSpecLoc(), diag::err_typename_invalid_constexpr) << static_cast<int>(DS.getConstexprSpecifier());"}},
		[l]={
			[ic]={"clang/test/CXX/dcl.dcl/dcl.spec/dcl.typedef/p2-0x.cpp:20:13: error: type name does not allow constexpr specifier to be specified"}
		}
	},
	["err_typename_invalid_functionspec"]={
		[c]="err_typename_invalid_functionspec",
		[d]="type name does not allow function specifier to be specified",
		[e]="type name does not allow function specifier to be specified",
		[f]=j,
		[g]="type name does not allow function specifier to be specified",
		[h]=a,
		[i]=I,
		[b]={Pb,1236199783,Qb,Fb},
		[k]={{rb,2676,"/// 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  // Issue diagnostic and remove function specifier if present.\n  if (Specs & DeclSpec::PQ_FunctionSpecifier) {\n    if (DS.isInlineSpecified())\n      Diag(DS.getInlineSpecLoc(), diag::err_typename_invalid_functionspec);"},{rb,2678,"/// 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  // Issue diagnostic and remove function specifier if present.\n  if (Specs & DeclSpec::PQ_FunctionSpecifier) {\n    // ...\n    if (DS.isVirtualSpecified())\n      Diag(DS.getVirtualSpecLoc(), diag::err_typename_invalid_functionspec);"},{rb,2680,"/// 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  // Issue diagnostic and remove function specifier if present.\n  if (Specs & DeclSpec::PQ_FunctionSpecifier) {\n    // ...\n    if (DS.hasExplicitSpecifier())\n      Diag(DS.getExplicitSpecLoc(), diag::err_typename_invalid_functionspec);"},{rb,2682,"/// 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  // Issue diagnostic and remove function specifier if present.\n  if (Specs & DeclSpec::PQ_FunctionSpecifier) {\n    // ...\n    if (DS.isNoreturnSpecified())\n      Diag(DS.getNoreturnSpecLoc(), diag::err_typename_invalid_functionspec);"}},
		[l]={
			[ic]={"clang/test/CXX/dcl.dcl/dcl.spec/dcl.typedef/p2-0x.cpp:14:13: error: type name does not allow function specifier to be specified","clang/test/CXX/dcl.dcl/dcl.spec/dcl.typedef/p2-0x.cpp:15:13: error: type name does not allow function specifier to be specified","clang/test/CXX/dcl.dcl/dcl.spec/dcl.typedef/p2-0x.cpp:16:13: error: type name does not allow function specifier to be specified"}
		}
	},
	["err_typename_invalid_storageclass"]={
		[c]="err_typename_invalid_storageclass",
		[d]="type name does not allow storage class to be specified",
		[e]="type name does not allow storage class to be specified",
		[f]=j,
		[g]="type name does not allow storage class to be specified",
		[h]=a,
		[i]=I,
		[b]={Pb,1236199783,Qb,Fb},
		[k]={{rb,2666,"/// 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  // Issue diagnostic and remove storage class if present.\n  if (Specs & DeclSpec::PQ_StorageClassSpecifier) {\n    if (DS.getStorageClassSpecLoc().isValid())\n      Diag(DS.getStorageClassSpecLoc(), diag::err_typename_invalid_storageclass);"},{rb,2669,"/// 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  // Issue diagnostic and remove storage class if present.\n  if (Specs & DeclSpec::PQ_StorageClassSpecifier) {\n    if (DS.getStorageClassSpecLoc().isValid())\n    // ...\n    else\n      Diag(DS.getThreadStorageClassSpecLoc(), diag::err_typename_invalid_storageclass);"}},
		[l]={
			[ic]={"clang/test/CXX/dcl.dcl/dcl.spec/dcl.typedef/p2-0x.cpp:19:13: error: type name does not allow storage class to be specified"}
		}
	},
	["err_typename_missing"]={
		[c]="err_typename_missing",
		[d]="missing \'typename\' prior to dependent type name \'%0%1\'",
		[e]="missing \'typename\' prior to dependent type name \'AB\'",
		[f]=j,
		[g]="missing \'typename\' prior to dependent type name \'(.*?)(.*?)\'",
		[h]=a,
		[i]=m,
		[b]={"15e5602e5998",1255476442,"Improve diagnostics when the parser encounters a declarator with an","Improve diagnostics when the parser encounters a declarator with an\nunknown type name, e.g.,\n\n  foo::bar x;\n\nwhen \"bar\" does not refer to a type in \"foo\". \n\nWith this change, the parser now calls into the action to perform\ndiagnostics and can try to recover by substituting in an appropriate\ntype. For example, this allows us to easily diagnose some missing\n\"typename\" specifiers, which we now do:\n\n  test/SemaCXX/unknown-type-name.cpp:29:1: error: missing \'typename\'\n        prior to dependent type name \'A<T>::type\'\n  A<T>::type A<T>::f() { return type(); }\n  ^~~~~~~~~~\n  typename \n\nFixes PR3990.\n\nllvm-svn: 84053"},
		[k]={{v,819,"void Sema::DiagnoseUnknownTypeName(IdentifierInfo *&II, SourceLocation IILoc, Scope *S, CXXScopeSpec *SS, ParsedType &SuggestedType, bool IsTemplateName) {\n  // ...\n  if (!SS || (!SS->isSet() && !SS->isInvalid()))\n  // ...\n  else if (DeclContext *DC = computeDeclContext(*SS, false))\n  // ...\n  else if (SS->isValid() && SS->getScopeRep()->containsErrors()) {\n  // ...\n  } else if (isDependentScopeSpecifier(*SS)) {\n    unsigned DiagID = diag::err_typename_missing;"},{n,2878,"/// BuildQualifiedDeclarationNameExpr - Build a C++ qualified\n/// declaration name, generally during template instantiation.\n/// There\'s a large number of things which don\'t need to be done along\n/// this path.\nExprResult Sema::BuildQualifiedDeclarationNameExpr(CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo, bool IsAddressOfOperand, const Scope *S, TypeSourceInfo **RecoveryTSI) {\n  // ...\n  if (const TypeDecl *TD = R.getAsSingle<TypeDecl>()) {\n    // ...\n    unsigned DiagID = diag::err_typename_missing;"}},
		[l]={
			["clang/test/SemaCXX/PR11358.cpp"]={"clang/test/SemaCXX/PR11358.cpp:15:7: error: missing \'typename\' prior to dependent type name \'Container::iterator\'","clang/test/SemaCXX/PR11358.cpp:31:10: error: missing \'typename\' prior to dependent type name \'hash_map<KeyType, ValueType>::const_iterator\'","clang/test/SemaCXX/PR11358.cpp:47:7: error: missing \'typename\' prior to dependent type name \'Container::iterator\'"}
		}
	},
	["err_typename_missing_template"]={
		[c]={{nil,C,"err_typename_missing_template"}},
		[d]={{nil,C,"missing \'typename\' prior to dependent type template name \'%0%1\'"}},
		[e]={{nil,C,"missing \'typename\' prior to dependent type template name \'AB\'"}},
		[f]=j,
		[g]="missing \'typename\' prior to dependent type template name \'(.*?)(.*?)\'",
		[h]=a,
		[i]={{nil,C,m}},
		[b]={"62559bd7ce0c",1485984998,"Fix hole in our enforcement of rule requiring \'typename\' prior to a dependent","Fix hole in our enforcement of rule requiring \'typename\' prior to a dependent\nname. If the dependent name happened to end in a template-id (X<T>::Y<U>), we\nwould fail to notice that the \'typename\' keyword is missing when resolving it\nto a type.\n\nIt turns out that GCC has a similar bug. If this shows up in much real code, we\ncan easily downgrade this to an ExtWarn.\n\nllvm-svn: 293815"},
		[k]={{o,4153,"TypeResult Sema::ActOnTemplateIdType(Scope *S, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, TemplateTy TemplateD, IdentifierInfo *TemplateII, SourceLocation TemplateIILoc, SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgsIn, SourceLocation RAngleLoc, bool IsCtorOrDtorName, bool IsClassName, ImplicitTypenameContext AllowImplicitTypename) {\n  // ...\n  if (!IsCtorOrDtorName && !IsClassName && SS.isSet()) {\n    // ...\n    // C++ [temp.res]p3:\n    //   A qualified-id that refers to a type and in which the\n    //   nested-name-specifier depends on a template-parameter (14.6.2)\n    //   shall be prefixed by the keyword typename to indicate that the\n    //   qualified-id denotes a type, forming an\n    //   elaborated-type-specifier (7.1.5.3).\n    if (!LookupCtx && isDependentScopeSpecifier(SS)) {\n      // C++2a relaxes some of those restrictions in [temp.res]p5.\n      if (AllowImplicitTypename == ImplicitTypenameContext::Yes) {\n      // ...\n      } else\n        Diag(SS.getBeginLoc(), diag::err_typename_missing_template) << SS.getScopeRep() << TemplateII->getName();"}}
	},
	["err_typename_nested_not_found"]={
		[c]="err_typename_nested_not_found",
		[d]="no type named %0 in %1",
		[e]="no type named A in B",
		[f]=j,
		[g]="no type named (.*?) in (.*?)",
		[h]=a,
		[i]=m,
		[b]={"333489bba35d",1238195448,"Initial implementation of parsing, semantic analysis, and template","Initial implementation of parsing, semantic analysis, and template\ninstantiation for C++ typename-specifiers such as\n\n  typename T::type\n\nThe parsing of typename-specifiers is relatively easy thanks to\nannotation tokens. When we see the \"typename\", we parse the\ntypename-specifier and produce a typename annotation token. There are\nonly a few places where we need to handle this. We currently parse the\ntypename-specifier form that terminates in an identifier, but not the\nsimple-template-id form, e.g.,\n\n  typename T::template apply<U, V>\n\nParsing of nested-name-specifiers has a similar problem, since at this\npoint we don\'t have any representation of a class template\nspecialization whose template-name is unknown.\n\nSemantic analysis is only partially complete, with some support for\ntemplate instantiation that works for simple examples. \n\nllvm-svn: 67875"},
		[k]={{v,813,"void Sema::DiagnoseUnknownTypeName(IdentifierInfo *&II, SourceLocation IILoc, Scope *S, CXXScopeSpec *SS, ParsedType &SuggestedType, bool IsTemplateName) {\n  // ...\n  if (!SS || (!SS->isSet() && !SS->isInvalid()))\n  // ...\n  else if (DeclContext *DC = computeDeclContext(*SS, false))\n    Diag(IILoc, IsTemplateName ? diag::err_no_member_template : diag::err_typename_nested_not_found) << II << DC << SS->getRange();"},{o,11058,"/// 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;"}},
		[l]={
			["clang/test/SemaCXX/libstdcxx_atomic_ns_hack.cpp"]={"clang/test/SemaCXX/libstdcxx_atomic_ns_hack.cpp:32:6: error: no type named \'foobar\' in namespace \'std\'"}
		}
	},
	["err_typename_nested_not_found_enable_if"]={
		[c]="err_typename_nested_not_found_enable_if",
		[d]="no type named \'type\' in %0; \'enable_if\' cannot be used to disable this declaration",
		[e]="no type named \'type\' in A; \'enable_if\' cannot be used to disable this declaration",
		[f]=j,
		[g]="no type named \'type\' in (.*?); \'enable_if\' cannot be used to disable this declaration",
		[h]=a,
		[i]=m,
		[b]={"6f8d2c6c9c34",1336540620,"A little tweak to the SFINAE condition reporting. Don\'t say:","A little tweak to the SFINAE condition reporting. Don\'t say:\n\n  candidate template ignored: substitution failed [with T = int]: no type named \'type\' in \'std::enable_if<false, void>\'\n\nInstead, just say:\n\n  candidate template ignored: disabled by \'enable_if\' [with T = int]\n\n... and point at the enable_if condition which (we assume) failed.\n\nThis is applied to all cases where the user writes \'typename enable_if<...>::type\' (optionally prefixed with a nested name specifier), and \'enable_if<...>\' names a complete class type which does not have a member named \'type\', and this results in a candidate function being ignored in a SFINAE context. Thus it catches \'std::enable_if\', \'std::__1::enable_if\', \'boost::enable_if\' and \'llvm::enable_if\'.\n\nllvm-svn: 156463"},
		[k]={{db,11263,"/// Diagnose a failed template-argument deduction.\nstatic void DiagnoseBadDeduction(Sema &S, NamedDecl *Found, Decl *Templated, DeductionFailureInfo &DeductionFailure, unsigned NumArgs, bool TakingCandidateAddress) {\n  // ...\n  case Sema::TDK_SubstitutionFailure: {\n    // ...\n    if (PDiag && PDiag->second.getDiagID() == diag::err_typename_nested_not_found_enable_if) {"},{o,3941,"QualType Sema::CheckTemplateIdType(TemplateName Name, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs) {\n  // ...\n  if (TypeAliasTemplateDecl *AliasTemplate = dyn_cast<TypeAliasTemplateDecl>(Template)) {\n    // ...\n    if (CanonType.isNull()) {\n      // If this was enable_if and we failed to find the nested type\n      // within enable_if in a SFINAE context, dig out the specific\n      // enable_if condition that failed and present that instead.\n      if (isEnableIfAliasTemplate(AliasTemplate)) {\n        if (auto DeductionInfo = isSFINAEContext()) {\n          if (*DeductionInfo && (*DeductionInfo)->hasSFINAEDiagnostic() && (*DeductionInfo)->peekSFINAEDiagnostic().second.getDiagID() == diag::err_typename_nested_not_found_enable_if && TemplateArgs[0].getArgument().getKind() == TemplateArgument::Expression) {"},{o,11053,"/// 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    if (Ctx && isEnableIf(QualifierLoc, II, CondRange, Cond)) {\n      // ...\n      Diag(CondRange.getBegin(), diag::err_typename_nested_not_found_enable_if) << Ctx << CondRange;"}}
	},
	["err_typename_nested_not_found_requirement"]={
		[c]={{nil,C,"err_typename_nested_not_found_requirement"}},
		[d]={{nil,C,"failed requirement \'%0\'; \'enable_if\' cannot be used to disable this declaration"}},
		[e]={{nil,C,"failed requirement \'A\'; \'enable_if\' cannot be used to disable this declaration"}},
		[f]=j,
		[g]="failed requirement \'(.*?)\'; \'enable_if\' cannot be used to disable this declaration",
		[h]=a,
		[i]={{nil,C,m}},
		[b]={"00fa10b43f25",1499286014,"Customize the SFINAE diagnostics for enable_if to provide the failed condition.","Customize the SFINAE diagnostics for enable_if to provide the failed condition.\n\nWhen enable_if disables a particular overload resolution candidate,\nrummage through the enable_if condition to find the specific condition\nthat caused the failure. For example, if we have something like:\n\n    template<\n      typename Iter,\n      typename = std::enable_if_t<Random_access_iterator<Iter> &&\n                                  Comparable<Iterator_value_type<Iter>>>>\n    void mysort(Iter first, Iter last) {}\n\nand we call \"mysort\" with \"std::list<int>\" iterators, we\'ll get a\ndiagnostic saying that the \"Random_access_iterator<Iter>\" requirement\nfailed. If we call \"mysort\" with\n\"std::vector<something_not_comparable>\", we\'ll get a diagnostic saying\nthat the \"Comparable<...>\" requirement failed.\n\nllvm-svn: 307196"},
		[k]={{db,11273,"/// Diagnose a failed template-argument deduction.\nstatic void DiagnoseBadDeduction(Sema &S, NamedDecl *Found, Decl *Templated, DeductionFailureInfo &DeductionFailure, unsigned NumArgs, bool TakingCandidateAddress) {\n  // ...\n  case Sema::TDK_SubstitutionFailure: {\n    // ...\n    if (PDiag && PDiag->second.getDiagID() == diag::err_typename_nested_not_found_requirement) {"},{o,3958,"QualType Sema::CheckTemplateIdType(TemplateName Name, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs) {\n  // ...\n  if (TypeAliasTemplateDecl *AliasTemplate = dyn_cast<TypeAliasTemplateDecl>(Template)) {\n    // ...\n    if (CanonType.isNull()) {\n      // If this was enable_if and we failed to find the nested type\n      // within enable_if in a SFINAE context, dig out the specific\n      // enable_if condition that failed and present that instead.\n      if (isEnableIfAliasTemplate(AliasTemplate)) {\n        if (auto DeductionInfo = isSFINAEContext()) {\n          if (*DeductionInfo && (*DeductionInfo)->hasSFINAEDiagnostic() && (*DeductionInfo)->peekSFINAEDiagnostic().second.getDiagID() == diag::err_typename_nested_not_found_enable_if && TemplateArgs[0].getArgument().getKind() == TemplateArgument::Expression) {\n            // ...\n            (*DeductionInfo)->addSFINAEDiagnostic(OldDiag.first, PDiag(diag::err_typename_nested_not_found_requirement) << FailedDescription << FailedCond->getSourceRange());"},{o,11046,"/// 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    if (Ctx && isEnableIf(QualifierLoc, II, CondRange, Cond)) {\n      // If we have a condition, narrow it down to the specific failed\n      // condition.\n      if (Cond) {\n        // ...\n        Diag(FailedCond->getExprLoc(), diag::err_typename_nested_not_found_requirement) << FailedDescription << FailedCond->getSourceRange();"}},
		[l]={
			["clang/test/SemaCXX/attr-annotate.cpp"]={"clang/test/SemaCXX/attr-annotate.cpp:34:51: error: failed requirement \'!is_same<long, long>::value\'; \'enable_if\' cannot be used to disable this declaration"}
		}
	},
	["err_typename_nested_not_type"]={
		[c]="err_typename_nested_not_type",
		[d]="typename specifier refers to non-type member %0 in %1",
		[e]="typename specifier refers to non-type member A in B",
		[f]=j,
		[g]="typename specifier refers to non\\-type member (.*?) in (.*?)",
		[h]=a,
		[i]=m,
		[b]={"333489bba35d",1238195448,"Initial implementation of parsing, semantic analysis, and template","Initial implementation of parsing, semantic analysis, and template\ninstantiation for C++ typename-specifiers such as\n\n  typename T::type\n\nThe parsing of typename-specifiers is relatively easy thanks to\nannotation tokens. When we see the \"typename\", we parse the\ntypename-specifier and produce a typename annotation token. There are\nonly a few places where we need to handle this. We currently parse the\ntypename-specifier form that terminates in an identifier, but not the\nsimple-template-id form, e.g.,\n\n  typename T::template apply<U, V>\n\nParsing of nested-name-specifiers has a similar problem, since at this\npoint we don\'t have any representation of a class template\nspecialization whose template-name is unknown.\n\nSemantic analysis is only partially complete, with some support for\ntemplate instantiation that works for simple examples. \n\nllvm-svn: 67875"},
		[k]={{o,11145,"/// 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;"},{o,11151,"/// 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;"}},
		[l]={
			["clang/test/CXX/expr/expr.prim/expr.prim.req/type-requirement.cpp"]={"clang/test/CXX/expr/expr.prim/expr.prim.req/type-requirement.cpp:62:51: error: typename specifier refers to non-type member \'type\' in \'D\'"}
		}
	}
};