Module:ClangDiags/DiagsLongData12

From emmtrix Wiki
Jump to navigation Jump to search

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

local a="";
local b="id_hist";
local c="message_hist";
local d="source";
local e="hierarchical_hist";
local f="note\\: ";
local g="regex1";
local h="regex2";
local i="regex3";
local j="category_hist";
local k="commit";
local l="10.0";
local m="tests2";
local n="clang/lib/AST/ExprConstant.cpp";
local o="None";
local p="Semantic Issue";
local q="9.0";
local r="11.0";
local s="8.0";
local t="clang/lib/Sema/SemaDeclCXX.cpp";
local u="12.0";
local v="read of";
local w="clang/lib/Sema/SemaExprObjC.cpp";
local x="16.0";
local y="clang/lib/AST/Interp/Interp.cpp";
local z="clang/lib/Sema/SemaExpr.cpp";
local A="13.0";
local B="increment of";
local C="decrement of";
local D="assignment to";
local E="6.0";
local F="7.0";
local G="5.0";
local H="clang/lib/Sema/SemaOpenMP.cpp";
local I="15.0";
local J="typeid applied to";
local K="14.0";
local L="clang/lib/Driver/Driver.cpp";
local M="clang/lib/Sema/SemaDecl.cpp";
local N="For P0784R7: Add support for dynamic allocation with new / delete during\nconstant evaluation.\n\nllvm-svn: 373036";
local O="da1b4347e41a";
local P="For P0784R7: Add support for dynamic allocation with new / delete during";
local Q="clang/lib/Sema/SemaDeclAttr.cpp";
local R="member call on";
local S="dynamic_cast of";
local T="clang/test/CXX/expr/expr.const/p2-0x.cpp";
local U="clang/lib/Sema/SemaTemplateInstantiate.cpp";
local V="clang/lib/Sema/SemaCoroutine.cpp";
local W="clang/test/SemaCXX/constant-expression-cxx2a.cpp";
local X=" is not allowed in a constant expression";
local Y="destruction of";
local Z="clang/lib/Sema/SemaExprCXX.cpp";
local ab=" ";
local bb="5253d9138eb3";
local cb="[c++20] Determine whether a defaulted comparison should be deleted or";
local db="clang/test/SemaCXX/cxx2a-constexpr-dynalloc.cpp";
local eb="[c++20] Determine whether a defaulted comparison should be deleted or\nconstexpr.";
local fb="clang/lib/Sema/SemaObjCProperty.cpp";
local gb="clang/test/SemaCXX/constexpr-string.cpp";
local hb="clang/lib/Sema/SemaAvailability.cpp";
local ib="clang/lib/Sema/SemaStmt.cpp";
local jb="[Clang] Implement P2738R1 - constexpr cast from void*";
local kb="C++1y: support simple variable assignments in constexpr functions.\n\nllvm-svn: 180603";
local lb="C++1y: support simple variable assignments in constexpr functions.";
local mb="3da88fac5416";
local nb="f27afedc6c86";
local ob="[Clang] Implement P2738R1 - constexpr cast from void*\n\nReviewed By: #clang-language-wg, erichkeane\n\nDifferential Revision: https://reviews.llvm.org/D153702";
local pb="Documentation Issue";
local qb="clang/lib/Sema/SemaDeclObjC.cpp";
local rb="construction of";
local sb="default";
local tb="clang/lib/Sema/SemaChecking.cpp";
local ub="852265ff1c19";
local vb="clang/lib/Sema/SemaTemplate.cpp";
local wb="PR10217: Provide diagnostics explaining why an implicitly-deleted special\nmember function is deleted.\n\nllvm-svn: 153773";
local xb="PR10217: Provide diagnostics explaining why an implicitly-deleted special";
local yb="clang/test/SemaCXX/constant-expression-cxx11.cpp";
local zb="357362d00b04";
local Ab="Add checks and diagnostics for many of the cases which C++11 considers to not";
local Bb="Add checks and diagnostics for many of the cases which C++11 considers to not\nbe constant expressions.\n\nllvm-svn: 146479";
local Cb="temporary";
local Db="reference";
local Eb="clang/lib/AST/CommentSema.cpp";
local Fb="clang/test/CXX/class/class.compare/class.compare.default/p2.cpp:5:8: note: defaulted \'operator<=>\' is implicitly deleted because class \'A1\' has a reference member";
local Gb="clang/lib/Sema/SemaConcept.cpp";
local Hb="previous documentation";
local Ib="[clang] New __attribute__((__clang_arm_mve_alias)).\n\nThis allows you to declare a function with a name of your choice (say\n`foo`), but have clang treat it as if it were a builtin function (say\n`__builtin_foo`), by writing\n\n  static __inline__ __attribute__((__clang_arm_mve_alias(__builtin_foo)))\n  int foo(args);\n\nI\'m intending to use this for the ACLE intrinsics for MVE, which have\nto be polymorphic on their argument types and also need to be\nimplemented by builtins. To avoid having to implement the polymorphism\nwith several layers of nested _Generic and make error reporting\nhideous, I want to make all the user-facing intrinsics correspond\ndirectly to clang builtins, so that after clang resolves\n__attribute__((overloadable)) polymorphism it\'s already holding the\nright BuiltinID for the intrinsic it selected.\n\nHowever, this commit itself just introduces the new attribute, and\ndoesn\'t use it for anything.\n\nTo avoid unanticipated side effects if this attribute is used to make\naliases to other builtins, there\'s a restriction mechanism: only\n(BuiltinID, alias) pairs that are approved by the function\nArmMveAliasValid() will be permitted. At present, that function\ndoesn\'t permit anything, because the Tablegen that will generate its\nlist of valid pairs isn\'t yet implemented. So the only test of this\nfacility is one that checks that an unapproved builtin _can\'t_ be\naliased.\n\nReviewers: dmgreen, miyuki, ostannard\n\nSubscribers: cfe-commits\n\nTags: #clang\n\nDifferential Revision: https://reviews.llvm.org/D67159";
local Jb="Coroutines Issue";
local Kb="[clang] New __attribute__((__clang_arm_mve_alias)).";
local Lb="7c11da0cfd33";
local Mb="[clang] Add no_builtin attribute";
local Nb="[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";
local Ob="clang/test/Sema/nonnull.c:161:16: note: declared \'returns_nonnull\' here";
local Pb="clang/lib/Sema/SemaStmtAsm.cpp";
local Qb="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";
local Rb="ARC Casting Rules";
local Sb="31168b077c36";
local Tb="Automatic Reference Counting.";
local Ub="bd8791610948";
local Vb="clang/lib/Frontend/CompilerInvocation.cpp";
local Wb="memcpy";
local Xb="61d065e21ff3";
local Yb="Refine r251469 to give better (and more localizable) diagnostics";
local Zb="Refine r251469 to give better (and more localizable) diagnostics\nfor all the reasons that ARC makes things implicitly unavailable.\n\nllvm-svn: 251496";
local ac="clang/lib/Sema/SemaLookup.cpp";
local bc="Let clang atomic builtins fetch add/sub support floating point types";
local cc="clang/lib/Sema/SemaOverload.cpp";
local dc="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 ec="474177c05381";
local fc="ARC Restrictions";
local gc="c6af8c606dae";
local hc="[AST] Improve overflow diagnostics for fixed-point constant evaluation.\n\nSummary:\nDiagnostics for overflow were not being produced for fixed-point\nevaluation. This patch refactors a bit of the evaluator and adds\na proper diagnostic for these cases.\n\nReviewers: rjmccall, leonardchan, bjope\n\nSubscribers: cfe-commits\n\nTags: #clang\n\nDifferential Revision: https://reviews.llvm.org/D73188";
local ic="pointer";
local jc="[C++2a] Add __builtin_bit_cast, used to implement std::bit_cast";
local kc="memmove";
local lc="destructor";
local mc="eee944e7f9e6";
local nc="3dbcea8b957a";
local oc="clang/test/SemaCXX/constexpr-value-init.cpp:4:21: note: read of object outside its lifetime is not allowed in a constant expression";
local pc="[AST] Improve overflow diagnostics for fixed-point constant evaluation.";
local qc="member";
local rc="[C++2a] Add __builtin_bit_cast, used to implement std::bit_cast\n\nThis commit adds a new builtin, __builtin_bit_cast(T, v), which performs a\nbit_cast from a value v to a type T. This expression can be evaluated at\ncompile time under specific circumstances.\n\nThe compile time evaluation currently doesn\'t support bit-fields, but I\'m\nplanning on fixing this in a follow up (some of the logic for figuring this out\nis in CodeGen). I\'m also planning follow-ups for supporting some more esoteric\ntypes that the constexpr evaluator supports, as well as extending\n__builtin_memcpy constexpr evaluation to use the same infrastructure.\n\nrdar://44987528\n\nDifferential revision: https://reviews.llvm.org/D62825\n\nllvm-svn: 364954";
local sc="Reland [clang] Check unsupported types in expressions\n\nThis was committed as ec6c847179fd, but then reverted after a failure\nin: https://lab.llvm.org/buildbot/#/builders/84/builds/13983\n\nI was not able to reproduce the problem, but I added an extra check\nfor a NULL QualType just in case.\n\nOriginal comit message:\n\nThe patch adds missing diagnostics for cases like:\n\n  float F3 = ((__float128)F1 * (__float128)F2) / 2.0f;\n\nSema::checkDeviceDecl (renamed to checkTypeSupport) is changed to work\nwith a type without the corresponding ValueDecl. It is also refactored\nso that host diagnostics for unsupported types can be added here as\nwell.\n\nDifferential Revision: https://reviews.llvm.org/D109315";
local tc="Reland [clang] Check unsupported types in expressions";

return {
	["note_alias_mangled_name_alternative"]={
		[b]="note_alias_mangled_name_alternative",
		[c]="function by that name is mangled as \"%0\"",
		[e]="function by that name is mangled as \"A\"",
		[g]=f,
		[h]="function by that name is mangled as \"(.*?)\"",
		[i]=a,
		[j]=o,
		[k]={"ba6e747f9b05",1670524276,"[clang] Set ShowInSystemHeader for module-build and module-import remarks","[clang] Set ShowInSystemHeader for module-build and module-import remarks\n\nWithout this change, the use of `-Rmodule-build` and `-Rmodule-import` only\nproduces diagnostics for modules built or imported by non-system code.\n\nFor example, if a project source file requires the Foundation module to be\nbuilt, then `-Rmodule-build` will show a single diagnostic for Foundation, but\nnot in turn for any of Foundation\'s (direct or indirect) dependencies. This is\nbecause the locations of those transitive module builds are initiated from\nsystem headers, which are ignored by default. When wanting to observe module\nbuilding/importing, the system modules can represent a significant amount of\nmodule diagnostics, and I think should be shown by default when\n`-Rmodule-build` and `-Rmodule-import` are specified.\n\nI noticed some other remarks use `ShowInSystemHeader`.\n\nDifferential Revision: https://reviews.llvm.org/D139653"},
		[d]={{"clang/lib/CodeGen/CodeGenModule.cpp",586,"static bool checkAliasedGlobal(DiagnosticsEngine &Diags, SourceLocation Location, bool IsIFunc, const llvm::GlobalValue *Alias, const llvm::GlobalValue *&GV, const llvm::MapVector<GlobalDecl, StringRef> &MangledDeclNames, SourceRange AliasRange) {\n  // ...\n  if (GV->isDeclaration()) {\n    // ...\n    // Provide a note if the given function is not found and exists as a\n    // mangled name.\n    for (const auto &[Decl, Name] : MangledDeclNames) {\n      if (const auto *ND = dyn_cast<NamedDecl>(Decl.getDecl())) {\n        if (ND->getName() == GV->getName()) {\n          Diags.Report(Location, diag::note_alias_mangled_name_alternative) << Name << FixItHint::CreateReplacement(AliasRange, (Twine(IsIFunc ? \"ifunc\" : \"alias\") + \"(\\\"\" + Name + \"\\\")\").str());"}},
		[m]={
			["clang/test/CodeGen/attr-ifunc.cpp"]={"clang/test/CodeGen/attr-ifunc.cpp:5:30: note: function by that name is mangled as \"_Z8f1_ifuncv\"","clang/test/CodeGen/attr-ifunc.cpp:12:40: note: function by that name is mangled as \"_Z20f6_resolver_resolverv\"","clang/test/CodeGen/attr-ifunc.cpp:17:30: note: function by that name is mangled as \"_Z11f6_resolverv\""}
		}
	},
	["note_alias_requires_mangled_name"]={
		[b]="note_alias_requires_mangled_name",
		[c]="the %select{function or variable|function}0 specified in an %select{alias|ifunc}1 must refer to its mangled name",
		[e]={{nil,nil,{"the ",{"function or variable","function"}," specified in an ",{"alias","ifunc"}," must refer to its mangled name"}}},
		[g]=f,
		[h]="the (?:function or variable|function) specified in an (?:alias|ifunc) must refer to its mangled name",
		[i]=a,
		[j]=o,
		[k]={"ba6e747f9b05",1670524276,"[clang] Set ShowInSystemHeader for module-build and module-import remarks","[clang] Set ShowInSystemHeader for module-build and module-import remarks\n\nWithout this change, the use of `-Rmodule-build` and `-Rmodule-import` only\nproduces diagnostics for modules built or imported by non-system code.\n\nFor example, if a project source file requires the Foundation module to be\nbuilt, then `-Rmodule-build` will show a single diagnostic for Foundation, but\nnot in turn for any of Foundation\'s (direct or indirect) dependencies. This is\nbecause the locations of those transitive module builds are initiated from\nsystem headers, which are ignored by default. When wanting to observe module\nbuilding/importing, the system modules can represent a significant amount of\nmodule diagnostics, and I think should be shown by default when\n`-Rmodule-build` and `-Rmodule-import` are specified.\n\nI noticed some other remarks use `ShowInSystemHeader`.\n\nDifferential Revision: https://reviews.llvm.org/D139653"},
		[d]={{"clang/lib/CodeGen/CodeGenModule.cpp",579,"static bool checkAliasedGlobal(DiagnosticsEngine &Diags, SourceLocation Location, bool IsIFunc, const llvm::GlobalValue *Alias, const llvm::GlobalValue *&GV, const llvm::MapVector<GlobalDecl, StringRef> &MangledDeclNames, SourceRange AliasRange) {\n  // ...\n  if (GV->isDeclaration()) {\n    // ...\n    Diags.Report(Location, diag::note_alias_requires_mangled_name) << IsIFunc << IsIFunc;"}},
		[m]={
			["clang/test/Sema/attr-alias-elf.c"]={"clang/test/Sema/attr-alias-elf.c:7:30: note: the function or variable specified in an alias must refer to its mangled name","clang/test/Sema/attr-alias-elf.c:10:30: note: the function or variable specified in an alias must refer to its mangled name","clang/test/Sema/attr-alias-elf.c:49:30: note: the function or variable specified in an alias must refer to its mangled name","clang/test/Sema/attr-alias-elf.c:52:30: note: the function or variable specified in an alias must refer to its mangled name","clang/test/Sema/attr-alias-elf.c:56:30: note: the function or variable specified in an alias must refer to its mangled name"}
		}
	},
	["note_alignas_on_declaration"]={
		[b]="note_alignas_on_declaration",
		[c]="declared with %0 attribute here",
		[e]="declared with A attribute here",
		[g]=f,
		[h]="declared with (.*?) attribute here",
		[i]=a,
		[j]=p,
		[k]={"bc8caaf05f09",1361508939,"Implement C++11 [dcl.align]p6-p8, and C11 6.7.5/7. This had to be split out of","Implement C++11 [dcl.align]p6-p8, and C11 6.7.5/7. This had to be split out of\nthe normal attribute-merging path, because we can\'t merge alignment attributes\nwithout knowing the complete set of alignment attributes which apply to a\nparticular declaration.\n\nllvm-svn: 175861"},
		[d]={{M,2859,"/// Merge alignment attributes from \\p Old to \\p New, taking into account the\n/// special semantics of C11\'s _Alignas specifier and C++11\'s alignas attribute.\n///\n/// \\return \\c true if any attributes were added to \\p New.\nstatic bool mergeAlignedAttrs(Sema &S, NamedDecl *New, Decl *Old) {\n  // ...\n  if (OldAlignasAttr && !NewAlignasAttr && isAttributeTargetADefinition(New)) {\n    // ...\n    S.Diag(OldAlignasAttr->getLocation(), diag::note_alignas_on_declaration) << OldAlignasAttr;"},{M,3087,"/// checkNewAttributesAfterDef - If we already have a definition, check that\n/// there are no new attributes in this declaration.\nstatic void checkNewAttributesAfterDef(Sema &S, Decl *New, const Decl *Old) {\n  // ...\n  for (unsigned I = 0, E = NewAttributes.size(); I != E;) {\n    // ...\n    if (isa<C11NoReturnAttr>(NewAttribute)) {\n    // ...\n    } else if (isa<UuidAttr>(NewAttribute)) {\n    // ...\n    } else if (const AlignedAttr *AA = dyn_cast<AlignedAttr>(NewAttribute)) {\n      if (AA->isAlignas()) {\n        // ...\n        S.Diag(NewAttribute->getLocation(), diag::note_alignas_on_declaration) << AA;"}},
		[m]={
			["clang/test/CXX/dcl.dcl/dcl.attr/dcl.align/p6.cpp"]={"clang/test/CXX/dcl.dcl/dcl.attr/dcl.align/p6.cpp:19:1: note: declared with \'alignas\' attribute here","clang/test/CXX/dcl.dcl/dcl.attr/dcl.align/p6.cpp:24:1: note: declared with \'alignas\' attribute here","clang/test/CXX/dcl.dcl/dcl.attr/dcl.align/p6.cpp:28:1: note: declared with \'alignas\' attribute here","clang/test/CXX/dcl.dcl/dcl.attr/dcl.align/p6.cpp:31:8: note: declared with \'alignas\' attribute here","clang/test/CXX/dcl.dcl/dcl.attr/dcl.align/p6.cpp:44:8: note: declared with \'alignas\' attribute here"}
		}
	},
	["note_allocated_here"]={
		[b]="note_allocated_here",
		[c]="allocated with \'new%select{[]|}0\' here",
		[e]={{nil,nil,{"allocated with \'new",{"[]",a},"\' here"}}},
		[g]=f,
		[h]="allocated with \'new(?:\\[\\]|)\' here",
		[i]=a,
		[j]=p,
		[k]={"538ef53c139d",1431620097,"Detect uses of mismatching forms of \'new\' and \'delete\'","Detect uses of mismatching forms of \'new\' and \'delete\'\n\nEmit warning when operand to `delete` is allocated with `new[]` or\noperand to `delete[]` is allocated with `new`.\n\nReviewers: rtrieu, jordan_rose, rsmith\n\nSubscribers: majnemer, cfe-commits\n\nDifferential Revision: http://reviews.llvm.org/D4661\n\nllvm-svn: 237368"},
		[d]={{Z,3541,"static void DiagnoseMismatchedNewDelete(Sema &SemaRef, SourceLocation DeleteLoc, const MismatchingNewDeleteDetector &Detector) {\n  // ...\n  for (const auto *NE : Detector.NewExprs)\n    SemaRef.Diag(NE->getExprLoc(), diag::note_allocated_here) << Detector.IsArrayForm;"}},
		[m]={
			["clang/test/CodeGenCXX/default-arguments.cpp"]={"clang/test/CodeGenCXX/default-arguments.cpp:63:10: note: allocated with \'new[]\' here"}
		}
	},
	["note_also_found"]={
		[b]="note_also_found",
		[c]="also found",
		[e]="also found",
		[g]=f,
		[h]="also found",
		[i]=a,
		[j]=o,
		[k]={"e29c5cd2398c",1260474663,"Improve the diagnostic when a new declaration conflicts with a using shadow","Improve the diagnostic when a new declaration conflicts with a using shadow\ndeclaration.  Rename note_using_decl to note_using, which is possibly less confusing.\nAdd a test for non-class-scope using decl collisions and be sure to note the case\nwe can\'t diagnose yet.\n\nllvm-svn: 91057"},
		[d]={{qb,3645,"void Sema::DiagnoseMultipleMethodInGlobalPool(SmallVectorImpl<ObjCMethodDecl *> &Methods, Selector Sel, SourceRange R, bool receiverIdOrClass) {\n  // ...\n  if (issueDiagnostic) {\n    // ...\n    for (unsigned I = 1, N = Methods.size(); I != N; ++I) {\n      Diag(Methods[I]->getBeginLoc(), diag::note_also_found) << Methods[I]->getSourceRange();"}},
		[m]={
			["clang/test/SemaObjC/selector-overload.m"]={"clang/test/SemaObjC/selector-overload.m:22:1: note: also found","clang/test/SemaObjC/selector-overload.m:28:1: note: also found","clang/test/SemaObjC/selector-overload.m:34:1: note: also found","clang/test/SemaObjC/selector-overload.m:40:1: note: also found"}
		}
	},
	["note_ambig_member_ref_object_type"]={
		[b]="note_ambig_member_ref_object_type",
		[c]="lookup in the object type %0 refers here",
		[e]="lookup in the object type A refers here",
		[g]=f,
		[h]="lookup in the object type (.*?) refers here",
		[i]=a,
		[j]=p,
		[k]={"b7bfe794129f",1251932376,"Rewrite of our handling of name lookup in C++ member access expressions, e.g.,","Rewrite of our handling of name lookup in C++ member access expressions, e.g.,\n\n  x->Base::f\n\nWe no longer try to \"enter\" the context of the type that \"x\" points\nto. Instead, we drag that object type through the parser and pass it\ninto the Sema routines that need to know how to perform lookup within\nmember access expressions.\n\nWe now implement most of the crazy name lookup rules in C++\n[basic.lookup.classref] for non-templated code, including performing\nlookup both in the context of the type referred to by the member\naccess and in the scope of the member access itself and then detecting\nambiguities when the two lookups collide (p1 and p4; p3 and p7 are\nstill TODO). This change also corrects our handling of name lookup\nwithin template arguments of template-ids inside the\nnested-name-specifier (p6; we used to look into the scope of the\nobject expression for them) and fixes PR4703.\n\nI have disabled some tests that involve member access expressions\nwhere the object expression has dependent type, because we don\'t yet\nhave the ability to describe dependent nested-name-specifiers starting\nwith an identifier.\n\nllvm-svn: 80843"},
		[d]={{"clang/lib/Sema/SemaCXXScopeSpec.cpp",684,"/// Build a new nested-name-specifier for \"identifier::\", as described\n/// by ActOnCXXNestedNameSpecifier.\n///\n/// \\param S Scope in which the nested-name-specifier occurs.\n/// \\param IdInfo Parser information about an identifier in the\n///        nested-name-spec.\n/// \\param EnteringContext If true, enter the context specified by the\n///        nested-name-specifier.\n/// \\param SS Optional nested name specifier preceding the identifier.\n/// \\param ScopeLookupResult Provides the result of name lookup within the\n///        scope of the nested-name-specifier that was computed at template\n///        definition time.\n/// \\param ErrorRecoveryLookup Specifies if the method is called to improve\n///        error recovery and what kind of recovery is performed.\n/// \\param IsCorrectedToColon If not null, suggestion of replace \'::\' -> \':\'\n///        are allowed.  The bool value pointed by this parameter is set to\n///       \'true\' if the identifier is treated as if it was followed by \':\',\n///        not \'::\'.\n/// \\param OnlyNamespace If true, only considers namespaces in lookup.\n///\n/// This routine differs only slightly from ActOnCXXNestedNameSpecifier, in\n/// that it contains an extra parameter \\p ScopeLookupResult, which provides\n/// the result of name lookup within the scope of the nested-name-specifier\n/// that was computed at template definition time.\n///\n/// If ErrorRecoveryLookup is true, then this call is used to improve error\n/// recovery.  This means that it should not emit diagnostics, it should\n/// just return true on failure.  It also means it should only return a valid\n/// scope if it *knows* that the result is correct.  It should not return in a\n/// dependent context, for example. Nor will it extend \\p SS with the scope\n/// specifier.\nbool Sema::BuildCXXNestedNameSpecifier(Scope *S, NestedNameSpecInfo &IdInfo, bool EnteringContext, CXXScopeSpec &SS, NamedDecl *ScopeLookupResult, bool ErrorRecoveryLookup, bool *IsCorrectedToColon, bool OnlyNamespace) {\n  // ...\n  if (AcceptSpec) {\n    if (!ObjectType.isNull() && !ObjectTypeSearchedInScope && !getLangOpts().CPlusPlus11) {\n      // ...\n      if (isAcceptableNestedNameSpecifier(OuterDecl) && OuterDecl->getCanonicalDecl() != SD->getCanonicalDecl() && (!isa<TypeDecl>(OuterDecl) || !isa<TypeDecl>(SD) || !Context.hasSameType(Context.getTypeDeclType(cast<TypeDecl>(OuterDecl)), Context.getTypeDeclType(cast<TypeDecl>(SD))))) {\n        // ...\n        Diag(SD->getLocation(), diag::note_ambig_member_ref_object_type) << ObjectType;"},{vb,609,"bool Sema::LookupTemplateName(LookupResult &Found, Scope *S, CXXScopeSpec &SS, QualType ObjectType, bool EnteringContext, bool &MemberOfUnknownSpecialization, RequiredTemplateKind RequiredTemplate, AssumedTemplateKind *ATK, bool AllowTypoCorrection) {\n  // ...\n  if (S && !ObjectType.isNull() && !ObjectTypeSearchedInScope && !getLangOpts().CPlusPlus11) {\n    // ...\n    if (FoundOuter.empty()) {\n    // ...\n    } else if (FoundOuter.isAmbiguous() || !FoundOuter.isSingleResult() || !(OuterTemplate = getAsTemplateNameDecl(FoundOuter.getFoundDecl()))) {\n    // ...\n    } else if (!Found.isSuppressingDiagnostics()) {\n      //   - if the name found is a class template, it must refer to the same\n      //     entity as the one found in the class of the object expression,\n      //     otherwise the program is ill-formed.\n      if (!Found.isSingleResult() || getAsTemplateNameDecl(Found.getFoundDecl())->getCanonicalDecl() != OuterTemplate->getCanonicalDecl()) {\n        // ...\n        Diag(Found.getRepresentativeDecl()->getLocation(), diag::note_ambig_member_ref_object_type) << ObjectType;"}},
		[m]={
			["clang/test/SemaCXX/qual-id-test.cpp"]={"clang/test/SemaCXX/qual-id-test.cpp:9:16: note: lookup in the object type \'A::sub\' refers here"}
		}
	},
	["note_ambig_member_ref_scope"]={
		[b]="note_ambig_member_ref_scope",
		[c]="lookup from the current scope refers here",
		[e]="lookup from the current scope refers here",
		[g]=f,
		[h]="lookup from the current scope refers here",
		[i]=a,
		[j]=p,
		[k]={"b7bfe794129f",1251932376,"Rewrite of our handling of name lookup in C++ member access expressions, e.g.,","Rewrite of our handling of name lookup in C++ member access expressions, e.g.,\n\n  x->Base::f\n\nWe no longer try to \"enter\" the context of the type that \"x\" points\nto. Instead, we drag that object type through the parser and pass it\ninto the Sema routines that need to know how to perform lookup within\nmember access expressions.\n\nWe now implement most of the crazy name lookup rules in C++\n[basic.lookup.classref] for non-templated code, including performing\nlookup both in the context of the type referred to by the member\naccess and in the scope of the member access itself and then detecting\nambiguities when the two lookups collide (p1 and p4; p3 and p7 are\nstill TODO). This change also corrects our handling of name lookup\nwithin template arguments of template-ids inside the\nnested-name-specifier (p6; we used to look into the scope of the\nobject expression for them) and fixes PR4703.\n\nI have disabled some tests that involve member access expressions\nwhere the object expression has dependent type, because we don\'t yet\nhave the ability to describe dependent nested-name-specifiers starting\nwith an identifier.\n\nllvm-svn: 80843"},
		[d]={{"clang/lib/Sema/SemaCXXScopeSpec.cpp",686,"/// Build a new nested-name-specifier for \"identifier::\", as described\n/// by ActOnCXXNestedNameSpecifier.\n///\n/// \\param S Scope in which the nested-name-specifier occurs.\n/// \\param IdInfo Parser information about an identifier in the\n///        nested-name-spec.\n/// \\param EnteringContext If true, enter the context specified by the\n///        nested-name-specifier.\n/// \\param SS Optional nested name specifier preceding the identifier.\n/// \\param ScopeLookupResult Provides the result of name lookup within the\n///        scope of the nested-name-specifier that was computed at template\n///        definition time.\n/// \\param ErrorRecoveryLookup Specifies if the method is called to improve\n///        error recovery and what kind of recovery is performed.\n/// \\param IsCorrectedToColon If not null, suggestion of replace \'::\' -> \':\'\n///        are allowed.  The bool value pointed by this parameter is set to\n///       \'true\' if the identifier is treated as if it was followed by \':\',\n///        not \'::\'.\n/// \\param OnlyNamespace If true, only considers namespaces in lookup.\n///\n/// This routine differs only slightly from ActOnCXXNestedNameSpecifier, in\n/// that it contains an extra parameter \\p ScopeLookupResult, which provides\n/// the result of name lookup within the scope of the nested-name-specifier\n/// that was computed at template definition time.\n///\n/// If ErrorRecoveryLookup is true, then this call is used to improve error\n/// recovery.  This means that it should not emit diagnostics, it should\n/// just return true on failure.  It also means it should only return a valid\n/// scope if it *knows* that the result is correct.  It should not return in a\n/// dependent context, for example. Nor will it extend \\p SS with the scope\n/// specifier.\nbool Sema::BuildCXXNestedNameSpecifier(Scope *S, NestedNameSpecInfo &IdInfo, bool EnteringContext, CXXScopeSpec &SS, NamedDecl *ScopeLookupResult, bool ErrorRecoveryLookup, bool *IsCorrectedToColon, bool OnlyNamespace) {\n  // ...\n  if (AcceptSpec) {\n    if (!ObjectType.isNull() && !ObjectTypeSearchedInScope && !getLangOpts().CPlusPlus11) {\n      // ...\n      if (isAcceptableNestedNameSpecifier(OuterDecl) && OuterDecl->getCanonicalDecl() != SD->getCanonicalDecl() && (!isa<TypeDecl>(OuterDecl) || !isa<TypeDecl>(SD) || !Context.hasSameType(Context.getTypeDeclType(cast<TypeDecl>(OuterDecl)), Context.getTypeDeclType(cast<TypeDecl>(SD))))) {\n        // ...\n        Diag(OuterDecl->getLocation(), diag::note_ambig_member_ref_scope);"},{vb,612,"bool Sema::LookupTemplateName(LookupResult &Found, Scope *S, CXXScopeSpec &SS, QualType ObjectType, bool EnteringContext, bool &MemberOfUnknownSpecialization, RequiredTemplateKind RequiredTemplate, AssumedTemplateKind *ATK, bool AllowTypoCorrection) {\n  // ...\n  if (S && !ObjectType.isNull() && !ObjectTypeSearchedInScope && !getLangOpts().CPlusPlus11) {\n    // ...\n    if (FoundOuter.empty()) {\n    // ...\n    } else if (FoundOuter.isAmbiguous() || !FoundOuter.isSingleResult() || !(OuterTemplate = getAsTemplateNameDecl(FoundOuter.getFoundDecl()))) {\n    // ...\n    } else if (!Found.isSuppressingDiagnostics()) {\n      //   - if the name found is a class template, it must refer to the same\n      //     entity as the one found in the class of the object expression,\n      //     otherwise the program is ill-formed.\n      if (!Found.isSingleResult() || getAsTemplateNameDecl(Found.getFoundDecl())->getCanonicalDecl() != OuterTemplate->getCanonicalDecl()) {\n        // ...\n        Diag(FoundOuter.getFoundDecl()->getLocation(), diag::note_ambig_member_ref_scope);"}},
		[m]={
			["clang/test/SemaCXX/qual-id-test.cpp"]={"clang/test/SemaCXX/qual-id-test.cpp:94:25: note: lookup from the current scope refers here"}
		}
	},
	["note_ambiguous_atomic_constraints"]={
		[b]={{nil,l,"note_ambiguous_atomic_constraints"}},
		[c]={{nil,l,"similar constraint expressions not considered equivalent; constraint expressions cannot be considered equivalent unless they originate from the same concept"}},
		[e]={{nil,l,"similar constraint expressions not considered equivalent; constraint expressions cannot be considered equivalent unless they originate from the same concept"}},
		[g]=f,
		[h]="similar constraint expressions not considered equivalent; constraint expressions cannot be considered equivalent unless they originate from the same concept",
		[i]=a,
		[j]={{nil,l,p}},
		[k]={"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"},
		[d]={{Gb,1579,"bool Sema::MaybeEmitAmbiguousAtomicConstraintsDiagnostic(NamedDecl *D1, ArrayRef<const Expr *> AC1, NamedDecl *D2, ArrayRef<const Expr *> AC2) {\n  // ...\n  Diag(AmbiguousAtomic1->getBeginLoc(), diag::note_ambiguous_atomic_constraints) << AmbiguousAtomic1->getSourceRange();"}},
		[m]={
			["clang/test/CXX/temp/temp.constr/temp.constr.order/var-template-partial-specializations.cpp"]={"clang/test/CXX/temp/temp.constr/temp.constr.order/var-template-partial-specializations.cpp:3:32: note: similar constraint expressions not considered equivalent; constraint expressions cannot be considered equivalent unless they originate from the same concept"}
		}
	},
	["note_ambiguous_atomic_constraints_similar_expression"]={
		[b]={{nil,l,"note_ambiguous_atomic_constraints_similar_expression"}},
		[c]={{nil,l,"similar constraint expression here"}},
		[e]={{nil,l,"similar constraint expression here"}},
		[g]=f,
		[h]="similar constraint expression here",
		[i]=a,
		[j]={{nil,l,p}},
		[k]={"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"},
		[d]={{Gb,1,"bool Sema::MaybeEmitAmbiguousAtomicConstraintsDiagnostic(NamedDecl *D1, ArrayRef<const Expr *> AC1, NamedDecl *D2, ArrayRef<const Expr *> AC2) {\n  // ...\n  Diag(AmbiguousAtomic2->getBeginLoc(), diag::note_ambiguous_atomic_constraints_similar_expression) << AmbiguousAtomic2->getSourceRange();"}},
		[m]={
			["clang/test/CXX/temp/temp.constr/temp.constr.order/var-template-partial-specializations.cpp"]={"clang/test/CXX/temp/temp.constr/temp.constr.order/var-template-partial-specializations.cpp:7:32: note: similar constraint expression here"}
		}
	},
	["note_ambiguous_candidate"]={
		[b]="note_ambiguous_candidate",
		[c]="candidate found by name lookup is %q0",
		[e]="candidate found by name lookup is A",
		[g]=f,
		[h]="candidate found by name lookup is (.*?)",
		[i]=a,
		[j]=p,
		[k]={"5a8987ca5113",1237025389,"Update tablegen diagnostic files to be in sync with the def files.","Update tablegen diagnostic files to be in sync with the def files.\n\nllvm-svn: 67004"},
		[d]={{ac,2866,"/// Produce a diagnostic describing the ambiguity that resulted\n/// from name lookup.\n///\n/// \\param Result The result of the ambiguous lookup to be diagnosed.\nvoid Sema::DiagnoseAmbiguousLookup(LookupResult &Result) {\n  // ...\n  case LookupResult::AmbiguousReference: {\n    // ...\n    for (auto *D : Result)\n      Diag(D->getLocation(), diag::note_ambiguous_candidate) << D;"}},
		[m]={
			["clang/test/CXX/basic/basic.lookup/basic.lookup.qual/namespace.qual/p5.cpp"]={"clang/test/CXX/basic/basic.lookup/basic.lookup.qual/namespace.qual/p5.cpp:14:10: note: candidate found by name lookup is \'B::x\'","clang/test/CXX/basic/basic.lookup/basic.lookup.qual/namespace.qual/p5.cpp:4:10: note: candidate found by name lookup is \'A::x\'","clang/test/CXX/basic/basic.lookup/basic.lookup.qual/namespace.qual/p5.cpp:15:9: note: candidate found by name lookup is \'B::x\'","clang/test/CXX/basic/basic.lookup/basic.lookup.qual/namespace.qual/p5.cpp:5:7: note: candidate found by name lookup is \'A::x\'"}
		}
	},
	["note_ambiguous_inherited_constructor_using"]={
		[b]="note_ambiguous_inherited_constructor_using",
		[c]="inherited from base class %0 here",
		[e]="inherited from base class A here",
		[g]=f,
		[h]="inherited from base class (.*?) here",
		[i]=a,
		[j]=p,
		[k]={"5179eb78210a",1467140637,"P0136R1, DR1573, DR1645, DR1715, DR1736, DR1903, DR1941, DR1959, DR1991:","P0136R1, DR1573, DR1645, DR1715, DR1736, DR1903, DR1941, DR1959, DR1991:\n\nReplace inheriting constructors implementation with new approach, voted into\nC++ last year as a DR against C++11.\n\nInstead of synthesizing a set of derived class constructors for each inherited\nbase class constructor, we make the constructors of the base class visible to\nconstructor lookup in the derived class, using the normal rules for\nusing-declarations.\n\nFor constructors, UsingShadowDecl now has a ConstructorUsingShadowDecl derived\nclass that tracks the requisite additional information. We create shadow\nconstructors (not found by name lookup) in the derived class to model the\nactual initialization, and have a new expression node,\nCXXInheritedCtorInitExpr, to model the initialization of a base class from such\na constructor. (This initialization is special because it performs real perfect\nforwarding of arguments.)\n\nIn cases where argument forwarding is not possible (for inalloca calls,\nvariadic calls, and calls with callee parameter cleanup), the shadow inheriting\nconstructor is not emitted and instead we directly emit the initialization code\ninto the caller of the inherited constructor.\n\nNote that this new model is not perfectly compatible with the old model in some\ncorner cases. In particular:\n * if B inherits a private constructor from A, and C uses that constructor to\n   construct a B, then we previously required that A befriends B and B\n   befriends C, but the new rules require A to befriend C directly, and\n * if a derived class has its own constructors (and so its implicit default\n   constructor is suppressed), it may still inherit a default constructor from\n   a base class\n\nllvm-svn: 274049"},
		[d]={{t,7305,"class Sema::InheritedConstructorInfo {\n  // ...\n  InheritedConstructorInfo(Sema &S, SourceLocation UseLoc, ConstructorUsingShadowDecl *Shadow) : S(S), UseLoc(UseLoc) {\n    // ...\n    // Find the set of such base class subobjects and check that there\'s a\n    // unique constructed subobject.\n    for (auto *D : Shadow->redecls()) {\n      // ...\n      // [class.inhctor.init]p2:\n      //   If the constructor was inherited from multiple base class subobjects\n      //   of type B, the program is ill-formed.\n      if (!ConstructedBase) {\n      // ...\n      } else if (ConstructedBase != DConstructedBase && !Shadow->isInvalidDecl()) {\n        if (!DiagnosedMultipleConstructedBases) {\n          // ...\n          S.Diag(ConstructedBaseIntroducer->getLocation(), diag::note_ambiguous_inherited_constructor_using) << ConstructedBase;"},{t,7310,"class Sema::InheritedConstructorInfo {\n  // ...\n  InheritedConstructorInfo(Sema &S, SourceLocation UseLoc, ConstructorUsingShadowDecl *Shadow) : S(S), UseLoc(UseLoc) {\n    // ...\n    // Find the set of such base class subobjects and check that there\'s a\n    // unique constructed subobject.\n    for (auto *D : Shadow->redecls()) {\n      // ...\n      // [class.inhctor.init]p2:\n      //   If the constructor was inherited from multiple base class subobjects\n      //   of type B, the program is ill-formed.\n      if (!ConstructedBase) {\n      // ...\n      } else if (ConstructedBase != DConstructedBase && !Shadow->isInvalidDecl()) {\n        // ...\n        S.Diag(D->getIntroducer()->getLocation(), diag::note_ambiguous_inherited_constructor_using) << DConstructedBase;"}},
		[m]={
			["clang/test/CXX/special/class.init/class.inhctor.init/p2.cpp"]={"clang/test/CXX/special/class.init/class.inhctor.init/p2.cpp:12:15: note: inherited from base class \'C2\' here","clang/test/CXX/special/class.init/class.inhctor.init/p2.cpp:11:15: note: inherited from base class \'C1\' here"}
		}
	},
	["note_ambiguous_member_found"]={
		[b]="note_ambiguous_member_found",
		[c]="member found by ambiguous name lookup",
		[e]="member found by ambiguous name lookup",
		[g]=f,
		[h]="member found by ambiguous name lookup",
		[i]=a,
		[j]=p,
		[k]={"5a8987ca5113",1237025389,"Update tablegen diagnostic files to be in sync with the def files.","Update tablegen diagnostic files to be in sync with the def files.\n\nllvm-svn: 67004"},
		[d]={{ac,2807,"/// Produce a diagnostic describing the ambiguity that resulted\n/// from name lookup.\n///\n/// \\param Result The result of the ambiguous lookup to be diagnosed.\nvoid Sema::DiagnoseAmbiguousLookup(LookupResult &Result) {\n  // ...\n  case LookupResult::AmbiguousBaseSubobjects: {\n    // ...\n    Diag((*Found)->getLocation(), diag::note_ambiguous_member_found);"},{ac,2831,"/// Produce a diagnostic describing the ambiguity that resulted\n/// from name lookup.\n///\n/// \\param Result The result of the ambiguous lookup to be diagnosed.\nvoid Sema::DiagnoseAmbiguousLookup(LookupResult &Result) {\n  // ...\n  case LookupResult::AmbiguousBaseSubobjectTypes: {\n    // ...\n    for (CXXBasePaths::paths_iterator Path = Paths->begin(), PathEnd = Paths->end(); Path != PathEnd; ++Path) {\n      // ...\n      if (DeclsPrinted.insert(D).second) {\n        if (const auto *TD = dyn_cast<TypedefNameDecl>(D->getUnderlyingDecl()))\n        // ...\n        else if (const auto *TD = dyn_cast<TypeDecl>(D->getUnderlyingDecl()))\n        // ...\n        else\n          Diag(D->getLocation(), diag::note_ambiguous_member_found);"}},
		[m]={
			["clang/test/SemaCXX/lookup-member.cpp"]={"clang/test/SemaCXX/lookup-member.cpp:30:30: note: member found by ambiguous name lookup","clang/test/SemaCXX/lookup-member.cpp:36:30: note: member found by ambiguous name lookup"}
		}
	},
	["note_ambiguous_member_type_found"]={
		[b]={{nil,u,"note_ambiguous_member_type_found"}},
		[c]={{nil,u,"member type %0 found by ambiguous name lookup"}},
		[e]={{nil,u,"member type A found by ambiguous name lookup"}},
		[g]=f,
		[h]="member type (.*?) found by ambiguous name lookup",
		[i]=a,
		[j]={{nil,u,p}},
		[k]={Xb,1590001902,bc,dc},
		[d]={{ac,2825,"/// Produce a diagnostic describing the ambiguity that resulted\n/// from name lookup.\n///\n/// \\param Result The result of the ambiguous lookup to be diagnosed.\nvoid Sema::DiagnoseAmbiguousLookup(LookupResult &Result) {\n  // ...\n  case LookupResult::AmbiguousBaseSubobjectTypes: {\n    // ...\n    for (CXXBasePaths::paths_iterator Path = Paths->begin(), PathEnd = Paths->end(); Path != PathEnd; ++Path) {\n      // ...\n      if (DeclsPrinted.insert(D).second) {\n        if (const auto *TD = dyn_cast<TypedefNameDecl>(D->getUnderlyingDecl()))\n          Diag(D->getLocation(), diag::note_ambiguous_member_type_found) << TD->getUnderlyingType();"},{ac,2828,"/// Produce a diagnostic describing the ambiguity that resulted\n/// from name lookup.\n///\n/// \\param Result The result of the ambiguous lookup to be diagnosed.\nvoid Sema::DiagnoseAmbiguousLookup(LookupResult &Result) {\n  // ...\n  case LookupResult::AmbiguousBaseSubobjectTypes: {\n    // ...\n    for (CXXBasePaths::paths_iterator Path = Paths->begin(), PathEnd = Paths->end(); Path != PathEnd; ++Path) {\n      // ...\n      if (DeclsPrinted.insert(D).second) {\n        if (const auto *TD = dyn_cast<TypedefNameDecl>(D->getUnderlyingDecl()))\n        // ...\n        else if (const auto *TD = dyn_cast<TypeDecl>(D->getUnderlyingDecl()))\n          Diag(D->getLocation(), diag::note_ambiguous_member_type_found) << Context.getTypeDeclType(TD);"}},
		[m]={
			["clang/test/SemaCXX/member-name-lookup.cpp"]={"clang/test/SemaCXX/member-name-lookup.cpp:23:8: note: member type \'B::E3\' found by ambiguous name lookup","clang/test/SemaCXX/member-name-lookup.cpp:30:8: note: member type \'C::E3\' found by ambiguous name lookup","clang/test/SemaCXX/member-name-lookup.cpp:23:8: note: member type \'B::E3\' found by ambiguous name lookup","clang/test/SemaCXX/member-name-lookup.cpp:30:8: note: member type \'C::E3\' found by ambiguous name lookup","clang/test/SemaCXX/member-name-lookup.cpp:74:8: note: member type \'B2::E3\' found by ambiguous name lookup","clang/test/SemaCXX/member-name-lookup.cpp:81:8: note: member type \'C2::E3\' found by ambiguous name lookup","clang/test/SemaCXX/member-name-lookup.cpp:74:8: note: member type \'B2::E3\' found by ambiguous name lookup","clang/test/SemaCXX/member-name-lookup.cpp:81:8: note: member type \'C2::E3\' found by ambiguous name lookup","clang/test/SemaCXX/member-name-lookup.cpp:135:10: note: member type \'HasMemberType1::type\' found by ambiguous name lookup","clang/test/SemaCXX/member-name-lookup.cpp:139:10: note: member type \'HasMemberType2::type\' found by ambiguous name lookup"}
		}
	},
	["note_ambiguous_type_conversion"]={
		[b]="note_ambiguous_type_conversion",
		[c]="because of ambiguity in conversion %diff{of $ to $|between types}0,1",
		[e]={{nil,nil,{"because of ambiguity in conversion ",{"of A to B","between types"}}}},
		[g]=f,
		[h]="because of ambiguity in conversion (?:of (.*?) to (.*?)|between types)",
		[i]=a,
		[j]=p,
		[k]={"574de2c5a4f0",1255369879,"If built-in operators could not be selected because of ambiguity in","If built-in operators could not be selected because of ambiguity in\nuser-defined type conversions, issue list of ambiguites in addition \nto the diagnostic. So, clang now issues the following:\n\nb.cpp:19:19: error: left hand operand to ->* must be a pointer to class compatible with the right hand operand, but is \'struct C1\'\n        int i = c1->*pmf;\n                ~~^\nb.cpp:19:19: note: because of ambiguity in conversion of \'struct C1\' to \'struct E *\'\nb.cpp:5:5: note: candidate function\n    operator E*();\n    ^\nb.cpp:11:5: note: candidate function\n    operator E*();\n    ^\n\nllvm-svn: 83862"},
		[d]={{cc,11697,"static void NoteAmbiguousUserConversions(Sema &S, SourceLocation OpLoc, OverloadCandidate *Cand) {\n  for (const ImplicitConversionSequence &ICS : Cand->Conversions) {\n    // ...\n    ICS.DiagnoseAmbiguousConversion(S, OpLoc, S.PDiag(diag::note_ambiguous_type_conversion));"}},
		[m]={
			["clang/test/SemaCXX/builtin-ptrtomember-overload-1.cpp"]={"clang/test/SemaCXX/builtin-ptrtomember-overload-1.cpp:43:19: note: because of ambiguity in conversion of \'C1\' to \'E *\'"}
		}
	},
	["note_anonymous_namespace"]={
		[b]={{nil,q,"note_anonymous_namespace"}},
		[c]={{nil,q,"anonymous namespace begins here"}},
		[e]={{nil,q,"anonymous namespace begins here"}},
		[g]=f,
		[h]="anonymous namespace begins here",
		[i]=a,
		[j]={{nil,q,"Modules Issue"}},
		[k]={"e181de7f4fe9",1555973411,"[c++2a] Implement semantic restrictions for \'export\' declarations.","[c++2a] Implement semantic restrictions for \'export\' declarations.\n\nllvm-svn: 358932"},
		[d]={{"clang/lib/Sema/SemaModule.cpp",790,"/// We have parsed the start of an export declaration, including the \'{\'\n/// (if present).\nDecl *Sema::ActOnStartExportDecl(Scope *S, SourceLocation ExportLoc, SourceLocation LBraceLoc) {\n  // ...\n  for (const DeclContext *DC = CurContext; DC; DC = DC->getLexicalParent()) {\n    if (const auto *ND = dyn_cast<NamespaceDecl>(DC)) {\n      //   An export-declaration shall not appear directly or indirectly within\n      //   an unnamed namespace [...]\n      if (ND->isAnonymousNamespace()) {\n        // ...\n        Diag(ND->getLocation(), diag::note_anonymous_namespace);"}},
		[m]={
			["clang/test/CXX/module/module.interface/p3.cpp"]={"clang/test/CXX/module/module.interface/p3.cpp:50:11: note: anonymous namespace begins here"}
		}
	},
	["note_arc_bridge"]={
		[b]="note_arc_bridge",
		[c]="use __bridge to convert directly (no change in ownership)",
		[e]="use __bridge to convert directly (no change in ownership)",
		[g]=f,
		[h]="use __bridge to convert directly \\(no change in ownership\\)",
		[i]=a,
		[j]=Rb,
		[k]={Sb,1308178962,Tb,Qb},
		[d]={{w,3933,"static void diagnoseObjCARCConversion(Sema &S, SourceRange castRange, QualType castType, ARCConversionTypeClass castACTC, Expr *castExpr, Expr *realCast, ARCConversionTypeClass exprACTC, Sema::CheckedConversionKind CCK) {\n  // ...\n  // Bridge from an ARC type to a CF type.\n  if (castACTC == ACTC_retainable && isAnyRetainable(exprACTC)) {\n    // ...\n    if (CreateRule != ACC_plusOne) {\n      auto DiagB = (CCK != Sema::CCK_OtherCast) ? S.Diag(noteLoc, diag::note_arc_bridge) : S.Diag(noteLoc, diag::note_arc_cstyle_bridge);"},{w,3974,"static void diagnoseObjCARCConversion(Sema &S, SourceRange castRange, QualType castType, ARCConversionTypeClass castACTC, Expr *castExpr, Expr *realCast, ARCConversionTypeClass exprACTC, Sema::CheckedConversionKind CCK) {\n  // ...\n  // Bridge from a CF type to an ARC type.\n  if (exprACTC == ACTC_retainable && isAnyRetainable(castACTC)) {\n    // ...\n    if (CreateRule != ACC_plusOne) {\n      auto DiagB = (CCK != Sema::CCK_OtherCast) ? S.Diag(noteLoc, diag::note_arc_bridge) : S.Diag(noteLoc, diag::note_arc_cstyle_bridge);"},{w,4672,"ExprResult Sema::BuildObjCBridgedCast(SourceLocation LParenLoc, ObjCBridgeCastKind Kind, SourceLocation BridgeKeywordLoc, TypeSourceInfo *TSInfo, Expr *SubExpr) {\n  // ...\n  if (T->isDependentType() || SubExpr->isTypeDependent()) {\n  // ...\n  } else if (T->isObjCARCBridgableType() && FromType->isCARCBridgableType()) {\n    // ...\n    case OBC_BridgeRetained: {\n      // ...\n      Diag(BridgeKeywordLoc, diag::note_arc_bridge) << FixItHint::CreateReplacement(BridgeKeywordLoc, \"__bridge\");"},{w,4716,"ExprResult Sema::BuildObjCBridgedCast(SourceLocation LParenLoc, ObjCBridgeCastKind Kind, SourceLocation BridgeKeywordLoc, TypeSourceInfo *TSInfo, Expr *SubExpr) {\n  // ...\n  if (T->isDependentType() || SubExpr->isTypeDependent()) {\n  // ...\n  } else if (T->isObjCARCBridgableType() && FromType->isCARCBridgableType()) {\n  // ...\n  } else if (T->isCARCBridgableType() && FromType->isObjCARCBridgableType()) {\n    // ...\n    case OBC_BridgeTransfer: {\n      // ...\n      Diag(BridgeKeywordLoc, diag::note_arc_bridge) << FixItHint::CreateReplacement(BridgeKeywordLoc, \"__bridge \");"}},
		[m]={
			["clang/test/SemaObjC/arc-cf.m"]={"clang/test/SemaObjC/arc-cf.m:18:8: note: use __bridge to convert directly (no change in ownership)"}
		}
	},
	["note_arc_bridge_retained"]={
		[b]="note_arc_bridge_retained",
		[c]="use %select{__bridge_retained|CFBridgingRetain call}1 to make an ARC object available as a +1 %0",
		[e]={{nil,nil,{"use ",{"__bridge_retained","CFBridgingRetain call"}," to make an ARC object available as a +1 A"}}},
		[g]=f,
		[h]="use (?:__bridge_retained|CFBridgingRetain call) to make an ARC object available as a \\+1 (.*?)",
		[i]=a,
		[j]=Rb,
		[k]={Sb,1308178962,Tb,Qb},
		[d]={{w,3986,"static void diagnoseObjCARCConversion(Sema &S, SourceRange castRange, QualType castType, ARCConversionTypeClass castACTC, Expr *castExpr, Expr *realCast, ARCConversionTypeClass exprACTC, Sema::CheckedConversionKind CCK) {\n  // ...\n  // Bridge from a CF type to an ARC type.\n  if (exprACTC == ACTC_retainable && isAnyRetainable(castACTC)) {\n    // ...\n    if (CreateRule != ACC_plusZero) {\n      auto DiagB = (CCK == Sema::CCK_OtherCast && !br) ? S.Diag(noteLoc, diag::note_arc_cstyle_bridge_retained) << castType : S.Diag(br ? castExpr->getExprLoc() : noteLoc, diag::note_arc_bridge_retained) << castType << br;"},{w,4718,"ExprResult Sema::BuildObjCBridgedCast(SourceLocation LParenLoc, ObjCBridgeCastKind Kind, SourceLocation BridgeKeywordLoc, TypeSourceInfo *TSInfo, Expr *SubExpr) {\n  // ...\n  if (T->isDependentType() || SubExpr->isTypeDependent()) {\n  // ...\n  } else if (T->isObjCARCBridgableType() && FromType->isCARCBridgableType()) {\n  // ...\n  } else if (T->isCARCBridgableType() && FromType->isObjCARCBridgableType()) {\n    // ...\n    case OBC_BridgeTransfer: {\n      // ...\n      Diag(BridgeKeywordLoc, diag::note_arc_bridge_retained) << T << br << FixItHint::CreateReplacement(BridgeKeywordLoc, br ? \"CFBridgingRetain \" : \"__bridge_retained\");"}},
		[m]={
			["clang/test/ARCMT/nonobjc-to-objc-cast-2.m"]={"clang/test/ARCMT/nonobjc-to-objc-cast-2.m:41:14: note: use CFBridgingRetain call to make an ARC object available as a +1 \'void *\'","clang/test/ARCMT/nonobjc-to-objc-cast-2.m:46:23: note: use CFBridgingRetain call to make an ARC object available as a +1 \'CFStringRef\' (aka \'const struct __CFString *\')","clang/test/ARCMT/nonobjc-to-objc-cast-2.m:61:29: note: use CFBridgingRetain call to make an ARC object available as a +1 \'CFStringRef\' (aka \'const struct __CFString *\')"}
		}
	},
	["note_arc_bridge_transfer"]={
		[b]="note_arc_bridge_transfer",
		[c]="use %select{__bridge_transfer|CFBridgingRelease call}1 to transfer ownership of a +1 %0 into ARC",
		[e]={{nil,nil,{"use ",{"__bridge_transfer","CFBridgingRelease call"}," to transfer ownership of a +1 A into ARC"}}},
		[g]=f,
		[h]="use (?:__bridge_transfer|CFBridgingRelease call) to transfer ownership of a \\+1 (.*?) into ARC",
		[i]=a,
		[j]=Rb,
		[k]={Sb,1308178962,Tb,Qb},
		[d]={{w,3946,"static void diagnoseObjCARCConversion(Sema &S, SourceRange castRange, QualType castType, ARCConversionTypeClass castACTC, Expr *castExpr, Expr *realCast, ARCConversionTypeClass exprACTC, Sema::CheckedConversionKind CCK) {\n  // ...\n  // Bridge from an ARC type to a CF type.\n  if (castACTC == ACTC_retainable && isAnyRetainable(exprACTC)) {\n    // ...\n    if (CreateRule != ACC_plusZero) {\n      auto DiagB = (CCK == Sema::CCK_OtherCast && !br) ? S.Diag(noteLoc, diag::note_arc_cstyle_bridge_transfer) << castExprType : S.Diag(br ? castExpr->getExprLoc() : noteLoc, diag::note_arc_bridge_transfer) << castExprType << br;"},{w,4674,"ExprResult Sema::BuildObjCBridgedCast(SourceLocation LParenLoc, ObjCBridgeCastKind Kind, SourceLocation BridgeKeywordLoc, TypeSourceInfo *TSInfo, Expr *SubExpr) {\n  // ...\n  if (T->isDependentType() || SubExpr->isTypeDependent()) {\n  // ...\n  } else if (T->isObjCARCBridgableType() && FromType->isCARCBridgableType()) {\n    // ...\n    case OBC_BridgeRetained: {\n      // ...\n      Diag(BridgeKeywordLoc, diag::note_arc_bridge_transfer) << FromType << br << FixItHint::CreateReplacement(BridgeKeywordLoc, br ? \"CFBridgingRelease \" : \"__bridge_transfer \");"}},
		[m]={
			["clang/test/SemaObjC/arc-cf.m"]={"clang/test/SemaObjC/arc-cf.m:18:12: note: use CFBridgingRelease call to transfer ownership of a +1 \'CFStringRef\' (aka \'const struct __CFString *\') into ARC","clang/test/SemaObjC/arc-cf.m:19:12: note: use CFBridgingRelease call to transfer ownership of a +1 \'CFStringRef\' (aka \'const struct __CFString *\') into ARC","clang/test/SemaObjC/arc-cf.m:27:12: note: use CFBridgingRelease call to transfer ownership of a +1 \'CFStringRef\' (aka \'const struct __CFString *\') into ARC","clang/test/SemaObjC/arc-cf.m:45:12: note: use CFBridgingRelease call to transfer ownership of a +1 \'CFStringRef\' (aka \'const struct __CFString *\') into ARC","clang/test/SemaObjC/arc-cf.m:46:12: note: use CFBridgingRelease call to transfer ownership of a +1 \'CFStringRef\' (aka \'const struct __CFString *\') into ARC"}
		}
	},
	["note_arc_cstyle_bridge"]={
		[b]="note_arc_cstyle_bridge",
		[c]="use __bridge with C-style cast to convert directly (no change in ownership)",
		[e]="use __bridge with C-style cast to convert directly (no change in ownership)",
		[g]=f,
		[h]="use __bridge with C\\-style cast to convert directly \\(no change in ownership\\)",
		[i]=a,
		[j]=Rb,
		[k]={"ac2d082f58e6",1361496168,"objective-C arc: Diagnostic can not say to use bridge","objective-C arc: Diagnostic can not say to use bridge\ncasts with c++ named casts. Change notes to say use\nbridge with c-style cast instead. // rdar://12788838\n\nllvm-svn: 175850"},
		[d]={{w,3934,"static void diagnoseObjCARCConversion(Sema &S, SourceRange castRange, QualType castType, ARCConversionTypeClass castACTC, Expr *castExpr, Expr *realCast, ARCConversionTypeClass exprACTC, Sema::CheckedConversionKind CCK) {\n  // ...\n  // Bridge from an ARC type to a CF type.\n  if (castACTC == ACTC_retainable && isAnyRetainable(exprACTC)) {\n    // ...\n    if (CreateRule != ACC_plusOne) {\n      auto DiagB = (CCK != Sema::CCK_OtherCast) ? S.Diag(noteLoc, diag::note_arc_bridge) : S.Diag(noteLoc, diag::note_arc_cstyle_bridge);"},{w,3975,"static void diagnoseObjCARCConversion(Sema &S, SourceRange castRange, QualType castType, ARCConversionTypeClass castACTC, Expr *castExpr, Expr *realCast, ARCConversionTypeClass exprACTC, Sema::CheckedConversionKind CCK) {\n  // ...\n  // Bridge from a CF type to an ARC type.\n  if (exprACTC == ACTC_retainable && isAnyRetainable(castACTC)) {\n    // ...\n    if (CreateRule != ACC_plusOne) {\n      auto DiagB = (CCK != Sema::CCK_OtherCast) ? S.Diag(noteLoc, diag::note_arc_bridge) : S.Diag(noteLoc, diag::note_arc_cstyle_bridge);"}},
		[m]={
			["clang/test/SemaObjCXX/objcbridge-static-cast.mm"]={"clang/test/SemaObjCXX/objcbridge-static-cast.mm:30:21: note: use __bridge with C-style cast to convert directly (no change in ownership)","clang/test/SemaObjCXX/objcbridge-static-cast.mm:56:20: note: use __bridge with C-style cast to convert directly (no change in ownership)","clang/test/SemaObjCXX/objcbridge-static-cast.mm:60:20: note: use __bridge with C-style cast to convert directly (no change in ownership)","clang/test/SemaObjCXX/objcbridge-static-cast.mm:63:20: note: use __bridge with C-style cast to convert directly (no change in ownership)","clang/test/SemaObjCXX/objcbridge-static-cast.mm:67:20: note: use __bridge with C-style cast to convert directly (no change in ownership)","clang/test/SemaObjCXX/objcbridge-static-cast.mm:70:31: note: use __bridge with C-style cast to convert directly (no change in ownership)","clang/test/SemaObjCXX/objcbridge-static-cast.mm:73:31: note: use __bridge with C-style cast to convert directly (no change in ownership)","clang/test/SemaObjCXX/objcbridge-static-cast.mm:77:20: note: use __bridge with C-style cast to convert directly (no change in ownership)","clang/test/SemaObjCXX/objcbridge-static-cast.mm:81:31: note: use __bridge with C-style cast to convert directly (no change in ownership)","clang/test/SemaObjCXX/objcbridge-static-cast.mm:89:20: note: use __bridge with C-style cast to convert directly (no change in ownership)","clang/test/SemaObjCXX/objcbridge-static-cast.mm:92:19: note: use __bridge with C-style cast to convert directly (no change in ownership)","clang/test/SemaObjCXX/objcbridge-static-cast.mm:95:19: note: use __bridge with C-style cast to convert directly (no change in ownership)","clang/test/SemaObjCXX/objcbridge-static-cast.mm:102:21: note: use __bridge with C-style cast to convert directly (no change in ownership)","clang/test/SemaObjCXX/objcbridge-static-cast.mm:105:19: note: use __bridge with C-style cast to convert directly (no change in ownership)","clang/test/SemaObjCXX/objcbridge-static-cast.mm:108:19: note: use __bridge with C-style cast to convert directly (no change in ownership)","clang/test/SemaObjCXX/objcbridge-static-cast.mm:111:19: note: use __bridge with C-style cast to convert directly (no change in ownership)","clang/test/SemaObjCXX/objcbridge-static-cast.mm:114:19: note: use __bridge with C-style cast to convert directly (no change in ownership)","clang/test/SemaObjCXX/objcbridge-static-cast.mm:121:30: note: use __bridge with C-style cast to convert directly (no change in ownership)","clang/test/SemaObjCXX/objcbridge-static-cast.mm:124:30: note: use __bridge with C-style cast to convert directly (no change in ownership)","clang/test/SemaObjCXX/objcbridge-static-cast.mm:127:30: note: use __bridge with C-style cast to convert directly (no change in ownership)","clang/test/SemaObjCXX/objcbridge-static-cast.mm:130:30: note: use __bridge with C-style cast to convert directly (no change in ownership)","clang/test/SemaObjCXX/objcbridge-static-cast.mm:133:30: note: use __bridge with C-style cast to convert directly (no change in ownership)"}
		}
	},
	["note_arc_cstyle_bridge_retained"]={
		[b]="note_arc_cstyle_bridge_retained",
		[c]="use __bridge_retained with C-style cast to make an ARC object available as a +1 %0",
		[e]="use __bridge_retained with C-style cast to make an ARC object available as a +1 A",
		[g]=f,
		[h]="use __bridge_retained with C\\-style cast to make an ARC object available as a \\+1 (.*?)",
		[i]=a,
		[j]=Rb,
		[k]={"ac2d082f58e6",1361496168,"objective-C arc: Diagnostic can not say to use bridge","objective-C arc: Diagnostic can not say to use bridge\ncasts with c++ named casts. Change notes to say use\nbridge with c-style cast instead. // rdar://12788838\n\nllvm-svn: 175850"},
		[d]={{w,3983,"static void diagnoseObjCARCConversion(Sema &S, SourceRange castRange, QualType castType, ARCConversionTypeClass castACTC, Expr *castExpr, Expr *realCast, ARCConversionTypeClass exprACTC, Sema::CheckedConversionKind CCK) {\n  // ...\n  // Bridge from a CF type to an ARC type.\n  if (exprACTC == ACTC_retainable && isAnyRetainable(castACTC)) {\n    // ...\n    if (CreateRule != ACC_plusZero) {\n      auto DiagB = (CCK == Sema::CCK_OtherCast && !br) ? S.Diag(noteLoc, diag::note_arc_cstyle_bridge_retained) << castType : S.Diag(br ? castExpr->getExprLoc() : noteLoc, diag::note_arc_bridge_retained) << castType << br;"}},
		[m]={
			["clang/test/SemaObjCXX/objcbridge-static-cast.mm"]={"clang/test/SemaObjCXX/objcbridge-static-cast.mm:70:31: note: use __bridge_retained with C-style cast to make an ARC object available as a +1 \'CFErrorRef\' (aka \'__CFErrorRef *\')","clang/test/SemaObjCXX/objcbridge-static-cast.mm:73:31: note: use __bridge_retained with C-style cast to make an ARC object available as a +1 \'CFErrorRef\' (aka \'__CFErrorRef *\')","clang/test/SemaObjCXX/objcbridge-static-cast.mm:81:31: note: use __bridge_retained with C-style cast to make an ARC object available as a +1 \'CFErrorRef\' (aka \'__CFErrorRef *\')","clang/test/SemaObjCXX/objcbridge-static-cast.mm:121:30: note: use __bridge_retained with C-style cast to make an ARC object available as a +1 \'CFErrorRef\' (aka \'__CFErrorRef *\')","clang/test/SemaObjCXX/objcbridge-static-cast.mm:124:30: note: use __bridge_retained with C-style cast to make an ARC object available as a +1 \'CFErrorRef\' (aka \'__CFErrorRef *\')","clang/test/SemaObjCXX/objcbridge-static-cast.mm:127:30: note: use __bridge_retained with C-style cast to make an ARC object available as a +1 \'CFErrorRef\' (aka \'__CFErrorRef *\')","clang/test/SemaObjCXX/objcbridge-static-cast.mm:130:30: note: use __bridge_retained with C-style cast to make an ARC object available as a +1 \'CFErrorRef\' (aka \'__CFErrorRef *\')","clang/test/SemaObjCXX/objcbridge-static-cast.mm:133:30: note: use __bridge_retained with C-style cast to make an ARC object available as a +1 \'CFErrorRef\' (aka \'__CFErrorRef *\')"}
		}
	},
	["note_arc_cstyle_bridge_transfer"]={
		[b]="note_arc_cstyle_bridge_transfer",
		[c]="use __bridge_transfer with C-style cast to transfer ownership of a +1 %0 into ARC",
		[e]="use __bridge_transfer with C-style cast to transfer ownership of a +1 A into ARC",
		[g]=f,
		[h]="use __bridge_transfer with C\\-style cast to transfer ownership of a \\+1 (.*?) into ARC",
		[i]=a,
		[j]=Rb,
		[k]={"ac2d082f58e6",1361496168,"objective-C arc: Diagnostic can not say to use bridge","objective-C arc: Diagnostic can not say to use bridge\ncasts with c++ named casts. Change notes to say use\nbridge with c-style cast instead. // rdar://12788838\n\nllvm-svn: 175850"},
		[d]={{w,3943,"static void diagnoseObjCARCConversion(Sema &S, SourceRange castRange, QualType castType, ARCConversionTypeClass castACTC, Expr *castExpr, Expr *realCast, ARCConversionTypeClass exprACTC, Sema::CheckedConversionKind CCK) {\n  // ...\n  // Bridge from an ARC type to a CF type.\n  if (castACTC == ACTC_retainable && isAnyRetainable(exprACTC)) {\n    // ...\n    if (CreateRule != ACC_plusZero) {\n      auto DiagB = (CCK == Sema::CCK_OtherCast && !br) ? S.Diag(noteLoc, diag::note_arc_cstyle_bridge_transfer) << castExprType : S.Diag(br ? castExpr->getExprLoc() : noteLoc, diag::note_arc_bridge_transfer) << castExprType << br;"}},
		[m]={
			["clang/test/SemaObjCXX/objcbridge-static-cast.mm"]={"clang/test/SemaObjCXX/objcbridge-static-cast.mm:30:21: note: use __bridge_transfer with C-style cast to transfer ownership of a +1 \'CFTestingRef\' (aka \'__CFError *\') into ARC","clang/test/SemaObjCXX/objcbridge-static-cast.mm:56:20: note: use __bridge_transfer with C-style cast to transfer ownership of a +1 \'CFErrorRef2\' (aka \'__CFErrorRef *\') into ARC","clang/test/SemaObjCXX/objcbridge-static-cast.mm:60:20: note: use __bridge_transfer with C-style cast to transfer ownership of a +1 \'CFErrorRef2\' (aka \'__CFErrorRef *\') into ARC","clang/test/SemaObjCXX/objcbridge-static-cast.mm:63:20: note: use __bridge_transfer with C-style cast to transfer ownership of a +1 \'CFErrorRef2\' (aka \'__CFErrorRef *\') into ARC","clang/test/SemaObjCXX/objcbridge-static-cast.mm:67:20: note: use __bridge_transfer with C-style cast to transfer ownership of a +1 \'CFUColor2Ref\' (aka \'__CFUPrimeColor *\') into ARC","clang/test/SemaObjCXX/objcbridge-static-cast.mm:77:20: note: use __bridge_transfer with C-style cast to transfer ownership of a +1 \'CFErrorRef2\' (aka \'__CFErrorRef *\') into ARC","clang/test/SemaObjCXX/objcbridge-static-cast.mm:89:20: note: use __bridge_transfer with C-style cast to transfer ownership of a +1 \'CFErrorRef\' (aka \'__CFErrorRef *\') into ARC","clang/test/SemaObjCXX/objcbridge-static-cast.mm:92:19: note: use __bridge_transfer with C-style cast to transfer ownership of a +1 \'CFErrorRef\' (aka \'__CFErrorRef *\') into ARC","clang/test/SemaObjCXX/objcbridge-static-cast.mm:95:19: note: use __bridge_transfer with C-style cast to transfer ownership of a +1 \'CFErrorRef\' (aka \'__CFErrorRef *\') into ARC","clang/test/SemaObjCXX/objcbridge-static-cast.mm:102:21: note: use __bridge_transfer with C-style cast to transfer ownership of a +1 \'CFMyErrorRef\' (aka \'__CFMyErrorRef *\') into ARC","clang/test/SemaObjCXX/objcbridge-static-cast.mm:105:19: note: use __bridge_transfer with C-style cast to transfer ownership of a +1 \'CFMyErrorRef\' (aka \'__CFMyErrorRef *\') into ARC","clang/test/SemaObjCXX/objcbridge-static-cast.mm:108:19: note: use __bridge_transfer with C-style cast to transfer ownership of a +1 \'CFMyErrorRef\' (aka \'__CFMyErrorRef *\') into ARC","clang/test/SemaObjCXX/objcbridge-static-cast.mm:111:19: note: use __bridge_transfer with C-style cast to transfer ownership of a +1 \'CFMyErrorRef\' (aka \'__CFMyErrorRef *\') into ARC","clang/test/SemaObjCXX/objcbridge-static-cast.mm:114:19: note: use __bridge_transfer with C-style cast to transfer ownership of a +1 \'CFMyErrorRef\' (aka \'__CFMyErrorRef *\') into ARC"}
		}
	},
	["note_arc_field_with_ownership"]={
		[b]="note_arc_field_with_ownership",
		[c]="field has non-trivial ownership qualification",
		[e]="field has non-trivial ownership qualification",
		[g]=f,
		[h]="field has non\\-trivial ownership qualification",
		[i]=a,
		[j]=fc,
		[k]={gc,1446008599,Yb,Zb},
		[d]={{hb,492,"/// Actually emit an availability diagnostic for a reference to an unavailable\n/// decl.\n///\n/// \\param Ctx The context that the reference occurred in\n/// \\param ReferringDecl The exact declaration that was referenced.\n/// \\param OffendingDecl A related decl to \\c ReferringDecl that has an\n/// availability attribute corresponding to \\c K attached to it. Note that this\n/// may not be the same as ReferringDecl, i.e. if an EnumDecl is annotated and\n/// we refer to a member EnumConstantDecl, ReferringDecl is the EnumConstantDecl\n/// and OffendingDecl is the EnumDecl.\nstatic void DoEmitAvailabilityWarning(Sema &S, AvailabilityResult K, Decl *Ctx, const NamedDecl *ReferringDecl, const NamedDecl *OffendingDecl, StringRef Message, ArrayRef<SourceLocation> Locs, const ObjCInterfaceDecl *UnknownObjCClass, const ObjCPropertyDecl *ObjCProperty, bool ObjCPropertyAccess) {\n  // ...\n  case AR_Unavailable:\n    // ...\n    if (auto AL = OffendingDecl->getAttr<UnavailableAttr>()) {\n      if (AL->isImplicit() && AL->getImplicitReason()) {\n        // ...\n        case UnavailableAttr::IR_ARCFieldWithOwnership:\n          // ...\n          diag_available_here = diag::note_arc_field_with_ownership;"}},
		[m]={
			["clang/test/SemaObjCXX/arc-system-header.mm"]={"clang/test/SemaObjCXX/Inputs/arc-system-header.h:10:7: note: field has non-trivial ownership qualification"}
		}
	},
	["note_arc_forbidden_type"]={
		[b]="note_arc_forbidden_type",
		[c]="declaration uses type that is ill-formed in ARC",
		[e]="declaration uses type that is ill-formed in ARC",
		[g]=f,
		[h]="declaration uses type that is ill\\-formed in ARC",
		[i]=a,
		[j]=fc,
		[k]={gc,1446008599,Yb,Zb},
		[d]={{hb,470,"/// Actually emit an availability diagnostic for a reference to an unavailable\n/// decl.\n///\n/// \\param Ctx The context that the reference occurred in\n/// \\param ReferringDecl The exact declaration that was referenced.\n/// \\param OffendingDecl A related decl to \\c ReferringDecl that has an\n/// availability attribute corresponding to \\c K attached to it. Note that this\n/// may not be the same as ReferringDecl, i.e. if an EnumDecl is annotated and\n/// we refer to a member EnumConstantDecl, ReferringDecl is the EnumConstantDecl\n/// and OffendingDecl is the EnumDecl.\nstatic void DoEmitAvailabilityWarning(Sema &S, AvailabilityResult K, Decl *Ctx, const NamedDecl *ReferringDecl, const NamedDecl *OffendingDecl, StringRef Message, ArrayRef<SourceLocation> Locs, const ObjCInterfaceDecl *UnknownObjCClass, const ObjCPropertyDecl *ObjCProperty, bool ObjCPropertyAccess) {\n  // ...\n  case AR_Unavailable:\n    // ...\n    if (auto AL = OffendingDecl->getAttr<UnavailableAttr>()) {\n      if (AL->isImplicit() && AL->getImplicitReason()) {\n        // ...\n        case UnavailableAttr::IR_ARCForbiddenType:\n          // ...\n          diag_available_here = diag::note_arc_forbidden_type;"}},
		[m]={
			["clang/test/SemaObjC/arc-unavailable-system-function.m"]={"/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:1:6: note: declaration uses type that is ill-formed in ARC"}
		}
	},
	["note_arc_gained_method_convention"]={
		[b]="note_arc_gained_method_convention",
		[c]="declaration in interface is not in the \'%select{alloc|copy|init|new}0\' family because %select{its result type is not an object pointer|its result type is unrelated to its receiver type}1",
		[e]={{nil,nil,{"declaration in interface is not in the \'",{"alloc","copy","init","new"},"\' family because ",{"its result type is not an object pointer","its result type is unrelated to its receiver type"}}}},
		[g]=f,
		[h]="declaration in interface is not in the \'(?:alloc|copy|init|new)\' family because (?:its result type is not an object pointer|its result type is unrelated to its receiver type)",
		[i]=a,
		[j]="ARC Semantic Issue",
		[k]={Sb,1308178962,Tb,Qb},
		[d]={{qb,2531,"/// In ARC, check whether the conventional meanings of the two methods\n/// match.  If they don\'t, it\'s a hard error.\nstatic bool checkMethodFamilyMismatch(Sema &S, ObjCMethodDecl *impl, ObjCMethodDecl *decl) {\n  // ...\n  if (declFamily == OMF_None) {\n    // ...\n    noteID = diag::note_arc_gained_method_convention;"}},
		[m]={
			["clang/test/ARCMT/checking.m"]={"clang/test/ARCMT/checking.m:202:1: note: declaration in interface is not in the \'init\' family because its result type is not an object pointer","clang/test/ARCMT/checking.m:205:1: note: declaration in interface is not in the \'init\' family because its result type is not an object pointer","clang/test/ARCMT/checking.m:206:1: note: declaration in interface is not in the \'init\' family because its result type is not an object pointer"}
		}
	},
	["note_arc_init_returns_unrelated"]={
		[b]="note_arc_init_returns_unrelated",
		[c]="init method must return a type related to its receiver type",
		[e]="init method must return a type related to its receiver type",
		[g]=f,
		[h]="init method must return a type related to its receiver type",
		[i]=a,
		[j]=fc,
		[k]={gc,1446008599,Yb,Zb},
		[d]={{hb,487,"/// Actually emit an availability diagnostic for a reference to an unavailable\n/// decl.\n///\n/// \\param Ctx The context that the reference occurred in\n/// \\param ReferringDecl The exact declaration that was referenced.\n/// \\param OffendingDecl A related decl to \\c ReferringDecl that has an\n/// availability attribute corresponding to \\c K attached to it. Note that this\n/// may not be the same as ReferringDecl, i.e. if an EnumDecl is annotated and\n/// we refer to a member EnumConstantDecl, ReferringDecl is the EnumConstantDecl\n/// and OffendingDecl is the EnumDecl.\nstatic void DoEmitAvailabilityWarning(Sema &S, AvailabilityResult K, Decl *Ctx, const NamedDecl *ReferringDecl, const NamedDecl *OffendingDecl, StringRef Message, ArrayRef<SourceLocation> Locs, const ObjCInterfaceDecl *UnknownObjCClass, const ObjCPropertyDecl *ObjCProperty, bool ObjCPropertyAccess) {\n  // ...\n  case AR_Unavailable:\n    // ...\n    if (auto AL = OffendingDecl->getAttr<UnavailableAttr>()) {\n      if (AL->isImplicit() && AL->getImplicitReason()) {\n        // ...\n        case UnavailableAttr::IR_ARCInitReturnsUnrelated:\n          // ...\n          diag_available_here = diag::note_arc_init_returns_unrelated;"}}
	},
	["note_arc_lost_method_convention"]={
		[b]="note_arc_lost_method_convention",
		[c]="declaration in interface",
		[e]="declaration in interface",
		[g]=f,
		[h]="declaration in interface",
		[i]=a,
		[j]="ARC Semantic Issue",
		[k]={Sb,1308178962,Tb,Qb},
		[d]={{qb,2526,"/// In ARC, check whether the conventional meanings of the two methods\n/// match.  If they don\'t, it\'s a hard error.\nstatic bool checkMethodFamilyMismatch(Sema &S, ObjCMethodDecl *impl, ObjCMethodDecl *decl) {\n  // ...\n  unsigned noteID = diag::note_arc_lost_method_convention;"}},
		[m]={
			["clang/test/ARCMT/checking.m"]={"clang/test/ARCMT/checking.m:196:1: note: declaration in interface","clang/test/ARCMT/checking.m:211:1: note: declaration in interface","clang/test/ARCMT/checking.m:218:1: note: declaration in interface","clang/test/ARCMT/checking.m:225:1: note: declaration in interface"}
		}
	},
	["note_arc_retain_cycle_owner"]={
		[b]="note_arc_retain_cycle_owner",
		[c]="block will be retained by %select{the captured object|an object strongly retained by the captured object}0",
		[e]={{nil,nil,{"block will be retained by ",{"the captured object","an object strongly retained by the captured object"}}}},
		[g]=f,
		[h]="block will be retained by (?:the captured object|an object strongly retained by the captured object)",
		[i]=a,
		[j]="ARC Retain Cycle",
		[k]={Sb,1308178962,Tb,Qb},
		[d]={{tb,17475,"static void diagnoseRetainCycle(Sema &S, Expr *capturer, RetainCycleOwner &owner) {\n  // ...\n  S.Diag(owner.Loc, diag::note_arc_retain_cycle_owner) << owner.Indirect << owner.Range;"}},
		[m]={
			["clang/test/SemaObjC/warn-retain-cycle.m"]={"clang/test/SemaObjC/warn-retain-cycle.m:11:4: note: block will be retained by the captured object","clang/test/SemaObjC/warn-retain-cycle.m:13:3: note: block will be retained by the captured object","clang/test/SemaObjC/warn-retain-cycle.m:16:4: note: block will be retained by the captured object","clang/test/SemaObjC/warn-retain-cycle.m:31:3: note: block will be retained by the captured object","clang/test/SemaObjC/warn-retain-cycle.m:48:3: note: block will be retained by an object strongly retained by the captured object","clang/test/SemaObjC/warn-retain-cycle.m:49:3: note: block will be retained by an object strongly retained by the captured object","clang/test/SemaObjC/warn-retain-cycle.m:63:3: note: block will be retained by an object strongly retained by the captured object","clang/test/SemaObjC/warn-retain-cycle.m:69:3: note: block will be retained by an object strongly retained by the captured object","clang/test/SemaObjC/warn-retain-cycle.m:71:3: note: block will be retained by an object strongly retained by the captured object","clang/test/SemaObjC/warn-retain-cycle.m:73:3: note: block will be retained by an object strongly retained by the captured object","clang/test/SemaObjC/warn-retain-cycle.m:81:3: note: block will be retained by an object strongly retained by the captured object","clang/test/SemaObjC/warn-retain-cycle.m:93:3: note: block will be retained by an object strongly retained by the captured object","clang/test/SemaObjC/warn-retain-cycle.m:124:4: note: block will be retained by an object strongly retained by the captured object","clang/test/SemaObjC/warn-retain-cycle.m:148:19: note: block will be retained by the captured object","clang/test/SemaObjC/warn-retain-cycle.m:153:3: note: block will be retained by the captured object","clang/test/SemaObjC/warn-retain-cycle.m:169:4: note: block will be retained by the captured object","clang/test/SemaObjC/warn-retain-cycle.m:173:4: note: block will be retained by the captured object"}
		}
	},
	["note_arc_weak_also_accessed_here"]={
		[b]="note_arc_weak_also_accessed_here",
		[c]="also accessed here",
		[e]="also accessed here",
		[g]=f,
		[h]="also accessed here",
		[i]=a,
		[j]=p,
		[k]={"d393458c3316",1348870890,"Add a warning (off by default) for repeated use of the same weak property.","Add a warning (off by default) for repeated use of the same weak property.\n\nThe motivating example:\n\nif (self.weakProp)\n  use(self.weakProp);\n\nAs with any non-atomic test-then-use, it is possible a weak property to be\nnon-nil at the \'if\', but be deallocated by the time it is used. The correct\nway to write this example is as follows:\n\nid tmp = self.weakProp;\nif (tmp)\n  use(tmp);\n\nThe warning is controlled by -Warc-repeated-use-of-receiver, and uses the\nproperty name and base to determine if the same property on the same object\nis being accessed multiple times. In cases where the base is more\ncomplicated than just a single Decl (e.g. \'foo.bar.weakProp\'), it picks a\nDecl for some degree of uniquing and reports the problem under a subflag,\n-Warc-maybe-repeated-use-of-receiver. This gives a way to tune the\naggressiveness of the warning for a particular project.\n\nThe warning is not on by default because it is not flow-sensitive and thus\nmay have a higher-than-acceptable rate of false positives, though it is\nless noisy than -Wreceiver-is-weak. On the other hand, it will not warn\nabout some cases that may be legitimate issues that -Wreceiver-is-weak\nwill catch, and it does not attempt to reason about methods returning weak\nvalues.\n\nEven though this is not a real \"analysis-based\" check I\'ve put the bug\nemission code in AnalysisBasedWarnings for two reasons: (1) to run on\nevery kind of code body (function, method, block, or lambda), and (2) to\nsuggest that it may be enhanced by flow-sensitive analysis in the future.\n\nThe second (smaller) half of this work is to extend it to weak locals\nand weak ivars. This should use most of the same infrastructure.\n\nPart of <rdar://problem/12280249>\n\nllvm-svn: 164854"},
		[d]={{"clang/lib/Sema/AnalysisBasedWarnings.cpp",1512,"static void diagnoseRepeatedUseOfWeak(Sema &S, const sema::FunctionScopeInfo *CurFn, const Decl *D, const ParentMap &PM) {\n  // ...\n  // Iterate through the sorted problems and emit warnings for each.\n  for (const auto &P : UsesByStmt) {\n    // ...\n    // Print all the other accesses as notes.\n    for (const auto &Use : Uses) {\n      // ...\n      S.Diag(Use.getUseExpr()->getBeginLoc(), diag::note_arc_weak_also_accessed_here) << Use.getUseExpr()->getSourceRange();"}},
		[m]={
			["clang/test/SemaObjC/arc-repeated-weak.mm"]={"clang/test/SemaObjC/arc-repeated-weak.mm:24:7: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:29:7: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:57:3: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:68:7: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:73:7: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:78:7: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:83:7: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:94:7: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:100:7: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:105:7: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:114:3: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:120:7: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:123:7: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:128:12: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:134:9: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:139:3: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:145:3: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:170:9: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:211:3: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:213:5: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:220:7: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:221:7: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:227:7: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:228:7: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:234:7: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:235:7: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:241:7: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:242:7: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:249:7: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:250:7: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:312:7: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:317:7: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:322:7: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:325:7: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:328:7: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:376:9: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:387:9: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:400:5: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:409:9: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:414:7: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:421:7: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:472:7: note: also accessed here","clang/test/SemaObjC/arc-repeated-weak.mm:476:7: note: also accessed here"}
		}
	},
	["note_arc_weak_disabled"]={
		[b]="note_arc_weak_disabled",
		[c]="declaration uses __weak, but ARC is disabled",
		[e]="declaration uses __weak, but ARC is disabled",
		[g]=f,
		[h]="declaration uses __weak, but ARC is disabled",
		[i]=a,
		[j]=fc,
		[k]={gc,1446008599,Yb,Zb},
		[d]={{hb,475,"/// Actually emit an availability diagnostic for a reference to an unavailable\n/// decl.\n///\n/// \\param Ctx The context that the reference occurred in\n/// \\param ReferringDecl The exact declaration that was referenced.\n/// \\param OffendingDecl A related decl to \\c ReferringDecl that has an\n/// availability attribute corresponding to \\c K attached to it. Note that this\n/// may not be the same as ReferringDecl, i.e. if an EnumDecl is annotated and\n/// we refer to a member EnumConstantDecl, ReferringDecl is the EnumConstantDecl\n/// and OffendingDecl is the EnumDecl.\nstatic void DoEmitAvailabilityWarning(Sema &S, AvailabilityResult K, Decl *Ctx, const NamedDecl *ReferringDecl, const NamedDecl *OffendingDecl, StringRef Message, ArrayRef<SourceLocation> Locs, const ObjCInterfaceDecl *UnknownObjCClass, const ObjCPropertyDecl *ObjCProperty, bool ObjCPropertyAccess) {\n  // ...\n  case AR_Unavailable:\n    // ...\n    if (auto AL = OffendingDecl->getAttr<UnavailableAttr>()) {\n      if (AL->isImplicit() && AL->getImplicitReason()) {\n        // ...\n        case UnavailableAttr::IR_ForbiddenWeak:\n          if (S.getLangOpts().ObjCWeakRuntime)\n            diag_available_here = diag::note_arc_weak_disabled;"}},
		[m]={
			["clang/test/SemaObjC/mrc-no-weak.m"]={"clang/test/SemaObjC/mrc-no-weak.m:39:13: note: declaration uses __weak, but ARC is disabled","clang/test/SemaObjC/mrc-no-weak.m:39:13: note: declaration uses __weak, but ARC is disabled"}
		}
	},
	["note_arc_weak_no_runtime"]={
		[b]="note_arc_weak_no_runtime",
		[c]="declaration uses __weak, which the current deployment target does not support",
		[e]="declaration uses __weak, which the current deployment target does not support",
		[g]=f,
		[h]="declaration uses __weak, which the current deployment target does not support",
		[i]=a,
		[j]=fc,
		[k]={gc,1446008599,Yb,Zb},
		[d]={{hb,477,"/// Actually emit an availability diagnostic for a reference to an unavailable\n/// decl.\n///\n/// \\param Ctx The context that the reference occurred in\n/// \\param ReferringDecl The exact declaration that was referenced.\n/// \\param OffendingDecl A related decl to \\c ReferringDecl that has an\n/// availability attribute corresponding to \\c K attached to it. Note that this\n/// may not be the same as ReferringDecl, i.e. if an EnumDecl is annotated and\n/// we refer to a member EnumConstantDecl, ReferringDecl is the EnumConstantDecl\n/// and OffendingDecl is the EnumDecl.\nstatic void DoEmitAvailabilityWarning(Sema &S, AvailabilityResult K, Decl *Ctx, const NamedDecl *ReferringDecl, const NamedDecl *OffendingDecl, StringRef Message, ArrayRef<SourceLocation> Locs, const ObjCInterfaceDecl *UnknownObjCClass, const ObjCPropertyDecl *ObjCProperty, bool ObjCPropertyAccess) {\n  // ...\n  case AR_Unavailable:\n    // ...\n    if (auto AL = OffendingDecl->getAttr<UnavailableAttr>()) {\n      if (AL->isImplicit() && AL->getImplicitReason()) {\n        // ...\n        case UnavailableAttr::IR_ForbiddenWeak:\n          if (S.getLangOpts().ObjCWeakRuntime)\n          // ...\n          else\n            diag_available_here = diag::note_arc_weak_no_runtime;"}}
	},
	["note_array_declared_here"]={
		[b]={{nil,l,"note_array_declared_here"}},
		[c]={{nil,l,"array %0 declared here"}},
		[e]={{nil,l,"array A declared here"}},
		[g]=f,
		[h]="array (.*?) declared here",
		[i]=a,
		[j]={{nil,l,p}},
		[k]={Lb,1567434909,Kb,Ib},
		[d]={{tb,17103,"void Sema::CheckArrayAccess(const Expr *BaseExpr, const Expr *IndexExpr, const ArraySubscriptExpr *ASE, bool AllowOnePastEnd, bool IndexNegated) {\n  // ...\n  if (IsUnboundedArray) {\n    // ...\n    if (index.isUnsigned() || !index.isNegative()) {\n      // ...\n      if (ND)\n        DiagRuntimeBehavior(ND->getBeginLoc(), BaseExpr, PDiag(diag::note_array_declared_here) << ND);"},{tb,17200,"void Sema::CheckArrayAccess(const Expr *BaseExpr, const Expr *IndexExpr, const ArraySubscriptExpr *ASE, bool AllowOnePastEnd, bool IndexNegated) {\n  // ...\n  if (ND)\n    DiagRuntimeBehavior(ND->getBeginLoc(), BaseExpr, PDiag(diag::note_array_declared_here) << ND);"},{z,11333,"static void DiagnoseDivisionSizeofPointerOrArray(Sema &S, Expr *LHS, Expr *RHS, SourceLocation Loc) {\n  // ...\n  if (LHSTy->isPointerType() && !RHSTy->isPointerType()) {\n  // ...\n  } else if (const auto *ArrayTy = S.Context.getAsArrayType(LHSTy)) {\n    // ...\n    if (const auto *DRE = dyn_cast<DeclRefExpr>(LHSArg)) {\n      if (const ValueDecl *LHSArgDecl = DRE->getDecl())\n        S.Diag(LHSArgDecl->getLocation(), diag::note_array_declared_here) << LHSArgDecl;"}},
		[m]={
			["clang/test/SemaCXX/array-bounds-system-header.cpp"]={"clang/test/SemaCXX/array-bounds-system-header.cpp:5:3: note: array \'a\' declared here","clang/test/SemaCXX/array-bounds-system-header.cpp:5:3: note: array \'a\' declared here"}
		}
	},
	["note_array_init_plain_string_into_char8_t"]={
		[b]={{nil,F,"note_array_init_plain_string_into_char8_t"}},
		[c]={{nil,F,"add \'u8\' prefix to form a \'char8_t\' string literal"}},
		[e]={{nil,F,"add \'u8\' prefix to form a \'char8_t\' string literal"}},
		[g]=f,
		[h]="add \'u8\' prefix to form a \'char8_t\' string literal",
		[i]=a,
		[j]={{nil,F,p}},
		[k]={"3a8244df6fb8",1525150965,"Implement P0482R2, support for char8_t type.","Implement P0482R2, support for char8_t type.\n\nThis is not yet part of any C++ working draft, and so is controlled by the flag\n-fchar8_t rather than a -std= flag. (The GCC implementation is controlled by a\nflag with the same name.)\n\nThis implementation is experimental, and will be removed or revised\nsubstantially to match the proposal as it makes its way through the C++\ncommittee.\n\nllvm-svn: 331244"},
		[d]={{"clang/lib/Sema/SemaInit.cpp",9600,"bool InitializationSequence::Diagnose(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, ArrayRef<Expr *> Args) {\n  // ...\n  case FK_PlainStringIntoUTF8Char:\n    // ...\n    S.Diag(Args.front()->getBeginLoc(), diag::note_array_init_plain_string_into_char8_t) << FixItHint::CreateInsertion(Args.front()->getBeginLoc(), \"u8\");"}},
		[m]={
			["clang/test/SemaCXX/char8_t.cpp"]={"clang/test/SemaCXX/char8_t.cpp:9:15: note: add \'u8\' prefix to form a \'char8_t\' string literal"}
		}
	},
	["note_array_size_conversion"]={
		[b]="note_array_size_conversion",
		[c]="conversion to %select{integral|enumeration}0 type %1 declared here",
		[e]={{nil,nil,{"conversion to ",{"integral","enumeration"}," type B declared here"}}},
		[g]=f,
		[h]="conversion to (?:integral|enumeration) type (.*?) declared here",
		[i]=a,
		[j]=p,
		[k]={"4799d03ce841",1277857243,"Implement C++ DR299, which allows an implicit conversion from a class","Implement C++ DR299, which allows an implicit conversion from a class\ntype to an integral or enumeration type in the size of an array new\nexpression, e.g.,\n\n  new int[ConvertibleToInt(10)];\n\nThis is a GNU and C++0x extension.\n\nllvm-svn: 107229"},
		[d]={{Z,2166,"ExprResult Sema::BuildCXXNew(SourceRange Range, bool UseGlobal, SourceLocation PlacementLParen, MultiExprArg PlacementArgs, SourceLocation PlacementRParen, SourceRange TypeIdParens, QualType AllocType, TypeSourceInfo *AllocTypeInfo, std::optional<Expr *> ArraySize, SourceRange DirectInitRange, Expr *Initializer) {\n  // ...\n  if (ArraySize && *ArraySize && !(*ArraySize)->isTypeDependent()) {\n    // ...\n    if (getLangOpts().CPlusPlus14) {\n    // ...\n    } else {\n      class SizeConvertDiagnoser : public ICEConvertDiagnoser {\n        // ...\n        SemaDiagnosticBuilder noteExplicitConv(Sema &S, CXXConversionDecl *Conv, QualType ConvTy) override { return S.Diag(Conv->getLocation(), diag::note_array_size_conversion) << ConvTy->isEnumeralType() << ConvTy; }"},{Z,2177,"ExprResult Sema::BuildCXXNew(SourceRange Range, bool UseGlobal, SourceLocation PlacementLParen, MultiExprArg PlacementArgs, SourceLocation PlacementRParen, SourceRange TypeIdParens, QualType AllocType, TypeSourceInfo *AllocTypeInfo, std::optional<Expr *> ArraySize, SourceRange DirectInitRange, Expr *Initializer) {\n  // ...\n  if (ArraySize && *ArraySize && !(*ArraySize)->isTypeDependent()) {\n    // ...\n    if (getLangOpts().CPlusPlus14) {\n    // ...\n    } else {\n      class SizeConvertDiagnoser : public ICEConvertDiagnoser {\n        // ...\n        SemaDiagnosticBuilder noteAmbiguous(Sema &S, CXXConversionDecl *Conv, QualType ConvTy) override { return S.Diag(Conv->getLocation(), diag::note_array_size_conversion) << ConvTy->isEnumeralType() << ConvTy; }"}}
	},
	["note_asm_input_duplicate_first"]={
		[b]="note_asm_input_duplicate_first",
		[c]="constraint \'%0\' is already present here",
		[e]="constraint \'A\' is already present here",
		[g]=f,
		[h]="constraint \'(.*?)\' is already present here",
		[i]=a,
		[j]="Inline Assembly Issue",
		[k]={"8e261be91106",1442846460,"Fix assertion in inline assembler IR gen","Fix assertion in inline assembler IR gen\nSeveral inputs may not refer to one output constraint in inline assembler\ninsertions, clang was failing on assertion on such test case.\n\nllvm-svn: 248158"},
		[d]={{Pb,609,"StmtResult Sema::ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, bool IsVolatile, unsigned NumOutputs, unsigned NumInputs, IdentifierInfo **Names, MultiExprArg constraints, MultiExprArg Exprs, Expr *asmString, MultiExprArg clobbers, unsigned NumLabels, SourceLocation RParenLoc) {\n  // ...\n  for (unsigned i = 0, e = InputConstraintInfos.size(); i != e; ++i) {\n    // ...\n    if (InputMatchedToOutput[TiedTo] != ~0U) {\n      // ...\n      targetDiag(NS->getInputExpr(InputMatchedToOutput[TiedTo])->getBeginLoc(), diag::note_asm_input_duplicate_first) << TiedTo;"}},
		[m]={
			["clang/test/Sema/asm.c"]={"clang/test/Sema/asm.c:291:17: note: constraint \'1\' is already present here"}
		}
	},
	["note_asm_missing_constraint_modifier"]={
		[b]="note_asm_missing_constraint_modifier",
		[c]="use constraint modifier \"%0\"",
		[e]="use constraint modifier \"A\"",
		[g]=f,
		[h]="use constraint modifier \"(.*?)\"",
		[i]=a,
		[j]="Inline Assembly Issue",
		[k]={"987f1864caeb",1408687521,"[AArch64, inline-asm] Improve diagnostic that is printed when the size of a","[AArch64, inline-asm] Improve diagnostic that is printed when the size of a\nvariable that has regiser constraint \"r\" is not 64-bit.\n\nGeneral register operands are output using 64-bit \"x\" register names, regardless\nof the size of the variable, unless the asm operand is prefixed with the \"%w\"\nmodifier. This surprises and confuses many users who aren\'t familiar with\naarch64 inline assembly rules.\n\nWith this commit, a note and fixit hint are printed which tell the users that\nthey need modifier \"%w\" in order to output a \"w\" register instead of an \"x\"\nregister.\n\n<rdar://problem/12764785>\n\nllvm-svn: 216260"},
		[d]={{Pb,554,"StmtResult Sema::ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, bool IsVolatile, unsigned NumOutputs, unsigned NumInputs, IdentifierInfo **Names, MultiExprArg constraints, MultiExprArg Exprs, Expr *asmString, MultiExprArg clobbers, unsigned NumLabels, SourceLocation RParenLoc) {\n  // ...\n  // Validate constraints and modifiers.\n  for (unsigned i = 0, e = Pieces.size(); i != e; ++i) {\n    // ...\n    if (!Context.getTargetInfo().validateConstraintModifier(Literal->getString(), Piece.getModifier(), Size, SuggestedModifier)) {\n      // ...\n      if (!SuggestedModifier.empty()) {\n        auto B = targetDiag(Piece.getRange().getBegin(), diag::note_asm_missing_constraint_modifier) << SuggestedModifier;"}},
		[m]={
			["clang/test/Sema/arm64-inline-asm.c"]={"clang/test/Sema/arm64-inline-asm.c:8:21: note: use constraint modifier \"w\""}
		}
	},
	["note_assign_lhs_incomplete"]={
		[b]="note_assign_lhs_incomplete",
		[c]="type %0 is incomplete",
		[e]="type A is incomplete",
		[g]=f,
		[h]="type (.*?) is incomplete",
		[i]=a,
		[j]=p,
		[k]={"a31efa07ff70",1377722135,"Improve error for assignment to incomplete class.","Improve error for assignment to incomplete class.\n\nPR7681.\n\nllvm-svn: 189510"},
		[d]={{cc,14260,"/// Create a binary operation that may resolve to an overloaded\n/// operator.\n///\n/// \\param OpLoc The location of the operator itself (e.g., \'+\').\n///\n/// \\param Opc The BinaryOperatorKind that describes this operator.\n///\n/// \\param Fns The set of non-member functions that will be\n/// considered by overload resolution. The caller needs to build this\n/// set based on the context using, e.g.,\n/// LookupOverloadedOperatorName() and ArgumentDependentLookup(). This\n/// set should not contain any member functions; those will be added\n/// by CreateOverloadedBinOp().\n///\n/// \\param LHS Left-hand argument.\n/// \\param RHS Right-hand argument.\n/// \\param PerformADL Whether to consider operator candidates found by ADL.\n/// \\param AllowRewrittenCandidates Whether to consider candidates found by\n///        C++20 operator rewrites.\n/// \\param DefaultedFn If we are synthesizing a defaulted operator function,\n///        the function in question. Such a function is never a candidate in\n///        our overload resolution. This also enables synthesizing a three-way\n///        comparison from < and == as described in C++20 [class.spaceship]p1.\nExprResult Sema::CreateOverloadedBinOp(SourceLocation OpLoc, BinaryOperatorKind Opc, const UnresolvedSetImpl &Fns, Expr *LHS, Expr *RHS, bool PerformADL, bool AllowRewrittenCandidates, FunctionDecl *DefaultedFn) {\n  // ...\n  case OR_No_Viable_Function: {\n    // ...\n    if (Args[0]->getType()->isRecordType() && Opc >= BO_Assign && Opc <= BO_OrAssign) {\n      // ...\n      if (Args[0]->getType()->isIncompleteType()) {\n        Diag(OpLoc, diag::note_assign_lhs_incomplete) << Args[0]->getType() << Args[0]->getSourceRange() << Args[1]->getSourceRange();"}},
		[m]={
			["clang/test/SemaCXX/overloaded-operator.cpp"]={"clang/test/SemaCXX/overloaded-operator.cpp:452:12: note: type \'PointerUnion<int *, float *>\' is incomplete"}
		}
	},
	["note_atomic_constraint_evaluated_to_false"]={
		[b]={{nil,l,"note_atomic_constraint_evaluated_to_false"}},
		[c]={{nil,l,"%select{and|because}0 \'%1\' evaluated to false"}},
		[e]={{nil,l,{{"and","because"}," \'B\' evaluated to false"}}},
		[g]=f,
		[h]="(?:and|because) \'(.*?)\' evaluated to false",
		[i]=a,
		[j]={{nil,l,p}},
		[k]={Ub,1569403888,Mb,Nb},
		[d]={{Gb,1134,"static void diagnoseWellFormedUnsatisfiedConstraintExpr(Sema &S, Expr *SubstExpr, bool First) {\n  // ...\n  S.Diag(SubstExpr->getSourceRange().getBegin(), diag::note_atomic_constraint_evaluated_to_false) << (int)First << SubstExpr;"}},
		[m]={
			["clang/test/SemaTemplate/instantiate-expanded-type-constraint.cpp"]={"clang/test/SemaTemplate/instantiate-expanded-type-constraint.cpp:18:14: note: because \'same_as<int, _Bool>\' evaluated to false","clang/test/SemaTemplate/instantiate-expanded-type-constraint.cpp:10:19: note: because \'is_same_v<int, _Bool>\' evaluated to false"}
		}
	},
	["note_atomic_constraint_evaluated_to_false_elaborated"]={
		[b]={{nil,l,"note_atomic_constraint_evaluated_to_false_elaborated"}},
		[c]={{nil,l,"%select{and|because}0 \'%1\' (%2 %3 %4) evaluated to false"}},
		[e]={{nil,l,{{"and","because"}," \'B\' (C D E) evaluated to false"}}},
		[g]=f,
		[h]="(?:and|because) \'(.*?)\' \\((.*?) (.*?) (.*?)\\) evaluated to false",
		[i]=a,
		[j]={{nil,l,p}},
		[k]={Ub,1569403888,Mb,Nb},
		[d]={{Gb,1078,"static void diagnoseWellFormedUnsatisfiedConstraintExpr(Sema &S, Expr *SubstExpr, bool First) {\n  // ...\n  if (BinaryOperator *BO = dyn_cast<BinaryOperator>(SubstExpr)) {\n    // ...\n    case BO_GE:\n    case BO_LE:\n    case BO_GT:\n    case BO_LT:\n    case BO_EQ:\n    case BO_NE:\n      if (BO->getLHS()->getType()->isIntegerType() && BO->getRHS()->getType()->isIntegerType()) {\n        // ...\n        if (!SimplifiedLHS.Diag && !SimplifiedRHS.Diag) {\n          S.Diag(SubstExpr->getBeginLoc(), diag::note_atomic_constraint_evaluated_to_false_elaborated) << (int)First << SubstExpr << toString(SimplifiedLHS.Val.getInt(), 10) << BinaryOperator::getOpcodeStr(BO->getOpcode()) << toString(SimplifiedRHS.Val.getInt(), 10);"}},
		[m]={
			["clang/test/SemaTemplate/concepts-PR54629.cpp"]={"clang/test/SemaTemplate/concepts-PR54629.cpp:31:38: note: because \'sizeof (t) < 4\' (4 < 4) evaluated to false","clang/test/SemaTemplate/concepts-PR54629.cpp:36:38: note: because \'sizeof (t) > 4\' (4 > 4) evaluated to false","clang/test/SemaTemplate/concepts-PR54629.cpp:41:38: note: because \'sizeof (t) > 8\' (4 > 8) evaluated to false"}
		}
	},
	["note_atomic_property_fixup_suggest"]={
		[b]="note_atomic_property_fixup_suggest",
		[c]={{nil,x,"setter and getter must both be synthesized, or both be user defined, or the property must be nonatomic"},{I,nil,"setter and getter must both be synthesized, or both be user defined,or the property must be nonatomic"}},
		[e]={{nil,x,"setter and getter must both be synthesized, or both be user defined, or the property must be nonatomic"},{I,nil,"setter and getter must both be synthesized, or both be user defined,or the property must be nonatomic"}},
		[g]=f,
		[h]="setter and getter must both be synthesized, or both be user defined, or the property must be nonatomic",
		[i]=a,
		[j]=p,
		[k]={"9cd57a7061c8",1317944878,"objc: Improve on diagnostic when atomic proeprty is synthesized","objc: Improve on diagnostic when atomic proeprty is synthesized\non one accessor and user-provide with another.\n\nllvm-svn: 141343"},
		[d]={{fb,2240,"void Sema::AtomicPropertySetterGetterRules(ObjCImplDecl *IMPDecl, ObjCInterfaceDecl *IDecl) {\n  // ...\n  for (ObjCContainerDecl::PropertyMap::iterator I = PM.begin(), E = PM.end(); I != E; ++I) {\n    // ...\n    if (const ObjCPropertyImplDecl *PIDecl = IMPDecl->FindPropertyImplDecl(Property->getIdentifier(), Property->getQueryKind())) {\n      // ...\n      if ((bool)GetterMethod ^ (bool)SetterMethod) {\n        // ...\n        // fixit stuff.\n        if (Property->getLParenLoc().isValid() && !(AttributesAsWritten & ObjCPropertyAttribute::kind_atomic)) {\n          // ...\n          Diag(Property->getLocation(), diag::note_atomic_property_fixup_suggest) << FixItHint::CreateInsertion(AfterLParen, NonatomicStr);"},{fb,2247,"void Sema::AtomicPropertySetterGetterRules(ObjCImplDecl *IMPDecl, ObjCInterfaceDecl *IDecl) {\n  // ...\n  for (ObjCContainerDecl::PropertyMap::iterator I = PM.begin(), E = PM.end(); I != E; ++I) {\n    // ...\n    if (const ObjCPropertyImplDecl *PIDecl = IMPDecl->FindPropertyImplDecl(Property->getIdentifier(), Property->getQueryKind())) {\n      // ...\n      if ((bool)GetterMethod ^ (bool)SetterMethod) {\n        // ...\n        // fixit stuff.\n        if (Property->getLParenLoc().isValid() && !(AttributesAsWritten & ObjCPropertyAttribute::kind_atomic)) {\n        // ...\n        } else if (Property->getLParenLoc().isInvalid()) {\n          // ...\n          Diag(Property->getLocation(), diag::note_atomic_property_fixup_suggest) << FixItHint::CreateInsertion(startLoc, \"(nonatomic) \");"},{fb,2250,"void Sema::AtomicPropertySetterGetterRules(ObjCImplDecl *IMPDecl, ObjCInterfaceDecl *IDecl) {\n  // ...\n  for (ObjCContainerDecl::PropertyMap::iterator I = PM.begin(), E = PM.end(); I != E; ++I) {\n    // ...\n    if (const ObjCPropertyImplDecl *PIDecl = IMPDecl->FindPropertyImplDecl(Property->getIdentifier(), Property->getQueryKind())) {\n      // ...\n      if ((bool)GetterMethod ^ (bool)SetterMethod) {\n        // ...\n        // fixit stuff.\n        if (Property->getLParenLoc().isValid() && !(AttributesAsWritten & ObjCPropertyAttribute::kind_atomic)) {\n        // ...\n        } else if (Property->getLParenLoc().isInvalid()) {\n        // ...\n        } else\n          Diag(MethodLoc, diag::note_atomic_property_fixup_suggest);"}},
		[m]={
			["clang/test/SemaObjC/atomic-property-synthesis-rules.m"]={"clang/test/SemaObjC/atomic-property-synthesis-rules.m:110:15: note: setter and getter must both be synthesized, or both be user defined, or the property must be nonatomic","clang/test/SemaObjC/atomic-property-synthesis-rules.m:112:15: note: setter and getter must both be synthesized, or both be user defined, or the property must be nonatomic","clang/test/SemaObjC/atomic-property-synthesis-rules.m:206:26: note: setter and getter must both be synthesized, or both be user defined, or the property must be nonatomic","clang/test/SemaObjC/atomic-property-synthesis-rules.m:208:26: note: setter and getter must both be synthesized, or both be user defined, or the property must be nonatomic","clang/test/SemaObjC/atomic-property-synthesis-rules.m:143:15: note: setter and getter must both be synthesized, or both be user defined, or the property must be nonatomic","clang/test/SemaObjC/atomic-property-synthesis-rules.m:145:15: note: setter and getter must both be synthesized, or both be user defined, or the property must be nonatomic","clang/test/SemaObjC/atomic-property-synthesis-rules.m:217:26: note: setter and getter must both be synthesized, or both be user defined, or the property must be nonatomic","clang/test/SemaObjC/atomic-property-synthesis-rules.m:219:26: note: setter and getter must both be synthesized, or both be user defined, or the property must be nonatomic"}
		}
	},
	["note_attribute"]={
		[b]="note_attribute",
		[c]="attribute is here",
		[e]="attribute is here",
		[g]=f,
		[h]="attribute is here",
		[i]=a,
		[j]=p,
		[k]={"078d2f89cd6a",1401382220,"Sema: Check dll attributes on static data members","Sema: Check dll attributes on static data members\n\nRedeclarations cannot add a dll attribute and static data members cannot\nbe defined.\n\nllvm-svn: 209825"},
		[d]={{M,7131,"static void checkDLLAttributeRedeclaration(Sema &S, NamedDecl *OldDecl, NamedDecl *NewDecl, bool IsSpecialization, bool IsDefinition) {\n  // ...\n  if (OldImportAttr && !HasNewAttr && (!IsInline || (IsMicrosoftABI && IsTemplate)) && !IsStaticDataMember && !NewDecl->isLocalExternDecl() && !IsQualifiedFriend) {\n    if (IsMicrosoftABI && IsDefinition) {\n      if (IsSpecialization) {\n        // ...\n        S.Diag(OldImportAttr->getLocation(), diag::note_attribute);"},{M,14447,"/// FinalizeDeclaration - called by ParseDeclarationAfterDeclarator to perform\n/// any semantic actions necessary after any initializer has been attached.\nvoid Sema::FinalizeDeclaration(Decl *ThisDecl) {\n  // ...\n  // Imported static data members cannot be defined out-of-line.\n  if (const auto *IA = dyn_cast_or_null<DLLImportAttr>(DLLAttr)) {\n    if (VD->isStaticDataMember() && VD->isOutOfLine() && VD->isThisDeclarationADefinition()) {\n      // ...\n      Diag(IA->getLocation(), diag::note_attribute);"},{M,15936,"Decl *Sema::ActOnFinishFunctionBody(Decl *dcl, Stmt *Body, bool IsInstantiation) {\n  // ...\n  {\n    // ...\n    // Verify and clean out per-function state.\n    if (Body && (!FD || !FD->isDefaulted())) {\n      // ...\n      if (FD && FD->hasAttr<NakedAttr>()) {\n        for (const Stmt *S : Body->children()) {\n          // ...\n          if (!isa<AsmStmt>(S) && !isa<NullStmt>(S)) {\n            // ...\n            Diag(FD->getAttr<NakedAttr>()->getLocation(), diag::note_attribute);"},{t,6658,"/// Perform propagation of DLL attributes from a derived class to a\n/// templated base class for MS compatibility.\nvoid Sema::propagateDLLAttrToBaseClassTemplate(CXXRecordDecl *Class, Attr *ClassAttr, ClassTemplateSpecializationDecl *BaseTemplateSpec, SourceLocation BaseLoc) {\n  // ...\n  Diag(ClassAttr->getLocation(), diag::note_attribute);"},{Pb,144,"static bool CheckNakedParmReference(Expr *E, Sema &S) {\n  // ...\n  while (WorkList.size()) {\n    // ...\n    if (isa<CXXThisExpr>(E)) {\n      // ...\n      S.Diag(Func->getAttr<NakedAttr>()->getLocation(), diag::note_attribute);"},{Pb,150,"static bool CheckNakedParmReference(Expr *E, Sema &S) {\n  // ...\n  while (WorkList.size()) {\n    // ...\n    if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) {\n      if (isa<ParmVarDecl>(DRE->getDecl())) {\n        // ...\n        S.Diag(Func->getAttr<NakedAttr>()->getLocation(), diag::note_attribute);"},{vb,9996,"// 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 (TSK == TSK_ExplicitInstantiationDeclaration && !Context.getTargetInfo().getTriple().isWindowsGNUEnvironment()) {\n    // Check for dllexport class template instantiation declarations,\n    // except for MinGW mode.\n    for (const ParsedAttr &AL : Attr) {\n      if (AL.getKind() == ParsedAttr::AT_DLLExport) {\n        // ...\n        Diag(AL.getLoc(), diag::note_attribute);"},{vb,10004,"// 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 (TSK == TSK_ExplicitInstantiationDeclaration && !Context.getTargetInfo().getTriple().isWindowsGNUEnvironment()) {\n    // ...\n    if (auto *A = ClassTemplate->getTemplatedDecl()->getAttr<DLLExportAttr>()) {\n      // ...\n      Diag(A->getLocation(), diag::note_attribute);"}},
		[m]={
			["clang/test/Sema/attr-naked.c"]={"clang/test/Sema/attr-naked.c:13:16: note: attribute is here","clang/test/Sema/attr-naked.c:38:16: note: attribute is here","clang/test/Sema/attr-naked.c:45:16: note: attribute is here","clang/test/Sema/attr-naked.c:52:16: note: attribute is here","clang/test/Sema/attr-naked.c:56:16: note: attribute is here","clang/test/Sema/attr-naked.c:60:16: note: attribute is here"}
		}
	},
	["note_attribute_has_no_effect_on_compile_time_if_here"]={
		[b]={{nil,K,"note_attribute_has_no_effect_on_compile_time_if_here"}},
		[c]={{nil,K,"annotating the \'if %select{constexpr|consteval}0\' statement here"}},
		[e]={{nil,K,{"annotating the \'if ",{"constexpr","consteval"},"\' statement here"}}},
		[g]=f,
		[h]="annotating the \'if (?:constexpr|consteval)\' statement here",
		[i]=a,
		[j]={{nil,K,p}},
		[k]={nc,1615397021,tc,sc},
		[d]={{ib,912,"StmtResult Sema::ActOnIfStmt(SourceLocation IfLoc, IfStatementKind StatementKind, SourceLocation LParenLoc, Stmt *InitStmt, ConditionResult Cond, SourceLocation RParenLoc, Stmt *thenStmt, SourceLocation ElseLoc, Stmt *elseStmt) {\n  // ...\n  if (ConstevalOrNegatedConsteval || StatementKind == IfStatementKind::Constexpr) {\n    auto DiagnoseLikelihood = [&](const Stmt *S) {\n      if (const Attr *A = Stmt::getLikelihoodAttr(S)) {\n        // ...\n        Diags.Report(IfLoc, diag::note_attribute_has_no_effect_on_compile_time_if_here) << ConstevalOrNegatedConsteval << SourceRange(IfLoc, (ConstevalOrNegatedConsteval ? thenStmt->getBeginLoc() : LParenLoc).getLocWithOffset(-1));"}},
		[m]={
			["clang/test/CXX/stmt.stmt/stmt.select/stmt.if/p4.cpp"]={"clang/test/CXX/stmt.stmt/stmt.select/stmt.if/p4.cpp:40:3: note: annotating the \'if consteval\' statement here","clang/test/CXX/stmt.stmt/stmt.select/stmt.if/p4.cpp:40:3: note: annotating the \'if consteval\' statement here"}
		}
	},
	["note_attribute_has_no_effect_on_infinite_loop_here"]={
		[b]={{nil,u,"note_attribute_has_no_effect_on_infinite_loop_here"}},
		[c]={{nil,u,"annotating the infinite loop here"}},
		[e]={{nil,u,"annotating the infinite loop here"}},
		[g]=f,
		[h]="annotating the infinite loop here",
		[i]=a,
		[j]={{nil,u,p}},
		[k]={Xb,1590001902,bc,dc},
		[d]={{"clang/lib/CodeGen/CGStmt.cpp",937,"void CodeGenFunction::EmitWhileStmt(const WhileStmt &S, ArrayRef<const Attr *> WhileAttrs) {\n  // ...\n  if (EmitBoolCondBranch) {\n  // ...\n  } else if (const Attr *A = Stmt::getLikelihoodAttr(S.getBody())) {\n    // ...\n    CGM.getDiags().Report(S.getWhileLoc(), diag::note_attribute_has_no_effect_on_infinite_loop_here) << SourceRange(S.getWhileLoc(), S.getRParenLoc());"}},
		[m]={
			["clang/test/CodeGenCXX/attr-likelihood-iteration-stmt.cpp"]={"clang/test/CodeGenCXX/attr-likelihood-iteration-stmt.cpp:63:3: note: annotating the infinite loop here"}
		}
	},
	["note_attribute_overloadable_prev_overload"]={
		[b]="note_attribute_overloadable_prev_overload",
		[c]="previous overload of function is here",
		[e]="previous overload of function is here",
		[g]=f,
		[h]="previous (?:unmarked |)overload of function is here",
		[i]=a,
		[j]=p,
		[k]={"b1c4d5507fad",1236199783,"The basic representation of diagnostics information in tablegen format, plus (uncommented and incomp...","The basic representation of diagnostics information in tablegen format, plus (uncommented and incomplete) test conversions of the existing def files to this format.\n\nllvm-svn: 66064"},
		[d]={{M,3752,"/// MergeFunctionDecl - We just parsed a function \'New\' from\n/// declarator D which has the same name and scope as a previous\n/// declaration \'Old\'.  Figure out how to resolve this situation,\n/// merging decls or emitting diagnostics as appropriate.\n///\n/// In C++, New and Old must be declarations that are not\n/// overloaded. Use IsOverload to determine whether New and Old are\n/// overloaded, and to select the Old declaration that New should be\n/// merged with.\n///\n/// Returns true if there was an error, false otherwise.\nbool Sema::MergeFunctionDecl(FunctionDecl *New, NamedDecl *&OldD, Scope *S, bool MergeTypeWithOld, bool NewDeclIsDefn) {\n  // ...\n  if (!getLangOpts().CPlusPlus) {\n    // ...\n    if (OldOvl != New->hasAttr<OverloadableAttr>() && !Old->isImplicit()) {\n      // ...\n      if (DiagOld)\n        Diag(DiagOld->getLocation(), diag::note_attribute_overloadable_prev_overload) << OldOvl;"},{M,11889,"/// Perform semantic checking of a new function declaration.\n///\n/// Performs semantic analysis of the new function declaration\n/// NewFD. This routine performs all semantic checking that does not\n/// require the actual declarator involved in the declaration, and is\n/// used both for the declaration of functions as they are parsed\n/// (called via ActOnDeclarator) and for the declaration of functions\n/// that have been instantiated via C++ template instantiation (called\n/// via InstantiateDecl).\n///\n/// \\param IsMemberSpecialization whether this new function declaration is\n/// a member specialization (that replaces any definition provided by the\n/// previous declaration).\n///\n/// This sets NewFD->isInvalidDecl() to true if there was an error.\n///\n/// \\returns true if the function declaration is a redeclaration.\nbool Sema::CheckFunctionDeclaration(Scope *S, FunctionDecl *NewFD, LookupResult &Previous, bool IsMemberSpecialization, bool DeclIsDefn) {\n  // ...\n  if (Redeclaration) {\n  // ...\n  } else if (!getLangOpts().CPlusPlus && MayNeedOverloadableChecks && !NewFD->getAttr<OverloadableAttr>()) {\n    // ...\n    if (OtherUnmarkedIter != Previous.end()) {\n      // ...\n      Diag((*OtherUnmarkedIter)->getLocation(), diag::note_attribute_overloadable_prev_overload) << false;"}},
		[m]={
			["clang/test/Sema/overloadable.c"]={"clang/test/Sema/overloadable.c:7:6: note: previous overload of function is here","clang/test/Sema/overloadable.c:78:35: note: previous unmarked overload of function is here","clang/test/Sema/overloadable.c:180:6: note: previous overload of function is here","clang/test/Sema/overloadable.c:185:6: note: previous overload of function is here","clang/test/Sema/overloadable.c:185:6: note: previous overload of function is here","clang/test/Sema/overloadable.c:191:6: note: previous unmarked overload of function is here","clang/test/Sema/overloadable.c:192:6: note: previous overload of function is here","clang/test/Sema/overloadable.c:192:6: note: previous overload of function is here","clang/test/Sema/overloadable.c:200:6: note: previous overload of function is here","clang/test/Sema/overloadable.c:204:6: note: previous overload of function is here","clang/test/Sema/overloadable.c:209:6: note: previous unmarked overload of function is here","clang/test/Sema/overloadable.c:209:6: note: previous unmarked overload of function is here","clang/test/Sema/overloadable.c:209:6: note: previous unmarked overload of function is here","clang/test/Sema/overloadable.c:217:6: note: previous overload of function is here","clang/test/Sema/overloadable.c:221:6: note: previous unmarked overload of function is here","clang/test/Sema/overloadable.c:230:6: note: previous unmarked overload of function is here","clang/test/Sema/overloadable.c:233:6: note: previous unmarked overload of function is here","clang/test/Sema/overloadable.c:240:6: note: previous unmarked overload of function is here"}
		}
	},
	["note_auto_readonly_iboutlet_fixup_suggest"]={
		[b]="note_auto_readonly_iboutlet_fixup_suggest",
		[c]="property should be changed to be readwrite",
		[e]="property should be changed to be readwrite",
		[g]=f,
		[h]="property should be changed to be readwrite",
		[i]=a,
		[j]=p,
		[k]={"199a9b57a6bb",1337451437,"objective-c: Warn if default synthesizing readonly IBOutlet properties","objective-c: Warn if default synthesizing readonly IBOutlet properties\nand provide a \'fixit\' to change \'readonly\' to \'readwrite\'. \'fixit\'\npart needs little more work. // rdar://11448209\n\nllvm-svn: 157121"},
		[d]={{fb,1165,"/// 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 (Synthesize && (PIkind & ObjCPropertyAttribute::kind_readonly) && property->hasAttr<IBOutletAttr>() && !AtLoc.isValid()) {\n      // ...\n      if (!ReadWriteProperty) {\n        // ...\n        if (LocPropertyAttribute(Context, \"readonly\", property->getLParenLoc(), readonlyLoc)) {\n          // ...\n          Diag(property->getLocation(), diag::note_auto_readonly_iboutlet_fixup_suggest) << FixItHint::CreateReplacement(ReadonlySourceRange, \"readwrite\");"}},
		[m]={
			["clang/test/SemaObjC/iboutlet.m"]={"clang/test/SemaObjC/iboutlet.m:10:66: note: property should be changed to be readwrite","clang/test/SemaObjC/iboutlet.m:12:53: note: property should be changed to be readwrite","clang/test/SemaObjC/iboutlet.m:28:58: note: property should be changed to be readwrite"}
		}
	},
	["note_availability_specified_here"]={
		[b]="note_availability_specified_here",
		[c]={{nil,s,"%0 has been explicitly marked %select{unavailable|deleted|deprecated}1 here"},{"7.1",nil,"%0 has been explicitly marked %select{unavailable|deleted|deprecated|partial}1 here"}},
		[e]={{nil,s,{"A has been explicitly marked ",{"unavailable","deleted","deprecated"}," here"}},{"7.1",nil,{"A has been explicitly marked ",{"unavailable","deleted","deprecated","partial"}," here"}}},
		[g]=f,
		[h]="(.*?) has been explicitly marked (?:unavailable|deleted|deprecated) here",
		[i]=a,
		[j]=p,
		[k]={"b79ee57080fa",1387409406,"Implemented delayed processing of \'unavailable\' checking, just like with \'deprecated\'.","Implemented delayed processing of \'unavailable\' checking, just like with \'deprecated\'.\n\nFixes <rdar://problem/15584219> and <rdar://problem/12241361>.\n\nThis change looks large, but all it does is reuse and consolidate\nthe delayed diagnostic logic for deprecation warnings with unavailability\nwarnings.  By doing so, it showed various inconsistencies between the\ndiagnostics, which were close, but not consistent.  It also revealed\nsome missing \"note:\"\'s in the deprecated diagnostics that were showing\nup in the unavailable diagnostics, etc.\n\nThis change also changes the wording of the core deprecation diagnostics.\nInstead of saying \"function has been explicitly marked deprecated\"\nwe now saw \"\'X\' has been been explicitly marked deprecated\".  It\nturns out providing a bit more context is useful, and often we\ngot the actual term wrong or it was not very precise\n (e.g., \"function\" instead of \"destructor\").  By just saying the name\nof the thing that is deprecated/deleted/unavailable we define\nthis issue away.  This diagnostic can likely be further wordsmithed\nto be shorter.\n\nllvm-svn: 197627"},
		[d]={{hb,337,"/// Actually emit an availability diagnostic for a reference to an unavailable\n/// decl.\n///\n/// \\param Ctx The context that the reference occurred in\n/// \\param ReferringDecl The exact declaration that was referenced.\n/// \\param OffendingDecl A related decl to \\c ReferringDecl that has an\n/// availability attribute corresponding to \\c K attached to it. Note that this\n/// may not be the same as ReferringDecl, i.e. if an EnumDecl is annotated and\n/// we refer to a member EnumConstantDecl, ReferringDecl is the EnumConstantDecl\n/// and OffendingDecl is the EnumDecl.\nstatic void DoEmitAvailabilityWarning(Sema &S, AvailabilityResult K, Decl *Ctx, const NamedDecl *ReferringDecl, const NamedDecl *OffendingDecl, StringRef Message, ArrayRef<SourceLocation> Locs, const ObjCInterfaceDecl *UnknownObjCClass, const ObjCPropertyDecl *ObjCProperty, bool ObjCPropertyAccess) {\n  // ...\n  unsigned diag_available_here = diag::note_availability_specified_here;"},{hb,343,"/// Actually emit an availability diagnostic for a reference to an unavailable\n/// decl.\n///\n/// \\param Ctx The context that the reference occurred in\n/// \\param ReferringDecl The exact declaration that was referenced.\n/// \\param OffendingDecl A related decl to \\c ReferringDecl that has an\n/// availability attribute corresponding to \\c K attached to it. Note that this\n/// may not be the same as ReferringDecl, i.e. if an EnumDecl is annotated and\n/// we refer to a member EnumConstantDecl, ReferringDecl is the EnumConstantDecl\n/// and OffendingDecl is the EnumDecl.\nstatic void DoEmitAvailabilityWarning(Sema &S, AvailabilityResult K, Decl *Ctx, const NamedDecl *ReferringDecl, const NamedDecl *OffendingDecl, StringRef Message, ArrayRef<SourceLocation> Locs, const ObjCInterfaceDecl *UnknownObjCClass, const ObjCPropertyDecl *ObjCProperty, bool ObjCPropertyAccess) {\n  // ...\n  // Matches diag::note_availability_specified_here."},{z,135,"/// Emit a note explaining that this function is deleted.\nvoid Sema::NoteDeletedFunction(FunctionDecl *Decl) {\n  // ...\n  Diag(Decl->getLocation(), diag::note_availability_specified_here) << Decl << 1;"}},
		[m]={
			["clang/test/SemaCXX/cxx0x-delegating-ctors.cpp"]={"clang/test/SemaCXX/cxx0x-delegating-ctors.cpp:46:3: note: \'~deleted_dtor\' has been explicitly marked deleted here"}
		}
	},
	["note_await_ready_no_bool_conversion"]={
		[b]={{nil,G,"note_await_ready_no_bool_conversion"}},
		[c]={{nil,G,"return type of \'await_ready\' is required to be contextually convertible to \'bool\'"}},
		[e]={{nil,G,"return type of \'await_ready\' is required to be contextually convertible to \'bool\'"}},
		[g]=f,
		[h]="return type of \'await_ready\' is required to be contextually convertible to \'bool\'",
		[i]=a,
		[j]={{nil,G,Jb}},
		[k]={"d978e53c6d70",1495995672,"[coroutines] Diagnose invalid result  types for `await_resume` and `await_suspend` and add missing c...","[coroutines] Diagnose invalid result  types for `await_resume` and `await_suspend` and add missing conversions.\n\nSummary:\nThe expression `await_ready` is required to be contextually convertible to bool and `await_suspend` must be a prvalue of either `void` or `bool`.\nThis patch adds diagnostics for when those requirements are violated.\n\nIt also correctly performs the contextual conversion to bool on the result of `await_ready`\n\n\n\nReviewers: GorNishanov, rsmith\n\nReviewed By: GorNishanov\n\nSubscribers: cfe-commits\n\nDifferential Revision: https://reviews.llvm.org/D33625\n\nllvm-svn: 304094"},
		[d]={{V,408,"/// Build calls to await_ready, await_suspend, and await_resume for a co_await\n/// expression.\n/// The generated AST tries to clean up temporary objects as early as\n/// possible so that they don\'t live across suspension points if possible.\n/// Having temporary objects living across suspension points unnecessarily can\n/// lead to large frame size, and also lead to memory corruptions if the\n/// coroutine frame is destroyed after coming back from suspension. This is done\n/// by wrapping both the await_ready call and the await_suspend call with\n/// ExprWithCleanups. In the end of this function, we also need to explicitly\n/// set cleanup state so that the CoawaitExpr is also wrapped with an\n/// ExprWithCleanups to clean up the awaiter associated with the co_await\n/// expression.\nstatic ReadySuspendResumeResult buildCoawaitCalls(Sema &S, VarDecl *CoroPromise, SourceLocation Loc, Expr *E) {\n  // ...\n  if (!AwaitReady->getType()->isDependentType()) {\n    // ...\n    if (Conv.isInvalid()) {\n      S.Diag(AwaitReady->getDirectCallee()->getBeginLoc(), diag::note_await_ready_no_bool_conversion);"}},
		[m]={
			["clang/test/SemaCXX/coroutines.cpp"]={"clang/test/SemaCXX/coroutines.cpp:1016:3: note: return type of \'await_ready\' is required to be contextually convertible to \'bool\'"}
		}
	},
	["note_bad_memaccess_silence"]={
		[b]="note_bad_memaccess_silence",
		[c]="explicitly cast the pointer to silence this warning",
		[e]="explicitly cast the pointer to silence this warning",
		[g]=f,
		[h]="explicitly cast the pointer to silence this warning",
		[i]=a,
		[j]=p,
		[k]={"ac6872655bc6",1307082237,"Clean up the \"non-POD memaccess\" stuff some. This adds a properly named","Clean up the \"non-POD memaccess\" stuff some. This adds a properly named\ndiagnostic group to cover the cases where we have definitively bad\nbehavior: dynamic classes.\n\nIt also rips out the existing support for POD-based checking. This\ndidn\'t work well, and triggered too many false positives. I\'m looking\ninto a possibly more principled way to warn on the fundamental buggy\nconstruct here. POD-ness isn\'t the critical aspect anyways, so a clean\nslate is better. This also removes some silliness from the code until\nthe new checks arrive.\n\nllvm-svn: 132534"},
		[d]={{tb,12604,"/// Check for dangerous or invalid arguments to memset().\n///\n/// This issues warnings on known problematic, dangerous or unspecified\n/// arguments to the standard \'memset\', \'memcpy\', \'memmove\', and \'memcmp\'\n/// function calls.\n///\n/// \\param Call The call expression to diagnose.\nvoid Sema::CheckMemaccessArguments(const CallExpr *Call, unsigned BId, IdentifierInfo *FnName) {\n  // ...\n  for (unsigned ArgIdx = 0; ArgIdx != LastArg; ++ArgIdx) {\n    // ...\n    DiagRuntimeBehavior(Dest->getExprLoc(), Dest, PDiag(diag::note_bad_memaccess_silence) << FixItHint::CreateInsertion(ArgRange.getBegin(), \"(void*)\"));"}},
		[m]={
			["clang/test/SemaObjC/warn-nontrivial-struct-memaccess.m"]={"clang/test/SemaObjC/warn-nontrivial-struct-memaccess.m:34:10: note: explicitly cast the pointer to silence this warning","clang/test/SemaObjC/warn-nontrivial-struct-memaccess.m:36:9: note: explicitly cast the pointer to silence this warning","clang/test/SemaObjC/warn-nontrivial-struct-memaccess.m:37:10: note: explicitly cast the pointer to silence this warning","clang/test/SemaObjC/warn-nontrivial-struct-memaccess.m:38:11: note: explicitly cast the pointer to silence this warning"}
		}
	},
	["note_base_class_specified_here"]={
		[b]="note_base_class_specified_here",
		[c]="base class %0 specified here",
		[e]="base class A specified here",
		[g]=f,
		[h]="base class (.*?) specified here",
		[i]=a,
		[j]=p,
		[k]={"43a0857631ab",1262823985,"When we typo-correct a base class initializer, point to the base class","When we typo-correct a base class initializer, point to the base class\nspecifier that we corrected to.\n\nllvm-svn: 92878"},
		[d]={{t,2759,"/// Check the validity of a C++ base class specifier.\n///\n/// \\returns a new CXXBaseSpecifier if well-formed, emits diagnostics\n/// and returns NULL otherwise.\nCXXBaseSpecifier *Sema::CheckBaseSpecifier(CXXRecordDecl *Class, SourceRange SpecifierRange, bool Virtual, AccessSpecifier Access, TypeSourceInfo *TInfo, SourceLocation EllipsisLoc) {\n  // ...\n  if ((DerivedCSA || BaseCSA) && (!BaseCSA || !DerivedCSA || BaseCSA->getName() != DerivedCSA->getName())) {\n    // ...\n    Diag(CXXBaseDecl->getLocation(), diag::note_base_class_specified_here) << CXXBaseDecl;"},{t,4500,"/// Handle a C++ member initializer.\nMemInitResult Sema::BuildMemInitializer(Decl *ConstructorD, Scope *S, CXXScopeSpec &SS, IdentifierInfo *MemberOrBase, ParsedType TemplateTypeTy, const DeclSpec &DS, SourceLocation IdLoc, Expr *Init, SourceLocation EllipsisLoc) {\n  // ...\n  if (TemplateTypeTy) {\n  // ...\n  } else if (DS.getTypeSpecType() == TST_decltype) {\n  // ...\n  } else if (DS.getTypeSpecType() == TST_decltype_auto) {\n  // ...\n  } else {\n    // ...\n    if (!TyD) {\n      // ...\n      if (R.empty() && BaseType.isNull() && (Corr = CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), S, &SS, CCC, CTK_ErrorRecovery, ClassDecl))) {\n        if (FieldDecl *Member = Corr.getCorrectionDeclAs<FieldDecl>()) {\n        // ...\n        } else if (TypeDecl *Type = Corr.getCorrectionDeclAs<TypeDecl>()) {\n          // ...\n          if (FindBaseInitializer(*this, ClassDecl, Context.getTypeDeclType(Type), DirectBaseSpec, VirtualBaseSpec)) {\n            // ...\n            Diag(BaseSpec->getBeginLoc(), diag::note_base_class_specified_here) << BaseSpec->getType() << BaseSpec->getSourceRange();"}},
		[m]={
			["clang/test/SemaCXX/code-seg.cpp"]={"clang/test/SemaCXX/code-seg.cpp:24:40: note: base class \'Base1\' specified here","clang/test/SemaCXX/code-seg.cpp:24:40: note: base class \'Base1\' specified here","clang/test/SemaCXX/code-seg.cpp:25:8: note: base class \'Base2\' specified here","clang/test/SemaCXX/code-seg.cpp:25:8: note: base class \'Base2\' specified here","clang/test/SemaCXX/code-seg.cpp:24:40: note: base class \'Base1\' specified here","clang/test/SemaCXX/code-seg.cpp:25:8: note: base class \'Base2\' specified here"}
		}
	},
	["note_bitfield_decl"]={
		[b]="note_bitfield_decl",
		[c]="bit-field is declared here",
		[e]="bit-field is declared here",
		[g]=f,
		[h]="bit\\-field is declared here",
		[i]=a,
		[j]=p,
		[k]={"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"},
		[d]={{z,16704,"ExprResult Sema::BuildBuiltinOffsetOf(SourceLocation BuiltinLoc, TypeSourceInfo *TInfo, ArrayRef<OffsetOfComponent> Components, SourceLocation RParenLoc) {\n  // ...\n  for (const OffsetOfComponent &OC : Components) {\n    // ...\n    // C99 7.17p3:\n    //   (If the specified member is a bit-field, the behavior is undefined.)\n    //\n    // We diagnose this as an error.\n    if (MemberDecl->isBitField()) {\n      // ...\n      Diag(MemberDecl->getLocation(), diag::note_bitfield_decl);"},{"clang/lib/Sema/SemaInit.cpp",9722,"bool InitializationSequence::Diagnose(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, ArrayRef<Expr *> Args) {\n  // ...\n  case FK_NonConstLValueReferenceBindingToBitfield: {\n    // ...\n    if (BitField)\n      S.Diag(BitField->getLocation(), diag::note_bitfield_decl);"},{Pb,956,"StmtResult Sema::ActOnMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, ArrayRef<Token> AsmToks, StringRef AsmString, unsigned NumOutputs, unsigned NumInputs, ArrayRef<StringRef> Constraints, ArrayRef<StringRef> Clobbers, ArrayRef<Expr *> Exprs, SourceLocation EndLoc) {\n  // ...\n  for (uint64_t I = 0; I < NumOutputs + NumInputs; ++I) {\n    // ...\n    if (E->getType()->isBitIntType()) {\n    // ...\n    } else if (E->refersToBitField()) {\n      // ...\n      Diag(BitField->getLocation(), diag::note_bitfield_decl);"}},
		[m]={
			["clang/test/SemaObjCXX/references.mm"]={"clang/test/SemaObjCXX/references.mm:70:12: note: bit-field is declared here"}
		}
	},
	["note_block_var_fixit_add_initialization"]={
		[b]="note_block_var_fixit_add_initialization",
		[c]="did you mean to use __block %0?",
		[e]="did you mean to use __block A?",
		[g]=f,
		[h]="did you mean to use __block (.*?)\\?",
		[i]=a,
		[j]=p,
		[k]={"429fadb8e262",1331166170,"improve on diagnostic and provide a fixit hint when","improve on diagnostic and provide a fixit hint when\nan uninitialized block variable is being called inside the\nblock literal. // rdar://10817031\n\nllvm-svn: 152271"},
		[d]={{"clang/lib/Sema/AnalysisBasedWarnings.cpp",776,"static bool SuggestInitializationFixit(Sema &S, const VarDecl *VD) {\n  // ...\n  if (VariableTy->isBlockPointerType() && !VD->hasAttr<BlocksAttr>()) {\n    S.Diag(VD->getLocation(), diag::note_block_var_fixit_add_initialization) << VD->getDeclName() << FixItHint::CreateInsertion(VD->getLocation(), \"__block \");"}},
		[m]={
			["clang/test/FixIt/fixit-recursive-block.c"]={"clang/test/FixIt/fixit-recursive-block.c:8:12: note: did you mean to use __block \'arc_fail\'?"}
		}
	},
	["note_bracket_depth"]={
		[b]="note_bracket_depth",
		[c]="use -fbracket-depth=N to increase maximum nesting level",
		[e]="use -fbracket-depth=N to increase maximum nesting level",
		[g]=f,
		[h]="use \\-fbracket\\-depth\\=N to increase maximum nesting level",
		[i]=a,
		[j]="Parse Issue",
		[k]={"b3a145293dc8",1361498391,"Add -fbracket-depth=N, analogous to -ftemplate-depth= and -fconstexpr-depth=,","Add -fbracket-depth=N, analogous to -ftemplate-depth= and -fconstexpr-depth=,\nto control the check for the C 5.2.4.1 / C++ [implimits] restriction on nesting\nlevels for parentheses, brackets and braces.\n\nSome code with heavy macro use exceeds the default limit of 256, but we don\'t\nwant to increase it generally to avoid stack overflow on stack-constrained\nsystems.\n\nllvm-svn: 175855"},
		[d]={{"clang/lib/Parse/Parser.cpp",2698,"bool BalancedDelimiterTracker::diagnoseOverflow() {\n  // ...\n  P.Diag(P.Tok, diag::note_bracket_depth);"}},
		[m]={
			["clang/test/SemaCXX/fold_expr_expansion_limit.cpp"]={"clang/test/SemaCXX/fold_expr_expansion_limit.cpp:4:43: note: use -fbracket-depth=N to increase maximum nesting level"}
		}
	},
	["note_building_builtin_dump_struct_call"]={
		[b]={{nil,I,"note_building_builtin_dump_struct_call"}},
		[c]={{nil,I,"in call to printing function with arguments \'(%0)\' while dumping struct"}},
		[e]={{nil,I,"in call to printing function with arguments \'(A)\' while dumping struct"}},
		[g]=f,
		[h]="in call to printing function with arguments \'\\((.*?)\\)\' while dumping struct",
		[i]=a,
		[j]={{nil,I,p}},
		[k]={"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"},
		[d]={{U,1009,"/// Prints the current instantiation stack through a series of\n/// notes.\nvoid Sema::PrintInstantiationStack() {\n  // ...\n  for (SmallVectorImpl<CodeSynthesisContext>::reverse_iterator Active = CodeSynthesisContexts.rbegin(), ActiveEnd = CodeSynthesisContexts.rend(); Active != ActiveEnd; ++Active, ++InstantiationIdx) {\n    // ...\n    case CodeSynthesisContext::BuildingBuiltinDumpStructCall:\n      Diags.Report(Active->PointOfInstantiation, diag::note_building_builtin_dump_struct_call) << convertCallArgsToString(*this, llvm::ArrayRef(Active->CallArgs, Active->NumCallArgs));"}},
		[m]={
			["clang/test/Sema/builtin-dump-struct.c"]={"clang/test/Sema/builtin-dump-struct.c:18:3: note: in call to printing function with arguments \'(\"%s\", \"struct A\")\' while dumping struct","clang/test/Sema/builtin-dump-struct.c:19:3: note: in call to printing function with arguments \'(\"%s\", \"struct A\")\' while dumping struct","clang/test/Sema/builtin-dump-struct.c:21:3: note: in call to printing function with arguments \'(\"%s\", \"struct A\")\' while dumping struct"}
		}
	},
	["note_called_by"]={
		[b]="note_called_by",
		[c]="called by %0",
		[e]="called by A",
		[g]=f,
		[h]="called by (.*?)",
		[i]=a,
		[j]=p,
		[k]={"6c86e9160d9b",1476911701,"[CUDA] When we emit an error that might have been deferred, also print a callstack.","[CUDA] When we emit an error that might have been deferred, also print a callstack.\n\nSummary:\nPreviously, when you did something not allowed in a host+device function\nand then caused it to be codegen\'ed, we would print out an error telling\nyou that you did something bad, but we wouldn\'t tell you how we decided\nthat the function needed to be codegen\'ed.\n\nThis change causes us to print out a callstack when emitting deferred\nerrors.  This is immensely helpful when debugging highly-templated code,\nwhere it\'s often unclear how a function became known-emitted.\n\nWe only print the callstack once per function, after we print the all\ndeferred errors.\n\nThis patch also switches all of our hashtables to using canonical\nFunctionDecls instead of regular FunctionDecls.  This prevents a number\nof bugs, some of which are caught by tests added here, in which we\nassume that two FDs for the same function have the same pointer value.\n\nReviewers: rnk\n\nSubscribers: cfe-commits, tra\n\nDifferential Revision: https://reviews.llvm.org/D25704\n\nllvm-svn: 284647"},
		[d]={{"clang/lib/Sema/Sema.cpp",1629,"// Print notes showing how we can reach FD starting from an a priori\n// known-callable function.\nstatic void emitCallStackNotes(Sema &S, const FunctionDecl *FD) {\n  // ...\n  while (FnIt != S.DeviceKnownEmittedFns.end()) {\n    // ...\n    DiagnosticBuilder Builder(S.Diags.Report(FnIt->second.Loc, diag::note_called_by));"}},
		[m]={
			["clang/test/SemaSYCL/prohibit-thread-local.cpp"]={"clang/test/SemaSYCL/prohibit-thread-local.cpp:46:48: note: called by \'operator()\'","clang/test/SemaSYCL/prohibit-thread-local.cpp:42:39: note: called by \'kernel_single_task<fake_kernel, (lambda at clang/test/SemaSYCL/prohibit-thread-local.cpp:46:41)>\'","clang/test/SemaSYCL/prohibit-thread-local.cpp:27:3: note: called by \'usage\'","clang/test/SemaSYCL/prohibit-thread-local.cpp:46:48: note: called by \'operator()\'","clang/test/SemaSYCL/prohibit-thread-local.cpp:42:39: note: called by \'kernel_single_task<fake_kernel, (lambda at clang/test/SemaSYCL/prohibit-thread-local.cpp:46:41)>\'"}
		}
	},
	["note_called_once_gets_called_twice"]={
		[b]={{nil,u,"note_called_once_gets_called_twice"}},
		[c]={{nil,u,"previous call is here%select{; set to nil to indicate it cannot be called afterwards|}0"}},
		[e]={{nil,u,{"previous call is here",{"; set to nil to indicate it cannot be called afterwards",a}}}},
		[g]=f,
		[h]="previous call is here(?:; set to nil to indicate it cannot be called afterwards|)",
		[i]=a,
		[j]={{nil,u,p}},
		[k]={Xb,1590001902,bc,dc},
		[d]={{"clang/lib/Sema/AnalysisBasedWarnings.cpp",1692,"class CalledOnceCheckReporter : public CalledOnceCheckHandler {\n  // ...\n  void handleDoubleCall(const ParmVarDecl *Parameter, const Expr *Call, const Expr *PrevCall, bool IsCompletionHandler, bool Poised) override {\n    // ...\n    S.Diag(PrevCall->getBeginLoc(), diag::note_called_once_gets_called_twice) << Poised;"}},
		[m]={
			["clang/test/SemaObjC/warn-called-once.m"]={"clang/test/SemaObjC/warn-called-once.m:53:3: note: previous call is here","clang/test/SemaObjC/warn-called-once.m:58:3: note: previous call is here","clang/test/SemaObjC/warn-called-once.m:63:3: note: previous call is here","clang/test/SemaObjC/warn-called-once.m:68:3: note: previous call is here","clang/test/SemaObjC/warn-called-once.m:77:3: note: previous call is here","clang/test/SemaObjC/warn-called-once.m:83:5: note: previous call is here","clang/test/SemaObjC/warn-called-once.m:91:3: note: previous call is here; set to nil to indicate it cannot be called afterwards","clang/test/SemaObjC/warn-called-once.m:114:5: note: previous call is here; set to nil to indicate it cannot be called afterwards","clang/test/SemaObjC/warn-called-once.m:128:5: note: previous call is here; set to nil to indicate it cannot be called afterwards","clang/test/SemaObjC/warn-called-once.m:181:3: note: previous call is here","clang/test/SemaObjC/warn-called-once.m:187:3: note: previous call is here","clang/test/SemaObjC/warn-called-once.m:195:3: note: previous call is here","clang/test/SemaObjC/warn-called-once.m:224:3: note: previous call is here","clang/test/SemaObjC/warn-called-once.m:239:3: note: previous call is here","clang/test/SemaObjC/warn-called-once.m:257:7: note: previous call is here","clang/test/SemaObjC/warn-called-once.m:280:5: note: previous call is here","clang/test/SemaObjC/warn-called-once.m:283:3: note: previous call is here","clang/test/SemaObjC/warn-called-once.m:306:7: note: previous call is here","clang/test/SemaObjC/warn-called-once.m:535:3: note: previous call is here; set to nil to indicate it cannot be called afterwards","clang/test/SemaObjC/warn-called-once.m:792:3: note: previous call is here","clang/test/SemaObjC/warn-called-once.m:797:3: note: previous call is here","clang/test/SemaObjC/warn-called-once.m:804:3: note: previous call is here","clang/test/SemaObjC/warn-called-once.m:811:3: note: previous call is here","clang/test/SemaObjC/warn-called-once.m:818:3: note: previous call is here","clang/test/SemaObjC/warn-called-once.m:825:3: note: previous call is here","clang/test/SemaObjC/warn-called-once.m:832:3: note: previous call is here","clang/test/SemaObjC/warn-called-once.m:862:3: note: previous call is here","clang/test/SemaObjC/warn-called-once.m:1118:5: note: previous call is here; set to nil to indicate it cannot be called afterwards","clang/test/SemaObjC/warn-called-once.m:1232:5: note: previous call is here"}
		}
	},
	["note_callee_decl"]={
		[b]="note_callee_decl",
		[c]="%0 declared here",
		[e]="A declared here",
		[g]=f,
		[h]="(.*?) declared here",
		[i]=a,
		[j]=p,
		[k]={"3bc84ca376a2",1311899082,"Fix an inconsistency in Sema::ConvertArgumentsForCall in that","Fix an inconsistency in Sema::ConvertArgumentsForCall in that\nthe callee note diagnostic was not emitted in the case where\nthere were too few arguments.\n\nllvm-svn: 136437"},
		[d]={{z,6496,"/// 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      // Emit the location of the prototype.\n      if (!TC && FDecl && !FDecl->getBuiltinID() && !IsExecConfig)\n        Diag(FDecl->getLocation(), diag::note_callee_decl) << FDecl << FDecl->getParametersSourceRange();"},{z,6565,"/// 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      // Emit the location of the prototype.\n      if (!TC && FDecl && !FDecl->getBuiltinID() && !IsExecConfig)\n        Diag(FDecl->getLocation(), diag::note_callee_decl) << FDecl << FDecl->getParametersSourceRange();"},{z,7363,"/// 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  // Interrupt handlers don\'t save off the VFP regs automatically on ARM,\n  // so there\'s some risk when calling out to non-interrupt handler functions\n  // that the callee might not preserve them. This is easy to diagnose here,\n  // but can be very challenging to debug.\n  // Likewise, X86 interrupt handlers may only call routines with attribute\n  // no_caller_saved_registers since there is no efficient way to\n  // save and restore the non-GPR state.\n  if (auto *Caller = getCurFunctionDecl()) {\n    if (Caller->hasAttr<ARMInterruptAttr>()) {\n      // ...\n      if (VFP && (!FDecl || !FDecl->hasAttr<ARMInterruptAttr>())) {\n        // ...\n        if (FDecl)\n          Diag(FDecl->getLocation(), diag::note_callee_decl) << FDecl;"},{z,7402,"/// 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  // Interrupt handlers don\'t save off the VFP regs automatically on ARM,\n  // so there\'s some risk when calling out to non-interrupt handler functions\n  // that the callee might not preserve them. This is easy to diagnose here,\n  // but can be very challenging to debug.\n  // Likewise, X86 interrupt handlers may only call routines with attribute\n  // no_caller_saved_registers since there is no efficient way to\n  // save and restore the non-GPR state.\n  if (auto *Caller = getCurFunctionDecl()) {\n    // ...\n    if (Caller->hasAttr<AnyX86InterruptAttr>() && ((!FDecl || !FDecl->hasAttr<AnyX86NoCallerSavedRegistersAttr>()))) {\n      // ...\n      if (FDecl)\n        Diag(FDecl->getLocation(), diag::note_callee_decl) << FDecl;"},{fb,1549,"/// 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 (ObjCMethodDecl *setterMethod = property->getSetterMethodDecl()) {\n    // ...\n    if (getLangOpts().CPlusPlus && Synthesize && !CompleteTypeErr && Ivar->getType()->isRecordType()) {\n      // ...\n      if (property->getPropertyAttributes() & ObjCPropertyAttribute::kind_atomic) {\n        // ...\n        if (const CXXOperatorCallExpr *CXXCE = dyn_cast_or_null<CXXOperatorCallExpr>(callExpr))\n          if (const FunctionDecl *FuncDecl = CXXCE->getDirectCallee())\n            if (!FuncDecl->isTrivial())\n              if (property->getType()->isReferenceType()) {\n                // ...\n                Diag(FuncDecl->getBeginLoc(), diag::note_callee_decl) << FuncDecl;"},{"clang/lib/Sema/SemaTemplateDeduction.cpp",5039,"bool Sema::DeduceReturnType(FunctionDecl *FD, SourceLocation Loc, bool Diagnose) {\n  // ...\n  if (StillUndeduced && Diagnose && !FD->isInvalidDecl()) {\n    // ...\n    Diag(FD->getLocation(), diag::note_callee_decl) << FD;"}}
	},
	["note_callee_static_array"]={
		[b]="note_callee_static_array",
		[c]="callee declares array parameter as static here",
		[e]="callee declares array parameter as static here",
		[g]=f,
		[h]="callee declares array parameter as static here",
		[i]=a,
		[j]=p,
		[k]={"5aa6ecb619bc",1318799852,"Add sema checks for calls to functions taking static array parameters","Add sema checks for calls to functions taking static array parameters\n\nllvm-svn: 142157"},
		[d]={{z,6683,"static void DiagnoseCalleeStaticArrayParam(Sema &S, ParmVarDecl *PVD) {\n  // ...\n  if (ArrayTypeLoc ATL = TL.getAs<ArrayTypeLoc>())\n    S.Diag(PVD->getLocation(), diag::note_callee_static_array) << ATL.getLocalSourceRange();"}},
		[m]={
			["clang/test/Sema/static-array.c"]={"clang/test/Sema/static-array.c:3:15: note: callee declares array parameter as static here","clang/test/Sema/static-array.c:6:14: note: callee declares array parameter as static here","clang/test/Sema/static-array.c:6:14: note: callee declares array parameter as static here","clang/test/Sema/static-array.c:8:21: note: callee declares array parameter as static here","clang/test/Sema/static-array.c:6:14: note: callee declares array parameter as static here","clang/test/Sema/static-array.c:6:14: note: callee declares array parameter as static here"}
		}
	},
	["note_cannot_use_trivial_abi_reason"]={
		[b]={{nil,r,"note_cannot_use_trivial_abi_reason"}},
		[c]={{nil,r,"\'trivial_abi\' is disallowed on %0 because %select{its copy constructors and move constructors are all deleted|it is polymorphic|it has a base of a non-trivial class type|it has a virtual base|it has a __weak field|it has a field of a non-trivial class type}1"}},
		[e]={{nil,r,{"\'trivial_abi\' is disallowed on A because ",{"its copy constructors and move constructors are all deleted","it is polymorphic","it has a base of a non-trivial class type","it has a virtual base","it has a __weak field","it has a field of a non-trivial class type"}}}},
		[g]=f,
		[h]="\'trivial_abi\' is disallowed on (.*?) because (?:its copy constructors and move constructors are all deleted|it is polymorphic|it has a base of a non\\-trivial class type|it has a virtual base|it has a __weak field|it has a field of a non\\-trivial class type)",
		[i]=a,
		[j]={{nil,r,p}},
		[k]={"14f6bfcb52e7",1582847864,"[clang] Implement objc_non_runtime_protocol to remove protocol metadata","[clang] Implement objc_non_runtime_protocol to remove protocol metadata\n\nSummary:\nMotivated by the new objc_direct attribute, this change adds a new\nattribute that remotes metadata from Protocols that the programmer knows\nisn\'t going to be used at runtime. We simply have the frontend skip\ngenerating any protocol metadata entries (e.g. OBJC_CLASS_NAME,\n_OBJC_$_PROTOCOL_INSTANCE_METHDOS, _OBJC_PROTOCOL, etc) for a protocol\nmarked with `__attribute__((objc_non_runtime_protocol))`.\n\nThere are a few APIs used to retrieve a protocol at runtime.\n`@protocol(SomeProtocol)` will now error out of the requested protocol\nis marked with attribute. `objc_getProtocol` will return `NULL` which\nis consistent with the behavior of a non-existing protocol.\n\nSubscribers: cfe-commits\n\nTags: #clang\n\nDifferential Revision: https://reviews.llvm.org/D75574"},
		[d]={{t,10304,"void Sema::checkIllFormedTrivialABIStruct(CXXRecordDecl &RD) {\n  auto PrintDiagAndRemoveAttr = [&](unsigned N) {\n    // No diagnostics if this is a template instantiation.\n    if (!isTemplateInstantiation(RD.getTemplateSpecializationKind())) {\n      // ...\n      Diag(RD.getAttr<TrivialABIAttr>()->getLocation(), diag::note_cannot_use_trivial_abi_reason) << &RD << N;"}},
		[m]={
			["clang/test/SemaCXX/attr-trivial-abi.cpp"]={"clang/test/SemaCXX/attr-trivial-abi.cpp:28:23: note: \'trivial_abi\' is disallowed on \'S3\' because it is polymorphic","clang/test/SemaCXX/attr-trivial-abi.cpp:35:18: note: \'trivial_abi\' is disallowed on \'S3_2\' because it is polymorphic","clang/test/SemaCXX/attr-trivial-abi.cpp:38:23: note: \'trivial_abi\' is disallowed on \'S3_3\' because it has a field of a non-trivial class type","clang/test/SemaCXX/attr-trivial-abi.cpp:53:23: note: \'trivial_abi\' is disallowed on \'S3_4\' because it has a field of a non-trivial class type","clang/test/SemaCXX/attr-trivial-abi.cpp:64:23: note: \'trivial_abi\' is disallowed on \'S5\' because it has a virtual base","clang/test/SemaCXX/attr-trivial-abi.cpp:117:23: note: \'trivial_abi\' is disallowed on \'CopyMoveDeleted\' because its copy constructors and move constructors are all deleted","clang/test/SemaCXX/attr-trivial-abi.cpp:127:23: note: \'trivial_abi\' is disallowed on \'S18\' because its copy constructors and move constructors are all deleted","clang/test/SemaCXX/attr-trivial-abi.cpp:152:23: note: \'trivial_abi\' is disallowed on \'S19\' because its copy constructors and move constructors are all deleted"}
		}
	},
	["note_carries_dependency_missing_first_decl"]={
		[b]="note_carries_dependency_missing_first_decl",
		[c]="declaration missing \'[[carries_dependency]]\' attribute is here",
		[e]="declaration missing \'[[carries_dependency]]\' attribute is here",
		[g]=f,
		[h]="declaration missing \'\\[\\[carries_dependency\\]\\]\' attribute is here",
		[i]=a,
		[j]=p,
		[k]={"e233fbfc16fe",1359412965,"Finish semantic analysis for [[carries_dependency]] attribute.","Finish semantic analysis for [[carries_dependency]] attribute.\n\nThis required plumbing through a new flag to determine whether a ParmVarDecl is\nactually a parameter of a function declaration (as opposed to a function\ntypedef etc, where the attribute is prohibited). Weirdly, this attribute (just\nlike [[noreturn]]) cannot be applied to a function type, just to a function\ndeclaration (and its parameters).\n\nllvm-svn: 173726"},
		[d]={{M,3349,"/// mergeParamDeclAttributes - Copy attributes from the old parameter\n/// to the new one.\nstatic void mergeParamDeclAttributes(ParmVarDecl *newDecl, const ParmVarDecl *oldDecl, Sema &S) {\n  // ...\n  if (CDA && !oldDecl->hasAttr<CarriesDependencyAttr>()) {\n    // ...\n    S.Diag(FirstVD->getLocation(), diag::note_carries_dependency_missing_first_decl) << 1 /*Param*/;"},{M,4057,"/// MergeFunctionDecl - We just parsed a function \'New\' from\n/// declarator D which has the same name and scope as a previous\n/// declaration \'Old\'.  Figure out how to resolve this situation,\n/// merging decls or emitting diagnostics as appropriate.\n///\n/// In C++, New and Old must be declarations that are not\n/// overloaded. Use IsOverload to determine whether New and Old are\n/// overloaded, and to select the Old declaration that New should be\n/// merged with.\n///\n/// Returns true if there was an error, false otherwise.\nbool Sema::MergeFunctionDecl(FunctionDecl *New, NamedDecl *&OldD, Scope *S, bool MergeTypeWithOld, bool NewDeclIsDefn) {\n  // ...\n  if (getLangOpts().CPlusPlus) {\n    // ...\n    if (CDA && !Old->hasAttr<CarriesDependencyAttr>()) {\n      // ...\n      Diag(Old->getFirstDecl()->getLocation(), diag::note_carries_dependency_missing_first_decl) << 0 /*Function*/;"}},
		[m]={
			["clang/test/CXX/dcl.dcl/dcl.attr/dcl.attr.depend/p2.cpp"]={"clang/test/CXX/dcl.dcl/dcl.attr/dcl.attr.depend/p2.cpp:3:5: note: declaration missing \'[[carries_dependency]]\' attribute is here","clang/test/CXX/dcl.dcl/dcl.attr/dcl.attr.depend/p2.cpp:3:10: note: declaration missing \'[[carries_dependency]]\' attribute is here","clang/test/CXX/dcl.dcl/dcl.attr/dcl.attr.depend/p2.cpp:7:5: note: declaration missing \'[[carries_dependency]]\' attribute is here"}
		}
	},
	["note_cast_operand_to_int"]={
		[b]={{nil,K,"note_cast_operand_to_int"}},
		[c]={{nil,K,"cast one or both operands to int to silence this warning"}},
		[e]={{nil,K,"cast one or both operands to int to silence this warning"}},
		[g]=f,
		[h]="cast one or both operands to int to silence this warning",
		[i]=a,
		[j]={{nil,K,p}},
		[k]={nc,1615397021,tc,sc},
		[d]={{tb,15253,"/// Data recursive variant of AnalyzeImplicitConversions. Subexpressions\n/// that should be visited are added to WorkList.\nstatic void AnalyzeImplicitConversions(Sema &S, AnalyzeImplicitConversionsWorkItem Item, llvm::SmallVectorImpl<AnalyzeImplicitConversionsWorkItem> &WorkList) {\n  // ...\n  if (const auto *BO = dyn_cast<BinaryOperator>(SourceExpr))\n    if ((BO->getOpcode() == BO_And || BO->getOpcode() == BO_Or) && BO->getLHS()->isKnownToHaveBooleanValue() && BO->getRHS()->isKnownToHaveBooleanValue() && BO->getLHS()->HasSideEffects(S.Context) && BO->getRHS()->HasSideEffects(S.Context)) {\n      // ...\n      S.Diag(BO->getBeginLoc(), diag::note_cast_operand_to_int);"}},
		[m]={
			["clang/test/Sema/warn-bitwise-or-bool.c"]={"clang/test/Sema/warn-bitwise-or-bool.c:27:7: note: cast one or both operands to int to silence this warning","clang/test/Sema/warn-bitwise-or-bool.c:32:7: note: cast one or both operands to int to silence this warning","clang/test/Sema/warn-bitwise-or-bool.c:35:7: note: cast one or both operands to int to silence this warning","clang/test/Sema/warn-bitwise-or-bool.c:40:7: note: cast one or both operands to int to silence this warning","clang/test/Sema/warn-bitwise-or-bool.c:48:7: note: cast one or both operands to int to silence this warning","clang/test/Sema/warn-bitwise-or-bool.c:52:7: note: cast one or both operands to int to silence this warning","clang/test/Sema/warn-bitwise-or-bool.c:58:8: note: cast one or both operands to int to silence this warning"}
		}
	},
	["note_cast_to_void"]={
		[b]="note_cast_to_void",
		[c]="cast expression to void to silence warning",
		[e]="cast expression to void to silence warning",
		[g]=f,
		[h]="cast expression to void to silence warning",
		[i]=a,
		[j]=p,
		[k]={"faca2d83b13e",1455839920,"Add -Wcomma warning to Clang.","Add -Wcomma warning to Clang.\n\n-Wcomma will detect and warn on most uses of the builtin comma operator.  It\ncurrently whitelists the first and third statements of the for-loop.  For other\ncases, the warning can be silenced by casting the first operand of the comma\noperator to void.\n\nDifferential Revision: http://reviews.llvm.org/D3976\n\nllvm-svn: 261278"},
		[d]={{z,14659,"// Look for instances where it is likely the comma operator is confused with\n// another operator.  There is an explicit list of acceptable expressions for\n// the left hand side of the comma operator, otherwise emit a warning.\nvoid Sema::DiagnoseCommaOperator(const Expr *LHS, SourceLocation Loc) {\n  // ...\n  Diag(LHS->getBeginLoc(), diag::note_cast_to_void) << LHS->getSourceRange() << FixItHint::CreateInsertion(LHS->getBeginLoc(), LangOpts.CPlusPlus ? \"static_cast<void>(\" : \"(void)(\") << FixItHint::CreateInsertion(PP.getLocForEndOfToken(LHS->getEndLoc()), \")\");"}},
		[m]={
			["clang/test/SemaCXX/warn-comma-operator.cpp"]={"clang/test/SemaCXX/warn-comma-operator.cpp:46:7: note: cast expression to void to silence warning","clang/test/SemaCXX/warn-comma-operator.cpp:57:10: note: cast expression to void to silence warning","clang/test/SemaCXX/warn-comma-operator.cpp:69:15: note: cast expression to void to silence warning","clang/test/SemaCXX/warn-comma-operator.cpp:75:15: note: cast expression to void to silence warning","clang/test/SemaCXX/warn-comma-operator.cpp:84:3: note: cast expression to void to silence warning","clang/test/SemaCXX/warn-comma-operator.cpp:93:8: note: cast expression to void to silence warning","clang/test/SemaCXX/warn-comma-operator.cpp:99:12: note: cast expression to void to silence warning","clang/test/SemaCXX/warn-comma-operator.cpp:105:10: note: cast expression to void to silence warning","clang/test/SemaCXX/warn-comma-operator.cpp:111:10: note: cast expression to void to silence warning","clang/test/SemaCXX/warn-comma-operator.cpp:117:7: note: cast expression to void to silence warning","clang/test/SemaCXX/warn-comma-operator.cpp:123:17: note: cast expression to void to silence warning","clang/test/SemaCXX/warn-comma-operator.cpp:132:3: note: cast expression to void to silence warning","clang/test/SemaCXX/warn-comma-operator.cpp:132:18: note: cast expression to void to silence warning","clang/test/SemaCXX/warn-comma-operator.cpp:132:33: note: cast expression to void to silence warning"}
		}
	},
	["note_cat_conform_to_noescape_prot"]={
		[b]={{nil,F,"note_cat_conform_to_noescape_prot"}},
		[c]={{nil,F,"%select{category|class extension}0 conforms to protocol %1 which defines method %2"}},
		[e]={{nil,F,{{"category","class extension"}," conforms to protocol B which defines method C"}}},
		[g]=f,
		[h]="(?:category|class extension) conforms to protocol (.*?) which defines method (.*?)",
		[i]=a,
		[j]={{nil,F,p}},
		[k]={"a6b5e0036128",1532750773,"[Sema][ObjC] Warn when a method declared in a protocol takes a","[Sema][ObjC] Warn when a method declared in a protocol takes a\nnon-escaping parameter but the implementation\'s method takes an escaping\nparameter.\n\nrdar://problem/39548196\n\nDifferential Revision: https://reviews.llvm.org/D49119\n\nllvm-svn: 338189"},
		[d]={{qb,132,"/// Produce additional diagnostics if a category conforms to a protocol that\n/// defines a method taking a non-escaping parameter.\nstatic void diagnoseNoescape(const ParmVarDecl *NewD, const ParmVarDecl *OldD, const ObjCCategoryDecl *CD, const ObjCProtocolDecl *PD, Sema &S) {\n  if (!diagnoseNoescape(NewD, OldD, S))\n    S.Diag(CD->getLocation(), diag::note_cat_conform_to_noescape_prot) << CD->IsClassExtension() << PD << cast<ObjCMethodDecl>(NewD->getDeclContext());"}},
		[m]={
			["clang/test/SemaObjCXX/noescape.mm"]={"clang/test/SemaObjCXX/noescape.mm:119:12: note: class extension conforms to protocol \'NoescapeProt\' which defines method \'m0:\'"}
		}
	},
	["note_cc1_round_trip_generated"]={
		[b]={{nil,A,"note_cc1_round_trip_generated"}},
		[c]={{nil,K,"generated arguments #%0 in round-trip: %1"},{A,A,"Generated arguments #%0 in round-trip: %1"}},
		[e]={{nil,K,"generated arguments #A in round-trip: B"},{A,A,"Generated arguments #A in round-trip: B"}},
		[g]=f,
		[h]="generated arguments \\#(.*?) in round\\-trip\\: (.*?)",
		[i]=a,
		[j]={{nil,A,o}},
		[k]={"0175999805cf",1585492323,"[AMDGPU] Add options -mamdgpu-ieee -mno-amdgpu-ieee","[AMDGPU] Add options -mamdgpu-ieee -mno-amdgpu-ieee\n\nAMDGPU backend need to know whether floating point opcodes that support exception\nflag gathering quiet and propagate signaling NaN inputs per IEEE754-2008, which is\nconveyed by a function attribute \"amdgpu-ieee\". \"amdgpu-ieee\"=\"false\" turns this off.\nWithout this function attribute backend assumes it is on for compute functions.\n\n-mamdgpu-ieee and -mno-amdgpu-ieee are added to Clang to control this function attribute.\nBy default it is on. -mno-amdgpu-ieee requires -fno-honor-nans or equivalent.\n\nReviewed by: Matt Arsenault\n\nDifferential Revision: https://reviews.llvm.org/D77013"},
		[d]={{Vb,756,"#endif\n  // ...\n  // The first parse on original arguments succeeded, but second parse of\n  // generated arguments failed. Something must be wrong with the generator.\n  if (!Success2) {\n    // ...\n    Diags.Report(diag::note_cc1_round_trip_generated) << 1 << SerializeArgs(GeneratedArgs);"},{Vb,784,"#endif\n  // ...\n  // If we generated different arguments from what we assume are two\n  // semantically equivalent CompilerInvocations, the Generate function may\n  // be non-deterministic.\n  if (!Equal(GeneratedArgs, ComparisonArgs)) {\n    // ...\n    Diags.Report(diag::note_cc1_round_trip_generated) << 1 << SerializeArgs(GeneratedArgs);"},{Vb,786,"#endif\n  // ...\n  // If we generated different arguments from what we assume are two\n  // semantically equivalent CompilerInvocations, the Generate function may\n  // be non-deterministic.\n  if (!Equal(GeneratedArgs, ComparisonArgs)) {\n    // ...\n    Diags.Report(diag::note_cc1_round_trip_generated) << 2 << SerializeArgs(ComparisonArgs);"}}
	},
	["note_cc1_round_trip_original"]={
		[b]={{nil,A,"note_cc1_round_trip_original"}},
		[c]={{nil,K,"original arguments in round-trip: %0"},{A,A,"Original arguments in round-trip: %0"}},
		[e]={{nil,K,"original arguments in round-trip: A"},{A,A,"Original arguments in round-trip: A"}},
		[g]=f,
		[h]="original arguments in round\\-trip\\: (.*?)",
		[i]=a,
		[j]={{nil,A,o}},
		[k]={"0175999805cf",1585492323,"[AMDGPU] Add options -mamdgpu-ieee -mno-amdgpu-ieee","[AMDGPU] Add options -mamdgpu-ieee -mno-amdgpu-ieee\n\nAMDGPU backend need to know whether floating point opcodes that support exception\nflag gathering quiet and propagate signaling NaN inputs per IEEE754-2008, which is\nconveyed by a function attribute \"amdgpu-ieee\". \"amdgpu-ieee\"=\"false\" turns this off.\nWithout this function attribute backend assumes it is on for compute functions.\n\n-mamdgpu-ieee and -mno-amdgpu-ieee are added to Clang to control this function attribute.\nBy default it is on. -mno-amdgpu-ieee requires -fno-honor-nans or equivalent.\n\nReviewed by: Matt Arsenault\n\nDifferential Revision: https://reviews.llvm.org/D77013"},
		[d]={{Vb,728,"#endif\n  // ...\n  // Run the first parse on the original arguments with the dummy invocation and\n  // diagnostics.\n  if (!Parse(DummyInvocation, CommandLineArgs, DummyDiags, Argv0) || DummyDiags.getNumWarnings() != 0) {\n    // ...\n    Diags.Report(diag::note_cc1_round_trip_original) << SerializeArgs(CommandLineArgs);"}}
	},
	["note_change_bitfield_sign"]={
		[b]={{nil,G,"note_change_bitfield_sign"}},
		[c]={{nil,G,"consider making the bitfield type %select{unsigned|signed}0"}},
		[e]={{nil,G,{"consider making the bitfield type ",{"unsigned","signed"}}}},
		[g]=f,
		[h]="consider making the bitfield type (?:unsigned|signed)",
		[i]=a,
		[j]={{nil,G,p}},
		[k]={"329f24d6f6e7",1489514462,"Warn on enum assignment to bitfields that can\'t fit all values","Warn on enum assignment to bitfields that can\'t fit all values\n\nThis adds -Wbitfield-enum-conversion, which warns on implicit\nconversions that happen on bitfield assignment that change the value of\nsome enumerators.\n\nValues of enum type typically take on a very small range of values, so\nthey are frequently stored in bitfields. Unfortunately, there is no\nconvenient way to calculate the minimum number of bits necessary to\nstore all possible values at compile time, so users usually hard code a\nbitwidth that works today and widen it as necessary to pass basic\ntesting and validation. This is very error-prone, and leads to stale\nwidths as enums grow. This warning aims to catch such bugs.\n\nThis would have found two real bugs in clang and two instances of\nquestionable code. See r297680 and r297654 for the full description of\nthe issues.\n\nThis warning is currently disabled by default while we investigate its\nusefulness outside of LLVM.\n\nThe major cause of false positives with this warning is this kind of\nenum:\n  enum E { W, X, Y, Z, SENTINEL_LAST };\nThe last enumerator is an invalid value used to validate inputs or size\nan array. Depending on the prevalance of this style of enum across a\ncodebase, this warning may be more or less feasible to deploy. It also\nhas trouble on sentinel values such as ~0U.\n\nReviewers: rsmith, rtrieu, thakis\n\nReviewed By: thakis\n\nSubscribers: hfinkel, voskresensky.vladimir, sashab, cfe-commits\n\nDifferential Revision: https://reviews.llvm.org/D30923\n\nllvm-svn: 297761"},
		[d]={{tb,14095,"/// Analyzes an attempt to assign the given value to a bitfield.\n///\n/// Returns true if there was something fishy about the attempt.\nstatic bool AnalyzeBitFieldAssignment(Sema &S, FieldDecl *Bitfield, Expr *Init, SourceLocation InitLoc) {\n  // ...\n  if (!OriginalInit->EvaluateAsInt(Result, S.Context, Expr::SE_AllowSideEffects)) {\n    // The RHS is not constant.  If the RHS has an enum type, make sure the\n    // bitfield is wide enough to hold all the values of the enum without\n    // truncation.\n    if (const auto *EnumTy = OriginalInit->getType()->getAs<EnumType>()) {\n      // ...\n      if (DiagID) {\n        // ...\n        S.Diag(Bitfield->getTypeSpecStartLoc(), diag::note_change_bitfield_sign) << SignedEnum << TypeRange;"}},
		[m]={
			["clang/test/SemaCXX/warn-bitfield-enum-conversion.cpp"]={"clang/test/SemaCXX/warn-bitfield-enum-conversion.cpp:11:3: note: consider making the bitfield type signed","clang/test/SemaCXX/warn-bitfield-enum-conversion.cpp:11:3: note: consider making the bitfield type signed","clang/test/SemaCXX/warn-bitfield-enum-conversion.cpp:12:3: note: consider making the bitfield type unsigned","clang/test/SemaCXX/warn-bitfield-enum-conversion.cpp:13:3: note: consider making the bitfield type signed","clang/test/SemaCXX/warn-bitfield-enum-conversion.cpp:13:3: note: consider making the bitfield type signed","clang/test/SemaCXX/warn-bitfield-enum-conversion.cpp:14:3: note: consider making the bitfield type unsigned"}
		}
	},
	["note_change_calling_conv_fixit"]={
		[b]="note_change_calling_conv_fixit",
		[c]="consider defining %0 with the \'%1\' calling convention",
		[e]="consider defining A with the \'B\' calling convention",
		[g]=f,
		[h]="consider defining (.*?) with the \'(.*?)\' calling convention",
		[i]=a,
		[j]=p,
		[k]={"9f49733c65b0",1462914003,"Add -Wcast-calling-convention to warn when casting away calling conventions","Add -Wcast-calling-convention to warn when casting away calling conventions\n\nSummary:\nThis only warns on casts of the address of a function defined in the\ncurrent TU. In this case, the fix is likely to be local and the warning\nuseful.\n\nHere are some things we could experiment with in the future:\n- Fire on declarations as well as definitions\n- Limit the warning to non-void function prototypes\n- Limit the warning to mismatches of caller and callee cleanup CCs\n\nThis warning is currently off by default while we study its usefulness.\n\nReviewers: thakis, rtrieu\n\nSubscribers: cfe-commits\n\nDifferential Revision: http://reviews.llvm.org/D17348\n\nllvm-svn: 269116"},
		[d]={{"clang/lib/Sema/SemaCast.cpp",2188,"/// Diagnose casts that change the calling convention of a pointer to a function\n/// defined in the current TU.\nstatic void DiagnoseCallingConvCast(Sema &Self, const ExprResult &SrcExpr, QualType DstType, SourceRange OpRange) {\n  // ...\n  Self.Diag(NameLoc, diag::note_change_calling_conv_fixit) << FD << DstCCName << FixItHint::CreateInsertion(NameLoc, CCAttrText);"}},
		[m]={
			["clang/test/Sema/callingconv-cast.c"]={"clang/test/Sema/callingconv-cast.c:16:6: note: consider defining \'mismatched\' with the \'stdcall\' calling convention","clang/test/Sema/callingconv-cast.c:16:6: note: consider defining \'mismatched\' with the \'stdcall\' calling convention","clang/test/Sema/callingconv-cast.c:16:6: note: consider defining \'mismatched\' with the \'stdcall\' calling convention","clang/test/Sema/callingconv-cast.c:7:6: note: consider defining \'mismatched_before_winapi\' with the \'stdcall\' calling convention","clang/test/Sema/callingconv-cast.c:19:6: note: consider defining \'mismatched_declaration\' with the \'stdcall\' calling convention","clang/test/Sema/callingconv-cast.c:22:6: note: consider defining \'suggest_fix_first_redecl\' with the \'stdcall\' calling convention"}
		}
	},
	["note_checking_constraints_for_class_spec_id_here"]={
		[b]={{nil,l,"note_checking_constraints_for_class_spec_id_here"}},
		[c]={{nil,l,"while checking constraint satisfaction for class template partial specialization \'%0\' required here"}},
		[e]={{nil,l,"while checking constraint satisfaction for class template partial specialization \'A\' required here"}},
		[g]=f,
		[h]="while checking constraint satisfaction for class template partial specialization \'(.*?)\' required here",
		[i]=a,
		[j]={{nil,l,p}},
		[k]={Ub,1569403888,Mb,Nb},
		[d]={{U,1036,"/// Prints the current instantiation stack through a series of\n/// notes.\nvoid Sema::PrintInstantiationStack() {\n  // ...\n  for (SmallVectorImpl<CodeSynthesisContext>::reverse_iterator Active = CodeSynthesisContexts.rbegin(), ActiveEnd = CodeSynthesisContexts.rend(); Active != ActiveEnd; ++Active, ++InstantiationIdx) {\n    // ...\n    case CodeSynthesisContext::ConstraintsCheck: {\n      // ...\n      if (isa<ConceptDecl>(Active->Entity))\n      // ...\n      else if (isa<TemplateDecl>(Active->Entity))\n      // ...\n      else if (isa<VarTemplatePartialSpecializationDecl>(Active->Entity))\n      // ...\n      else if (isa<ClassTemplatePartialSpecializationDecl>(Active->Entity))\n        DiagID = diag::note_checking_constraints_for_class_spec_id_here;"}},
		[m]={
			["clang/test/CXX/temp/temp.constr/temp.constr.constr/partial-specializations.cpp"]={"clang/test/CXX/temp/temp.constr/temp.constr.constr/partial-specializations.cpp:29:24: note: while checking constraint satisfaction for class template partial specialization \'B<int *>\' required here","clang/test/CXX/temp/temp.constr/temp.constr.constr/partial-specializations.cpp:29:24: note: while checking constraint satisfaction for class template partial specialization \'B<int>\' required here"}
		}
	},
	["note_checking_constraints_for_function_here"]={
		[b]={{nil,l,"note_checking_constraints_for_function_here"}},
		[c]={{nil,l,"while checking constraint satisfaction for function \'%0\' required here"}},
		[e]={{nil,l,"while checking constraint satisfaction for function \'A\' required here"}},
		[g]=f,
		[h]="while checking constraint satisfaction for function \'(.*?)\' required here",
		[i]=a,
		[j]={{nil,l,p}},
		[k]={"1228d42ddab8",1576809732,"[OpenMP][Part 2] Use reusable OpenMP context/traits handling","[OpenMP][Part 2] Use reusable OpenMP context/traits handling\n\nThis patch implements an almost complete handling of OpenMP\ncontexts/traits such that we can reuse most of the logic in Flang\nthrough the OMPContext.{h,cpp} in llvm/Frontend/OpenMP.\n\nAll but construct SIMD specifiers, e.g., inbranch, and the device ISA\nselector are define in `llvm/lib/Frontend/OpenMP/OMPKinds.def`. From\nthese definitions we generate the enum classes `TraitSet`,\n`TraitSelector`, and `TraitProperty` as well as conversion and helper\nfunctions in `llvm/lib/Frontend/OpenMP/OMPContext.{h,cpp}`.\n\nThe above enum classes are used in the parser, sema, and the AST\nattribute. The latter is not a collection of multiple primitive variant\narguments that contain encodings via numbers and strings but instead a\ntree that mirrors the `match` clause (see `struct OpenMPTraitInfo`).\n\nThe changes to the parser make it more forgiving when wrong syntax is\nread and they also resulted in more specialized diagnostics. The tests\nare updated and the core issues are detected as before. Here and\nelsewhere this patch tries to be generic, thus we do not distinguish\nwhat selector set, selector, or property is parsed except if they do\nbehave exceptionally, as for example `user={condition(EXPR)}` does.\n\nThe sema logic changed in two ways: First, the OMPDeclareVariantAttr\nrepresentation changed, as mentioned above, and the sema was adjusted to\nwork with the new `OpenMPTraitInfo`. Second, the matching and scoring\nlogic moved into `OMPContext.{h,cpp}`. It is implemented on a flat\nrepresentation of the `match` clause that is not tied to clang.\n`OpenMPTraitInfo` provides a method to generate this flat structure (see\n`struct VariantMatchInfo`) by computing integer score values and boolean\nuser conditions from the `clang::Expr` we keep for them.\n\nThe OpenMP context is now an explicit object (see `struct OMPContext`).\nThis is in anticipation of construct traits that need to be tracked. The\nOpenMP context, as well as the `VariantMatchInfo`, are basically made up\nof a set of active or respectively required traits, e.g., \'host\', and an\nordered container of constructs which allows duplication. Matching and\nscoring is kept as generic as possible to allow easy extension in the\nfuture.\n\n---\n\nTest changes:\n\nThe messages checked in `OpenMP/declare_variant_messages.{c,cpp}` have\nbeen auto generated to match the new warnings and notes of the parser.\nThe \"subset\" checks were reversed causing the wrong version to be\npicked. The tests have been adjusted to correct this.\nWe do not print scores if the user did not provide one.\nWe print spaces to make lists in the `match` clause more legible.\n\nReviewers: kiranchandramohan, ABataev, RaviNarayanaswamy, gtbercea, grokos, sdmitriev, JonChesterfield, hfinkel, fghanim\n\nSubscribers: merge_guards_bot, rampitec, mgorny, hiraditya, aheejin, fedor.sergeev, simoncook, bollu, guansong, dexonsmith, jfb, s.egerton, llvm-commits, cfe-commits\n\nTags: #clang, #llvm\n\nDifferential Revision: https://reviews.llvm.org/D71830"},
		[d]={{U,1039,"/// Prints the current instantiation stack through a series of\n/// notes.\nvoid Sema::PrintInstantiationStack() {\n  // ...\n  for (SmallVectorImpl<CodeSynthesisContext>::reverse_iterator Active = CodeSynthesisContexts.rbegin(), ActiveEnd = CodeSynthesisContexts.rend(); Active != ActiveEnd; ++Active, ++InstantiationIdx) {\n    // ...\n    case CodeSynthesisContext::ConstraintsCheck: {\n      // ...\n      if (isa<ConceptDecl>(Active->Entity))\n      // ...\n      else if (isa<TemplateDecl>(Active->Entity))\n      // ...\n      else if (isa<VarTemplatePartialSpecializationDecl>(Active->Entity))\n      // ...\n      else if (isa<ClassTemplatePartialSpecializationDecl>(Active->Entity))\n      // ...\n      else {\n        // ...\n        DiagID = diag::note_checking_constraints_for_function_here;"}},
		[m]={
			["clang/test/SemaTemplate/cxx2a-constraint-exprs.cpp"]={"clang/test/SemaTemplate/cxx2a-constraint-exprs.cpp:45:20: note: while checking constraint satisfaction for function \'foo\' required here"}
		}
	},
	["note_checking_constraints_for_template_id_here"]={
		[b]={{nil,l,"note_checking_constraints_for_template_id_here"}},
		[c]={{nil,l,"while checking constraint satisfaction for template \'%0\' required here"}},
		[e]={{nil,l,"while checking constraint satisfaction for template \'A\' required here"}},
		[g]=f,
		[h]="while checking constraint satisfaction for template \'(.*?)\' required here",
		[i]=a,
		[j]={{nil,l,p}},
		[k]={Ub,1569403888,Mb,Nb},
		[d]={{U,1032,"/// Prints the current instantiation stack through a series of\n/// notes.\nvoid Sema::PrintInstantiationStack() {\n  // ...\n  for (SmallVectorImpl<CodeSynthesisContext>::reverse_iterator Active = CodeSynthesisContexts.rbegin(), ActiveEnd = CodeSynthesisContexts.rend(); Active != ActiveEnd; ++Active, ++InstantiationIdx) {\n    // ...\n    case CodeSynthesisContext::ConstraintsCheck: {\n      // ...\n      if (isa<ConceptDecl>(Active->Entity))\n      // ...\n      else if (isa<TemplateDecl>(Active->Entity))\n        DiagID = diag::note_checking_constraints_for_template_id_here;"}},
		[m]={
			["clang/test/SemaCXX/concept-crash-on-diagnostic.cpp"]={"clang/test/SemaCXX/concept-crash-on-diagnostic.cpp:25:3: note: while checking constraint satisfaction for template \'compare<Object *, Object *>\' required here"}
		}
	},
	["note_checking_constraints_for_var_spec_id_here"]={
		[b]={{nil,l,"note_checking_constraints_for_var_spec_id_here"}},
		[c]={{nil,l,"while checking constraint satisfaction for variable template partial specialization \'%0\' required here"}},
		[e]={{nil,l,"while checking constraint satisfaction for variable template partial specialization \'A\' required here"}},
		[g]=f,
		[h]="while checking constraint satisfaction for variable template partial specialization \'(.*?)\' required here",
		[i]=a,
		[j]={{nil,l,p}},
		[k]={Ub,1569403888,Mb,Nb},
		[d]={{U,1034,"/// Prints the current instantiation stack through a series of\n/// notes.\nvoid Sema::PrintInstantiationStack() {\n  // ...\n  for (SmallVectorImpl<CodeSynthesisContext>::reverse_iterator Active = CodeSynthesisContexts.rbegin(), ActiveEnd = CodeSynthesisContexts.rend(); Active != ActiveEnd; ++Active, ++InstantiationIdx) {\n    // ...\n    case CodeSynthesisContext::ConstraintsCheck: {\n      // ...\n      if (isa<ConceptDecl>(Active->Entity))\n      // ...\n      else if (isa<TemplateDecl>(Active->Entity))\n      // ...\n      else if (isa<VarTemplatePartialSpecializationDecl>(Active->Entity))\n        DiagID = diag::note_checking_constraints_for_var_spec_id_here;"}},
		[m]={
			["clang/test/CXX/temp/temp.constr/temp.constr.constr/partial-specializations.cpp"]={"clang/test/CXX/temp/temp.constr/temp.constr.constr/partial-specializations.cpp:78:17: note: while checking constraint satisfaction for variable template partial specialization \'v1<int *>\' required here","clang/test/CXX/temp/temp.constr/temp.constr.constr/partial-specializations.cpp:78:17: note: while checking constraint satisfaction for variable template partial specialization \'v1<int>\' required here"}
		}
	},
	["note_class_declared"]={
		[b]="note_class_declared",
		[c]="class is declared here",
		[e]="class is declared here",
		[g]=f,
		[h]="class is declared here",
		[i]=a,
		[j]=p,
		[k]={"1f626d6fd1ca",1309980245,"objc-arc: Support objc_arc_weak_unavailable on those","objc-arc: Support objc_arc_weak_unavailable on those\nclasses which are incompatible with weak references.\n// rdar://9693477\n\nllvm-svn: 134522"},
		[d]={{qb,4166,"// Note: For class/category implementations, allMethods is always null.\nDecl *Sema::ActOnAtEnd(Scope *S, SourceRange AtEnd, ArrayRef<Decl *> allMethods, ArrayRef<DeclGroupPtrTy> allTUVars) {\n  // ...\n  if (ObjCImplementationDecl *IC = dyn_cast<ObjCImplementationDecl>(ClassDecl)) {\n    // ...\n    if (ObjCInterfaceDecl *IDecl = IC->getClassInterface()) {\n      // ...\n      if (const ObjCInterfaceDecl *Super = IDecl->getSuperClass()) {\n        // An interface can subclass another interface with a\n        // objc_subclassing_restricted attribute when it has that attribute as\n        // well (because of interfaces imported from Swift). Therefore we have\n        // to check if we can subclass in the implementation as well.\n        if (IDecl->hasAttr<ObjCSubclassingRestrictedAttr>() && Super->hasAttr<ObjCSubclassingRestrictedAttr>()) {\n          // ...\n          Diag(Super->getLocation(), diag::note_class_declared);"},{qb,4198,"// Note: For class/category implementations, allMethods is always null.\nDecl *Sema::ActOnAtEnd(Scope *S, SourceRange AtEnd, ArrayRef<Decl *> allMethods, ArrayRef<DeclGroupPtrTy> allTUVars) {\n  // ...\n  if (ObjCImplementationDecl *IC = dyn_cast<ObjCImplementationDecl>(ClassDecl)) {\n  // ...\n  } else if (ObjCCategoryImplDecl *CatImplClass = dyn_cast<ObjCCategoryImplDecl>(ClassDecl)) {\n  // ...\n  } else if (const auto *IntfDecl = dyn_cast<ObjCInterfaceDecl>(ClassDecl)) {\n    if (const ObjCInterfaceDecl *Super = IntfDecl->getSuperClass()) {\n      if (!IntfDecl->hasAttr<ObjCSubclassingRestrictedAttr>() && Super->hasAttr<ObjCSubclassingRestrictedAttr>()) {\n        // ...\n        Diag(Super->getLocation(), diag::note_class_declared);"},{"clang/lib/Sema/SemaType.cpp",7076,"/// handleObjCOwnershipTypeAttr - Process an objc_ownership\n/// attribute on the specified type.\n///\n/// Returns \'true\' if the attribute was handled.\nstatic bool handleObjCOwnershipTypeAttr(TypeProcessingState &state, ParsedAttr &attr, QualType &type) {\n  // ...\n  // Forbid __weak for class objects marked as\n  // objc_arc_weak_reference_unavailable\n  if (lifetime == Qualifiers::OCL_Weak) {\n    if (const ObjCObjectPointerType *ObjT = type->getAs<ObjCObjectPointerType>()) {\n      if (ObjCInterfaceDecl *Class = ObjT->getInterfaceDecl()) {\n        if (Class->isArcWeakrefUnavailable()) {\n          // ...\n          S.Diag(ObjT->getInterfaceDecl()->getLocation(), diag::note_class_declared);"}},
		[m]={
			["clang/test/SemaObjCXX/objc-weak.mm"]={"clang/test/SemaObjCXX/objc-weak.mm:8:12: note: class is declared here","clang/test/SemaObjCXX/objc-weak.mm:8:12: note: class is declared here"}
		}
	},
	["note_cocoa_naming_declare_family"]={
		[b]="note_cocoa_naming_declare_family",
		[c]="explicitly declare getter %objcinstance0 with \'%1\' to return an \'unowned\' object",
		[e]="explicitly declare getter A with \'B\' to return an \'unowned\' object",
		[g]=f,
		[h]="explicitly declare getter (.*?) with \'(.*?)\' to return an \'unowned\' object",
		[i]=a,
		[j]=p,
		[k]={"a34d04d35e72",1421449471,"Suggest objc_method_family(none) for a property named -newFoo or similar.","Suggest objc_method_family(none) for a property named -newFoo or similar.\n\nAs mentioned in the previous commit, if a property (declared with @property)\nhas a name that matches a special Objective-C method family, the getter picks\nup that family despite being declared by the property. The most correct way\nto solve this problem is to add the \'objc_method_family\' attribute to the\ngetter with an argument of \'none\', which unfortunately requires an explicit\ndeclaration of the getter.\n\nThis commit adds a note to the existing error (ARC) or warning (MRR) for\nsuch a poorly-named property that suggests the solution; if there\'s already\na declaration of the getter, it even includes a fix-it.\n\nllvm-svn: 226339"},
		[d]={{fb,2304,"void Sema::DiagnoseOwningPropertyGetterSynthesis(const ObjCImplementationDecl *D) {\n  // ...\n  for (const auto *PID : D->property_impls()) {\n    // ...\n    if (PD && !PD->hasAttr<NSReturnsNotRetainedAttr>() && !PD->isClassProperty()) {\n      // ...\n      if (family == OMF_alloc || family == OMF_copy || family == OMF_mutableCopy || family == OMF_new) {\n        // ...\n        auto noteDiag = Diag(noteLoc, diag::note_cocoa_naming_declare_family) << method->getDeclName() << spelling;"}},
		[m]={
			["clang/test/SemaObjC/arc-decls.m"]={"clang/test/SemaObjC/arc-decls.m:70:23: note: explicitly declare getter \'-newFoo\' with \'__attribute__((objc_method_family(none)))\' to return an \'unowned\' object","clang/test/SemaObjC/arc-decls.m:71:23: note: explicitly declare getter \'-copyBar\' with \'__attribute__((objc_method_family(none)))\' to return an \'unowned\' object","clang/test/SemaObjC/arc-decls.m:72:21: note: explicitly declare getter \'-allocBaz\' with \'__attribute__((objc_method_family(none)))\' to return an \'unowned\' object","clang/test/SemaObjC/arc-decls.m:74:23: note: explicitly declare getter \'-newDFoo\' with \'__attribute__((objc_method_family(none)))\' to return an \'unowned\' object","clang/test/SemaObjC/arc-decls.m:75:23: note: explicitly declare getter \'-copyDBar\' with \'__attribute__((objc_method_family(none)))\' to return an \'unowned\' object","clang/test/SemaObjC/arc-decls.m:76:21: note: explicitly declare getter \'-allocDBaz\' with \'__attribute__((objc_method_family(none)))\' to return an \'unowned\' object","clang/test/SemaObjC/arc-decls.m:103:33: note: explicitly declare getter \'-newGarply\' with \'__attribute__((objc_method_family(none)))\' to return an \'unowned\' object","clang/test/SemaObjC/arc-decls.m:94:1: note: explicitly declare getter \'-newFoo\' with \'__attribute__((objc_method_family(none)))\' to return an \'unowned\' object","clang/test/SemaObjC/arc-decls.m:97:1: note: explicitly declare getter \'-newBar\' with \'OBJC_METHOD_FAMILY_NONE\' to return an \'unowned\' object","clang/test/SemaObjC/arc-decls.m:100:23: note: explicitly declare getter \'-newBaz\' with \'OBJC_METHOD_FAMILY_NONE\' to return an \'unowned\' object"}
		}
	},
	["note_collapse_loop_count"]={
		[b]="note_collapse_loop_count",
		[c]="parameter of the \'collapse\' clause",
		[e]="parameter of the \'collapse\' clause",
		[g]=f,
		[h]="parameter of the \'collapse\' clause",
		[i]=a,
		[j]="OpenMP Issue",
		[k]={"7b6bc88c5aaf",1448524239,"[OPENMP 4.5] Fixed rules for \'ordered\' clause.","[OPENMP 4.5] Fixed rules for \'ordered\' clause.\nAccording to OpenMP 4.5 the parameter of \'ordered\' clause must be greater than or equal to the parameter of \'collapse\' clause. Patch adds this rule.\n\nllvm-svn: 254141"},
		[d]={{H,9607,"/// Called on a for stmt to check itself and nested loops (if any).\n/// \\return Returns 0 if one of the collapsed stmts is not canonical for loop,\n/// number of collapsed loops otherwise.\nstatic unsigned checkOpenMPLoop(OpenMPDirectiveKind DKind, Expr *CollapseLoopCountExpr, Expr *OrderedLoopCountExpr, Stmt *AStmt, Sema &SemaRef, DSAStackTy &DSA, Sema::VarsWithInheritedDSAType &VarsWithImplicitDSA, OMPLoopBasedDirective::HelperExprs &Built) {\n  // ...\n  if (OrderedLoopCountExpr) {\n    // ...\n    if (!OrderedLoopCountExpr->isValueDependent() && OrderedLoopCountExpr->EvaluateAsInt(EVResult, SemaRef.getASTContext())) {\n      // ...\n      if (Result.getLimitedValue() < NestedLoopCount) {\n        // ...\n        SemaRef.Diag(CollapseLoopCountExpr->getExprLoc(), diag::note_collapse_loop_count) << CollapseLoopCountExpr->getSourceRange();"}},
		[m]={
			["clang/test/OpenMP/for_ordered_clause.cpp"]={"clang/test/OpenMP/for_ordered_clause.cpp:129:37: note: parameter of the \'collapse\' clause","clang/test/OpenMP/for_ordered_clause.cpp:75:37: note: parameter of the \'collapse\' clause"}
		}
	},
	["note_comparison_synthesized_at"]={
		[b]={{nil,l,"note_comparison_synthesized_at"}},
		[c]={{nil,l,"in defaulted %select{<ERROR>|equality|three-way|equality|relational}0 comparison operator for %1 first required here"}},
		[e]={{nil,l,{"in defaulted ",{"equality","three-way","equality","relational"}," comparison operator for B first required here"}}},
		[g]=f,
		[h]="in defaulted (?:equality|three\\-way|equality|relational) comparison operator for (.*?) first required here",
		[i]=a,
		[j]={{nil,l,p}},
		[k]={"cafc7416baf7",1575501927,"[c++20] Synthesis of defaulted comparison functions.","[c++20] Synthesis of defaulted comparison functions.\n\nArray members are not yet handled. In addition, defaulted comparisons\ncan\'t yet find comparison operators by unqualified lookup (only by\nmember lookup and ADL). These issues will be fixed in follow-on changes."},
		[d]={{U,984,"/// Prints the current instantiation stack through a series of\n/// notes.\nvoid Sema::PrintInstantiationStack() {\n  // ...\n  for (SmallVectorImpl<CodeSynthesisContext>::reverse_iterator Active = CodeSynthesisContexts.rbegin(), ActiveEnd = CodeSynthesisContexts.rend(); Active != ActiveEnd; ++Active, ++InstantiationIdx) {\n    // ...\n    case CodeSynthesisContext::DefiningSynthesizedFunction: {\n      // ...\n      if (DFK.isSpecialMember()) {\n      // ...\n      } else if (DFK.isComparison()) {\n        // ...\n        Diags.Report(Active->PointOfInstantiation, diag::note_comparison_synthesized_at) << (int)DFK.asComparison() << RecordType;"}},
		[m]={
			["clang/test/SemaCXX/cxx20-default-compare.cpp"]={"clang/test/SemaCXX/cxx20-default-compare.cpp:11:43: note: in defaulted equality comparison operator for \'Foo\' first required here","clang/test/SemaCXX/cxx20-default-compare.cpp:14:45: note: in defaulted equality comparison operator for \'Foo\' first required here","clang/test/SemaCXX/cxx20-default-compare.cpp:17:29: note: in defaulted equality comparison operator for \'Foo\' first required here"}
		}
	},
	["note_compat_assoc"]={
		[b]="note_compat_assoc",
		[c]="compatible type %0 specified here",
		[e]="compatible type A specified here",
		[g]=f,
		[h]="compatible type (.*?) specified here",
		[i]=a,
		[j]=p,
		[k]={"91147596414d",1302827748,"C1X: implement generic selections","C1X: implement generic selections\n\nAs an extension, generic selection support has been added for all\nsupported languages.  The syntax is the same as for C1X.\n\nllvm-svn: 129554"},
		[d]={{z,1783,"ExprResult Sema::CreateGenericSelectionExpr(SourceLocation KeyLoc, SourceLocation DefaultLoc, SourceLocation RParenLoc, bool PredicateIsExpr, void *ControllingExprOrType, ArrayRef<TypeSourceInfo *> Types, ArrayRef<Expr *> Exprs) {\n  // ...\n  for (unsigned i = 0; i < NumAssocs; ++i) {\n    // ...\n    if (Types[i]) {\n      // ...\n      if (Types[i]->getType()->isDependentType()) {\n      // ...\n      } else {\n        // ...\n        // C11 6.5.1.1p2 \"No two generic associations in the same generic\n        // selection shall specify compatible types.\"\n        for (unsigned j = i + 1; j < NumAssocs; ++j)\n          if (Types[j] && !Types[j]->getType()->isDependentType() && Context.typesAreCompatible(Types[i]->getType(), Types[j]->getType())) {\n            // ...\n            Diag(Types[i]->getTypeLoc().getBeginLoc(), diag::note_compat_assoc) << Types[i]->getTypeLoc().getSourceRange() << Types[i]->getType();"},{z,1852,"ExprResult Sema::CreateGenericSelectionExpr(SourceLocation KeyLoc, SourceLocation DefaultLoc, SourceLocation RParenLoc, bool PredicateIsExpr, void *ControllingExprOrType, ArrayRef<TypeSourceInfo *> Types, ArrayRef<Expr *> Exprs) {\n  // ...\n  // C11 6.5.1.1p2 \"The controlling expression of a generic selection shall have\n  // type compatible with at most one of the types named in its generic\n  // association list.\"\n  if (CompatIndices.size() > 1) {\n    // ...\n    for (unsigned I : CompatIndices) {\n      Diag(Types[I]->getTypeLoc().getBeginLoc(), diag::note_compat_assoc) << Types[I]->getTypeLoc().getSourceRange() << Types[I]->getType();"}},
		[m]={
			["clang/test/Sema/attr-btf_type_tag.c"]={"clang/test/Sema/attr-btf_type_tag.c:31:19: note: compatible type \'int  __attribute__((btf_type_tag(\"tag1\")))*\' (aka \'int *\') specified here"}
		}
	},
	["note_compound_token_split_second_token_here"]={
		[b]={{nil,u,"note_compound_token_split_second_token_here"}},
		[c]={{nil,u,"%select{|second }0%1 token is here"}},
		[e]={{nil,u,{{a,"second "},"B token is here"}}},
		[g]=f,
		[h]="(?:|second )(.*?) token is here",
		[i]=a,
		[j]={{nil,u,"Parse Issue"}},
		[k]={"5c63ae156e96",1597298751,"[OpenMP] Support nested OpenMP context selectors (declare variant)","[OpenMP] Support nested OpenMP context selectors (declare variant)\n\nDue to `omp begin/end declare variant`, OpenMP context selectors can be\nnested. This patch adds initial support for this so we can use it for\ntarget math variants. We should improve the detection of \"equivalent\"\nscores and user conditions, we should also revisit the data structures\nof the OMPTraitInfo object, however, both are not pressing issues right\nnow.\n\nReviewed By: JonChesterfield\n\nDifferential Revision: https://reviews.llvm.org/D85877"},
		[d]={{"clang/lib/Parse/Parser.cpp",246,"void Parser::checkCompoundToken(SourceLocation FirstTokLoc, tok::TokenKind FirstTokKind, CompoundToken Op) {\n  // ...\n  // If either token is in a macro, we expect both tokens to come from the same\n  // macro expansion.\n  if ((FirstTokLoc.isMacroID() || SecondTokLoc.isMacroID()) && PP.getSourceManager().getFileID(FirstTokLoc) != PP.getSourceManager().getFileID(SecondTokLoc)) {\n    // ...\n    Diag(SecondTokLoc, diag::note_compound_token_split_second_token_here) << (FirstTokKind == Tok.getKind()) << Tok.getKind() << SourceRange(SecondTokLoc);"}},
		[m]={
			["clang/test/Parser/compound-token-split.cpp"]={"clang/test/Parser/compound-token-split.cpp:15:15: note: \'{\' token is here","clang/test/Parser/compound-token-split.cpp:15:3: note: \')\' token is here","clang/test/Parser/compound-token-split.cpp:29:18: note: \')\' token is here"}
		}
	},
	["note_concatenated_string_literal_silence"]={
		[b]={{nil,u,"note_concatenated_string_literal_silence"}},
		[c]={{nil,u,"place parentheses around the string literal to silence warning"}},
		[e]={{nil,u,"place parentheses around the string literal to silence warning"}},
		[g]=f,
		[h]="place parentheses around the string literal to silence warning",
		[i]=a,
		[j]={{nil,u,p}},
		[k]={"14f6bfcb52e7",1582847864,"[clang] Implement objc_non_runtime_protocol to remove protocol metadata","[clang] Implement objc_non_runtime_protocol to remove protocol metadata\n\nSummary:\nMotivated by the new objc_direct attribute, this change adds a new\nattribute that remotes metadata from Protocols that the programmer knows\nisn\'t going to be used at runtime. We simply have the frontend skip\ngenerating any protocol metadata entries (e.g. OBJC_CLASS_NAME,\n_OBJC_$_PROTOCOL_INSTANCE_METHDOS, _OBJC_PROTOCOL, etc) for a protocol\nmarked with `__attribute__((objc_non_runtime_protocol))`.\n\nThere are a few APIs used to retrieve a protocol at runtime.\n`@protocol(SomeProtocol)` will now error out of the requested protocol\nis marked with attribute. `objc_getProtocol` will return `NULL` which\nis consistent with the behavior of a non-existing protocol.\n\nSubscribers: cfe-commits\n\nTags: #clang\n\nDifferential Revision: https://reviews.llvm.org/D75574"},
		[d]={{M,14157,"void Sema::CheckCompleteVariableDeclaration(VarDecl *var) {\n  // ...\n  if (!var->getType()->isStructureType() && var->hasInit() && isa<InitListExpr>(var->getInit())) {\n    // ...\n    if (NumInits > 2)\n      for (unsigned I = 0; I < NumInits; ++I) {\n        // ...\n        // Diagnose missing comma in string array initialization.\n        // Do not warn when all the elements in the initializer are concatenated\n        // together. Do not warn for macros too.\n        if (NumConcat == 2 && !SL->getBeginLoc().isMacroID()) {\n          // ...\n          if (OnlyOneMissingComma) {\n            // ...\n            Diag(SL->getBeginLoc(), diag::note_concatenated_string_literal_silence);"}},
		[m]={
			["clang/test/Sema/string-concat.c"]={"clang/test/Sema/string-concat.c:10:5: note: place parentheses around the string literal to silence warning","clang/test/Sema/string-concat.c:21:5: note: place parentheses around the string literal to silence warning","clang/test/Sema/string-concat.c:29:5: note: place parentheses around the string literal to silence warning","clang/test/Sema/string-concat.c:36:24: note: place parentheses around the string literal to silence warning","clang/test/Sema/string-concat.c:39:65: note: place parentheses around the string literal to silence warning","clang/test/Sema/string-concat.c:43:72: note: place parentheses around the string literal to silence warning","clang/test/Sema/string-concat.c:49:5: note: place parentheses around the string literal to silence warning","clang/test/Sema/string-concat.c:53:40: note: place parentheses around the string literal to silence warning","clang/test/Sema/string-concat.c:66:30: note: place parentheses around the string literal to silence warning"}
		}
	},
	["note_concept_specialization_constraint_evaluated_to_false"]={
		[b]={{nil,l,"note_concept_specialization_constraint_evaluated_to_false"}},
		[c]={{nil,l,"%select{and|because}0 \'%1\' evaluated to false"}},
		[e]={{nil,l,{{"and","because"}," \'B\' evaluated to false"}}},
		[g]=f,
		[h]="(?:and|because) \'(.*?)\' evaluated to false",
		[i]=a,
		[j]={{nil,l,p}},
		[k]={Ub,1569403888,Mb,Nb},
		[d]={{Gb,1124,"static void diagnoseWellFormedUnsatisfiedConstraintExpr(Sema &S, Expr *SubstExpr, bool First) {\n  // ...\n  if (BinaryOperator *BO = dyn_cast<BinaryOperator>(SubstExpr)) {\n  // ...\n  } else if (auto *CSE = dyn_cast<ConceptSpecializationExpr>(SubstExpr)) {\n    if (CSE->getTemplateArgsAsWritten()->NumTemplateArgs == 1) {\n    // ...\n    } else {\n      S.Diag(SubstExpr->getSourceRange().getBegin(), diag::note_concept_specialization_constraint_evaluated_to_false) << (int)First << CSE;"}}
	},
	["note_concept_specialization_here"]={
		[b]={{nil,l,"note_concept_specialization_here"}},
		[c]={{nil,l,"while checking the satisfaction of concept \'%0\' requested here"}},
		[e]={{nil,l,"while checking the satisfaction of concept \'A\' requested here"}},
		[g]=f,
		[h]="while checking the satisfaction of concept \'(.*?)\' requested here",
		[i]=a,
		[j]={{nil,l,p}},
		[k]={Lb,1567434909,Kb,Ib},
		[d]={{U,1030,"/// Prints the current instantiation stack through a series of\n/// notes.\nvoid Sema::PrintInstantiationStack() {\n  // ...\n  for (SmallVectorImpl<CodeSynthesisContext>::reverse_iterator Active = CodeSynthesisContexts.rbegin(), ActiveEnd = CodeSynthesisContexts.rend(); Active != ActiveEnd; ++Active, ++InstantiationIdx) {\n    // ...\n    case CodeSynthesisContext::ConstraintsCheck: {\n      // ...\n      if (isa<ConceptDecl>(Active->Entity))\n        DiagID = diag::note_concept_specialization_here;"}},
		[m]={
			["clang/test/SemaCXX/concept-crash-on-diagnostic.cpp"]={"clang/test/SemaCXX/concept-crash-on-diagnostic.cpp:15:23: note: while checking the satisfaction of concept \'convertible_to<bool, bool>\' requested here"}
		}
	},
	["note_condition_assign_silence"]={
		[b]="note_condition_assign_silence",
		[c]="place parentheses around the assignment to silence this warning",
		[e]="place parentheses around the assignment to silence this warning",
		[g]=f,
		[h]="place parentheses around the assignment to silence this warning",
		[i]=a,
		[j]=p,
		[k]={"2bf2d3d0165f",1271261392,"When diagnosing suspicious precedence or assignments, move the fix-it","When diagnosing suspicious precedence or assignments, move the fix-it\nthat adds parentheses from the main diagnostic down to a new\nnote. This way, when the fix-it represents a choice between two\noptions, each of the options is associted with a note. There is no\ndefault option in such cases. For example:\n\n/Users/dgregor/t.c:2:9: warning: & has lower precedence than ==; ==\nwill be\n      evaluated first [-Wparentheses]\n  if (x & y == 0) {\n        ^~~~~~~~\n/Users/dgregor/t.c:2:9: note: place parentheses around the &\nexpression to\n      evaluate it first\n  if (x & y == 0) {\n        ^\n      (    )\n/Users/dgregor/t.c:2:9: note: place parentheses around the ==\nexpression to\n      silence this warning\n  if (x & y == 0) {\n        ^\n          (     )\n\nllvm-svn: 101249"},
		[d]={{z,20883,"// Diagnose the s/=/==/ and s/\\|=/!=/ typos. Note that adding parentheses\n// will prevent this condition from triggering, which is what we want.\nvoid Sema::DiagnoseAssignmentAsCondition(Expr *E) {\n  // ...\n  Diag(Loc, diag::note_condition_assign_silence) << FixItHint::CreateInsertion(Open, \"(\") << FixItHint::CreateInsertion(Close, \")\");"}},
		[m]={
			["clang/test/CodeCompletion/crash-skipped-bodies-template-inst.cpp"]={"clang/test/CodeCompletion/crash-skipped-bodies-template-inst.cpp:15:9: note: place parentheses around the assignment to silence this warning","clang/test/CodeCompletion/crash-skipped-bodies-template-inst.cpp:15:9: note: place parentheses around the assignment to silence this warning"}
		}
	},
	["note_condition_assign_to_comparison"]={
		[b]="note_condition_assign_to_comparison",
		[c]="use \'==\' to turn this assignment into an equality comparison",
		[e]="use \'==\' to turn this assignment into an equality comparison",
		[g]=f,
		[h]="use \'\\=\\=\' to turn this assignment into an equality comparison",
		[i]=a,
		[j]=p,
		[k]={"fa1e36d0de87",1262910023,"Improve the fix-its for -Wparentheses to ensure that the fix-it","Improve the fix-its for -Wparentheses to ensure that the fix-it\nsuggestions follow recovery. Additionally, add a note to these\ndiagnostics which suggests a fix-it for changing the behavior to what\nthe user probably meant. Examples:\n\nt.cpp:2:9: warning: & has lower precedence than ==; == will be evaluated first\n      [-Wparentheses]\n  if (i & j == k) {\n        ^~~~~~~~\n          (     )\nt.cpp:2:9: note: place parentheses around the & expression to evaluate it first\n  if (i & j == k) {\n        ^\n      (    )\n\nt.cpp:14:9: warning: using the result of an assignment as a condition\nwithout\n      parentheses [-Wparentheses]\n  if (i = f()) {\n      ~~^~~~~\n      (      )\nt.cpp:14:9: note: use \'==\' to turn this assignment into an equality\ncomparison\n  if (i = f()) {\n        ^\n        ==\n\nllvm-svn: 92975"},
		[d]={{z,20909,"// Diagnose the s/=/==/ and s/\\|=/!=/ typos. Note that adding parentheses\n// will prevent this condition from triggering, which is what we want.\nvoid Sema::DiagnoseAssignmentAsCondition(Expr *E) {\n  // ...\n  if (IsOrAssign)\n  // ...\n  else\n    Diag(Loc, diag::note_condition_assign_to_comparison) << FixItHint::CreateReplacement(Loc, \"==\");"}},
		[m]={
			["clang/test/CodeCompletion/crash-skipped-bodies-template-inst.cpp"]={"clang/test/CodeCompletion/crash-skipped-bodies-template-inst.cpp:15:9: note: use \'==\' to turn this assignment into an equality comparison","clang/test/CodeCompletion/crash-skipped-bodies-template-inst.cpp:15:9: note: use \'==\' to turn this assignment into an equality comparison"}
		}
	},
	["note_condition_or_assign_to_comparison"]={
		[b]="note_condition_or_assign_to_comparison",
		[c]="use \'!=\' to turn this compound assignment into an inequality comparison",
		[e]="use \'!=\' to turn this compound assignment into an inequality comparison",
		[g]=f,
		[h]="use \'\\!\\=\' to turn this compound assignment into an inequality comparison",
		[i]=a,
		[j]=p,
		[k]={"2d4f64f441ce",1295455808,"Warn about the use of unparenthesized |= in conditionals (which may be","Warn about the use of unparenthesized |= in conditionals (which may be\na typo for !=). Fixes PR9001, from Hans Wennborg!\n\nllvm-svn: 123836"},
		[d]={{z,20886,"// Diagnose the s/=/==/ and s/\\|=/!=/ typos. Note that adding parentheses\n// will prevent this condition from triggering, which is what we want.\nvoid Sema::DiagnoseAssignmentAsCondition(Expr *E) {\n  // ...\n  if (IsOrAssign)\n    Diag(Loc, diag::note_condition_or_assign_to_comparison) << FixItHint::CreateReplacement(Loc, \"!=\");"}},
		[m]={
			["clang/test/SemaCXX/warn-assignment-condition.cpp"]={"clang/test/SemaCXX/warn-assignment-condition.cpp:101:9: note: use \'!=\' to turn this compound assignment into an inequality comparison","clang/test/SemaCXX/warn-assignment-condition.cpp:105:9: note: use \'!=\' to turn this compound assignment into an inequality comparison"}
		}
	},
	["note_conflicting_attribute"]={
		[b]="note_conflicting_attribute",
		[c]="conflicting attribute is here",
		[e]="conflicting attribute is here",
		[g]=f,
		[h]="conflicting attribute is here",
		[i]=a,
		[j]=p,
		[k]={"30e41fb4da68",1418669848,"Warn when attribute \'optnone\' conflicts with attributes on a","Warn when attribute \'optnone\' conflicts with attributes on a\ndifferent declaration of the same function.\n\nllvm-svn: 224256"},
		[d]={{Q,280,"/// Diagnose mutually exclusive attributes when present on a given\n/// declaration. Returns true if diagnosed.\ntemplate <typename AttrTy> static bool checkAttrMutualExclusion(Sema &S, Decl *D, const ParsedAttr &AL) {\n  if (const auto *A = D->getAttr<AttrTy>()) {\n    // ...\n    S.Diag(A->getLocation(), diag::note_conflicting_attribute);"},{Q,292,"template <typename AttrTy> static bool checkAttrMutualExclusion(Sema &S, Decl *D, const Attr &AL) {\n  if (const auto *A = D->getAttr<AttrTy>()) {\n    // ...\n    S.Diag(A->getLocation(), diag::note_conflicting_attribute);"},{Q,2071,"static void handleCPUSpecificAttr(Sema &S, Decl *D, const ParsedAttr &AL) {\n  // Ensure we don\'t combine these with themselves, since that causes some\n  // confusing behavior.\n  if (AL.getParsedKind() == ParsedAttr::AT_CPUDispatch) {\n    // ...\n    if (const auto *Other = D->getAttr<CPUDispatchAttr>()) {\n      // ...\n      S.Diag(Other->getLocation(), diag::note_conflicting_attribute);"},{Q,2080,"static void handleCPUSpecificAttr(Sema &S, Decl *D, const ParsedAttr &AL) {\n  // Ensure we don\'t combine these with themselves, since that causes some\n  // confusing behavior.\n  if (AL.getParsedKind() == ParsedAttr::AT_CPUDispatch) {\n  // ...\n  } else if (AL.getParsedKind() == ParsedAttr::AT_CPUSpecific) {\n    // ...\n    if (const auto *Other = D->getAttr<CPUSpecificAttr>()) {\n      // ...\n      S.Diag(Other->getLocation(), diag::note_conflicting_attribute);"},{Q,3621,"static void handleTargetClonesAttr(Sema &S, Decl *D, const ParsedAttr &AL) {\n  // ...\n  // Ensure we don\'t combine these with themselves, since that causes some\n  // confusing behavior.\n  if (const auto *Other = D->getAttr<TargetClonesAttr>()) {\n    // ...\n    S.Diag(Other->getLocation(), diag::note_conflicting_attribute);"},{Q,3902,"ErrorAttr *Sema::mergeErrorAttr(Decl *D, const AttributeCommonInfo &CI, StringRef NewUserDiagnostic) {\n  if (const auto *EA = D->getAttr<ErrorAttr>()) {\n    // ...\n    if (!Match) {\n      // ...\n      Diag(CI.getLoc(), diag::note_conflicting_attribute);"},{Q,4888,"AlwaysInlineAttr *Sema::mergeAlwaysInlineAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Ident) {\n  if (OptimizeNoneAttr *Optnone = D->getAttr<OptimizeNoneAttr>()) {\n    // ...\n    Diag(Optnone->getLocation(), diag::note_conflicting_attribute);"},{Q,4944,"MinSizeAttr *Sema::mergeMinSizeAttr(Decl *D, const AttributeCommonInfo &CI) {\n  if (OptimizeNoneAttr *Optnone = D->getAttr<OptimizeNoneAttr>()) {\n    // ...\n    Diag(Optnone->getLocation(), diag::note_conflicting_attribute);"},{Q,4962,"SwiftNameAttr *Sema::mergeSwiftNameAttr(Decl *D, const SwiftNameAttr &SNA, StringRef Name) {\n  if (const auto *PrevSNA = D->getAttr<SwiftNameAttr>()) {\n    if (PrevSNA->getName() != Name && !PrevSNA->isImplicit()) {\n      // ...\n      Diag(SNA.getLoc(), diag::note_conflicting_attribute);"},{Q,4974,"OptimizeNoneAttr *Sema::mergeOptimizeNoneAttr(Decl *D, const AttributeCommonInfo &CI) {\n  if (AlwaysInlineAttr *Inline = D->getAttr<AlwaysInlineAttr>()) {\n    // ...\n    Diag(CI.getLoc(), diag::note_conflicting_attribute);"},{Q,4979,"OptimizeNoneAttr *Sema::mergeOptimizeNoneAttr(Decl *D, const AttributeCommonInfo &CI) {\n  // ...\n  if (MinSizeAttr *MinSize = D->getAttr<MinSizeAttr>()) {\n    // ...\n    Diag(CI.getLoc(), diag::note_conflicting_attribute);"},{Q,5260,"static void handleLifetimeCategoryAttr(Sema &S, Decl *D, const ParsedAttr &AL) {\n  // ...\n  if (AL.getKind() == ParsedAttr::AT_Owner) {\n    // ...\n    if (const auto *OAttr = D->getAttr<OwnerAttr>()) {\n      // ...\n      if (ExistingDerefType != ParmType.getTypePtrOrNull()) {\n        // ...\n        S.Diag(OAttr->getLocation(), diag::note_conflicting_attribute);"},{Q,5279,"static void handleLifetimeCategoryAttr(Sema &S, Decl *D, const ParsedAttr &AL) {\n  // ...\n  if (AL.getKind() == ParsedAttr::AT_Owner) {\n  // ...\n  } else {\n    // ...\n    if (const auto *PAttr = D->getAttr<PointerAttr>()) {\n      // ...\n      if (ExistingDerefType != ParmType.getTypePtrOrNull()) {\n        // ...\n        S.Diag(PAttr->getLocation(), diag::note_conflicting_attribute);"},{Q,5516,"void Sema::AddParameterABIAttr(Decl *D, const AttributeCommonInfo &CI, ParameterABI abi) {\n  // ...\n  if (auto existingAttr = D->getAttr<ParameterABIAttr>()) {\n    if (existingAttr->getABI() != abi) {\n      // ...\n      Diag(existingAttr->getLocation(), diag::note_conflicting_attribute);"},{Q,7113,"HLSLNumThreadsAttr *Sema::mergeHLSLNumThreadsAttr(Decl *D, const AttributeCommonInfo &AL, int X, int Y, int Z) {\n  if (HLSLNumThreadsAttr *NT = D->getAttr<HLSLNumThreadsAttr>()) {\n    if (NT->getX() != X || NT->getY() != Y || NT->getZ() != Z) {\n      // ...\n      Diag(AL.getLoc(), diag::note_conflicting_attribute);"},{Q,7210,"HLSLShaderAttr *Sema::mergeHLSLShaderAttr(Decl *D, const AttributeCommonInfo &AL, HLSLShaderAttr::ShaderType ShaderType) {\n  if (HLSLShaderAttr *NT = D->getAttr<HLSLShaderAttr>()) {\n    if (NT->getType() != ShaderType) {\n      // ...\n      Diag(AL.getLoc(), diag::note_conflicting_attribute);"},{Q,8654,"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    // ...\n    S.Diag(AL.getLoc(), diag::note_conflicting_attribute);"},{ib,931,"StmtResult Sema::ActOnIfStmt(SourceLocation IfLoc, IfStatementKind StatementKind, SourceLocation LParenLoc, Stmt *InitStmt, ConditionResult Cond, SourceLocation RParenLoc, Stmt *thenStmt, SourceLocation ElseLoc, Stmt *elseStmt) {\n  // ...\n  if (ConstevalOrNegatedConsteval || StatementKind == IfStatementKind::Constexpr) {\n  // ...\n  } else {\n    // ...\n    if (std::get<0>(LHC)) {\n      // ...\n      Diags.Report(ElseAttr->getLocation(), diag::note_conflicting_attribute) << ElseAttr << ElseAttr->getRange();"},{"clang/lib/Sema/SemaStmtAttr.cpp",254,"template <typename OtherAttr, int DiagIdx> static bool CheckStmtInlineAttr(Sema &SemaRef, const Stmt *OrigSt, const Stmt *CurSt, const AttributeCommonInfo &A) {\n  // ...\n  for (const auto &Tup : llvm::zip_longest(OrigCEF.getCallExprs(), CEF.getCallExprs())) {\n    // If the original call expression already had a callee, we already\n    // diagnosed this, so skip it here. We can\'t skip if there isn\'t a 1:1\n    // relationship between the two lists of call expressions.\n    if (!CanSuppressDiag || !(*std::get<0>(Tup))->getCalleeDecl()) {\n      // ...\n      if (Callee && (Callee->hasAttr<OtherAttr>() || Callee->hasAttr<FlattenAttr>())) {\n        // ...\n        SemaRef.Diag(Callee->getBeginLoc(), diag::note_conflicting_attribute);"},{"clang/utils/TableGen/ClangAttrEmitter.cpp",4025,"// Generates the mutual exclusion checks. The checks for parsed attributes are\n// written into OS and the checks for merging declaration attributes are\n// written into MergeOS.\nstatic void GenerateMutualExclusionsChecks(const Record &Attr, const RecordKeeper &Records, raw_ostream &OS, raw_ostream &MergeDeclOS, raw_ostream &MergeStmtOS) {\n  // ...\n  // If we discovered any decl or stmt attributes to test for, generate the\n  // predicates for them now.\n  if (!DeclAttrs.empty()) {\n    // ...\n    for (const std::string &A : DeclAttrs) {\n      // ...\n      OS << \"      S.Diag(A->getLocation(), diag::note_conflicting_attribute);\";"},{"clang/utils/TableGen/ClangAttrEmitter.cpp",4048,"// Generates the mutual exclusion checks. The checks for parsed attributes are\n// written into OS and the checks for merging declaration attributes are\n// written into MergeOS.\nstatic void GenerateMutualExclusionsChecks(const Record &Attr, const RecordKeeper &Records, raw_ostream &OS, raw_ostream &MergeDeclOS, raw_ostream &MergeStmtOS) {\n  // ...\n  // If we discovered any decl or stmt attributes to test for, generate the\n  // predicates for them now.\n  if (!DeclAttrs.empty()) {\n    // ...\n    // Also generate the declaration attribute merging logic if the current\n    // attribute is one that can be inheritted on a declaration. It is assumed\n    // this code will be executed in the context of a function with parameters:\n    // Sema &S, Decl *D, Attr *A and that returns a bool (false on diagnostic,\n    // true on success).\n    if (Attr.isSubClassOf(\"InheritableAttr\")) {\n      // ...\n      for (const std::string &A : DeclAttrs) {\n        // ...\n        MergeDeclOS << \"      S.Diag(Second->getLocation(), \"\n                    << \"diag::note_conflicting_attribute);\\n\";"},{"clang/utils/TableGen/ClangAttrEmitter.cpp",4089,"// Generates the mutual exclusion checks. The checks for parsed attributes are\n// written into OS and the checks for merging declaration attributes are\n// written into MergeOS.\nstatic void GenerateMutualExclusionsChecks(const Record &Attr, const RecordKeeper &Records, raw_ostream &OS, raw_ostream &MergeDeclOS, raw_ostream &MergeStmtOS) {\n  // ...\n  // Statement attributes are a bit different from declarations. With\n  // declarations, each attribute is added to the declaration as it is\n  // processed, and so you can look on the Decl * itself to see if there is a\n  // conflicting attribute. Statement attributes are processed as a group\n  // because AttributedStmt needs to tail-allocate all of the attribute nodes\n  // at once. This means we cannot check whether the statement already contains\n  // an attribute to check for the conflict. Instead, we need to check whether\n  // the given list of semantic attributes contain any conflicts. It is assumed\n  // this code will be executed in the context of a function with parameters:\n  // Sema &S, const SmallVectorImpl<const Attr *> &C. The code will be within a\n  // loop which loops over the container C with a loop variable named A to\n  // represent the current attribute to check for conflicts.\n  //\n  // FIXME: it would be nice not to walk over the list of potential attributes\n  // to apply to the statement more than once, but statements typically don\'t\n  // have long lists of attributes on them, so re-walking the list should not\n  // be an expensive operation.\n  if (!StmtAttrs.empty()) {\n    // ...\n    MergeStmtOS << \"        S.Diag(Second->getLocation(), \"\n                << \"diag::note_conflicting_attribute);\\n\";"}},
		[m]={
			["clang/test/Sema/mips-interrupt-attr.c"]={"clang/test/Sema/mips-interrupt-attr.c:22:16: note: conflicting attribute is here","clang/test/Sema/mips-interrupt-attr.c:24:16: note: conflicting attribute is here","clang/test/Sema/mips-interrupt-attr.c:26:16: note: conflicting attribute is here","clang/test/Sema/mips-interrupt-attr.c:28:16: note: conflicting attribute is here"}
		}
	},
	["note_conflicting_prototype"]={
		[b]={{nil,I,"note_conflicting_prototype"}},
		[c]={{nil,I,"conflicting prototype is here"}},
		[e]={{nil,I,"conflicting prototype is here"}},
		[g]=f,
		[h]="conflicting prototype is here",
		[i]=a,
		[j]={{nil,I,p}},
		[k]={"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"},
		[d]={{M,4179,"/// MergeFunctionDecl - We just parsed a function \'New\' from\n/// declarator D which has the same name and scope as a previous\n/// declaration \'Old\'.  Figure out how to resolve this situation,\n/// merging decls or emitting diagnostics as appropriate.\n///\n/// In C++, New and Old must be declarations that are not\n/// overloaded. Use IsOverload to determine whether New and Old are\n/// overloaded, and to select the Old declaration that New should be\n/// merged with.\n///\n/// Returns true if there was an error, false otherwise.\nbool Sema::MergeFunctionDecl(FunctionDecl *New, NamedDecl *&OldD, Scope *S, bool MergeTypeWithOld, bool NewDeclIsDefn) {\n  // ...\n  // C: Function types need to be compatible, not identical. This handles\n  // duplicate function decls like \"void f(int); void f(enum X);\" properly.\n  if (!getLangOpts().CPlusPlus) {\n    // ...\n    // If we are merging two functions where only one of them has a prototype,\n    // we may have enough information to decide to issue a diagnostic that the\n    // function without a protoype will change behavior in C2x. This handles\n    // cases like:\n    //   void i(); void i(int j);\n    //   void i(int j); void i();\n    //   void i(); void i(int j) {}\n    // See ActOnFinishFunctionBody() for other cases of the behavior change\n    // diagnostic. See GetFullTypeForDeclarator() for handling of a function\n    // type without a prototype.\n    if (New->hasWrittenPrototype() != Old->hasWrittenPrototype() && !New->isImplicit() && !Old->isImplicit()) {\n      // ...\n      if (WithProto->getNumParams() != 0) {\n        if (WithoutProto->getBuiltinID() == 0 && !WithoutProto->isImplicit()) {\n          // ...\n          // The reason the one without the prototype will be changing behavior\n          // is because of the one with the prototype, so note that so long as\n          // it\'s a user-visible declaration. There is one exception to this:\n          // when the new declaration is a definition without a prototype, the\n          // old declaration with a prototype is not the cause of the issue,\n          // and that does not need to be noted because the one with a\n          // prototype will not change behavior in C2x.\n          if (WithProto->getBuiltinID() == 0 && !WithProto->isImplicit() && !IsWithoutProtoADef)\n            Diag(WithProto->getLocation(), diag::note_conflicting_prototype);"}},
		[m]={
			["clang/test/SemaObjC/nonnull.m"]={"clang/test/SemaObjC/nonnull.m:63:6: note: conflicting prototype is here"}
		}
	},
	["note_conflicting_try_here"]={
		[b]="note_conflicting_try_here",
		[c]="conflicting %0 here",
		[e]="conflicting A here",
		[g]=f,
		[h]="conflicting (.*?) here",
		[i]=a,
		[j]=p,
		[k]={"e71759103e72",1422915331,"SEH: Diagnose use of C++ EH and SEH in the same function","SEH: Diagnose use of C++ EH and SEH in the same function\n\nThis check does not apply when Borland extensions are enabled, as they\nhave a checked in test case indicating that mixed usage of SEH and C++\nis supported.\n\nllvm-svn: 227876"},
		[d]={{ib,4245,"StmtResult Sema::ActOnObjCAtTryStmt(SourceLocation AtLoc, Stmt *Try, MultiStmtArg CatchStmts, Stmt *Finally) {\n  // ...\n  if (FSI->FirstSEHTryLoc.isValid()) {\n    // ...\n    Diag(FSI->FirstSEHTryLoc, diag::note_conflicting_try_here) << \"\'__try\'\";"},{ib,4495,"/// ActOnCXXTryBlock - Takes a try compound-statement and a number of\n/// handlers and creates a try statement from them.\nStmtResult Sema::ActOnCXXTryBlock(SourceLocation TryLoc, Stmt *TryBlock, ArrayRef<Stmt *> Handlers) {\n  // ...\n  // C++ try is incompatible with SEH __try.\n  if (!getLangOpts().Borland && FSI->FirstSEHTryLoc.isValid()) {\n    // ...\n    Diag(FSI->FirstSEHTryLoc, diag::note_conflicting_try_here) << \"\'__try\'\";"},{ib,4588,"StmtResult Sema::ActOnSEHTryBlock(bool IsCXXTry, SourceLocation TryLoc, Stmt *TryBlock, Stmt *Handler) {\n  // ...\n  // SEH __try is incompatible with C++ try. Borland appears to support this,\n  // however.\n  if (!getLangOpts().Borland) {\n    if (FSI->FirstCXXOrObjCTryLoc.isValid()) {\n      // ...\n      Diag(FSI->FirstCXXOrObjCTryLoc, diag::note_conflicting_try_here) << (FSI->FirstTryType == sema::FunctionScopeInfo::TryLocIsCXX ? \"\'try\'\" : \"\'@try\'\");"}},
		[m]={
			["clang/test/SemaCXX/exceptions-seh.mm"]={"clang/test/SemaCXX/exceptions-seh.mm:6:3: note: conflicting \'@try\' here","clang/test/SemaCXX/exceptions-seh.mm:17:3: note: conflicting \'__try\' here"}
		}
	},
	["note_consteval_address_accessible"]={
		[b]={{nil,r,"note_consteval_address_accessible"}},
		[c]={{nil,r,"%select{pointer|reference}0 to a consteval declaration is not a constant expression"}},
		[e]={{nil,r,{{ic,Db}," to a consteval declaration is not a constant expression"}}},
		[g]=f,
		[h]="(?:pointer|reference) to a consteval declaration is not a constant expression",
		[i]=a,
		[j]={{nil,r,o}},
		[k]={ec,1579695612,pc,hc},
		[d]={{n,2196,"/// Check that this reference or pointer core constant expression is a valid\n/// value for an address or reference constant expression. Return true if we\n/// can fold this expression, whether or not it\'s a constant expression.\nstatic bool CheckLValueConstantExpression(EvalInfo &Info, SourceLocation Loc, QualType Type, const LValue &LVal, ConstantExprKind Kind, CheckedTemporaries &CheckedTemps) {\n  // ...\n  if (auto *FD = dyn_cast_or_null<FunctionDecl>(BaseVD); FD && FD->isImmediateFunction()) {\n    Info.FFDiag(Loc, diag::note_consteval_address_accessible) << !Type->isAnyPointerType();"},{n,2336,"/// Member pointers are constant expressions unless they point to a\n/// non-virtual dllimport member function.\nstatic bool CheckMemberPointerConstantExpression(EvalInfo &Info, SourceLocation Loc, QualType Type, const APValue &Value, ConstantExprKind Kind) {\n  // ...\n  if (FD->isImmediateFunction()) {\n    Info.FFDiag(Loc, diag::note_consteval_address_accessible) << /*pointer*/ 0;"}},
		[m]={
			["clang/test/CXX/expr/expr.const/p6-2a.cpp"]={"clang/test/CXX/expr/expr.const/p6-2a.cpp:50:20: note: pointer to a consteval declaration is not a constant expression","clang/test/CXX/expr/expr.const/p6-2a.cpp:50:16: note: pointer to a consteval declaration is not a constant expression"}
		}
	},
	["note_constexpr_access_deleted_object"]={
		[b]={{nil,l,"note_constexpr_access_deleted_object"}},
		[c]={{nil,l,"%select{read of|read of|assignment to|increment of|decrement of|member call on|dynamic_cast of|typeid applied to|construction of|destruction of}0 heap allocated object that has been deleted"}},
		[e]={{nil,l,{{v,v,D,B,C,R,S,J,rb,Y}," heap allocated object that has been deleted"}}},
		[g]=f,
		[h]="(?:read of|read of|assignment to|increment of|decrement of|member call on|dynamic_cast of|typeid applied to|construction of|destruction of) heap allocated object that has been deleted",
		[i]=a,
		[j]={{nil,l,o}},
		[k]={O,1569547607,P,N},
		[d]={{n,4174,"/// Find the complete object to which an LValue refers.\nstatic CompleteObject findCompleteObject(EvalInfo &Info, const Expr *E, AccessKinds AK, const LValue &LVal, QualType LValType) {\n  // ...\n  if (Info.getLangOpts().CPlusPlus14 && LVal.Base == Info.EvaluatingDecl && lifetimeStartedInEvaluation(Info, LVal.Base)) {\n  // ...\n  } else if (const ValueDecl *D = LVal.Base.dyn_cast<const ValueDecl *>()) {\n  // ...\n  } else if (DynamicAllocLValue DA = LVal.Base.dyn_cast<DynamicAllocLValue>()) {\n    // ...\n    if (!Alloc) {\n      Info.FFDiag(E, diag::note_constexpr_access_deleted_object) << AK;"}},
		[m]={
			[db]={"clang/test/SemaCXX/cxx2a-constexpr-dynalloc.cpp:111:5: note: construction of heap allocated object that has been deleted"}
		}
	},
	["note_constexpr_access_inactive_union_member"]={
		[b]="note_constexpr_access_inactive_union_member",
		[c]={{nil,l,"%select{read of|read of|assignment to|increment of|decrement of|member call on|dynamic_cast of|typeid applied to|construction of subobject of|destruction of}0 member %1 of union with %select{active member %3|no active member}2 is not allowed in a constant expression"},{q,q,"%select{read of|assignment to|increment of|decrement of|member call on|dynamic_cast of|typeid applied to}0 member %1 of union with %select{active member %3|no active member}2 is not allowed in a constant expression"},{s,nil,"%select{read of|assignment to|increment of|decrement of}0 member %1 of union with %select{active member %3|no active member}2 is not allowed in a constant expression"}},
		[e]={{nil,l,{{v,v,D,B,C,R,S,J,"construction of subobject of",Y}," member B of union with ",{"active member D","no active member"},X}},{q,q,{{v,D,B,C,R,S,J}," member B of union with ",{"active member D","no active member"},X}},{s,nil,{{v,D,B,C}," member B of union with ",{"active member D","no active member"},X}}},
		[g]=f,
		[h]="(?:read of|read of|assignment to|increment of|decrement of|member call on|dynamic_cast of|typeid applied to|construction of subobject of|destruction of) member (.*?) of union with (?:active member (.*?)|no active member) is not allowed in a constant expression",
		[i]=a,
		[j]=o,
		[k]={mb,1366986990,lb,kb},
		[d]={{n,3824,"/// Find the designated sub-object of an rvalue.\ntemplate <typename SubobjectHandler> typename SubobjectHandler::result_type findSubobject(EvalInfo &Info, const Expr *E, const CompleteObject &Obj, const SubobjectDesignator &Sub, SubobjectHandler &handler) {\n  // ...\n  // Walk the designator\'s path to find the subobject.\n  for (unsigned I = 0, N = Sub.Entries.size(); /**/; ++I) {\n    // ...\n    if (ObjType->isArrayType()) {\n    // ...\n    } else if (ObjType->isAnyComplexType()) {\n    // ...\n    } else if (const FieldDecl *Field = getAsField(Sub.Entries[I])) {\n      // ...\n      if (RD->isUnion()) {\n        // ...\n        if (!UnionField || UnionField->getCanonicalDecl() != Field->getCanonicalDecl()) {\n          if (I == N - 1 && handler.AccessKind == AK_Construct) {\n          // ...\n          } else {\n            // ...\n            Info.FFDiag(E, diag::note_constexpr_access_inactive_union_member) << handler.AccessKind << Field << !UnionField << UnionField;"},{y,84,"static bool CheckActive(InterpState &S, CodePtr OpPC, const Pointer &Ptr, AccessKinds AK) {\n  // ...\n  S.FFDiag(Loc, diag::note_constexpr_access_inactive_union_member) << AK << InactiveField << !ActiveField << ActiveField;"}},
		[m]={
			["clang/test/SemaCXX/cxx1y-initializer-aggregates.cpp"]={"clang/test/SemaCXX/cxx1y-initializer-aggregates.cpp:28:17: note: read of member \'d\' of union with active member \'c\' is not allowed in a constant expression"}
		}
	},
	["note_constexpr_access_mutable"]={
		[b]={{nil,l,"note_constexpr_access_mutable"}},
		[c]={{nil,l,"%select{read of|read of|assignment to|increment of|decrement of|member call on|dynamic_cast of|typeid applied to|construction of|destruction of}0 mutable member %1 is not allowed in a constant expression"}},
		[e]={{nil,l,{{v,v,D,B,C,R,S,J,rb,Y}," mutable member B is not allowed in a constant expression"}}},
		[g]=f,
		[h]="(?:read of|read of|assignment to|increment of|decrement of|member call on|dynamic_cast of|typeid applied to|construction of|destruction of) mutable member (.*?) is not allowed in a constant expression",
		[i]=a,
		[j]={{nil,l,o}},
		[k]={"2b4fa5348ee1",1569733726,"For P0784R7: compute whether a variable has constant destruction if it","For P0784R7: compute whether a variable has constant destruction if it\nhas a constexpr destructor.\n\nFor constexpr variables, reject if the variable does not have constant\ndestruction. In all cases, do not emit runtime calls to the destructor\nfor variables with constant destruction.\n\nllvm-svn: 373159"},
		[d]={{n,3542,"/// Diagnose an attempt to read from any unreadable field within the specified\n/// type, which might be a class type.\nstatic bool diagnoseMutableFields(EvalInfo &Info, const Expr *E, AccessKinds AK, QualType T) {\n  // ...\n  for (auto *Field : RD->fields()) {\n    // If we\'re actually going to read this field in some way, then it can\'t\n    // be mutable. If we\'re in a union, then assigning to a mutable field\n    // (even an empty one) can change the active member, so that\'s not OK.\n    // FIXME: Add core issue number for the union case.\n    if (Field->isMutable() && (RD->isUnion() || isReadByLvalueToRvalueConversion(Field->getType()))) {\n      Info.FFDiag(E, diag::note_constexpr_access_mutable, 1) << AK << Field;"},{n,3804,"/// Find the designated sub-object of an rvalue.\ntemplate <typename SubobjectHandler> typename SubobjectHandler::result_type findSubobject(EvalInfo &Info, const Expr *E, const CompleteObject &Obj, const SubobjectDesignator &Sub, SubobjectHandler &handler) {\n  // ...\n  // Walk the designator\'s path to find the subobject.\n  for (unsigned I = 0, N = Sub.Entries.size(); /**/; ++I) {\n    // ...\n    if (ObjType->isArrayType()) {\n    // ...\n    } else if (ObjType->isAnyComplexType()) {\n    // ...\n    } else if (const FieldDecl *Field = getAsField(Sub.Entries[I])) {\n      if (Field->isMutable() && !Obj.mayAccessMutableMembers(Info, handler.AccessKind)) {\n        Info.FFDiag(E, diag::note_constexpr_access_mutable, 1) << handler.AccessKind << Field;"},{y,231,"bool CheckMutable(InterpState &S, CodePtr OpPC, const Pointer &Ptr) {\n  // ...\n  S.FFDiag(Loc, diag::note_constexpr_access_mutable, 1) << AK_Read << Field;"}},
		[m]={
			["clang/test/CXX/expr/expr.const/p6-2a.cpp"]={"clang/test/CXX/expr/expr.const/p6-2a.cpp:15:35: note: read of mutable member \'member\' is not allowed in a constant expression","clang/test/CXX/expr/expr.const/p6-2a.cpp:21:38: note: assignment to mutable member \'member\' is not allowed in a constant expression","clang/test/CXX/expr/expr.const/p6-2a.cpp:32:13: note: read of mutable member \'hcm\' is not allowed in a constant expression"}
		}
	},
	["note_constexpr_access_null"]={
		[b]="note_constexpr_access_null",
		[c]={{nil,l,"%select{read of|read of|assignment to|increment of|decrement of|member call on|dynamic_cast of|typeid applied to|construction of|destruction of}0 dereferenced null pointer is not allowed in a constant expression"},{q,q,"%select{read of|assignment to|increment of|decrement of|member call on|dynamic_cast of|typeid applied to}0 dereferenced null pointer is not allowed in a constant expression"},{s,nil,"%select{read of|assignment to|increment of|decrement of}0 dereferenced null pointer is not allowed in a constant expression"}},
		[e]={{nil,l,{{v,v,D,B,C,R,S,J,rb,Y}," dereferenced null pointer is not allowed in a constant expression"}},{q,q,{{v,D,B,C,R,S,J}," dereferenced null pointer is not allowed in a constant expression"}},{s,nil,{{v,D,B,C}," dereferenced null pointer is not allowed in a constant expression"}}},
		[g]=f,
		[h]="(?:read of|read of|assignment to|increment of|decrement of|member call on|dynamic_cast of|typeid applied to|construction of|destruction of) dereferenced null pointer is not allowed in a constant expression",
		[i]=a,
		[j]=o,
		[k]={mb,1366986990,lb,kb},
		[d]={{n,1654,"#endif\n  // ...\n  bool checkNullPointerForFoldAccess(EvalInfo &Info, const Expr *E, AccessKinds AK) {\n    return checkNullPointerDiagnosingWith([&Info, E, AK] { Info.FFDiag(E, diag::note_constexpr_access_null) << AK; });"},{n,4009,"/// Find the complete object to which an LValue refers.\nstatic CompleteObject findCompleteObject(EvalInfo &Info, const Expr *E, AccessKinds AK, const LValue &LVal, QualType LValType) {\n  // ...\n  if (!LVal.Base) {\n    Info.FFDiag(E, diag::note_constexpr_access_null) << AK;"},{y,155,"bool CheckLive(InterpState &S, CodePtr OpPC, const Pointer &Ptr, AccessKinds AK) {\n  if (Ptr.isZero()) {\n    // ...\n    if (Ptr.isField())\n    // ...\n    else\n      S.FFDiag(Src, diag::note_constexpr_access_null) << AK;"}},
		[m]={
			["clang/test/AST/Interp/builtin-functions.cpp"]={"clang/test/AST/Interp/builtin-functions.cpp:19:17: note: read of dereferenced null pointer is not allowed in a constant expression","clang/test/AST/Interp/builtin-functions.cpp:24:17: note: read of dereferenced null pointer is not allowed in a constant expression"}
		}
	},
	["note_constexpr_access_past_end"]={
		[b]="note_constexpr_access_past_end",
		[c]={{nil,l,"%select{read of|read of|assignment to|increment of|decrement of|member call on|dynamic_cast of|typeid applied to|construction of|destruction of}0 dereferenced one-past-the-end pointer is not allowed in a constant expression"},{q,q,"%select{read of|assignment to|increment of|decrement of|member call on|dynamic_cast of|typeid applied to}0 dereferenced one-past-the-end pointer is not allowed in a constant expression"},{s,nil,"%select{read of|assignment to|increment of|decrement of}0 dereferenced one-past-the-end pointer is not allowed in a constant expression"}},
		[e]={{nil,l,{{v,v,D,B,C,R,S,J,rb,Y}," dereferenced one-past-the-end pointer is not allowed in a constant expression"}},{q,q,{{v,D,B,C,R,S,J}," dereferenced one-past-the-end pointer is not allowed in a constant expression"}},{s,nil,{{v,D,B,C}," dereferenced one-past-the-end pointer is not allowed in a constant expression"}}},
		[g]=f,
		[h]="(?:read of|read of|assignment to|increment of|decrement of|member call on|dynamic_cast of|typeid applied to|construction of|destruction of) dereferenced one\\-past\\-the\\-end pointer is not allowed in a constant expression",
		[i]=a,
		[j]=o,
		[k]={mb,1366986990,lb,kb},
		[d]={{n,3659,"/// Find the designated sub-object of an rvalue.\ntemplate <typename SubobjectHandler> typename SubobjectHandler::result_type findSubobject(EvalInfo &Info, const Expr *E, const CompleteObject &Obj, const SubobjectDesignator &Sub, SubobjectHandler &handler) {\n  // ...\n  if (Sub.isOnePastTheEnd() || Sub.isMostDerivedAnUnsizedArray()) {\n    if (Info.getLangOpts().CPlusPlus11)\n      Info.FFDiag(E, Sub.isOnePastTheEnd() ? diag::note_constexpr_access_past_end : diag::note_constexpr_access_unsized_array) << handler.AccessKind;"},{n,3761,"/// Find the designated sub-object of an rvalue.\ntemplate <typename SubobjectHandler> typename SubobjectHandler::result_type findSubobject(EvalInfo &Info, const Expr *E, const CompleteObject &Obj, const SubobjectDesignator &Sub, SubobjectHandler &handler) {\n  // ...\n  // Walk the designator\'s path to find the subobject.\n  for (unsigned I = 0, N = Sub.Entries.size(); /**/; ++I) {\n    // ...\n    if (ObjType->isArrayType()) {\n      // ...\n      if (CAT->getSize().ule(Index)) {\n        // Note, it should not be possible to form a pointer with a valid\n        // designator which points more than one past the end of the array.\n        if (Info.getLangOpts().CPlusPlus11)\n          Info.FFDiag(E, diag::note_constexpr_access_past_end) << handler.AccessKind;"},{n,3782,"/// Find the designated sub-object of an rvalue.\ntemplate <typename SubobjectHandler> typename SubobjectHandler::result_type findSubobject(EvalInfo &Info, const Expr *E, const CompleteObject &Obj, const SubobjectDesignator &Sub, SubobjectHandler &handler) {\n  // ...\n  // Walk the designator\'s path to find the subobject.\n  for (unsigned I = 0, N = Sub.Entries.size(); /**/; ++I) {\n    // ...\n    if (ObjType->isArrayType()) {\n    // ...\n    } else if (ObjType->isAnyComplexType()) {\n      // ...\n      if (Index > 1) {\n        if (Info.getLangOpts().CPlusPlus11)\n          Info.FFDiag(E, diag::note_constexpr_access_past_end) << handler.AccessKind;"},{n,4340,"/// Perform an lvalue-to-rvalue conversion on the given glvalue. This\n/// can also be used for \'lvalue-to-lvalue\' conversions for looking up the\n/// glvalue referred to by an entity of reference type.\n///\n/// \\param Info - Information about the ongoing evaluation.\n/// \\param Conv - The expression for which we are performing the conversion.\n///               Used for diagnostics.\n/// \\param Type - The type of the glvalue (before stripping cv-qualifiers in the\n///               case of a non-class type).\n/// \\param LVal - The glvalue on which we are attempting to perform this action.\n/// \\param RVal - The produced value will be placed here.\n/// \\param WantObjectRepresentation - If true, we\'re looking for the object\n///               representation rather than the value, and in particular,\n///               there is no requirement that the result be fully initialized.\nstatic bool handleLValueToRValueConversion(EvalInfo &Info, const Expr *Conv, QualType Type, const LValue &LVal, APValue &RVal, bool WantObjectRepresentation = false) {\n  // ...\n  if (Base && !LVal.getLValueCallIndex() && !Type.isVolatileQualified()) {\n    if (const CompoundLiteralExpr *CLE = dyn_cast<CompoundLiteralExpr>(Base)) {\n    // ...\n    } else if (isa<StringLiteral>(Base) || isa<PredefinedExpr>(Base)) {\n      // ...\n      if (LVal.Designator.isOnePastTheEnd()) {\n        if (Info.getLangOpts().CPlusPlus11)\n          Info.FFDiag(Conv, diag::note_constexpr_access_past_end) << AK;"},{n,5661,"/// Check that we can access the notional vptr of an object / determine its\n/// dynamic type.\nstatic bool checkDynamicType(EvalInfo &Info, const Expr *E, const LValue &This, AccessKinds AK, bool Polymorphic) {\n  // ...\n  if (!Obj.Value) {\n    // The object is not usable in constant expressions, so we can\'t inspect\n    // its value to see if it\'s in-lifetime or what the active union members\n    // are. We can still check for a one-past-the-end lvalue.\n    if (This.Designator.isOnePastTheEnd() || This.Designator.isMostDerivedAnUnsizedArray()) {\n      Info.FFDiag(E, This.Designator.isOnePastTheEnd() ? diag::note_constexpr_access_past_end : diag::note_constexpr_access_unsized_array) << AK;"},{y,191,"bool CheckRange(InterpState &S, CodePtr OpPC, const Pointer &Ptr, AccessKinds AK) {\n  // ...\n  S.FFDiag(Loc, diag::note_constexpr_access_past_end) << AK;"}},
		[m]={
			["clang/test/SemaCXX/constexpr-array-unknown-bound.cpp"]={"clang/test/SemaCXX/constexpr-array-unknown-bound.cpp:5:32: note: read of dereferenced one-past-the-end pointer is not allowed in a constant expression"}
		}
	},
	["note_constexpr_access_static_temporary"]={
		[b]="note_constexpr_access_static_temporary",
		[c]={{nil,l,"%select{read of|read of|assignment to|increment of|decrement of|member call on|dynamic_cast of|typeid applied to|reconstruction of|destruction of}0 temporary is not allowed in a constant expression outside the expression that created the temporary"},{q,q,"%select{read of|assignment to|increment of|decrement of|member call on|dynamic_cast of|typeid applied to}0 temporary is not allowed in a constant expression outside the expression that created the temporary"},{s,nil,"%select{read of|assignment to|increment of|decrement of}0 temporary is not allowed in a constant expression outside the expression that created the temporary"}},
		[e]={{nil,l,{{v,v,D,B,C,R,S,J,"reconstruction of",Y}," temporary is not allowed in a constant expression outside the expression that created the temporary"}},{q,q,{{v,D,B,C,R,S,J}," temporary is not allowed in a constant expression outside the expression that created the temporary"}},{s,nil,{{v,D,B,C}," temporary is not allowed in a constant expression outside the expression that created the temporary"}}},
		[g]=f,
		[h]="(?:read of|read of|assignment to|increment of|decrement of|member call on|dynamic_cast of|typeid applied to|reconstruction of|destruction of) temporary is not allowed in a constant expression outside the expression that created the temporary",
		[i]=a,
		[j]=o,
		[k]={"e6c0144208a4",1370393174,"Model temporary lifetime-extension explicitly in the AST. Use this model to","Model temporary lifetime-extension explicitly in the AST. Use this model to\nhandle temporaries which have been lifetime-extended to static storage duration\nwithin constant expressions. This correctly handles nested lifetime extension\n(through reference members of aggregates in aggregate initializers) but\nnon-constant-expression emission hasn\'t yet been updated to do the same.\n\nllvm-svn: 183283"},
		[d]={{n,4217,"/// Find the complete object to which an LValue refers.\nstatic CompleteObject findCompleteObject(EvalInfo &Info, const Expr *E, AccessKinds AK, const LValue &LVal, QualType LValType) {\n  // ...\n  if (Info.getLangOpts().CPlusPlus14 && LVal.Base == Info.EvaluatingDecl && lifetimeStartedInEvaluation(Info, LVal.Base)) {\n  // ...\n  } else if (const ValueDecl *D = LVal.Base.dyn_cast<const ValueDecl *>()) {\n  // ...\n  } else if (DynamicAllocLValue DA = LVal.Base.dyn_cast<DynamicAllocLValue>()) {\n  // ...\n  } else {\n    // ...\n    if (!Frame) {\n      if (const MaterializeTemporaryExpr *MTE = dyn_cast_or_null<MaterializeTemporaryExpr>(Base)) {\n        // ...\n        // C++20 [expr.const]p4: [DR2126]\n        //   An object or reference is usable in constant expressions if it is\n        //   - a temporary object of non-volatile const-qualified literal type\n        //     whose lifetime is extended to that of a variable that is usable\n        //     in constant expressions\n        //\n        // C++20 [expr.const]p5:\n        //  an lvalue-to-rvalue conversion [is not allowed unless it applies to]\n        //   - a non-volatile glvalue that refers to an object that is usable\n        //     in constant expressions, or\n        //   - a non-volatile glvalue of literal type that refers to a\n        //     non-volatile object whose lifetime began within the evaluation\n        //     of E;\n        //\n        // C++11 misses the \'began within the evaluation of e\' check and\n        // instead allows all temporaries, including things like:\n        //   int &&r = 1;\n        //   int x = ++r;\n        //   constexpr int k = r;\n        // Therefore we use the C++14-onwards rules in C++11 too.\n        //\n        // Note that temporaries whose lifetimes began while evaluating a\n        // variable\'s constructor are not usable while evaluating the\n        // corresponding destructor, not even if they\'re of const-qualified\n        // types.\n        if (!MTE->isUsableInConstantExpressions(Info.Ctx) && !lifetimeStartedInEvaluation(Info, LVal.Base)) {\n          // ...\n          Info.FFDiag(E, diag::note_constexpr_access_static_temporary, 1) << AK;"},{y,102,"static bool CheckTemporary(InterpState &S, CodePtr OpPC, const Pointer &Ptr, AccessKinds AK) {\n  if (auto ID = Ptr.getDeclID()) {\n    // ...\n    S.FFDiag(E, diag::note_constexpr_access_static_temporary, 1) << AK;"}},
		[m]={
			["clang/test/CXX/expr/expr.const/p6-2a.cpp"]={"clang/test/CXX/expr/expr.const/p6-2a.cpp:40:13: note: read of temporary is not allowed in a constant expression outside the expression that created the temporary"}
		}
	},
	["note_constexpr_access_uninit"]={
		[b]="note_constexpr_access_uninit",
		[c]={{nil,l,"%select{read of|read of|assignment to|increment of|decrement of|member call on|dynamic_cast of|typeid applied to|construction of subobject of|destruction of}0 %select{object outside its lifetime|uninitialized object}1 is not allowed in a constant expression"},{q,q,"%select{read of|assignment to|increment of|decrement of|member call on|dynamic_cast of|typeid applied to}0 %select{object outside its lifetime|uninitialized object}1 is not allowed in a constant expression"},{s,nil,"%select{read of|assignment to|increment of|decrement of}0 object outside its lifetime is not allowed in a constant expression"}},
		[e]={{nil,l,{{v,v,D,B,C,R,S,J,"construction of subobject of",Y},ab,{"object outside its lifetime","uninitialized object"},X}},{q,q,{{v,D,B,C,R,S,J},ab,{"object outside its lifetime","uninitialized object"},X}},{s,nil,{{v,D,B,C}," object outside its lifetime is not allowed in a constant expression"}}},
		[g]=f,
		[h]="(?:read of|read of|assignment to|increment of|decrement of|member call on|dynamic_cast of|typeid applied to|construction of subobject of|destruction of) (?:object outside its lifetime|uninitialized object) is not allowed in a constant expression",
		[i]=a,
		[j]=o,
		[k]={mb,1366986990,lb,kb},
		[d]={{n,3679,"/// Find the designated sub-object of an rvalue.\ntemplate <typename SubobjectHandler> typename SubobjectHandler::result_type findSubobject(EvalInfo &Info, const Expr *E, const CompleteObject &Obj, const SubobjectDesignator &Sub, SubobjectHandler &handler) {\n  // ...\n  // Walk the designator\'s path to find the subobject.\n  for (unsigned I = 0, N = Sub.Entries.size(); /**/; ++I) {\n    // Reading an indeterminate value is undefined, but assigning over one is OK.\n    if ((O->isAbsent() && !(handler.AccessKind == AK_Construct && I == N)) || (O->isIndeterminate() && !isValidIndeterminateAccess(handler.AccessKind))) {\n      if (!Info.checkingPotentialConstantExpression())\n        Info.FFDiag(E, diag::note_constexpr_access_uninit) << handler.AccessKind << O->isIndeterminate();"},{y,243,"bool CheckInitialized(InterpState &S, CodePtr OpPC, const Pointer &Ptr, AccessKinds AK) {\n  // ...\n  if (!S.checkingPotentialConstantExpression()) {\n    // ...\n    S.FFDiag(Loc, diag::note_constexpr_access_uninit) << AK << /*uninitialized=*/true;"}},
		[m]={
			["clang/test/SemaCXX/constexpr-value-init.cpp"]={oc,oc,oc,oc,oc}
		}
	},
	["note_constexpr_access_unreadable_object"]={
		[b]={{nil,q,"note_constexpr_access_unreadable_object"}},
		[c]={{nil,l,"%select{read of|read of|assignment to|increment of|decrement of|member call on|dynamic_cast of|typeid applied to|construction of|destruction of}0 object \'%1\' whose value is not known"},{q,q,"%select{read of|assignment to|increment of|decrement of|member call on|dynamic_cast of|typeid applied to}0 object \'%1\' whose value is not known"}},
		[e]={{nil,l,{{v,v,D,B,C,R,S,J,rb,Y}," object \'B\' whose value is not known"}},{q,q,{{v,D,B,C,R,S,J}," object \'B\' whose value is not known"}}},
		[g]=f,
		[h]="(?:read of|read of|assignment to|increment of|decrement of|member call on|dynamic_cast of|typeid applied to|construction of|destruction of) object \'(.*?)\' whose value is not known",
		[i]=a,
		[j]={{nil,q,o}},
		[k]={"7ee4307bd445",1558057565,"Refactor constant evaluation of typeid(T) to track a symbolic type_info","Refactor constant evaluation of typeid(T) to track a symbolic type_info\nobject rather than tracking the originating expression.\n\nThis is groundwork for supporting polymorphic typeid expressions. (Note\nthat this somewhat regresses our support for DR1968, but it turns out\nthat that never actually worked anyway, at least in non-trivial cases.)\n\nllvm-svn: 360974"},
		[d]={{n,4229,"/// Find the complete object to which an LValue refers.\nstatic CompleteObject findCompleteObject(EvalInfo &Info, const Expr *E, AccessKinds AK, const LValue &LVal, QualType LValType) {\n  // ...\n  if (Info.getLangOpts().CPlusPlus14 && LVal.Base == Info.EvaluatingDecl && lifetimeStartedInEvaluation(Info, LVal.Base)) {\n  // ...\n  } else if (const ValueDecl *D = LVal.Base.dyn_cast<const ValueDecl *>()) {\n  // ...\n  } else if (DynamicAllocLValue DA = LVal.Base.dyn_cast<DynamicAllocLValue>()) {\n  // ...\n  } else {\n    // ...\n    if (!Frame) {\n      if (const MaterializeTemporaryExpr *MTE = dyn_cast_or_null<MaterializeTemporaryExpr>(Base)) {\n      // ...\n      } else {\n        // ...\n        Info.FFDiag(E, diag::note_constexpr_access_unreadable_object) << AK << Val.getAsString(Info.Ctx, Info.Ctx.getLValueReferenceType(LValType));"}},
		[m]={
			["clang/test/SemaCXX/typeid.cpp"]={"clang/test/SemaCXX/typeid.cpp:32:30: note: read of object \'typeid(int).name\' whose value is not known"}
		}
	},
	["note_constexpr_access_unsized_array"]={
		[b]={{nil,E,"note_constexpr_access_unsized_array"}},
		[c]={{nil,l,"%select{read of|read of|assignment to|increment of|decrement of|member call on|dynamic_cast of|typeid applied to|construction of|destruction of}0 element of array without known bound is not allowed in a constant expression"},{q,q,"%select{read of|assignment to|increment of|decrement of|member call on|dynamic_cast of|typeid applied to}0 element of array without known bound is not allowed in a constant expression"},{s,E,"%select{read of|assignment to|increment of|decrement of}0 pointer to element of array without known bound is not allowed in a constant expression"}},
		[e]={{nil,l,{{v,v,D,B,C,R,S,J,rb,Y}," element of array without known bound is not allowed in a constant expression"}},{q,q,{{v,D,B,C,R,S,J}," element of array without known bound is not allowed in a constant expression"}},{s,E,{{v,D,B,C}," pointer to element of array without known bound is not allowed in a constant expression"}}},
		[g]=f,
		[h]="(?:read of|read of|assignment to|increment of|decrement of|member call on|dynamic_cast of|typeid applied to|construction of|destruction of) element of array without known bound is not allowed in a constant expression",
		[i]=a,
		[j]={{nil,E,o}},
		[k]={"2cd56048239f",1503971533,"Improve constant expression evaluation of arrays of unknown bound.","Improve constant expression evaluation of arrays of unknown bound.\n\nThe standard is not clear on how these are supposed to be handled, so we\nconservatively treat as non-constant any cases whose value is unknown or whose\nevaluation might result in undefined behavior.\n\nllvm-svn: 311970"},
		[d]={{n,3660,"/// Find the designated sub-object of an rvalue.\ntemplate <typename SubobjectHandler> typename SubobjectHandler::result_type findSubobject(EvalInfo &Info, const Expr *E, const CompleteObject &Obj, const SubobjectDesignator &Sub, SubobjectHandler &handler) {\n  // ...\n  if (Sub.isOnePastTheEnd() || Sub.isMostDerivedAnUnsizedArray()) {\n    if (Info.getLangOpts().CPlusPlus11)\n      Info.FFDiag(E, Sub.isOnePastTheEnd() ? diag::note_constexpr_access_past_end : diag::note_constexpr_access_unsized_array) << handler.AccessKind;"},{n,5662,"/// Check that we can access the notional vptr of an object / determine its\n/// dynamic type.\nstatic bool checkDynamicType(EvalInfo &Info, const Expr *E, const LValue &This, AccessKinds AK, bool Polymorphic) {\n  // ...\n  if (!Obj.Value) {\n    // The object is not usable in constant expressions, so we can\'t inspect\n    // its value to see if it\'s in-lifetime or what the active union members\n    // are. We can still check for a one-past-the-end lvalue.\n    if (This.Designator.isOnePastTheEnd() || This.Designator.isMostDerivedAnUnsizedArray()) {\n      Info.FFDiag(E, This.Designator.isOnePastTheEnd() ? diag::note_constexpr_access_past_end : diag::note_constexpr_access_unsized_array) << AK;"}}
	},
	["note_constexpr_access_volatile_obj"]={
		[b]="note_constexpr_access_volatile_obj",
		[c]={{nil,l,"%select{read of|read of|assignment to|increment of|decrement of|<ERROR>|<ERROR>|<ERROR>|<ERROR>}0 volatile %select{temporary|object %2|member %2}1 is not allowed in a constant expression"},{q,q,"%select{read of|assignment to|increment of|decrement of|<ERROR>|<ERROR>}0 volatile %select{temporary|object %2|member %2}1 is not allowed in a constant expression"},{s,nil,"%select{read of|assignment to|increment of|decrement of}0 volatile %select{temporary|object %2|member %2}1 is not allowed in a constant expression"}},
		[e]={{nil,l,{{v,v,D,B,C}," volatile ",{Cb,"object C","member C"},X}},{q,nil,{{v,D,B,C}," volatile ",{Cb,"object C","member C"},X}}},
		[g]=f,
		[h]="(?:read of|read of|assignment to|increment of|decrement of) volatile (?:temporary|object (.*?)|member (.*?)) is not allowed in a constant expression",
		[i]=a,
		[j]=o,
		[k]={mb,1366986990,lb,kb},
		[d]={{n,3719,"/// Find the designated sub-object of an rvalue.\ntemplate <typename SubobjectHandler> typename SubobjectHandler::result_type findSubobject(EvalInfo &Info, const Expr *E, const CompleteObject &Obj, const SubobjectDesignator &Sub, SubobjectHandler &handler) {\n  // ...\n  // Walk the designator\'s path to find the subobject.\n  for (unsigned I = 0, N = Sub.Entries.size(); /**/; ++I) {\n    // ...\n    // If this is our last pass, check that the final object type is OK.\n    if (I == N || (I == N - 1 && ObjType->isAnyComplexType())) {\n      // Accesses to volatile objects are prohibited.\n      if (ObjType.isVolatileQualified() && isFormalAccess(handler.AccessKind)) {\n        if (Info.getLangOpts().CPlusPlus) {\n          // ...\n          Info.FFDiag(E, diag::note_constexpr_access_volatile_obj, 1) << handler.AccessKind << DiagKind << Decl;"}},
		[m]={
			[T]={"clang/test/CXX/expr/expr.const/p2-0x.cpp:328:17: note: read of volatile object \'vi\' is not allowed in a constant expression","clang/test/CXX/expr/expr.const/p2-0x.cpp:350:17: note: read of volatile object \'vi\' is not allowed in a constant expression","clang/test/CXX/expr/expr.const/p2-0x.cpp:352:17: note: read of volatile object \'vs\' is not allowed in a constant expression"}
		}
	},
	["note_constexpr_access_volatile_type"]={
		[b]="note_constexpr_access_volatile_type",
		[c]={{nil,l,"%select{read of|read of|assignment to|increment of|decrement of|<ERROR>|<ERROR>|<ERROR>|<ERROR>}0 volatile-qualified type %1 is not allowed in a constant expression"},{q,q,"%select{read of|assignment to|increment of|decrement of|<ERROR>|<ERROR>}0 volatile-qualified type %1 is not allowed in a constant expression"},{s,nil,"%select{read of|assignment to|increment of|decrement of}0 volatile-qualified type %1 is not allowed in a constant expression"}},
		[e]={{nil,l,{{v,v,D,B,C}," volatile-qualified type B is not allowed in a constant expression"}},{q,nil,{{v,D,B,C}," volatile-qualified type B is not allowed in a constant expression"}}},
		[g]=f,
		[h]="(?:read of|read of|assignment to|increment of|decrement of) volatile\\-qualified type (.*?) is not allowed in a constant expression",
		[i]=a,
		[j]=o,
		[k]={mb,1366986990,lb,kb},
		[d]={{n,4034,"/// Find the complete object to which an LValue refers.\nstatic CompleteObject findCompleteObject(EvalInfo &Info, const Expr *E, AccessKinds AK, const LValue &LVal, QualType LValType) {\n  // ...\n  // C++11 DR1311: An lvalue-to-rvalue conversion on a volatile-qualified type\n  // is not a constant expression (even if the object is non-volatile). We also\n  // apply this rule to C++98, in order to conform to the expected \'volatile\'\n  // semantics.\n  if (isFormalAccess(AK) && LValType.isVolatileQualified()) {\n    if (Info.getLangOpts().CPlusPlus)\n      Info.FFDiag(E, diag::note_constexpr_access_volatile_type) << AK << LValType;"}},
		[m]={
			[T]={"clang/test/CXX/expr/expr.const/p2-0x.cpp:327:17: note: read of volatile-qualified type \'const volatile int\' is not allowed in a constant expression","clang/test/CXX/expr/expr.const/p2-0x.cpp:329:17: note: read of volatile-qualified type \'const volatile int\' is not allowed in a constant expression","clang/test/CXX/expr/expr.const/p2-0x.cpp:349:17: note: read of volatile-qualified type \'volatile int\' is not allowed in a constant expression","clang/test/CXX/expr/expr.const/p2-0x.cpp:351:17: note: read of volatile-qualified type \'const volatile int\' is not allowed in a constant expression","clang/test/CXX/expr/expr.const/p2-0x.cpp:353:17: note: read of volatile-qualified type \'const volatile int\' is not allowed in a constant expression","clang/test/CXX/expr/expr.const/p2-0x.cpp:359:17: note: read of volatile-qualified type \'volatile int\' is not allowed in a constant expression","clang/test/CXX/expr/expr.const/p2-0x.cpp:360:17: note: read of volatile-qualified type \'const volatile int\' is not allowed in a constant expression"}
		}
	},
	["note_constexpr_alignment_adjust"]={
		[b]={{nil,l,"note_constexpr_alignment_adjust"}},
		[c]={{nil,l,"cannot constant evaluate the result of adjusting alignment to %0"}},
		[e]={{nil,l,"cannot constant evaluate the result of adjusting alignment to A"}},
		[g]=f,
		[h]="cannot constant evaluate the result of adjusting alignment to (.*?)",
		[i]=a,
		[j]={{nil,l,o}},
		[k]={"8c387cbea76b",1578602886,"Add builtins for aligning and checking alignment of pointers and integers","Add builtins for aligning and checking alignment of pointers and integers\n\nThis change introduces three new builtins (which work on both pointers\nand integers) that can be used instead of common bitwise arithmetic:\n__builtin_align_up(x, alignment), __builtin_align_down(x, alignment) and\n__builtin_is_aligned(x, alignment).\n\nI originally added these builtins to the CHERI fork of LLVM a few years ago\nto handle the slightly different C semantics that we use for CHERI [1].\nUntil recently these builtins (or sequences of other builtins) were\nrequired to generate correct code. I have since made changes to the default\nC semantics so that they are no longer strictly necessary (but using them\ndoes generate slightly more efficient code). However, based on our experience\nusing them in various projects over the past few years, I believe that adding\nthese builtins to clang would be useful.\n\nThese builtins have the following benefit over bit-manipulation and casts\nvia uintptr_t:\n\n- The named builtins clearly convey the semantics of the operation. While\n  checking alignment using __builtin_is_aligned(x, 16) versus\n  ((x & 15) == 0) is probably not a huge win in readably, I personally find\n  __builtin_align_up(x, N) a lot easier to read than (x+(N-1))&~(N-1).\n- They preserve the type of the argument (including const qualifiers). When\n  using casts via uintptr_t, it is easy to cast to the wrong type or strip\n  qualifiers such as const.\n- If the alignment argument is a constant value, clang can check that it is\n  a power-of-two and within the range of the type. Since the semantics of\n  these builtins is well defined compared to arbitrary bit-manipulation,\n  it is possible to add a UBSAN checker that the run-time value is a valid\n  power-of-two. I intend to add this as a follow-up to this change.\n- The builtins avoids int-to-pointer casts both in C and LLVM IR.\n  In the future (i.e. once most optimizations handle it), we could use the new\n  llvm.ptrmask intrinsic to avoid the ptrtoint instruction that would normally\n  be generated.\n- They can be used to round up/down to the next aligned value for both\n  integers and pointers without requiring two separate macros.\n- In many projects the alignment operations are already wrapped in macros (e.g.\n  roundup2 and rounddown2 in FreeBSD), so by replacing the macro implementation\n  with a builtin call, we get improved diagnostics for many call-sites while\n  only having to change a few lines.\n- Finally, the builtins also emit assume_aligned metadata when used on pointers.\n  This can improve code generation compared to the uintptr_t casts.\n\n[1] In our CHERI compiler we have compilation mode where all pointers are\nimplemented as capabilities (essentially unforgeable 128-bit fat pointers).\nIn our original model, casts from uintptr_t (which is a 128-bit capability)\nto an integer value returned the \"offset\" of the capability (i.e. the\ndifference between the virtual address and the base of the allocation).\nThis causes problems for cases such as checking the alignment: for example, the\nexpression `if ((uintptr_t)ptr & 63) == 0` is generally used to check if the\npointer is aligned to a multiple of 64 bytes. The problem with offsets is that\nany pointer to the beginning of an allocation will have an offset of zero, so\nthis check always succeeds in that case (even if the address is not correctly\naligned). The same issues also exist when aligning up or down. Using the\nalignment builtins ensures that the address is used instead of the offset. While\nI have since changed the default C semantics to return the address instead of\nthe offset when casting, this offset compilation mode can still be used by\npassing a command-line flag.\n\nReviewers: rsmith, aaron.ballman, theraven, fhahn, lebedev.ri, nlopes, aqjune\nReviewed By: aaron.ballman, lebedev.ri\nDifferential Revision: https://reviews.llvm.org/D71499"},
		[d]={{n,9287,"bool PointerExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E, unsigned BuiltinOp) {\n  // ...\n  case Builtin::BI__builtin_align_up:\n  case Builtin::BI__builtin_align_down: {\n    // ...\n    Info.FFDiag(E->getArg(0), diag::note_constexpr_alignment_adjust) << Alignment;"}},
		[m]={
			["clang/test/SemaCXX/builtin-align-cxx.cpp"]={"clang/test/SemaCXX/builtin-align-cxx.cpp:176:54: note: cannot constant evaluate the result of adjusting alignment to 64","clang/test/SemaCXX/builtin-align-cxx.cpp:178:34: note: cannot constant evaluate the result of adjusting alignment to 64","clang/test/SemaCXX/builtin-align-cxx.cpp:207:36: note: cannot constant evaluate the result of adjusting alignment to 64","clang/test/SemaCXX/builtin-align-cxx.cpp:228:55: note: cannot constant evaluate the result of adjusting alignment to 64"}
		}
	},
	["note_constexpr_alignment_compute"]={
		[b]={{nil,l,"note_constexpr_alignment_compute"}},
		[c]={{nil,l,"cannot constant evaluate whether run-time alignment is at least %0"}},
		[e]={{nil,l,"cannot constant evaluate whether run-time alignment is at least A"}},
		[g]=f,
		[h]="cannot constant evaluate whether run\\-time alignment is at least (.*?)",
		[i]=a,
		[j]={{nil,l,o}},
		[k]={"8c387cbea76b",1578602886,"Add builtins for aligning and checking alignment of pointers and integers","Add builtins for aligning and checking alignment of pointers and integers\n\nThis change introduces three new builtins (which work on both pointers\nand integers) that can be used instead of common bitwise arithmetic:\n__builtin_align_up(x, alignment), __builtin_align_down(x, alignment) and\n__builtin_is_aligned(x, alignment).\n\nI originally added these builtins to the CHERI fork of LLVM a few years ago\nto handle the slightly different C semantics that we use for CHERI [1].\nUntil recently these builtins (or sequences of other builtins) were\nrequired to generate correct code. I have since made changes to the default\nC semantics so that they are no longer strictly necessary (but using them\ndoes generate slightly more efficient code). However, based on our experience\nusing them in various projects over the past few years, I believe that adding\nthese builtins to clang would be useful.\n\nThese builtins have the following benefit over bit-manipulation and casts\nvia uintptr_t:\n\n- The named builtins clearly convey the semantics of the operation. While\n  checking alignment using __builtin_is_aligned(x, 16) versus\n  ((x & 15) == 0) is probably not a huge win in readably, I personally find\n  __builtin_align_up(x, N) a lot easier to read than (x+(N-1))&~(N-1).\n- They preserve the type of the argument (including const qualifiers). When\n  using casts via uintptr_t, it is easy to cast to the wrong type or strip\n  qualifiers such as const.\n- If the alignment argument is a constant value, clang can check that it is\n  a power-of-two and within the range of the type. Since the semantics of\n  these builtins is well defined compared to arbitrary bit-manipulation,\n  it is possible to add a UBSAN checker that the run-time value is a valid\n  power-of-two. I intend to add this as a follow-up to this change.\n- The builtins avoids int-to-pointer casts both in C and LLVM IR.\n  In the future (i.e. once most optimizations handle it), we could use the new\n  llvm.ptrmask intrinsic to avoid the ptrtoint instruction that would normally\n  be generated.\n- They can be used to round up/down to the next aligned value for both\n  integers and pointers without requiring two separate macros.\n- In many projects the alignment operations are already wrapped in macros (e.g.\n  roundup2 and rounddown2 in FreeBSD), so by replacing the macro implementation\n  with a builtin call, we get improved diagnostics for many call-sites while\n  only having to change a few lines.\n- Finally, the builtins also emit assume_aligned metadata when used on pointers.\n  This can improve code generation compared to the uintptr_t casts.\n\n[1] In our CHERI compiler we have compilation mode where all pointers are\nimplemented as capabilities (essentially unforgeable 128-bit fat pointers).\nIn our original model, casts from uintptr_t (which is a 128-bit capability)\nto an integer value returned the \"offset\" of the capability (i.e. the\ndifference between the virtual address and the base of the allocation).\nThis causes problems for cases such as checking the alignment: for example, the\nexpression `if ((uintptr_t)ptr & 63) == 0` is generally used to check if the\npointer is aligned to a multiple of 64 bytes. The problem with offsets is that\nany pointer to the beginning of an allocation will have an offset of zero, so\nthis check always succeeds in that case (even if the address is not correctly\naligned). The same issues also exist when aligning up or down. Using the\nalignment builtins ensures that the address is used instead of the offset. While\nI have since changed the default C semantics to return the address instead of\nthe offset when casting, this offset compilation mode can still be used by\npassing a command-line flag.\n\nReviewers: rsmith, aaron.ballman, theraven, fhahn, lebedev.ri, nlopes, aqjune\nReviewed By: aaron.ballman, lebedev.ri\nDifferential Revision: https://reviews.llvm.org/D71499"},
		[d]={{n,12026,"bool IntExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E, unsigned BuiltinOp) {\n  // ...\n  case Builtin::BI__builtin_is_aligned: {\n    // ...\n    if (Src.isLValue()) {\n      // ...\n      Info.FFDiag(E->getArg(0), diag::note_constexpr_alignment_compute) << Alignment;"}},
		[m]={
			["clang/test/SemaCXX/builtin-align-cxx.cpp"]={"clang/test/SemaCXX/builtin-align-cxx.cpp:215:37: note: cannot constant evaluate whether run-time alignment is at least 64"}
		}
	},
	["note_constexpr_alignment_too_big"]={
		[b]={{nil,l,"note_constexpr_alignment_too_big"}},
		[c]={{nil,l,"requested alignment must be %0 or less for type %1; %2 is invalid"}},
		[e]={{nil,l,"requested alignment must be A or less for type B; C is invalid"}},
		[g]=f,
		[h]="requested alignment must be (.*?) or less for type (.*?); (.*?) is invalid",
		[i]=a,
		[j]={{nil,l,o}},
		[k]={"8c387cbea76b",1578602886,"Add builtins for aligning and checking alignment of pointers and integers","Add builtins for aligning and checking alignment of pointers and integers\n\nThis change introduces three new builtins (which work on both pointers\nand integers) that can be used instead of common bitwise arithmetic:\n__builtin_align_up(x, alignment), __builtin_align_down(x, alignment) and\n__builtin_is_aligned(x, alignment).\n\nI originally added these builtins to the CHERI fork of LLVM a few years ago\nto handle the slightly different C semantics that we use for CHERI [1].\nUntil recently these builtins (or sequences of other builtins) were\nrequired to generate correct code. I have since made changes to the default\nC semantics so that they are no longer strictly necessary (but using them\ndoes generate slightly more efficient code). However, based on our experience\nusing them in various projects over the past few years, I believe that adding\nthese builtins to clang would be useful.\n\nThese builtins have the following benefit over bit-manipulation and casts\nvia uintptr_t:\n\n- The named builtins clearly convey the semantics of the operation. While\n  checking alignment using __builtin_is_aligned(x, 16) versus\n  ((x & 15) == 0) is probably not a huge win in readably, I personally find\n  __builtin_align_up(x, N) a lot easier to read than (x+(N-1))&~(N-1).\n- They preserve the type of the argument (including const qualifiers). When\n  using casts via uintptr_t, it is easy to cast to the wrong type or strip\n  qualifiers such as const.\n- If the alignment argument is a constant value, clang can check that it is\n  a power-of-two and within the range of the type. Since the semantics of\n  these builtins is well defined compared to arbitrary bit-manipulation,\n  it is possible to add a UBSAN checker that the run-time value is a valid\n  power-of-two. I intend to add this as a follow-up to this change.\n- The builtins avoids int-to-pointer casts both in C and LLVM IR.\n  In the future (i.e. once most optimizations handle it), we could use the new\n  llvm.ptrmask intrinsic to avoid the ptrtoint instruction that would normally\n  be generated.\n- They can be used to round up/down to the next aligned value for both\n  integers and pointers without requiring two separate macros.\n- In many projects the alignment operations are already wrapped in macros (e.g.\n  roundup2 and rounddown2 in FreeBSD), so by replacing the macro implementation\n  with a builtin call, we get improved diagnostics for many call-sites while\n  only having to change a few lines.\n- Finally, the builtins also emit assume_aligned metadata when used on pointers.\n  This can improve code generation compared to the uintptr_t casts.\n\n[1] In our CHERI compiler we have compilation mode where all pointers are\nimplemented as capabilities (essentially unforgeable 128-bit fat pointers).\nIn our original model, casts from uintptr_t (which is a 128-bit capability)\nto an integer value returned the \"offset\" of the capability (i.e. the\ndifference between the virtual address and the base of the allocation).\nThis causes problems for cases such as checking the alignment: for example, the\nexpression `if ((uintptr_t)ptr & 63) == 0` is generally used to check if the\npointer is aligned to a multiple of 64 bytes. The problem with offsets is that\nany pointer to the beginning of an allocation will have an offset of zero, so\nthis check always succeeds in that case (even if the address is not correctly\naligned). The same issues also exist when aligning up or down. Using the\nalignment builtins ensures that the address is used instead of the offset. While\nI have since changed the default C semantics to return the address instead of\nthe offset when casting, this offset compilation mode can still be used by\npassing a command-line flag.\n\nReviewers: rsmith, aaron.ballman, theraven, fhahn, lebedev.ri, nlopes, aqjune\nReviewed By: aaron.ballman, lebedev.ri\nDifferential Revision: https://reviews.llvm.org/D71499"},
		[d]={{n,9149,"/// Evaluate the value of the alignment argument to __builtin_align_{up,down},\n/// __builtin_is_aligned and __builtin_assume_aligned.\nstatic bool getAlignmentArgument(const Expr *E, QualType ForType, EvalInfo &Info, APSInt &Alignment) {\n  // ...\n  if (APSInt::compareValues(Alignment, MaxValue) > 0) {\n    Info.FFDiag(E, diag::note_constexpr_alignment_too_big) << MaxValue << ForType << Alignment;"}},
		[m]={
			["clang/test/SemaCXX/builtin-align-cxx.cpp"]={"clang/test/SemaCXX/builtin-align-cxx.cpp:121:36: note: requested alignment must be 32768 or less for type \'short\'; 1048576 is invalid","clang/test/SemaCXX/builtin-align-cxx.cpp:112:34: note: requested alignment must be 2147483648 or less for type \'int\'; 8589934592 is invalid","clang/test/SemaCXX/builtin-align-cxx.cpp:105:36: note: requested alignment must be 128 or less for type \'char\'; 4194304 is invalid"}
		}
	},
	["note_constexpr_array_index"]={
		[b]="note_constexpr_array_index",
		[c]="cannot refer to element %0 of %select{array of %2 elements|non-array object}1 in a constant expression",
		[e]={{nil,G,{"cannot refer to element A of ",{{"array of C element",{a,"s"}},"non-array object"}," in a constant expression"}},{nil,nil,{"cannot refer to element A of ",{"array of C elements","non-array object"}," in a constant expression"}}},
		[g]=f,
		[h]="cannot refer to element (.*?) of (?:array of (.*?) element(?:|s)|non\\-array object) in a constant expression",
		[i]=a,
		[j]=o,
		[k]={"a8105bc9cecb",1325867940,"C++11 generalized constant expressions: implement checking and diagnostics for","C++11 generalized constant expressions: implement checking and diagnostics for\npointer-arithmetic-related undefined behavior and unspecified results. We\ncontinue to fold such values, but now notice they aren\'t constant expressions.\n\nllvm-svn: 147659"},
		[d]={{n,1435,"void SubobjectDesignator::diagnosePointerArithmetic(EvalInfo &Info, const Expr *E, const APSInt &N) {\n  // If we\'re complaining, we must be able to statically determine the size of\n  // the most derived array.\n  if (MostDerivedPathLength == Entries.size() && MostDerivedIsArrayElement)\n    Info.CCEDiag(E, diag::note_constexpr_array_index) << N << /*array*/ 0 << static_cast<unsigned>(getMostDerivedArraySize());"},{n,1439,"void SubobjectDesignator::diagnosePointerArithmetic(EvalInfo &Info, const Expr *E, const APSInt &N) {\n  // If we\'re complaining, we must be able to statically determine the size of\n  // the most derived array.\n  if (MostDerivedPathLength == Entries.size() && MostDerivedIsArrayElement)\n  // ...\n  else\n    Info.CCEDiag(E, diag::note_constexpr_array_index) << N << /*non-array*/ 1;"}},
		[m]={
			["clang/test/SemaCXX/constexpr-printing.cpp"]={"clang/test/SemaCXX/constexpr-printing.cpp:73:46: note: cannot refer to element -1 of array of 12 elements in a constant expression","clang/test/SemaCXX/constexpr-printing.cpp:73:46: note: cannot refer to element -1 of array of 12 elements in a constant expression","clang/test/SemaCXX/constexpr-printing.cpp:73:46: note: cannot refer to element -1 of array of 13 elements in a constant expression","clang/test/SemaCXX/constexpr-printing.cpp:73:46: note: cannot refer to element -1 of array of 14 elements in a constant expression","clang/test/SemaCXX/constexpr-printing.cpp:73:46: note: cannot refer to element -1 of array of 14 elements in a constant expression"}
		}
	},
	["note_constexpr_baa_insufficient_alignment"]={
		[b]="note_constexpr_baa_insufficient_alignment",
		[c]="%select{alignment of|offset of the aligned pointer from}0 the base pointee object (%1 %plural{1:byte|:bytes}1) is %select{less than|not a multiple of}0 the asserted %2 %plural{1:byte|:bytes}2",
		[e]={{nil,nil,{{"alignment of","offset of the aligned pointer from"}," the base pointee object (B ",{"byte","bytes"},") is ",{"less than","not a multiple of"}," the asserted C ",{"byte","bytes"}}}},
		[g]=f,
		[h]="(?:alignment of|offset of the aligned pointer from) the base pointee object \\((.*?) (?:byte|bytes)\\) is (?:less than|not a multiple of) the asserted (.*?) (?:byte|bytes)",
		[i]=a,
		[j]=o,
		[k]={"0dd05d4b5936",1412356717,"constexpr evaluation for __builtin_assume_aligned","constexpr evaluation for __builtin_assume_aligned\n\nRichard noted in the review of r217349 that extra handling of\n__builtin_assume_aligned inside of the expression evaluator was needed. He was\nright, and this should address the concerns raised, namely:\n\n 1. The offset argument to __builtin_assume_aligned can have side effects, and\n    we need to make sure that all arguments are properly evaluated.\n\n 2. If the alignment assumption does not hold, that introduces undefined\n    behavior, and undefined behavior cannot appear inside a constexpr.\n\nand hopefully the diagnostics produced are detailed enough to explain what is\ngoing on.\n\nllvm-svn: 218992"},
		[d]={{n,9231,"bool PointerExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E, unsigned BuiltinOp) {\n  // ...\n  case Builtin::BI__builtin_assume_aligned: {\n    // ...\n    // If there is a base object, then it must have the correct alignment.\n    if (OffsetResult.Base) {\n      // ...\n      if (BaseAlignment < Align) {\n        // ...\n        CCEDiag(E->getArg(0), diag::note_constexpr_baa_insufficient_alignment) << 0 << (unsigned)BaseAlignment.getQuantity() << (unsigned)Align.getQuantity();"},{n,9244,"bool PointerExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E, unsigned BuiltinOp) {\n  // ...\n  case Builtin::BI__builtin_assume_aligned: {\n    // ...\n    // The offset must also have the correct alignment.\n    if (OffsetResult.Offset.alignTo(Align) != OffsetResult.Offset) {\n      // ...\n      (OffsetResult.Base ? CCEDiag(E->getArg(0), diag::note_constexpr_baa_insufficient_alignment) << 1 : CCEDiag(E->getArg(0), diag::note_constexpr_baa_value_insufficient_alignment)) << (int)OffsetResult.Offset.getQuantity() << (unsigned)Align.getQuantity();"}},
		[m]={
			["clang/test/SemaCXX/builtin-assume-aligned.cpp"]={"clang/test/SemaCXX/builtin-assume-aligned.cpp:16:46: note: alignment of the base pointee object (4 bytes) is less than the asserted 16 bytes","clang/test/SemaCXX/builtin-assume-aligned.cpp:20:47: note: offset of the aligned pointer from the base pointee object (-2 bytes) is not a multiple of the asserted 4 bytes","clang/test/SemaCXX/builtin-assume-aligned.cpp:23:47: note: offset of the aligned pointer from the base pointee object (2 bytes) is not a multiple of the asserted 4 bytes","clang/test/SemaCXX/builtin-assume-aligned.cpp:30:47: note: alignment of the base pointee object (1 byte) is less than the asserted 16 bytes","clang/test/SemaCXX/builtin-assume-aligned.cpp:35:47: note: offset of the aligned pointer from the base pointee object (2 bytes) is not a multiple of the asserted 16 bytes","clang/test/SemaCXX/builtin-assume-aligned.cpp:39:47: note: offset of the aligned pointer from the base pointee object (1 byte) is not a multiple of the asserted 16 bytes"}
		}
	},
	["note_constexpr_baa_value_insufficient_alignment"]={
		[b]="note_constexpr_baa_value_insufficient_alignment",
		[c]="value of the aligned pointer (%0) is not a multiple of the asserted %1 %plural{1:byte|:bytes}1",
		[e]={{nil,nil,{"value of the aligned pointer (A) is not a multiple of the asserted B ",{"byte","bytes"}}}},
		[g]=f,
		[h]="value of the aligned pointer \\((.*?)\\) is not a multiple of the asserted (.*?) (?:byte|bytes)",
		[i]=a,
		[j]=o,
		[k]={"0dd05d4b5936",1412356717,"constexpr evaluation for __builtin_assume_aligned","constexpr evaluation for __builtin_assume_aligned\n\nRichard noted in the review of r217349 that extra handling of\n__builtin_assume_aligned inside of the expression evaluator was needed. He was\nright, and this should address the concerns raised, namely:\n\n 1. The offset argument to __builtin_assume_aligned can have side effects, and\n    we need to make sure that all arguments are properly evaluated.\n\n 2. If the alignment assumption does not hold, that introduces undefined\n    behavior, and undefined behavior cannot appear inside a constexpr.\n\nand hopefully the diagnostics produced are detailed enough to explain what is\ngoing on.\n\nllvm-svn: 218992"},
		[d]={{n,9246,"bool PointerExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E, unsigned BuiltinOp) {\n  // ...\n  case Builtin::BI__builtin_assume_aligned: {\n    // ...\n    // The offset must also have the correct alignment.\n    if (OffsetResult.Offset.alignTo(Align) != OffsetResult.Offset) {\n      // ...\n      (OffsetResult.Base ? CCEDiag(E->getArg(0), diag::note_constexpr_baa_insufficient_alignment) << 1 : CCEDiag(E->getArg(0), diag::note_constexpr_baa_value_insufficient_alignment)) << (int)OffsetResult.Offset.getQuantity() << (unsigned)Align.getQuantity();"}},
		[m]={
			["clang/test/SemaCXX/builtin-assume-aligned.cpp"]={"clang/test/SemaCXX/builtin-assume-aligned.cpp:44:47: note: value of the aligned pointer (255) is not a multiple of the asserted 32 bytes","clang/test/SemaCXX/builtin-assume-aligned.cpp:47:47: note: value of the aligned pointer (250) is not a multiple of the asserted 32 bytes"}
		}
	},
	["note_constexpr_bit_cast_indet_dest"]={
		[b]={{nil,q,"note_constexpr_bit_cast_indet_dest"}},
		[c]={{nil,q,"indeterminate value can only initialize an object of type \'unsigned char\'%select{, \'char\',|}1 or \'std::byte\'; %0 is invalid"}},
		[e]={{nil,q,{"indeterminate value can only initialize an object of type \'unsigned char\'",{", \'char\',",a}," or \'std::byte\'; A is invalid"}}},
		[g]=f,
		[h]="indeterminate value can only initialize an object of type \'unsigned char\'(?:, \'char\',|) or \'std\\:\\:byte\'; (.*?) is invalid",
		[i]=a,
		[j]={{nil,q,o}},
		[k]={mc,1562092093,jc,rc},
		[d]={{n,7142,"/// Write an BitCastBuffer into an APValue.\nclass BufferToAPValueConverter {\n  // ...\n  std::optional<APValue> visit(const BuiltinType *T, CharUnits Offset, const EnumType *EnumSugar = nullptr) {\n    // ...\n    if (!Buffer.readObject(Offset, SizeOf, Bytes)) {\n      // ...\n      if (!IsStdByte && !IsUChar) {\n        // ...\n        Info.FFDiag(BCE->getExprLoc(), diag::note_constexpr_bit_cast_indet_dest) << DisplayType << Info.Ctx.getLangOpts().CharIsSigned;"}},
		[m]={
			["clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp"]={"clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp:35:10: note: indeterminate value can only initialize an object of type \'unsigned char\' or \'std::byte\'; \'signed char\' is invalid","clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp:35:10: note: indeterminate value can only initialize an object of type \'unsigned char\' or \'std::byte\'; \'signed char\' is invalid","clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp:238:45: note: indeterminate value can only initialize an object of type \'unsigned char\' or \'std::byte\'; \'unsigned long\' is invalid","clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp:373:30: note: indeterminate value can only initialize an object of type \'unsigned char\' or \'std::byte\'; \'my_byte\' is invalid","clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp:378:28: note: indeterminate value can only initialize an object of type \'unsigned char\' or \'std::byte\'; \'char\' is invalid"}
		}
	},
	["note_constexpr_bit_cast_invalid_subtype"]={
		[b]={{nil,q,"note_constexpr_bit_cast_invalid_subtype"}},
		[c]={{nil,q,"invalid type %0 is a %select{member|base}1 of %2"}},
		[e]={{nil,q,{"invalid type A is a ",{qc,"base"}," of C"}}},
		[g]=f,
		[h]="invalid type (.*?) is a (?:member|base) of (.*?)",
		[i]=a,
		[j]={{nil,q,o}},
		[k]={mc,1562092093,jc,rc},
		[d]={{n,7309,"static bool checkBitCastConstexprEligibilityType(SourceLocation Loc, QualType Ty, EvalInfo *Info, const ASTContext &Ctx, bool CheckingDest) {\n  // ...\n  auto note = [&](int Construct, QualType NoteTy, SourceLocation NoteLoc) {\n    if (Info)\n      Info->Note(NoteLoc, diag::note_constexpr_bit_cast_invalid_subtype) << NoteTy << Construct << Ty;"}},
		[m]={
			["clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp"]={"clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp:189:5: note: invalid type \'int *\' is a member of \'has_pointer\'","clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp:189:5: note: invalid type \'int *\' is a member of \'has_pointer\'","clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp:203:5: note: invalid type \'int *\' is a member of \'A\'","clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp:208:5: note: invalid type \'A[10]\' is a member of \'B\'","clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp:212:14: note: invalid type \'B\' is a base of \'C\'","clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp:326:3: note: invalid type \'int vol_mem::*\' is a member of \'mem_ptr\'"}
		}
	},
	["note_constexpr_bit_cast_invalid_type"]={
		[b]={{nil,q,"note_constexpr_bit_cast_invalid_type"}},
		[c]={{nil,q,"bit_cast %select{from|to}0 a %select{|type with a }1%select{union|pointer|member pointer|volatile|reference}2 %select{type|member}1 is not allowed in a constant expression"}},
		[e]={{nil,q,{"bit_cast ",{"from","to"}," a ",{a,"type with a "},{"union",ic,"member pointer","volatile",Db},ab,{"type",qc},X}}},
		[g]=f,
		[h]="bit_cast (?:from|to) a (?:|type with a )(?:union|pointer|member pointer|volatile|reference) (?:type|member) is not allowed in a constant expression",
		[i]=a,
		[j]={{nil,q,o}},
		[k]={mc,1562092093,jc,rc},
		[d]={{n,7303,"static bool checkBitCastConstexprEligibilityType(SourceLocation Loc, QualType Ty, EvalInfo *Info, const ASTContext &Ctx, bool CheckingDest) {\n  // ...\n  auto diag = [&](int Reason) {\n    if (Info)\n      Info->FFDiag(Loc, diag::note_constexpr_bit_cast_invalid_type) << CheckingDest << (Reason == 4) << Reason;"}},
		[m]={
			["clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp"]={"clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp:182:19: note: bit_cast from a union type is not allowed in a constant expression","clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp:185:19: note: bit_cast to a union type is not allowed in a constant expression","clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp:194:33: note: bit_cast from a pointer type is not allowed in a constant expression","clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp:197:33: note: bit_cast to a pointer type is not allowed in a constant expression","clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp:221:19: note: bit_cast from a pointer type is not allowed in a constant expression","clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp:306:39: note: bit_cast from a type with a reference member is not allowed in a constant expression","clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp:315:23: note: bit_cast from a union type is not allowed in a constant expression","clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp:330:29: note: bit_cast from a member pointer type is not allowed in a constant expression"}
		}
	},
	["note_constexpr_bit_cast_unrepresentable_value"]={
		[b]={{nil,u,"note_constexpr_bit_cast_unrepresentable_value"}},
		[c]={{nil,u,"value %1 cannot be represented in type %0"}},
		[e]={{nil,u,"value B cannot be represented in type A"}},
		[g]=f,
		[h]="value (.*?) cannot be represented in type (.*?)",
		[i]=a,
		[j]={{nil,u,o}},
		[k]={"9523cf02c22a",1599063797,"[AST] Fix handling of long double and bool in __builtin_bit_cast","[AST] Fix handling of long double and bool in __builtin_bit_cast\n\nOn x86, long double has 6 unused trailing bytes. This patch changes the\nconstant evaluator to treat them as though they were padding bytes, so reading\nfrom them results in an indeterminate value, and nothing is written for them.\nAlso, fix a similar bug with bool, but instead of treating the unused bits as\npadding, enforce that they\'re zero.\n\nDifferential revision: https://reviews.llvm.org/D76323"},
		[d]={{n,7102,"/// Write an BitCastBuffer into an APValue.\nclass BufferToAPValueConverter {\n  // ...\n  std::nullopt_t unrepresentableValue(QualType Ty, const APSInt &Val) {\n    Info.FFDiag(BCE->getBeginLoc(), diag::note_constexpr_bit_cast_unrepresentable_value) << Ty << toString(Val, /*Radix=*/10);"}},
		[m]={
			["clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp"]={"clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp:35:10: note: value 65 cannot be represented in type \'bool\'"}
		}
	},
	["note_constexpr_bit_cast_unsupported_bitfield"]={
		[b]={{nil,q,"note_constexpr_bit_cast_unsupported_bitfield"}},
		[c]={{nil,q,"constexpr bit_cast involving bit-field is not yet supported"}},
		[e]={{nil,q,"constexpr bit_cast involving bit-field is not yet supported"}},
		[g]=f,
		[h]="constexpr bit_cast involving bit\\-field is not yet supported",
		[i]=a,
		[j]={{nil,q,o}},
		[k]={mc,1562092093,jc,rc},
		[d]={{n,7003,"/// Traverse an APValue to produce an BitCastBuffer, emulating how the current\n/// target would represent the value at runtime.\nclass APValueToBufferConverter {\n  // ...\n  bool visitRecord(const APValue &Val, QualType Ty, CharUnits Offset) {\n    // ...\n    for (FieldDecl *FD : RD->fields()) {\n      if (FD->isBitField()) {\n        Info.FFDiag(BCE->getBeginLoc(), diag::note_constexpr_bit_cast_unsupported_bitfield);"},{n,7211,"/// Write an BitCastBuffer into an APValue.\nclass BufferToAPValueConverter {\n  // ...\n  std::optional<APValue> visit(const RecordType *RTy, CharUnits Offset) {\n    // ...\n    for (FieldDecl *FD : RD->fields()) {\n      // FIXME: We don\'t currently support bit-fields. A lot of the logic for\n      // this is in CodeGen, so we need to factor it around.\n      if (FD->isBitField()) {\n        Info.FFDiag(BCE->getBeginLoc(), diag::note_constexpr_bit_cast_unsupported_bitfield);"}},
		[m]={
			["clang/test/SemaTemplate/temp_arg_nontype_cxx20.cpp"]={"clang/test/SemaTemplate/temp_arg_nontype_cxx20.cpp:226:15: note: constexpr bit_cast involving bit-field is not yet supported"}
		}
	},
	["note_constexpr_bit_cast_unsupported_type"]={
		[b]={{nil,q,"note_constexpr_bit_cast_unsupported_type"}},
		[c]={{nil,q,"constexpr bit_cast involving type %0 is not yet supported"}},
		[e]={{nil,q,"constexpr bit_cast involving type A is not yet supported"}},
		[g]=f,
		[h]="constexpr bit_cast involving type (.*?) is not yet supported",
		[i]=a,
		[j]={{nil,q,o}},
		[k]={mc,1562092093,jc,rc},
		[d]={{n,6971,"/// Traverse an APValue to produce an BitCastBuffer, emulating how the current\n/// target would represent the value at runtime.\nclass APValueToBufferConverter {\n  // ...\n  // Write out Val with type Ty into Buffer starting at Offset.\n  bool visit(const APValue &Val, QualType Ty, CharUnits Offset) {\n    // ...\n    case APValue::Union:\n    case APValue::MemberPointer:\n    case APValue::AddrLabelDiff: {\n      Info.FFDiag(BCE->getBeginLoc(), diag::note_constexpr_bit_cast_unsupported_type) << Ty;"},{n,7095,"/// Write an BitCastBuffer into an APValue.\nclass BufferToAPValueConverter {\n  // ...\n  // Emit an unsupported bit_cast type error. Sema refuses to build a bit_cast\n  // with an invalid type, so anything left is a deficiency on our part (FIXME).\n  // Ideally this will be unreachable.\n  std::nullopt_t unsupportedType(QualType Ty) {\n    Info.FFDiag(BCE->getBeginLoc(), diag::note_constexpr_bit_cast_unsupported_type) << Ty;"}}
	},
	["note_constexpr_body_previous_return"]={
		[b]="note_constexpr_body_previous_return",
		[c]="previous return statement is here",
		[e]="previous return statement is here",
		[g]=f,
		[h]="previous return statement is here",
		[i]=a,
		[j]=p,
		[k]={"eb3c10c248ac",1317436288,"constexpr: semantic checking for constexpr functions and constructors. Based in","constexpr: semantic checking for constexpr functions and constructors. Based in\npart on patches by Peter Collingbourne.\n\nWe diverge from the C++11 standard in a few areas, mostly related to checking\nconstexpr function declarations, and not just definitions. See WG21 paper\nN3308=11-0078 for details.\n\nFunction invocation substitution is not available in this patch; constexpr\nfunctions cannot yet be used from within constant expressions.\n\nllvm-svn: 140926"},
		[d]={{t,2403,"/// Check the body for the given constexpr function declaration only contains\n/// the permitted types of statement. C++11 [dcl.constexpr]p3,p4.\n///\n/// \\return true if the body is OK, false if we have found or diagnosed a\n/// problem.\nstatic bool CheckConstexprFunctionBody(Sema &SemaRef, const FunctionDecl *Dcl, Stmt *Body, Sema::CheckConstexprKind Kind) {\n  // ...\n  if (const CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(Dcl)) {\n  // ...\n  } else {\n    if (ReturnStmts.empty()) {\n    // ...\n    } else if (ReturnStmts.size() > 1) {\n      // ...\n      case Sema::CheckConstexprKind::Diagnose:\n        // ...\n        for (unsigned I = 0; I < ReturnStmts.size() - 1; ++I)\n          SemaRef.Diag(ReturnStmts[I], diag::note_constexpr_body_previous_return);"}},
		[m]={
			["clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p3.cpp"]={"clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p3.cpp:128:3: note: previous return statement is here","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p3.cpp:217:3: note: previous return statement is here"}
		}
	},
	["note_constexpr_call_here"]={
		[b]="note_constexpr_call_here",
		[c]="in call to \'%0\'",
		[e]="in call to \'A\'",
		[g]=f,
		[h]="in call to \'(.*?)\'",
		[i]=a,
		[j]=o,
		[k]={"f6f003af6a91",1324062367,"C++11 constexpr: Add note stacks containing backtraces if constant evaluation","C++11 constexpr: Add note stacks containing backtraces if constant evaluation\nfails within a call to a constexpr function. Add -fconstexpr-backtrace-limit\nargument to driver and frontend, to control the maximum number of notes so\nproduced (default 10). Fix APValue printing to be able to pretty-print all\nAPValue types, and move the testing for this functionality from a unittest to\na -verify test now that it\'s visible in clang\'s output.\n\nllvm-svn: 146749"},
		[d]={{"clang/lib/AST/Interp/State.cpp",158,"void State::addCallStack(unsigned Limit) {\n  // ...\n  for (const Frame *F = Top; F != Bottom; F = F->getCaller(), ++CallIdx) {\n    // ...\n    addDiag(CallLocation, diag::note_constexpr_call_here) << Out.str();"}},
		[m]={
			["clang/test/SemaCXX/crash-lambda-weak-attr.cpp"]={"clang/test/SemaCXX/crash-lambda-weak-attr.cpp:6:15: note: in call to \'[]() {"}
		}
	},
	["note_constexpr_call_limit_exceeded"]={
		[b]="note_constexpr_call_limit_exceeded",
		[c]="constexpr evaluation hit maximum call limit",
		[e]="constexpr evaluation hit maximum call limit",
		[g]=f,
		[h]="constexpr evaluation hit maximum call limit",
		[i]=a,
		[j]=o,
		[k]={"b228a86fcfd1",1329272293,"Implement DR1454. This allows all intermediate results in constant expressions","Implement DR1454. This allows all intermediate results in constant expressions\nto be core constant expressions (including pointers and references to\ntemporaries), and makes constexpr calculations Turing-complete. A Turing machine\nsimulator is included as a testcase.\n\nThis opens up the possibilty of removing CCValue entirely, and removing some\ncopies from the constant evaluator in the process, but that cleanup is not part\nof this change.\n\nllvm-svn: 150557"},
		[d]={{n,1013,"/// EvalInfo - This is a private struct used by the evaluator to capture\n/// information about a subexpression as it is folded.  It retains information\n/// about the AST context, but also maintains information about the folded\n/// expression.\n///\n/// If an expression could be evaluated, it is still possible it is not a C\n/// \"integer constant expression\" or constant expression.  If not, this struct\n/// captures information about how and why not.\n///\n/// One bit of information passed *into* the request for constant folding\n/// indicates whether the subexpression is \"evaluated\" or not according to C\n/// rules.  For example, the RHS of (0 && foo()) is not evaluated.  We can\n/// evaluate the expression regardless of what the RHS is, but C only allows\n/// certain things in certain situations.\nclass EvalInfo : public interp::State {\n  // ...\n  bool CheckCallLimit(SourceLocation Loc) {\n    // ...\n    if (NextCallIndex == 0) {\n      // ...\n      FFDiag(Loc, diag::note_constexpr_call_limit_exceeded);"}}
	},
	["note_constexpr_calls_suppressed"]={
		[b]="note_constexpr_calls_suppressed",
		[c]="(skipping %0 call%s0 in backtrace; use -fconstexpr-backtrace-limit=0 to see all)",
		[e]="(skipping A callA in backtrace; use -fconstexpr-backtrace-limit=0 to see all)",
		[g]=f,
		[h]="\\(skipping (.*?) call(.*?) in backtrace; use \\-fconstexpr\\-backtrace\\-limit\\=0 to see all\\)",
		[i]=a,
		[j]=o,
		[k]={"f6f003af6a91",1324062367,"C++11 constexpr: Add note stacks containing backtraces if constant evaluation","C++11 constexpr: Add note stacks containing backtraces if constant evaluation\nfails within a call to a constexpr function. Add -fconstexpr-backtrace-limit\nargument to driver and frontend, to control the maximum number of notes so\nproduced (default 10). Fix APValue printing to be able to pretty-print all\nAPValue types, and move the testing for this functionality from a unittest to\na -verify test now that it\'s visible in clang\'s output.\n\nllvm-svn: 146749"},
		[d]={{"clang/lib/AST/Interp/State.cpp",139,"void State::addCallStack(unsigned Limit) {\n  // ...\n  for (const Frame *F = Top; F != Bottom; F = F->getCaller(), ++CallIdx) {\n    // ...\n    // Skip this call?\n    if (CallIdx >= SkipStart && CallIdx < SkipEnd) {\n      if (CallIdx == SkipStart) {\n        // ...\n        addDiag(CallLocation, diag::note_constexpr_calls_suppressed) << unsigned(ActiveCalls - Limit);"}},
		[m]={
			["clang/test/AST/Interp/depth-limit.cpp"]={"clang/test/AST/Interp/depth-limit.cpp:9:10: note: (skipping 90 calls in backtrace; use -fconstexpr-backtrace-limit=0 to see all)"}
		}
	},
	["note_constexpr_compare_virtual_mem_ptr"]={
		[b]="note_constexpr_compare_virtual_mem_ptr",
		[c]="comparison of pointer to virtual member function %0 has unspecified value",
		[e]="comparison of pointer to virtual member function A has unspecified value",
		[g]=f,
		[h]="comparison of pointer to virtual member function (.*?) has unspecified value",
		[i]=a,
		[j]=o,
		[k]={"7bb0067c06ef",1328060564,"constexpr: add support for comparisons of pointer-to-members.","constexpr: add support for comparisons of pointer-to-members.\n\nllvm-svn: 149463"},
		[d]={{n,13246,"template <class SuccessCB, class AfterCB> static bool EvaluateComparisonBinaryOperator(EvalInfo &Info, const BinaryOperator *E, SuccessCB &&Success, AfterCB &&DoAfter) {\n  // ...\n  if (LHSTy->isMemberPointerType()) {\n    // ...\n    //   Otherwise if either is a pointer to a virtual member function, the\n    //   result is unspecified.\n    if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(LHSValue.getDecl()))\n      if (MD->isVirtual())\n        Info.CCEDiag(E, diag::note_constexpr_compare_virtual_mem_ptr) << MD;"},{n,13249,"template <class SuccessCB, class AfterCB> static bool EvaluateComparisonBinaryOperator(EvalInfo &Info, const BinaryOperator *E, SuccessCB &&Success, AfterCB &&DoAfter) {\n  // ...\n  if (LHSTy->isMemberPointerType()) {\n    // ...\n    if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(RHSValue.getDecl()))\n      if (MD->isVirtual())\n        Info.CCEDiag(E, diag::note_constexpr_compare_virtual_mem_ptr) << MD;"}},
		[m]={
			[yb]={"clang/test/SemaCXX/constant-expression-cxx11.cpp:1113:20: note: comparison of pointer to virtual member function \'g\' has unspecified value","clang/test/SemaCXX/constant-expression-cxx11.cpp:1114:20: note: comparison of pointer to virtual member function \'g\' has unspecified value"}
		}
	},
	["note_constexpr_conditional_never_const"]={
		[b]="note_constexpr_conditional_never_const",
		[c]="both arms of conditional operator are unable to produce a constant expression",
		[e]="both arms of conditional operator are unable to produce a constant expression",
		[g]=f,
		[h]="both arms of conditional operator are unable to produce a constant expression",
		[i]=a,
		[j]=o,
		[k]={"17100bad0ac1",1329360394,"constexpr tidyups:","constexpr tidyups:\n  * Fix bug when determining whether && / || are potential constant expressions\n  * Try harder when determining whether ?: is a potential constant expression\n  * Produce a diagnostic on sizeof(VLA) to provide a better source location\n\nllvm-svn: 150657"},
		[d]={{n,7429,"template <class Derived> class ExprEvaluatorBase : public ConstStmtVisitor<Derived, bool> {\n  // ...\n  // Check whether a conditional operator with a non-constant condition is a\n  // potential constant expression. If neither arm is a potential constant\n  // expression, then the conditional operator is not either.\n  template <typename ConditionalOperator> void CheckPotentialConstantConditional(const ConditionalOperator *E) {\n    // ...\n    Error(E, diag::note_constexpr_conditional_never_const);"}},
		[m]={
			["clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p5.cpp"]={"clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p5.cpp:80:52: note: both arms of conditional operator are unable to produce a constant expression"}
		}
	},
	["note_constexpr_construct_complex_elem"]={
		[b]={{nil,l,"note_constexpr_construct_complex_elem"}},
		[c]={{nil,l,"construction of individual component of complex number is not yet supported in constant expressions"}},
		[e]={{nil,l,"construction of individual component of complex number is not yet supported in constant expressions"}},
		[g]=f,
		[h]="construction of individual component of complex number is not yet supported in constant expressions",
		[i]=a,
		[j]={{nil,l,o}},
		[k]={"b542602c5f35",1570063175,"For P0784R7: support placement new-expressions in constant evaluation.","For P0784R7: support placement new-expressions in constant evaluation.\n\nFor now, we restrict this support to use from within the standard\nlibrary implementation, since we\'re required to make parts of the\nstandard library that use placement new work, but not permitted to\nmake uses of placement new from user code work.\n\nllvm-svn: 373547"},
		[d]={{n,9717,"bool PointerExprEvaluator::VisitCXXNewExpr(const CXXNewExpr *E) {\n  // ...\n  if (IsPlacement) {\n    // ...\n    struct FindObjectHandler {\n      // ...\n      bool found(APSInt &Value, QualType SubobjType) {\n        Info.FFDiag(E, diag::note_constexpr_construct_complex_elem);"},{n,9721,"bool PointerExprEvaluator::VisitCXXNewExpr(const CXXNewExpr *E) {\n  // ...\n  if (IsPlacement) {\n    // ...\n    struct FindObjectHandler {\n      // ...\n      bool found(APFloat &Value, QualType SubobjType) {\n        Info.FFDiag(E, diag::note_constexpr_construct_complex_elem);"}}
	},
	["note_constexpr_ctor_missing_init"]={
		[b]="note_constexpr_ctor_missing_init",
		[c]="member not initialized by constructor",
		[e]="member not initialized by constructor",
		[g]=f,
		[h]="member not initialized by constructor",
		[i]=a,
		[j]=p,
		[k]={"eb3c10c248ac",1317436288,"constexpr: semantic checking for constexpr functions and constructors. Based in","constexpr: semantic checking for constexpr functions and constructors. Based in\npart on patches by Peter Collingbourne.\n\nWe diverge from the C++11 standard in a few areas, mostly related to checking\nconstexpr function declarations, and not just definitions. See WG21 paper\nN3308=11-0078 for details.\n\nFunction invocation substitution is not available in this patch; constexpr\nfunctions cannot yet be used from within constant expressions.\n\nllvm-svn: 140926"},
		[d]={{t,2049,"/// Check that the given field is initialized within a constexpr constructor.\n///\n/// \\param Dcl The constexpr constructor being checked.\n/// \\param Field The field being checked. This may be a member of an anonymous\n///        struct or union nested within the class being checked.\n/// \\param Inits All declarations, including anonymous struct/union members and\n///        indirect members, for which any initialization was provided.\n/// \\param Diagnosed Whether we\'ve emitted the error message yet. Used to attach\n///        multiple notes for different members to the same error.\n/// \\param Kind Whether we\'re diagnosing a constructor as written or determining\n///        whether the formal requirements are satisfied.\n/// \\return \\c false if we\'re checking for validity and the constructor does\n///         not satisfy the requirements on a constexpr constructor.\nstatic bool CheckConstexprCtorInitializer(Sema &SemaRef, const FunctionDecl *Dcl, FieldDecl *Field, llvm::SmallSet<Decl *, 16> &Inits, bool &Diagnosed, Sema::CheckConstexprKind Kind) {\n  // ...\n  if (!Inits.count(Field)) {\n    if (Kind == Sema::CheckConstexprKind::Diagnose) {\n      // ...\n      SemaRef.Diag(Field->getLocation(), diag::note_constexpr_ctor_missing_init);"}},
		[m]={
			["clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp"]={"clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp:139:7: note: member not initialized by constructor","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp:152:12: note: member not initialized by constructor","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp:163:14: note: member not initialized by constructor","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp:165:5: note: member not initialized by constructor","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp:162:11: note: member not initialized by constructor","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp:165:5: note: member not initialized by constructor","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp:148:3: note: member not initialized by constructor","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp:147:7: note: member not initialized by constructor","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp:148:3: note: member not initialized by constructor","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p4.cpp:159:3: note: member not initialized by constructor"}
		}
	},
	["note_constexpr_deallocate_null"]={
		[b]={{nil,A,"note_constexpr_deallocate_null"}},
		[c]={{nil,A,"\'std::allocator<...>::deallocate\' used to delete a null pointer"}},
		[e]={{nil,A,"\'std::allocator<...>::deallocate\' used to delete a null pointer"}},
		[g]=f,
		[h]="\'std\\:\\:allocator\\<\\.\\.\\.\\>\\:\\:deallocate\' used to delete a null pointer",
		[i]=a,
		[j]={{nil,A,o}},
		[k]={"a892b0015ed6",1615331091,"PR49465: Disallow constant evaluation of a call to operator delete(nullptr).","PR49465: Disallow constant evaluation of a call to operator delete(nullptr).\n\nThe only time we would consider allowing this is inside a call to\nstd::allocator<T>::deallocate, whose contract does not permit deletion\nof null pointers."},
		[d]={{n,6858,"// Perform a call to \'operator delete\' or \'__builtin_operator_delete\'.\nbool HandleOperatorDeleteCall(EvalInfo &Info, const CallExpr *E) {\n  // ...\n  // Deleting a null pointer would have no effect, but it\'s not permitted by\n  // std::allocator<T>::deallocate\'s contract.\n  if (Pointer.isNullPointer()) {\n    Info.CCEDiag(E->getExprLoc(), diag::note_constexpr_deallocate_null);"}},
		[m]={
			[db]={"clang/test/SemaCXX/cxx2a-constexpr-dynalloc.cpp:20:7: note: \'std::allocator<...>::deallocate\' used to delete a null pointer"}
		}
	},
	["note_constexpr_delete_base_nonvirt_dtor"]={
		[b]={{nil,l,"note_constexpr_delete_base_nonvirt_dtor"}},
		[c]={{nil,l,"delete of object with dynamic type %1 through pointer to base class type %0 with non-virtual destructor"}},
		[e]={{nil,l,"delete of object with dynamic type B through pointer to base class type A with non-virtual destructor"}},
		[g]=f,
		[h]="delete of object with dynamic type (.*?) through pointer to base class type (.*?) with non\\-virtual destructor",
		[i]=a,
		[j]={{nil,l,o}},
		[k]={O,1569547607,P,N},
		[d]={{n,15029,"bool VoidExprEvaluator::VisitCXXDeleteExpr(const CXXDeleteExpr *E) {\n  // ...\n  // For the non-array case, the designator must be empty if the static type\n  // does not have a virtual destructor.\n  if (!E->isArrayForm() && Pointer.Designator.Entries.size() != 0 && !hasVirtualDestructor(Arg->getType()->getPointeeType())) {\n    Info.FFDiag(E, diag::note_constexpr_delete_base_nonvirt_dtor) << Arg->getType()->getPointeeType() << AllocType;"}},
		[m]={
			[W]={"clang/test/SemaCXX/constant-expression-cxx2a.cpp:774:5: note: delete of object with dynamic type \'T\' through pointer to base class type \'S\' with non-virtual destructor"}
		}
	},
	["note_constexpr_delete_not_heap_alloc"]={
		[b]={{nil,l,"note_constexpr_delete_not_heap_alloc"}},
		[c]={{nil,l,"delete of pointer \'%0\' that does not point to a heap-allocated object"}},
		[e]={{nil,l,"delete of pointer \'A\' that does not point to a heap-allocated object"}},
		[g]=f,
		[h]="delete of pointer \'(.*?)\' that does not point to a heap\\-allocated object",
		[i]=a,
		[j]={{nil,l,o}},
		[k]={O,1569547607,P,N},
		[d]={{n,6796,"/// Check that the given object is a suitable pointer to a heap allocation that\n/// still exists and is of the right kind for the purpose of a deletion.\n///\n/// On success, returns the heap allocation to deallocate. On failure, produces\n/// a diagnostic and returns std::nullopt.\nstatic std::optional<DynAlloc *> CheckDeleteKind(EvalInfo &Info, const Expr *E, const LValue &Pointer, DynAlloc::Kind DeallocKind) {\n  // ...\n  if (!DA) {\n    Info.FFDiag(E, diag::note_constexpr_delete_not_heap_alloc) << PointerAsString();"}},
		[m]={
			[db]={"clang/test/SemaCXX/cxx2a-constexpr-dynalloc.cpp:20:7: note: delete of pointer \'&no_deallocate_nonalloc\' that does not point to a heap-allocated object"}
		}
	},
	["note_constexpr_delete_subobject"]={
		[b]={{nil,l,"note_constexpr_delete_subobject"}},
		[c]={{nil,l,"delete of pointer%select{ to subobject|}1 \'%0\' %select{|that does not point to complete object}1"}},
		[e]={{nil,l,{"delete of pointer",{" to subobject",a}," \'A\' ",{a,"that does not point to complete object"}}}},
		[g]=f,
		[h]="delete of pointer(?: to subobject|) \'(.*?)\' (?:|that does not point to complete object)",
		[i]=a,
		[j]={{nil,l,o}},
		[k]={O,1569547607,P,N},
		[d]={{n,6826,"/// Check that the given object is a suitable pointer to a heap allocation that\n/// still exists and is of the right kind for the purpose of a deletion.\n///\n/// On success, returns the heap allocation to deallocate. On failure, produces\n/// a diagnostic and returns std::nullopt.\nstatic std::optional<DynAlloc *> CheckDeleteKind(EvalInfo &Info, const Expr *E, const LValue &Pointer, DynAlloc::Kind DeallocKind) {\n  // ...\n  if (Subobject) {\n    Info.FFDiag(E, diag::note_constexpr_delete_subobject) << PointerAsString() << Pointer.Designator.isOnePastTheEnd();"}},
		[m]={
			[W]={"clang/test/SemaCXX/constant-expression-cxx2a.cpp:824:7: note: delete of pointer to subobject \'&{*new T[3]#0}[0]\' ","clang/test/SemaCXX/constant-expression-cxx2a.cpp:1034:18: note: delete of pointer to subobject \'&{*new A#0}.n\' ","clang/test/SemaCXX/constant-expression-cxx2a.cpp:1035:18: note: delete of pointer \'&{*new int#0} + 1\' that does not point to complete object","clang/test/SemaCXX/constant-expression-cxx2a.cpp:1036:18: note: delete of pointer to subobject \'&{*new int[3]#0}[1]\' "}
		}
	},
	["note_constexpr_depth_limit_exceeded"]={
		[b]="note_constexpr_depth_limit_exceeded",
		[c]="constexpr evaluation exceeded maximum depth of %0 calls",
		[e]="constexpr evaluation exceeded maximum depth of A calls",
		[g]=f,
		[h]="constexpr evaluation exceeded maximum depth of (.*?) calls",
		[i]=a,
		[j]=o,
		[k]={zb,1323758398,Ab,Bb},
		[d]={{n,1018,"/// EvalInfo - This is a private struct used by the evaluator to capture\n/// information about a subexpression as it is folded.  It retains information\n/// about the AST context, but also maintains information about the folded\n/// expression.\n///\n/// If an expression could be evaluated, it is still possible it is not a C\n/// \"integer constant expression\" or constant expression.  If not, this struct\n/// captures information about how and why not.\n///\n/// One bit of information passed *into* the request for constant folding\n/// indicates whether the subexpression is \"evaluated\" or not according to C\n/// rules.  For example, the RHS of (0 && foo()) is not evaluated.  We can\n/// evaluate the expression regardless of what the RHS is, but C only allows\n/// certain things in certain situations.\nclass EvalInfo : public interp::State {\n  // ...\n  bool CheckCallLimit(SourceLocation Loc) {\n    // ...\n    FFDiag(Loc, diag::note_constexpr_depth_limit_exceeded) << getLangOpts().ConstexprCallDepth;"},{y,348,"bool CheckCallDepth(InterpState &S, CodePtr OpPC) {\n  if ((S.Current->getDepth() + 1) > S.getLangOpts().ConstexprCallDepth) {\n    S.FFDiag(S.Current->getSource(OpPC), diag::note_constexpr_depth_limit_exceeded) << S.getLangOpts().ConstexprCallDepth;"}},
		[m]={
			["clang/test/AST/Interp/depth-limit.cpp"]={"clang/test/AST/Interp/depth-limit.cpp:9:10: note: constexpr evaluation exceeded maximum depth of 100 calls"}
		}
	},
	["note_constexpr_destroy_complex_elem"]={
		[b]={{nil,l,"note_constexpr_destroy_complex_elem"}},
		[c]={{nil,l,"destruction of individual component of complex number is not yet supported in constant expressions"}},
		[e]={{nil,l,"destruction of individual component of complex number is not yet supported in constant expressions"}},
		[g]=f,
		[h]="destruction of individual component of complex number is not yet supported in constant expressions",
		[i]=a,
		[j]={{nil,l,o}},
		[k]={"61422f96653f",1569615876,"For P0784R7: add support for explicit destructor calls and","For P0784R7: add support for explicit destructor calls and\npseudo-destructor calls in constant evaluation.\n\nllvm-svn: 373122"},
		[d]={{n,6671,"struct DestroyObjectHandler {\n  // ...\n  bool found(APSInt &Value, QualType SubobjType) {\n    Info.FFDiag(E, diag::note_constexpr_destroy_complex_elem);"},{n,6675,"struct DestroyObjectHandler {\n  // ...\n  bool found(APFloat &Value, QualType SubobjType) {\n    Info.FFDiag(E, diag::note_constexpr_destroy_complex_elem);"}}
	},
	["note_constexpr_destroy_out_of_lifetime"]={
		[b]={{nil,l,"note_constexpr_destroy_out_of_lifetime"}},
		[c]={{nil,l,"destroying object \'%0\' whose lifetime has already ended"}},
		[e]={{nil,l,"destroying object \'A\' whose lifetime has already ended"}},
		[g]=f,
		[h]="destroying object \'(.*?)\' whose lifetime has already ended",
		[i]=a,
		[j]={{nil,l,o}},
		[k]={O,1569547607,P,N},
		[d]={{n,6500,"static bool HandleDestructionImpl(EvalInfo &Info, SourceLocation CallLoc, const LValue &This, APValue &Value, QualType T) {\n  // Objects can only be destroyed while they\'re within their lifetimes.\n  // FIXME: We have no representation for whether an object of type nullptr_t\n  // is in its lifetime; it usually doesn\'t matter. Perhaps we should model it\n  // as indeterminate instead?\n  if (Value.isAbsent() && !T->isNullPtrType()) {\n    // ...\n    Info.FFDiag(CallLoc, diag::note_constexpr_destroy_out_of_lifetime) << Printable.getAsString(Info.Ctx, Info.Ctx.getLValueReferenceType(T));"}},
		[m]={
			["clang/test/AST/Interp/cxx20.cpp"]={"clang/test/AST/Interp/cxx20.cpp:442:11: note: destroying object \'I\' whose lifetime has already ended"}
		}
	},
	["note_constexpr_double_delete"]={
		[b]={{nil,l,"note_constexpr_double_delete"}},
		[c]={{nil,l,"delete of pointer that has already been deleted"}},
		[e]={{nil,l,"delete of pointer that has already been deleted"}},
		[g]=f,
		[h]="delete of pointer that has already been deleted",
		[i]=a,
		[j]={{nil,l,o}},
		[k]={O,1569547607,P,N},
		[d]={{n,6805,"/// Check that the given object is a suitable pointer to a heap allocation that\n/// still exists and is of the right kind for the purpose of a deletion.\n///\n/// On success, returns the heap allocation to deallocate. On failure, produces\n/// a diagnostic and returns std::nullopt.\nstatic std::optional<DynAlloc *> CheckDeleteKind(EvalInfo &Info, const Expr *E, const LValue &Pointer, DynAlloc::Kind DeallocKind) {\n  // ...\n  if (!Alloc) {\n    Info.FFDiag(E, diag::note_constexpr_double_delete);"},{n,15055,"bool VoidExprEvaluator::VisitCXXDeleteExpr(const CXXDeleteExpr *E) {\n  // ...\n  if (!Info.HeapAllocs.erase(Pointer.Base.dyn_cast<DynamicAllocLValue>())) {\n    // ...\n    Info.FFDiag(E, diag::note_constexpr_double_delete);"}},
		[m]={
			[W]={"clang/test/SemaCXX/constant-expression-cxx2a.cpp:917:5: note: delete of pointer that has already been deleted"}
		}
	},
	["note_constexpr_double_destroy"]={
		[b]={{nil,l,"note_constexpr_double_destroy"}},
		[c]={{nil,l,"destruction of object that is already being destroyed"}},
		[e]={{nil,l,"destruction of object that is already being destroyed"}},
		[g]=f,
		[h]="destruction of object that is already being destroyed",
		[i]=a,
		[j]={{nil,l,o}},
		[k]={O,1569547607,P,N},
		[d]={{n,6598,"static bool HandleDestructionImpl(EvalInfo &Info, SourceLocation CallLoc, const LValue &This, APValue &Value, QualType T) {\n  // ...\n  if (!EvalObj.DidInsert) {\n    // ...\n    Info.FFDiag(CallLoc, diag::note_constexpr_double_destroy);"}},
		[m]={
			[W]={"clang/test/SemaCXX/constant-expression-cxx2a.cpp:921:24: note: destruction of object that is already being destroyed"}
		}
	},
	["note_constexpr_dtor_subobject"]={
		[b]={{nil,l,"note_constexpr_dtor_subobject"}},
		[c]={{nil,l,"%select{data member %1|base class %2}0 declared here"}},
		[e]={{nil,l,{{"data member B","base class C"}," declared here"}}},
		[g]=f,
		[h]="(?:data member (.*?)|base class (.*?)) declared here",
		[i]=a,
		[j]={{nil,l,p}},
		[k]={Lb,1567434909,Kb,Ib},
		[d]={{t,1700,"/// Determine whether a destructor cannot be constexpr due to\nstatic bool CheckConstexprDestructorSubobjects(Sema &SemaRef, const CXXDestructorDecl *DD, Sema::CheckConstexprKind Kind) {\n  auto Check = [&](SourceLocation Loc, QualType T, const FieldDecl *FD) {\n    // ...\n    if (Kind == Sema::CheckConstexprKind::Diagnose) {\n      // ...\n      SemaRef.Diag(Loc, diag::note_constexpr_dtor_subobject) << !FD << (FD ? FD->getDeclName() : DeclarationName()) << T;"}},
		[m]={
			["clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/dtor.cpp"]={"clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/dtor.cpp:61:14: note: base class \'A\' declared here","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/dtor.cpp:65:7: note: data member \'a\' declared here"}
		}
	},
	["note_constexpr_dynamic_alloc"]={
		[b]={{nil,l,"note_constexpr_dynamic_alloc"}},
		[c]={{nil,l,"%select{pointer|reference}0 to %select{|subobject of }1heap-allocated object is not a constant expression"}},
		[e]={{nil,l,{{ic,Db}," to ",{a,"subobject of "},"heap-allocated object is not a constant expression"}}},
		[g]=f,
		[h]="(?:pointer|reference) to (?:|subobject of )heap\\-allocated object is not a constant expression",
		[i]=a,
		[j]={{nil,l,o}},
		[k]={O,1569547607,P,N},
		[d]={{n,2234,"/// Check that this reference or pointer core constant expression is a valid\n/// value for an address or reference constant expression. Return true if we\n/// can fold this expression, whether or not it\'s a constant expression.\nstatic bool CheckLValueConstantExpression(EvalInfo &Info, SourceLocation Loc, QualType Type, const LValue &LVal, ConstantExprKind Kind, CheckedTemporaries &CheckedTemps) {\n  // ...\n  if (Base.is<DynamicAllocLValue>()) {\n    Info.FFDiag(Loc, diag::note_constexpr_dynamic_alloc) << IsReferenceType << !Designator.Entries.empty();"}},
		[m]={
			["clang/test/CXX/basic/basic.def.odr/p2-typeid.cpp"]={"clang/test/CXX/basic/basic.def.odr/p2-typeid.cpp:59:17: note: pointer to heap-allocated object is not a constant expression"}
		}
	},
	["note_constexpr_dynamic_alloc_here"]={
		[b]={{nil,l,"note_constexpr_dynamic_alloc_here"}},
		[c]={{nil,l,"heap allocation performed here"}},
		[e]={{nil,l,"heap allocation performed here"}},
		[g]=f,
		[h]="heap allocation performed here",
		[i]=a,
		[j]={{nil,l,o}},
		[k]={O,1569547607,P,N},
		[d]={{n,2130,"static void NoteLValueLocation(EvalInfo &Info, APValue::LValueBase Base) {\n  // ...\n  if (VD)\n  // ...\n  else if (const Expr *E = Base.dyn_cast<const Expr *>())\n  // ...\n  else if (DynamicAllocLValue DA = Base.dyn_cast<DynamicAllocLValue>()) {\n    // FIXME: Produce a note for dangling pointers too.\n    if (std::optional<DynAlloc *> Alloc = Info.lookupDynamicAlloc(DA))\n      Info.Note((*Alloc)->AllocExpr->getExprLoc(), diag::note_constexpr_dynamic_alloc_here);"}},
		[m]={
			["clang/test/CXX/basic/basic.def.odr/p2-typeid.cpp"]={"clang/test/CXX/basic/basic.def.odr/p2-typeid.cpp:53:32: note: heap allocation performed here"}
		}
	},
	["note_constexpr_dynamic_cast_to_reference_failed"]={
		[b]={{nil,q,"note_constexpr_dynamic_cast_to_reference_failed"}},
		[c]={{nil,q,"reference dynamic_cast failed: %select{static type %1 of operand is a non-public base class of dynamic type %2|dynamic type %2 of operand does not have a base class of type %3|%3 is an ambiguous base class of dynamic type %2 of operand|%3 is a non-public base class of dynamic type %2 of operand}0"}},
		[e]={{nil,q,{"reference dynamic_cast failed: ",{"static type B of operand is a non-public base class of dynamic type C","dynamic type C of operand does not have a base class of type D","D is an ambiguous base class of dynamic type C of operand","D is a non-public base class of dynamic type C of operand"}}}},
		[g]=f,
		[h]="reference dynamic_cast failed\\: (?:static type (.*?) of operand is a non\\-public base class of dynamic type (.*?)|dynamic type (.*?) of operand does not have a base class of type (.*?)|(.*?) is an ambiguous base class of dynamic type (.*?) of operand|(.*?) is a non\\-public base class of dynamic type (.*?) of operand)",
		[i]=a,
		[j]={{nil,q,o}},
		[k]={"7bd54ab58665",1557951741,"[c++20] For P1327R1: support dynamic_cast in constant expression","[c++20] For P1327R1: support dynamic_cast in constant expression\nevaluation.\n\nllvm-svn: 360806"},
		[d]={{n,5926,"/// Apply the given dynamic cast operation on the provided lvalue.\n///\n/// This implements the hard case of dynamic_cast, requiring a \"runtime check\"\n/// to find a suitable target subobject.\nstatic bool HandleDynamicCast(EvalInfo &Info, const ExplicitCastExpr *E, LValue &Ptr) {\n  // ...\n  auto RuntimeCheckFailed = [&](CXXBasePaths *Paths) {\n    // ...\n    Info.FFDiag(E, diag::note_constexpr_dynamic_cast_to_reference_failed) << DiagKind << Ptr.Designator.getType(Info.Ctx) << Info.Ctx.getRecordType(DynType->Type) << E->getType().getUnqualifiedType();"}},
		[m]={
			[W]={"clang/test/SemaCXX/constant-expression-cxx2a.cpp:259:24: note: reference dynamic_cast failed: \'A\' is an ambiguous base class of dynamic type \'DynamicCast::G\' of operand","clang/test/SemaCXX/constant-expression-cxx2a.cpp:267:18: note: reference dynamic_cast failed: \'A\' is an ambiguous base class of dynamic type \'DynamicCast::G\' of operand","clang/test/SemaCXX/constant-expression-cxx2a.cpp:274:24: note: reference dynamic_cast failed: static type \'DynamicCast::E\' of operand is a non-public base class of dynamic type \'DynamicCast::G\'","clang/test/SemaCXX/constant-expression-cxx2a.cpp:278:24: note: reference dynamic_cast failed: \'E\' is a non-public base class of dynamic type \'DynamicCast::G\' of operand","clang/test/SemaCXX/constant-expression-cxx2a.cpp:282:32: note: reference dynamic_cast failed: dynamic type \'DynamicCast::G\' of operand does not have a base class of type \'Unrelated\'","clang/test/SemaCXX/constant-expression-cxx2a.cpp:284:32: note: reference dynamic_cast failed: dynamic type \'DynamicCast::G\' of operand does not have a base class of type \'Unrelated\'"}
		}
	},
	["note_constexpr_dynamic_rounding"]={
		[b]={{nil,u,"note_constexpr_dynamic_rounding"}},
		[c]={{nil,u,"cannot evaluate this expression if rounding mode is dynamic"}},
		[e]={{nil,u,"cannot evaluate this expression if rounding mode is dynamic"}},
		[g]=f,
		[h]="cannot evaluate this expression if rounding mode is dynamic",
		[i]=a,
		[j]={{nil,u,o}},
		[k]={"6314f412a83d",1600326607,"[FPEnv] Evaluate constant expressions under non-default rounding modes","[FPEnv] Evaluate constant expressions under non-default rounding modes\n\nThe change implements evaluation of constant floating point expressions\nunder non-default rounding modes. The main objective was to support\nevaluation of global variable initializers, where constant rounding mode\nmay be specified by `#pragma STDC FENV_ROUND`.\n\nDifferential Revision: https://reviews.llvm.org/D87822"},
		[d]={{n,2625,"/// Check if the given evaluation result is allowed for constant evaluation.\nstatic bool checkFloatingPointResult(EvalInfo &Info, const Expr *E, APFloat::opStatus St) {\n  // ...\n  if ((St & APFloat::opInexact) && FPO.getRoundingMode() == llvm::RoundingMode::Dynamic) {\n    // ...\n    Info.FFDiag(E, diag::note_constexpr_dynamic_rounding);"},{y,480,"bool CheckFloatResult(InterpState &S, CodePtr OpPC, APFloat::opStatus Status) {\n  // ...\n  if ((Status & APFloat::opInexact) && FPO.getRoundingMode() == llvm::RoundingMode::Dynamic) {\n    // ...\n    S.FFDiag(E, diag::note_constexpr_dynamic_rounding);"}}
	},
	["note_constexpr_float_arithmetic"]={
		[b]="note_constexpr_float_arithmetic",
		[c]="floating point arithmetic produces %select{an infinity|a NaN}0",
		[e]={{nil,nil,{"floating point arithmetic produces ",{"an infinity","a NaN"}}}},
		[g]=f,
		[h]="floating point arithmetic produces (?:an infinity|a NaN)",
		[i]=a,
		[j]=o,
		[k]={"c8042323e1b2",1328075592,"constexpr: overflow checking for integral and floating-point arithmetic.","constexpr: overflow checking for integral and floating-point arithmetic.\n\nllvm-svn: 149473"},
		[d]={{n,2917,"/// Perform the given binary floating-point operation, in-place, on LHS.\nstatic bool handleFloatFloatBinOp(EvalInfo &Info, const BinaryOperator *E, APFloat &LHS, BinaryOperatorKind Opcode, const APFloat &RHS) {\n  // ...\n  // [expr.pre]p4:\n  //   If during the evaluation of an expression, the result is not\n  //   mathematically defined [...], the behavior is undefined.\n  // FIXME: C++ rules require us to not conform to IEEE 754 here.\n  if (LHS.isNaN()) {\n    Info.CCEDiag(E, diag::note_constexpr_float_arithmetic) << LHS.isNaN();"}},
		[m]={
			[T]={"clang/test/CXX/expr/expr.const/p2-0x.cpp:281:30: note: floating point arithmetic produces a NaN","clang/test/CXX/expr/expr.const/p2-0x.cpp:282:30: note: floating point arithmetic produces a NaN","clang/test/CXX/expr/expr.const/p2-0x.cpp:283:30: note: floating point arithmetic produces a NaN"}
		}
	},
	["note_constexpr_float_arithmetic_strict"]={
		[b]={{nil,u,"note_constexpr_float_arithmetic_strict"}},
		[c]={{nil,u,"compile time floating point arithmetic suppressed in strict evaluation modes"}},
		[e]={{nil,u,"compile time floating point arithmetic suppressed in strict evaluation modes"}},
		[g]=f,
		[h]="compile time floating point arithmetic suppressed in strict evaluation modes",
		[i]=a,
		[j]={{nil,u,o}},
		[k]={"2e204e23911b",1601401476,"[clang] Enable support for #pragma STDC FENV_ACCESS","[clang] Enable support for #pragma STDC FENV_ACCESS\n\nReviewers: rjmccall, rsmith, sepavloff\n\nDifferential Revision: https://reviews.llvm.org/D87528"},
		[d]={{n,2633,"/// Check if the given evaluation result is allowed for constant evaluation.\nstatic bool checkFloatingPointResult(EvalInfo &Info, const Expr *E, APFloat::opStatus St) {\n  // ...\n  if ((St != APFloat::opOK) && (FPO.getRoundingMode() == llvm::RoundingMode::Dynamic || FPO.getExceptionMode() != LangOptions::FPE_Ignore || FPO.getAllowFEnvAccess())) {\n    Info.FFDiag(E, diag::note_constexpr_float_arithmetic_strict);"},{n,13037,"template <class SuccessCB, class AfterCB> static bool EvaluateComparisonBinaryOperator(EvalInfo &Info, const BinaryOperator *E, SuccessCB &&Success, AfterCB &&DoAfter) {\n  // ...\n  if (LHSTy->isRealFloatingType() && RHSTy->isRealFloatingType()) {\n    // ...\n    if (!Info.InConstantContext && APFloatCmpResult == APFloat::cmpUnordered && E->getFPFeaturesInEffect(Info.Ctx.getLangOpts()).isFPConstrained()) {\n      // ...\n      Info.FFDiag(E, diag::note_constexpr_float_arithmetic_strict);"},{y,488,"bool CheckFloatResult(InterpState &S, CodePtr OpPC, APFloat::opStatus Status) {\n  // ...\n  if ((Status != APFloat::opOK) && (FPO.getRoundingMode() == llvm::RoundingMode::Dynamic || FPO.getExceptionMode() != LangOptions::FPE_Ignore || FPO.getAllowFEnvAccess())) {\n    S.FFDiag(E, diag::note_constexpr_float_arithmetic_strict);"}}
	},
	["note_constexpr_function_param_value_unknown"]={
		[b]={{nil,r,"note_constexpr_function_param_value_unknown"}},
		[c]={{nil,r,"function parameter %0 with unknown value cannot be used in a constant expression"}},
		[e]={{nil,r,"function parameter A with unknown value cannot be used in a constant expression"}},
		[g]=f,
		[h]="function parameter (.*?) with unknown value cannot be used in a constant expression",
		[i]=a,
		[j]={{nil,r,o}},
		[k]={"00068c452a59",1594250761,"Improve diagnostics for constant evaluation that fails because a","Improve diagnostics for constant evaluation that fails because a\nvariable\'s initializer is not known.\n\nThe hope is that a better diagnostic for this case will reduce the rate\nat which duplicates of non-bug PR41093 are reported."},
		[d]={{n,3323,"/// Try to evaluate the initializer for a variable declaration.\n///\n/// \\param Info   Information about the ongoing evaluation.\n/// \\param E      An expression to be used when printing diagnostics.\n/// \\param VD     The variable whose initializer should be obtained.\n/// \\param Version The version of the variable within the frame.\n/// \\param Frame  The frame in which the variable was created. Must be null\n///               if this variable is not local to the evaluation.\n/// \\param Result Filled in with a pointer to the value of the variable.\nstatic bool evaluateVarDeclInit(EvalInfo &Info, const Expr *E, const VarDecl *VD, CallStackFrame *Frame, unsigned Version, APValue *&Result) {\n  // ...\n  if (isa<ParmVarDecl>(VD)) {\n    // Assume parameters of a potential constant expression are usable in\n    // constant expressions.\n    if (!Info.checkingPotentialConstantExpression() || !Info.CurrentCall->Callee || !Info.CurrentCall->Callee->Equals(VD->getDeclContext())) {\n      if (Info.getLangOpts().CPlusPlus11) {\n        Info.FFDiag(E, diag::note_constexpr_function_param_value_unknown) << VD;"}},
		[m]={
			["clang/test/SemaCXX/warn-vla.cpp"]={"clang/test/SemaCXX/warn-vla.cpp:4:9: note: function parameter \'n\' with unknown value cannot be used in a constant expression","clang/test/SemaCXX/warn-vla.cpp:7:25: note: function parameter \'n\' with unknown value cannot be used in a constant expression","clang/test/SemaCXX/warn-vla.cpp:10:25: note: function parameter \'n\' with unknown value cannot be used in a constant expression","clang/test/SemaCXX/warn-vla.cpp:14:9: note: function parameter \'n\' with unknown value cannot be used in a constant expression","clang/test/SemaCXX/warn-vla.cpp:18:25: note: function parameter \'n\' with unknown value cannot be used in a constant expression","clang/test/SemaCXX/warn-vla.cpp:22:25: note: function parameter \'n\' with unknown value cannot be used in a constant expression","clang/test/SemaCXX/warn-vla.cpp:25:23: note: function parameter \'n\' with unknown value cannot be used in a constant expression"}
		}
	},
	["note_constexpr_heap_alloc_limit_exceeded"]={
		[b]={{nil,l,"note_constexpr_heap_alloc_limit_exceeded"}},
		[c]={{nil,l,"constexpr evaluation hit maximum heap allocation limit"}},
		[e]={{nil,l,"constexpr evaluation hit maximum heap allocation limit"}},
		[g]=f,
		[h]="constexpr evaluation hit maximum heap allocation limit",
		[i]=a,
		[j]={{nil,l,o}},
		[k]={O,1569547607,P,N},
		[d]={{n,1905,"APValue *EvalInfo::createHeapAlloc(const Expr *E, QualType T, LValue &LV) {\n  if (NumHeapAllocs > DynamicAllocLValue::getMaxIndex()) {\n    FFDiag(E, diag::note_constexpr_heap_alloc_limit_exceeded);"}}
	},
	["note_constexpr_inherited_ctor_call_here"]={
		[b]="note_constexpr_inherited_ctor_call_here",
		[c]="in implicit initialization for inherited constructor of %0",
		[e]="in implicit initialization for inherited constructor of A",
		[g]=f,
		[h]="in implicit initialization for inherited constructor of (.*?)",
		[i]=a,
		[j]=o,
		[k]={"5179eb78210a",1467140637,"P0136R1, DR1573, DR1645, DR1715, DR1736, DR1903, DR1941, DR1959, DR1991:","P0136R1, DR1573, DR1645, DR1715, DR1736, DR1903, DR1941, DR1959, DR1991:\n\nReplace inheriting constructors implementation with new approach, voted into\nC++ last year as a DR against C++11.\n\nInstead of synthesizing a set of derived class constructors for each inherited\nbase class constructor, we make the constructors of the base class visible to\nconstructor lookup in the derived class, using the normal rules for\nusing-declarations.\n\nFor constructors, UsingShadowDecl now has a ConstructorUsingShadowDecl derived\nclass that tracks the requisite additional information. We create shadow\nconstructors (not found by name lookup) in the derived class to model the\nactual initialization, and have a new expression node,\nCXXInheritedCtorInitExpr, to model the initialization of a base class from such\na constructor. (This initialization is special because it performs real perfect\nforwarding of arguments.)\n\nIn cases where argument forwarding is not possible (for inalloca calls,\nvariadic calls, and calls with callee parameter cleanup), the shadow inheriting\nconstructor is not emitted and instead we directly emit the initialization code\ninto the caller of the inherited constructor.\n\nNote that this new model is not perfectly compatible with the old model in some\ncorner cases. In particular:\n * if B inherits a private constructor from A, and C uses that constructor to\n   construct a B, then we previously required that A befriends B and B\n   befriends C, but the new rules require A to befriend C directly, and\n * if a derived class has its own constructors (and so its implicit default\n   constructor is suppressed), it may still inherit a default constructor from\n   a base class\n\nllvm-svn: 274049"},
		[d]={{"clang/lib/AST/Interp/State.cpp",150,"void State::addCallStack(unsigned Limit) {\n  // ...\n  for (const Frame *F = Top; F != Bottom; F = F->getCaller(), ++CallIdx) {\n    // ...\n    // Use a different note for an inheriting constructor, because from the\n    // user\'s perspective it\'s not really a function at all.\n    if (const auto *CD = dyn_cast_if_present<CXXConstructorDecl>(F->getCallee()); CD && CD->isInheritingConstructor()) {\n      addDiag(CallLocation, diag::note_constexpr_inherited_ctor_call_here) << CD->getParent();"}}
	},
	["note_constexpr_invalid_alignment"]={
		[b]={{nil,l,"note_constexpr_invalid_alignment"}},
		[c]={{nil,l,"requested alignment %0 is not a positive power of two"}},
		[e]={{nil,l,"requested alignment A is not a positive power of two"}},
		[g]=f,
		[h]="requested alignment (.*?) is not a positive power of two",
		[i]=a,
		[j]={{nil,l,o}},
		[k]={"8c387cbea76b",1578602886,"Add builtins for aligning and checking alignment of pointers and integers","Add builtins for aligning and checking alignment of pointers and integers\n\nThis change introduces three new builtins (which work on both pointers\nand integers) that can be used instead of common bitwise arithmetic:\n__builtin_align_up(x, alignment), __builtin_align_down(x, alignment) and\n__builtin_is_aligned(x, alignment).\n\nI originally added these builtins to the CHERI fork of LLVM a few years ago\nto handle the slightly different C semantics that we use for CHERI [1].\nUntil recently these builtins (or sequences of other builtins) were\nrequired to generate correct code. I have since made changes to the default\nC semantics so that they are no longer strictly necessary (but using them\ndoes generate slightly more efficient code). However, based on our experience\nusing them in various projects over the past few years, I believe that adding\nthese builtins to clang would be useful.\n\nThese builtins have the following benefit over bit-manipulation and casts\nvia uintptr_t:\n\n- The named builtins clearly convey the semantics of the operation. While\n  checking alignment using __builtin_is_aligned(x, 16) versus\n  ((x & 15) == 0) is probably not a huge win in readably, I personally find\n  __builtin_align_up(x, N) a lot easier to read than (x+(N-1))&~(N-1).\n- They preserve the type of the argument (including const qualifiers). When\n  using casts via uintptr_t, it is easy to cast to the wrong type or strip\n  qualifiers such as const.\n- If the alignment argument is a constant value, clang can check that it is\n  a power-of-two and within the range of the type. Since the semantics of\n  these builtins is well defined compared to arbitrary bit-manipulation,\n  it is possible to add a UBSAN checker that the run-time value is a valid\n  power-of-two. I intend to add this as a follow-up to this change.\n- The builtins avoids int-to-pointer casts both in C and LLVM IR.\n  In the future (i.e. once most optimizations handle it), we could use the new\n  llvm.ptrmask intrinsic to avoid the ptrtoint instruction that would normally\n  be generated.\n- They can be used to round up/down to the next aligned value for both\n  integers and pointers without requiring two separate macros.\n- In many projects the alignment operations are already wrapped in macros (e.g.\n  roundup2 and rounddown2 in FreeBSD), so by replacing the macro implementation\n  with a builtin call, we get improved diagnostics for many call-sites while\n  only having to change a few lines.\n- Finally, the builtins also emit assume_aligned metadata when used on pointers.\n  This can improve code generation compared to the uintptr_t casts.\n\n[1] In our CHERI compiler we have compilation mode where all pointers are\nimplemented as capabilities (essentially unforgeable 128-bit fat pointers).\nIn our original model, casts from uintptr_t (which is a 128-bit capability)\nto an integer value returned the \"offset\" of the capability (i.e. the\ndifference between the virtual address and the base of the allocation).\nThis causes problems for cases such as checking the alignment: for example, the\nexpression `if ((uintptr_t)ptr & 63) == 0` is generally used to check if the\npointer is aligned to a multiple of 64 bytes. The problem with offsets is that\nany pointer to the beginning of an allocation will have an offset of zero, so\nthis check always succeeds in that case (even if the address is not correctly\naligned). The same issues also exist when aligning up or down. Using the\nalignment builtins ensures that the address is used instead of the offset. While\nI have since changed the default C semantics to return the address instead of\nthe offset when casting, this offset compilation mode can still be used by\npassing a command-line flag.\n\nReviewers: rsmith, aaron.ballman, theraven, fhahn, lebedev.ri, nlopes, aqjune\nReviewed By: aaron.ballman, lebedev.ri\nDifferential Revision: https://reviews.llvm.org/D71499"},
		[d]={{n,9143,"/// Evaluate the value of the alignment argument to __builtin_align_{up,down},\n/// __builtin_is_aligned and __builtin_assume_aligned.\nstatic bool getAlignmentArgument(const Expr *E, QualType ForType, EvalInfo &Info, APSInt &Alignment) {\n  // ...\n  if (Alignment < 0 || !Alignment.isPowerOf2()) {\n    Info.FFDiag(E, diag::note_constexpr_invalid_alignment) << Alignment;"}},
		[m]={
			["clang/test/SemaCXX/builtin-align-cxx.cpp"]={"clang/test/SemaCXX/builtin-align-cxx.cpp:121:36: note: requested alignment -1 is not a positive power of two","clang/test/SemaCXX/builtin-align-cxx.cpp:112:34: note: requested alignment -2 is not a positive power of two","clang/test/SemaCXX/builtin-align-cxx.cpp:105:36: note: requested alignment -3 is not a positive power of two","clang/test/SemaCXX/builtin-align-cxx.cpp:121:36: note: requested alignment 17 is not a positive power of two","clang/test/SemaCXX/builtin-align-cxx.cpp:112:34: note: requested alignment 18 is not a positive power of two","clang/test/SemaCXX/builtin-align-cxx.cpp:105:36: note: requested alignment 19 is not a positive power of two"}
		}
	},
	["note_constexpr_invalid_cast"]={
		[b]="note_constexpr_invalid_cast",
		[c]={{nil,x,"%select{reinterpret_cast|dynamic_cast|%select{this conversion|cast that performs the conversions of a reinterpret_cast}1|cast from %1}0 is not allowed in a constant expression%select{| in C++ standards before C++20||}0"},{I,l,"%select{reinterpret_cast|dynamic_cast|cast that performs the conversions of a reinterpret_cast|cast from %1}0 is not allowed in a constant expression%select{| in C++ standards before C++20||}0"},{q,q,"%select{reinterpret_cast|dynamic_cast|cast that performs the conversions of a reinterpret_cast|cast from %1}0 is not allowed in a constant expression%select{| in C++ standards before C++2a||}0"},{s,nil,"%select{reinterpret_cast|dynamic_cast|cast that performs the conversions of a reinterpret_cast|cast from %1}0 is not allowed in a constant expression"}},
		[e]={{nil,x,{{"reinterpret_cast","dynamic_cast",{{"this conversion","cast that performs the conversions of a reinterpret_cast"}},"cast from B"},X,{a," in C++ standards before C++20",a,a}}},{I,l,{{"reinterpret_cast","dynamic_cast","cast that performs the conversions of a reinterpret_cast","cast from B"},X,{a," in C++ standards before C++20",a,a}}},{q,q,{{"reinterpret_cast","dynamic_cast","cast that performs the conversions of a reinterpret_cast","cast from B"},X,{a," in C++ standards before C++2a",a,a}}},{s,nil,{{"reinterpret_cast","dynamic_cast","cast that performs the conversions of a reinterpret_cast","cast from B"},X}}},
		[g]=f,
		[h]="(?:reinterpret_cast|dynamic_cast|(?:this conversion|cast that performs the conversions of a reinterpret_cast)|cast from (.*?)) is not allowed in a constant expression(?:| in C\\+\\+ standards before C\\+\\+20||)",
		[i]=a,
		[j]=o,
		[k]={"6d6ecc34f841",1323693976,"Implement C++11 constant expression cast restrictions.","Implement C++11 constant expression cast restrictions.\n\nllvm-svn: 146371"},
		[d]={{n,7536,"template <class Derived> class ExprEvaluatorBase : public ConstStmtVisitor<Derived, bool> {\n  // ...\n  bool VisitCXXReinterpretCastExpr(const CXXReinterpretCastExpr *E) {\n    CCEDiag(E, diag::note_constexpr_invalid_cast) << 0;"},{n,7541,"template <class Derived> class ExprEvaluatorBase : public ConstStmtVisitor<Derived, bool> {\n  // ...\n  bool VisitCXXDynamicCastExpr(const CXXDynamicCastExpr *E) {\n    if (!Info.Ctx.getLangOpts().CPlusPlus20)\n      CCEDiag(E, diag::note_constexpr_invalid_cast) << 1;"},{n,8247,"class LValueExprEvaluator : public LValueExprEvaluatorBase<LValueExprEvaluator> {\n  // ...\n  bool VisitCastExpr(const CastExpr *E) {\n    // ...\n    case CK_LValueBitCast:\n      this->CCEDiag(E, diag::note_constexpr_invalid_cast) << 2 << Info.Ctx.getLangOpts().CPlusPlus;"},{n,8976,"bool PointerExprEvaluator::VisitCastExpr(const CastExpr *E) {\n  // ...\n  case CK_BitCast:\n  case CK_CPointerToObjCPointerCast:\n  case CK_BlockPointerToObjCPointerCast:\n  case CK_AnyPointerToBlockPointerCast:\n  case CK_AddressSpaceConversion:\n    // ...\n    // Bitcasts to cv void* are static_casts, not reinterpret_casts, so are\n    // permitted in constant expressions in C++11. Bitcasts from cv void* are\n    // also static_casts, but we disallow them as a resolution to DR1312.\n    if (!E->getType()->isVoidPointerType()) {\n      // ...\n      // 1. We\'ll allow it in std::allocator::allocate, and anything which that\n      //    calls.\n      // 2. HACK 2022-03-28: Work around an issue with libstdc++\'s\n      //    <source_location> header. Fixed in GCC 12 and later (2022-04-??).\n      //    We\'ll allow it in the body of std::source_location::current.  GCC\'s\n      //    implementation had a parameter of type `void*`, and casts from\n      //    that back to `const __impl*` in its body.\n      if (VoidPtrCastMaybeOK && (Info.getStdAllocatorCaller(\"allocate\") || IsDeclSourceLocationCurrent(Info.CurrentCall->Callee) || Info.getLangOpts().CPlusPlus26)) {\n      // ...\n      } else {\n        if (SubExpr->getType()->isVoidPointerType()) {\n          if (HasValidResult)\n          // ...\n          else\n            CCEDiag(E, diag::note_constexpr_invalid_cast) << 3 << SubExpr->getType();"},{n,8979,"bool PointerExprEvaluator::VisitCastExpr(const CastExpr *E) {\n  // ...\n  case CK_BitCast:\n  case CK_CPointerToObjCPointerCast:\n  case CK_BlockPointerToObjCPointerCast:\n  case CK_AnyPointerToBlockPointerCast:\n  case CK_AddressSpaceConversion:\n    // ...\n    // Bitcasts to cv void* are static_casts, not reinterpret_casts, so are\n    // permitted in constant expressions in C++11. Bitcasts from cv void* are\n    // also static_casts, but we disallow them as a resolution to DR1312.\n    if (!E->getType()->isVoidPointerType()) {\n      // ...\n      // 1. We\'ll allow it in std::allocator::allocate, and anything which that\n      //    calls.\n      // 2. HACK 2022-03-28: Work around an issue with libstdc++\'s\n      //    <source_location> header. Fixed in GCC 12 and later (2022-04-??).\n      //    We\'ll allow it in the body of std::source_location::current.  GCC\'s\n      //    implementation had a parameter of type `void*`, and casts from\n      //    that back to `const __impl*` in its body.\n      if (VoidPtrCastMaybeOK && (Info.getStdAllocatorCaller(\"allocate\") || IsDeclSourceLocationCurrent(Info.CurrentCall->Callee) || Info.getLangOpts().CPlusPlus26)) {\n      // ...\n      } else {\n        if (SubExpr->getType()->isVoidPointerType()) {\n        // ...\n        } else\n          CCEDiag(E, diag::note_constexpr_invalid_cast) << 2 << Info.Ctx.getLangOpts().CPlusPlus;"},{n,9018,"bool PointerExprEvaluator::VisitCastExpr(const CastExpr *E) {\n  // ...\n  case CK_IntegralToPointer: {\n    CCEDiag(E, diag::note_constexpr_invalid_cast) << 2 << Info.Ctx.getLangOpts().CPlusPlus;"},{n,13795,"/// HandleCast - This is used to evaluate implicit or explicit casts where the\n/// result type is integer.\nbool IntExprEvaluator::VisitCastExpr(const CastExpr *E) {\n  // ...\n  case CK_PointerToIntegral: {\n    CCEDiag(E, diag::note_constexpr_invalid_cast) << 2 << Info.Ctx.getLangOpts().CPlusPlus;"}},
		[m]={
			["clang/test/Sema/cast.c"]={"clang/test/Sema/cast.c:3:11: note: this conversion is not allowed in a constant expression"}
		}
	},
	["note_constexpr_invalid_downcast"]={
		[b]="note_constexpr_invalid_downcast",
		[c]="cannot cast object of dynamic type %0 to type %1",
		[e]="cannot cast object of dynamic type A to type B",
		[g]=f,
		[h]="cannot cast object of dynamic type (.*?) to type (.*?)",
		[i]=a,
		[j]=o,
		[k]={"a8105bc9cecb",1325867940,"C++11 generalized constant expressions: implement checking and diagnostics for","C++11 generalized constant expressions: implement checking and diagnostics for\npointer-arithmetic-related undefined behavior and unspecified results. We\ncontinue to fold such values, but now notice they aren\'t constant expressions.\n\nllvm-svn: 147659"},
		[d]={{n,4800,"/// HandleBaseToDerivedCast - Apply the given base-to-derived cast operation on\n/// the provided lvalue, which currently refers to the base object.\nstatic bool HandleBaseToDerivedCast(EvalInfo &Info, const CastExpr *E, LValue &Result) {\n  // ...\n  // Check this cast lands within the final derived-to-base subobject path.\n  if (D.MostDerivedPathLength + E->path_size() > D.Entries.size()) {\n    Info.CCEDiag(E, diag::note_constexpr_invalid_downcast) << D.MostDerivedType << TargetQT;"},{n,4815,"/// HandleBaseToDerivedCast - Apply the given base-to-derived cast operation on\n/// the provided lvalue, which currently refers to the base object.\nstatic bool HandleBaseToDerivedCast(EvalInfo &Info, const CastExpr *E, LValue &Result) {\n  // ...\n  if (FinalType->getCanonicalDecl() != TargetType->getCanonicalDecl()) {\n    Info.CCEDiag(E, diag::note_constexpr_invalid_downcast) << D.MostDerivedType << TargetQT;"}},
		[m]={
			[yb]={"clang/test/SemaCXX/constant-expression-cxx11.cpp:889:25: note: cannot cast object of dynamic type \'const Derived\' to type \'Base2\'","clang/test/SemaCXX/constant-expression-cxx11.cpp:890:25: note: cannot cast object of dynamic type \'const Derived\' to type \'Base\'","clang/test/SemaCXX/constant-expression-cxx11.cpp:894:26: note: cannot cast object of dynamic type \'const Derived\' to type \'Base2\'","clang/test/SemaCXX/constant-expression-cxx11.cpp:895:26: note: cannot cast object of dynamic type \'const Derived\' to type \'Base\'","clang/test/SemaCXX/constant-expression-cxx11.cpp:978:10: note: cannot cast object of dynamic type \'S\' to type \'const T\'","clang/test/SemaCXX/constant-expression-cxx11.cpp:978:10: note: cannot cast object of dynamic type \'const S\' to type \'const T\'","clang/test/SemaCXX/constant-expression-cxx11.cpp:978:10: note: cannot cast object of dynamic type \'const S\' to type \'const T\'","clang/test/SemaCXX/constant-expression-cxx11.cpp:978:10: note: cannot cast object of dynamic type \'const S\' to type \'const T\'","clang/test/SemaCXX/constant-expression-cxx11.cpp:978:10: note: cannot cast object of dynamic type \'const S\' to type \'const T\'","clang/test/SemaCXX/constant-expression-cxx11.cpp:1135:29: note: cannot cast object of dynamic type \'T<17>\' to type \'T<23>\'"}
		}
	},
	["note_constexpr_invalid_function"]={
		[b]="note_constexpr_invalid_function",
		[c]="%select{non-constexpr|undefined}0 %select{function|constructor}1 %2 cannot be used in a constant expression",
		[e]={{nil,nil,{{"non-constexpr","undefined"},ab,{"function","constructor"}," C cannot be used in a constant expression"}}},
		[g]=f,
		[h]="(?:non\\-constexpr|undefined) (?:function|constructor) (.*?) cannot be used in a constant expression",
		[i]=a,
		[j]=o,
		[k]={zb,1323758398,Ab,Bb},
		[d]={{n,5557,"/// CheckTrivialDefaultConstructor - Check whether a constructor is a trivial\n/// default constructor. If so, we\'ll fold it whether or not it\'s marked as\n/// constexpr. If it is marked as constexpr, we will never implicitly define it,\n/// so we need special handling.\nstatic bool CheckTrivialDefaultConstructor(EvalInfo &Info, SourceLocation Loc, const CXXConstructorDecl *CD, bool IsValueInitialization) {\n  // ...\n  // Value-initialization does not call a trivial default constructor, so such a\n  // call is a core constant expression whether or not the constructor is\n  // constexpr.\n  if (!CD->isConstexpr() && !IsValueInitialization) {\n    if (Info.getLangOpts().CPlusPlus11) {\n      // ...\n      Info.CCEDiag(Loc, diag::note_constexpr_invalid_function, 1) << /*IsConstexpr*/ 0 << /*IsConstructor*/ 1 << CD;"},{n,5622,"/// CheckConstexprFunction - Check that a function can be called in a constant\n/// expression.\nstatic bool CheckConstexprFunction(EvalInfo &Info, SourceLocation CallLoc, const FunctionDecl *Declaration, const FunctionDecl *Definition, const Stmt *Body) {\n  // ...\n  if (Info.getLangOpts().CPlusPlus11) {\n    // ...\n    // FIXME: If DiagDecl is an implicitly-declared special member function\n    // or an inheriting constructor, we should be much more explicit about why\n    // it\'s not constexpr.\n    if (CD && CD->isInheritingConstructor())\n    // ...\n    else\n      Info.FFDiag(CallLoc, diag::note_constexpr_invalid_function, 1) << DiagDecl->isConstexpr() << (bool)CD << DiagDecl;"},{n,9300,"bool PointerExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E, unsigned BuiltinOp) {\n  // ...\n  case Builtin::BIstrchr:\n  case Builtin::BIwcschr:\n  case Builtin::BImemchr:\n  case Builtin::BIwmemchr:\n    if (Info.getLangOpts().CPlusPlus11)\n      Info.CCEDiag(E, diag::note_constexpr_invalid_function) << /*isConstexpr*/ 0 << /*isConstructor*/ 0 << (\"\'\" + Info.Ctx.BuiltinInfo.getName(BuiltinOp) + \"\'\").str();"},{n,9408,"bool PointerExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E, unsigned BuiltinOp) {\n  // ...\n  case Builtin::BImemcpy:\n  case Builtin::BImemmove:\n  case Builtin::BIwmemcpy:\n  case Builtin::BIwmemmove:\n    if (Info.getLangOpts().CPlusPlus11)\n      Info.CCEDiag(E, diag::note_constexpr_invalid_function) << /*isConstexpr*/ 0 << /*isConstructor*/ 0 << (\"\'\" + Info.Ctx.BuiltinInfo.getName(BuiltinOp) + \"\'\").str();"},{n,12285,"bool IntExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E, unsigned BuiltinOp) {\n  // ...\n  case Builtin::BIstrlen:\n  case Builtin::BIwcslen:\n    // A call to strlen is not a constant expression.\n    if (Info.getLangOpts().CPlusPlus11)\n      Info.CCEDiag(E, diag::note_constexpr_invalid_function) << /*isConstexpr*/ 0 << /*isConstructor*/ 0 << (\"\'\" + Info.Ctx.BuiltinInfo.getName(BuiltinOp) + \"\'\").str();"},{n,12310,"bool IntExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E, unsigned BuiltinOp) {\n  // ...\n  case Builtin::BIstrcmp:\n  case Builtin::BIwcscmp:\n  case Builtin::BIstrncmp:\n  case Builtin::BIwcsncmp:\n  case Builtin::BImemcmp:\n  case Builtin::BIbcmp:\n  case Builtin::BIwmemcmp:\n    // A call to strlen is not a constant expression.\n    if (Info.getLangOpts().CPlusPlus11)\n      Info.CCEDiag(E, diag::note_constexpr_invalid_function) << /*isConstexpr*/ 0 << /*isConstructor*/ 0 << (\"\'\" + Info.Ctx.BuiltinInfo.getName(BuiltinOp) + \"\'\").str();"},{y,333,"bool CheckCallable(InterpState &S, CodePtr OpPC, const Function *F) {\n  // ...\n  if (!F->isConstexpr()) {\n    // ...\n    if (S.getLangOpts().CPlusPlus11) {\n      // ...\n      // FIXME: If DiagDecl is an implicitly-declared special member function\n      // or an inheriting constructor, we should be much more explicit about why\n      // it\'s not constexpr.\n      if (CD && CD->isInheritingConstructor())\n      // ...\n      else\n        S.FFDiag(Loc, diag::note_constexpr_invalid_function, 1) << DiagDecl->isConstexpr() << (bool)CD << DiagDecl;"}},
		[m]={
			["clang/test/SemaCXX/cxx0x-class.cpp"]={"clang/test/SemaCXX/cxx0x-class.cpp:26:33: note: non-constexpr function \'foo\' cannot be used in a constant expression"}
		}
	},
	["note_constexpr_invalid_inhctor"]={
		[b]="note_constexpr_invalid_inhctor",
		[c]="constructor inherited from base class %0 cannot be used in a constant expression; derived class cannot be implicitly initialized",
		[e]="constructor inherited from base class A cannot be used in a constant expression; derived class cannot be implicitly initialized",
		[g]=f,
		[h]="constructor inherited from base class (.*?) cannot be used in a constant expression; derived class cannot be implicitly initialized",
		[i]=a,
		[j]=o,
		[k]={"5179eb78210a",1467140637,"P0136R1, DR1573, DR1645, DR1715, DR1736, DR1903, DR1941, DR1959, DR1991:","P0136R1, DR1573, DR1645, DR1715, DR1736, DR1903, DR1941, DR1959, DR1991:\n\nReplace inheriting constructors implementation with new approach, voted into\nC++ last year as a DR against C++11.\n\nInstead of synthesizing a set of derived class constructors for each inherited\nbase class constructor, we make the constructors of the base class visible to\nconstructor lookup in the derived class, using the normal rules for\nusing-declarations.\n\nFor constructors, UsingShadowDecl now has a ConstructorUsingShadowDecl derived\nclass that tracks the requisite additional information. We create shadow\nconstructors (not found by name lookup) in the derived class to model the\nactual initialization, and have a new expression node,\nCXXInheritedCtorInitExpr, to model the initialization of a base class from such\na constructor. (This initialization is special because it performs real perfect\nforwarding of arguments.)\n\nIn cases where argument forwarding is not possible (for inalloca calls,\nvariadic calls, and calls with callee parameter cleanup), the shadow inheriting\nconstructor is not emitted and instead we directly emit the initialization code\ninto the caller of the inherited constructor.\n\nNote that this new model is not perfectly compatible with the old model in some\ncorner cases. In particular:\n * if B inherits a private constructor from A, and C uses that constructor to\n   construct a B, then we previously required that A befriends B and B\n   befriends C, but the new rules require A to befriend C directly, and\n * if a derived class has its own constructors (and so its implicit default\n   constructor is suppressed), it may still inherit a default constructor from\n   a base class\n\nllvm-svn: 274049"},
		[d]={{n,5619,"/// CheckConstexprFunction - Check that a function can be called in a constant\n/// expression.\nstatic bool CheckConstexprFunction(EvalInfo &Info, SourceLocation CallLoc, const FunctionDecl *Declaration, const FunctionDecl *Definition, const Stmt *Body) {\n  // ...\n  if (Info.getLangOpts().CPlusPlus11) {\n    // ...\n    // FIXME: If DiagDecl is an implicitly-declared special member function\n    // or an inheriting constructor, we should be much more explicit about why\n    // it\'s not constexpr.\n    if (CD && CD->isInheritingConstructor())\n      Info.FFDiag(CallLoc, diag::note_constexpr_invalid_inhctor, 1) << CD->getInheritedConstructor().getConstructor()->getParent();"},{y,330,"bool CheckCallable(InterpState &S, CodePtr OpPC, const Function *F) {\n  // ...\n  if (!F->isConstexpr()) {\n    // ...\n    if (S.getLangOpts().CPlusPlus11) {\n      // ...\n      // FIXME: If DiagDecl is an implicitly-declared special member function\n      // or an inheriting constructor, we should be much more explicit about why\n      // it\'s not constexpr.\n      if (CD && CD->isInheritingConstructor())\n        S.FFDiag(Loc, diag::note_constexpr_invalid_inhctor, 1) << CD->getInheritedConstructor().getConstructor()->getParent();"}},
		[m]={
			["clang/test/CXX/special/class.inhctor/p2.cpp"]={"clang/test/CXX/special/class.inhctor/p2.cpp:80:28: note: constructor inherited from base class \'Constexpr\' cannot be used in a constant expression; derived class cannot be implicitly initialized"}
		}
	},
	["note_constexpr_invalid_template_arg"]={
		[b]={{nil,u,"note_constexpr_invalid_template_arg"}},
		[c]={{nil,u,"%select{pointer|reference}0 to %select{|subobject of }1%select{type_info object|string literal|temporary object|predefined \'%3\' variable}2 is not allowed in a template argument"}},
		[e]={{nil,u,{{ic,Db}," to ",{a,"subobject of "},{"type_info object","string literal","temporary object","predefined \'D\' variable"}," is not allowed in a template argument"}}},
		[g]=f,
		[h]="(?:pointer|reference) to (?:|subobject of )(?:type_info object|string literal|temporary object|predefined \'(.*?)\' variable) is not allowed in a template argument",
		[i]=a,
		[j]={{nil,u,o}},
		[k]={"7b3515880c22",1603602504,"For P0732R2, P1907R1: ensure that template parameter objects don\'t refer","For P0732R2, P1907R1: ensure that template parameter objects don\'t refer\nto disallowed objects or have non-constant destruction."},
		[d]={{n,2187,"/// Check that this reference or pointer core constant expression is a valid\n/// value for an address or reference constant expression. Return true if we\n/// can fold this expression, whether or not it\'s a constant expression.\nstatic bool CheckLValueConstantExpression(EvalInfo &Info, SourceLocation Loc, QualType Type, const LValue &LVal, ConstantExprKind Kind, CheckedTemporaries &CheckedTemps) {\n  // ...\n  // Additional restrictions apply in a template argument. We only enforce the\n  // C++20 restrictions here; additional syntactic and semantic restrictions\n  // are applied elsewhere.\n  if (isTemplateArgument(Kind)) {\n    // ...\n    if (InvalidBaseKind != -1) {\n      Info.FFDiag(Loc, diag::note_constexpr_invalid_template_arg) << IsReferenceType << !Designator.Entries.empty() << InvalidBaseKind << Ident;"},{cc,5989,"/// EvaluateConvertedConstantExpression - Evaluate an Expression\n/// That is a converted constant expression\n/// (which was built with BuildConvertedConstantExpression)\nstatic ExprResult EvaluateConvertedConstantExpression(Sema &S, Expr *E, QualType T, APValue &Value, Sema::CCEKind CCE, bool RequireInt, const APValue &PreNarrowingValue) {\n  // ...\n  } else if (!Notes.empty() && Notes[0].second.getDiagID() == diag::note_constexpr_invalid_template_arg) {"}}
	},
	["note_constexpr_invalid_void_star_cast"]={
		[b]="note_constexpr_invalid_void_star_cast",
		[c]="cast from %0 is not allowed in a constant expression %select{in C++ standards before C++2c|because the pointed object type %2 is not similar to the target type %3}1",
		[e]={{nil,nil,{"cast from A is not allowed in a constant expression ",{"in C++ standards before C++2c","because the pointed object type C is not similar to the target type D"}}}},
		[g]=f,
		[h]="cast from (.*?) is not allowed in a constant expression (?:in C\\+\\+ standards before C\\+\\+2c|because the pointed object type (.*?) is not similar to the target type (.*?))",
		[i]=a,
		[j]=o,
		[k]={nb,1662843785,jb,ob},
		[d]={{n,8971,"bool PointerExprEvaluator::VisitCastExpr(const CastExpr *E) {\n  // ...\n  case CK_BitCast:\n  case CK_CPointerToObjCPointerCast:\n  case CK_BlockPointerToObjCPointerCast:\n  case CK_AnyPointerToBlockPointerCast:\n  case CK_AddressSpaceConversion:\n    // ...\n    // Bitcasts to cv void* are static_casts, not reinterpret_casts, so are\n    // permitted in constant expressions in C++11. Bitcasts from cv void* are\n    // also static_casts, but we disallow them as a resolution to DR1312.\n    if (!E->getType()->isVoidPointerType()) {\n      // ...\n      // 1. We\'ll allow it in std::allocator::allocate, and anything which that\n      //    calls.\n      // 2. HACK 2022-03-28: Work around an issue with libstdc++\'s\n      //    <source_location> header. Fixed in GCC 12 and later (2022-04-??).\n      //    We\'ll allow it in the body of std::source_location::current.  GCC\'s\n      //    implementation had a parameter of type `void*`, and casts from\n      //    that back to `const __impl*` in its body.\n      if (VoidPtrCastMaybeOK && (Info.getStdAllocatorCaller(\"allocate\") || IsDeclSourceLocationCurrent(Info.CurrentCall->Callee) || Info.getLangOpts().CPlusPlus26)) {\n      // ...\n      } else {\n        if (SubExpr->getType()->isVoidPointerType()) {\n          if (HasValidResult)\n            CCEDiag(E, diag::note_constexpr_invalid_void_star_cast) << SubExpr->getType() << Info.getLangOpts().CPlusPlus26 << Result.Designator.getType(Info.Ctx).getCanonicalType() << E->getType()->getPointeeType();"}},
		[m]={
			["clang/test/CXX/expr/expr.const/p5-26.cpp"]={"clang/test/CXX/expr/expr.const/p5-26.cpp:12:11: note: cast from \'void *\' is not allowed in a constant expression in C++ standards before C++2c","clang/test/CXX/expr/expr.const/p5-26.cpp:33:27: note: cast from \'void *\' is not allowed in a constant expression in C++ standards before C++2c","clang/test/CXX/expr/expr.const/p5-26.cpp:36:27: note: cast from \'void *\' is not allowed in a constant expression in C++ standards before C++2c"}
		}
	},
	["note_constexpr_large_shift"]={
		[b]="note_constexpr_large_shift",
		[c]="shift count %0 >= width of type %1 (%2 bit%s2)",
		[e]="shift count A >= width of type B (C bitC)",
		[g]=f,
		[h]="shift count (.*?) \\>\\= width of type (.*?) \\((.*?) bit(.*?)\\)",
		[i]=a,
		[j]=o,
		[k]={"fe800031ec14",1327982900,"constexpr: catch a collection of integral undefined behaviors:","constexpr: catch a collection of integral undefined behaviors:\n  -INT_MIN and INT_MIN / -1\n  Shift by a negative or too large quantity\n  Left shift of negative value\n  Overflow in left shift\n\nllvm-svn: 149344"},
		[d]={{n,2834,"/// Perform the given binary integer operation.\nstatic bool handleIntIntBinOp(EvalInfo &Info, const Expr *E, const APSInt &LHS, BinaryOperatorKind Opcode, APSInt RHS, APSInt &Result) {\n  // ...\n  shift_left:\n    // ...\n    if (SA != RHS) {\n      Info.CCEDiag(E, diag::note_constexpr_large_shift) << RHS << E->getType() << LHS.getBitWidth();"},{n,2867,"/// Perform the given binary integer operation.\nstatic bool handleIntIntBinOp(EvalInfo &Info, const Expr *E, const APSInt &LHS, BinaryOperatorKind Opcode, APSInt RHS, APSInt &Result) {\n  // ...\n  shift_right:\n    // ...\n    if (SA != RHS)\n      Info.CCEDiag(E, diag::note_constexpr_large_shift) << RHS << E->getType() << LHS.getBitWidth();"},{n,14046,"bool FixedPointExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {\n  // ...\n  case BO_Shl:\n  case BO_Shr: {\n    // ...\n    // Embedded-C 4.1.6.2.2:\n    //   The right operand must be nonnegative and less than the total number\n    //   of (nonpadding) bits of the fixed-point operand ...\n    if (RHSVal.isNegative())\n    // ...\n    else if (Amt != RHSVal)\n      Info.CCEDiag(E, diag::note_constexpr_large_shift) << RHSVal << E->getType() << ShiftBW;"}},
		[m]={
			[T]={"clang/test/CXX/expr/expr.const/p2-0x.cpp:158:28: note: shift count 32 >= width of type \'int\' (32 bits)","clang/test/CXX/expr/expr.const/p2-0x.cpp:174:28: note: shift count 32 >= width of type \'int\' (32 bits)"}
		}
	},
	["note_constexpr_lifetime_ended"]={
		[b]="note_constexpr_lifetime_ended",
		[c]={{nil,l,"%select{read of|read of|assignment to|increment of|decrement of|member call on|dynamic_cast of|typeid applied to|construction of|destruction of}0 %select{temporary|variable}1 whose %plural{8:storage duration|:lifetime}0 has ended"},{q,q,"%select{read of|assignment to|increment of|decrement of|member call on|dynamic_cast of|typeid applied to}0 %select{temporary|variable}1 whose lifetime has ended"},{s,nil,"%select{read of|assignment to|increment of|decrement of}0 %select{temporary|variable}1 whose lifetime has ended"}},
		[e]={{nil,l,{{v,v,D,B,C,R,S,J,rb,Y},ab,{Cb,"variable"}," whose ",{"storage duration","lifetime"}," has ended"}},{q,q,{{v,D,B,C,R,S,J},ab,{Cb,"variable"}," whose lifetime has ended"}},{s,nil,{{v,D,B,C},ab,{Cb,"variable"}," whose lifetime has ended"}}},
		[g]=f,
		[h]="(?:read of|read of|assignment to|increment of|decrement of|member call on|dynamic_cast of|typeid applied to|construction of|destruction of) (?:temporary|variable) whose (?:storage duration|lifetime) has ended",
		[i]=a,
		[j]=o,
		[k]={"b228a86fcfd1",1329272293,"Implement DR1454. This allows all intermediate results in constant expressions","Implement DR1454. This allows all intermediate results in constant expressions\nto be core constant expressions (including pointers and references to\ntemporaries), and makes constexpr calculations Turing-complete. A Turing machine\nsimulator is included as a testcase.\n\nThis opens up the possibilty of removing CCValue entirely, and removing some\ncopies from the constant evaluator in the process, but that cleanup is not part\nof this change.\n\nllvm-svn: 150557"},
		[d]={{n,4019,"/// Find the complete object to which an LValue refers.\nstatic CompleteObject findCompleteObject(EvalInfo &Info, const Expr *E, AccessKinds AK, const LValue &LVal, QualType LValType) {\n  // ...\n  if (LVal.getLValueCallIndex()) {\n    // ...\n    if (!Frame) {\n      Info.FFDiag(E, diag::note_constexpr_lifetime_ended, 1) << AK << LVal.Base.is<const ValueDecl *>();"},{y,164,"bool CheckLive(InterpState &S, CodePtr OpPC, const Pointer &Ptr, AccessKinds AK) {\n  // ...\n  if (!Ptr.isLive()) {\n    // ...\n    S.FFDiag(Src, diag::note_constexpr_lifetime_ended, 1) << AK << !IsTemp;"}},
		[m]={
			[W]={"clang/test/SemaCXX/constant-expression-cxx2a.cpp:1199:8: note: destruction of variable whose lifetime has ended","clang/test/SemaCXX/constant-expression-cxx2a.cpp:1205:8: note: destruction of temporary whose lifetime has ended"}
		}
	},
	["note_constexpr_literal_comparison"]={
		[b]={{nil,x,"note_constexpr_literal_comparison"}},
		[c]={{nil,x,"comparison of addresses of literals has unspecified value"}},
		[e]={{nil,x,"comparison of addresses of literals has unspecified value"}},
		[g]=f,
		[h]="comparison of addresses of literals has unspecified value",
		[i]=a,
		[j]={{nil,x,o}},
		[k]={nb,1662843785,jb,ob},
		[d]={{n,13096,"template <class SuccessCB, class AfterCB> static bool EvaluateComparisonBinaryOperator(EvalInfo &Info, const BinaryOperator *E, SuccessCB &&Success, AfterCB &&DoAfter) {\n  // ...\n  if (LHSTy->isPointerType() && RHSTy->isPointerType()) {\n    // ...\n    // Reject differing bases from the normal codepath; we special-case\n    // comparisons to null.\n    if (!HasSameBase(LHSValue, RHSValue)) {\n      // ...\n      // It\'s implementation-defined whether distinct literals will have\n      // distinct addresses. In clang, the result of such a comparison is\n      // unspecified, so it is not a constant expression. However, we do know\n      // that the address of a literal will be non-null.\n      if ((IsLiteralLValue(LHSValue) || IsLiteralLValue(RHSValue)) && LHSValue.Base && RHSValue.Base)\n        return DiagComparison(diag::note_constexpr_literal_comparison);"}},
		[m]={
			["clang/test/SemaCXX/builtins.cpp"]={"clang/test/SemaCXX/builtins.cpp:50:43: note: comparison of addresses of literals has unspecified value"}
		}
	},
	["note_constexpr_lshift_discards"]={
		[b]="note_constexpr_lshift_discards",
		[c]="signed left shift discards bits",
		[e]="signed left shift discards bits",
		[g]=f,
		[h]="signed left shift discards bits",
		[i]=a,
		[j]=o,
		[k]={"da7c4ba1af98",1328681693,"Implement the agreed resolution to DR1457: a signed left shift of a 1 bit into","Implement the agreed resolution to DR1457: a signed left shift of a 1 bit into\nthe sign bit doesn\'t have undefined behavior, but a signed left shift of a 1 bit\nout of the sign bit still does. As promised to Howard :)\n\nThe suppression of the potential constant expression checking in system headers\nis also removed, since the problem it was working around is gone.\n\nllvm-svn: 150059"},
		[d]={{n,2844,"/// Perform the given binary integer operation.\nstatic bool handleIntIntBinOp(EvalInfo &Info, const Expr *E, const APSInt &LHS, BinaryOperatorKind Opcode, APSInt RHS, APSInt &Result) {\n  // ...\n  shift_left:\n    // ...\n    if (SA != RHS) {\n    // ...\n    } else if (LHS.isSigned() && !Info.getLangOpts().CPlusPlus20) {\n      // C++11 [expr.shift]p2: A signed left shift must have a non-negative\n      // operand, and must not overflow the corresponding unsigned type.\n      // C++2a [expr.shift]p2: E1 << E2 is the unique value congruent to\n      // E1 x 2^E2 module 2^N.\n      if (LHS.isNegative())\n      // ...\n      else if (LHS.countl_zero() < SA)\n        Info.CCEDiag(E, diag::note_constexpr_lshift_discards);"}},
		[m]={
			[T]={"clang/test/CXX/expr/expr.const/p2-0x.cpp:166:40: note: signed left shift discards bits","clang/test/CXX/expr/expr.const/p2-0x.cpp:167:51: note: signed left shift discards bits","clang/test/CXX/expr/expr.const/p2-0x.cpp:168:44: note: signed left shift discards bits"}
		}
	},
	["note_constexpr_lshift_of_negative"]={
		[b]="note_constexpr_lshift_of_negative",
		[c]="left shift of negative value %0",
		[e]="left shift of negative value A",
		[g]=f,
		[h]="left shift of negative value (.*?)",
		[i]=a,
		[j]=o,
		[k]={"fe800031ec14",1327982900,"constexpr: catch a collection of integral undefined behaviors:","constexpr: catch a collection of integral undefined behaviors:\n  -INT_MIN and INT_MIN / -1\n  Shift by a negative or too large quantity\n  Left shift of negative value\n  Overflow in left shift\n\nllvm-svn: 149344"},
		[d]={{n,2842,"/// Perform the given binary integer operation.\nstatic bool handleIntIntBinOp(EvalInfo &Info, const Expr *E, const APSInt &LHS, BinaryOperatorKind Opcode, APSInt RHS, APSInt &Result) {\n  // ...\n  shift_left:\n    // ...\n    if (SA != RHS) {\n    // ...\n    } else if (LHS.isSigned() && !Info.getLangOpts().CPlusPlus20) {\n      // C++11 [expr.shift]p2: A signed left shift must have a non-negative\n      // operand, and must not overflow the corresponding unsigned type.\n      // C++2a [expr.shift]p2: E1 << E2 is the unique value congruent to\n      // E1 x 2^E2 module 2^N.\n      if (LHS.isNegative())\n        Info.CCEDiag(E, diag::note_constexpr_lshift_of_negative) << LHS;"}},
		[m]={
			[T]={"clang/test/CXX/expr/expr.const/p2-0x.cpp:162:44: note: left shift of negative value -3"}
		}
	},
	["note_constexpr_ltor_incomplete_type"]={
		[b]={{nil,s,"note_constexpr_ltor_incomplete_type"}},
		[c]={{nil,s,"read of incomplete type %0 is not allowed in a constant expression"}},
		[e]={{nil,s,"read of incomplete type A is not allowed in a constant expression"}},
		[g]=f,
		[h]="read of incomplete type (.*?) is not allowed in a constant expression",
		[i]=a,
		[j]={{nil,s,o}},
		[k]={"147b743602e4",1544633623,"[ExprConstant] Improve memchr/memcmp for type mismatch and multibyte element types","[ExprConstant] Improve memchr/memcmp for type mismatch and multibyte element types\n\nSummary:\n`memchr` and `memcmp` operate upon the character units of the object\nrepresentation; that is, the `size_t` parameter expresses the number of\ncharacter units. The constant folding implementation is updated in this\npatch to account for multibyte element types in the arrays passed to\n`memchr`/`memcmp` and, in the case of `memcmp`, to account for the\npossibility that the arrays may have differing element types (even when\nthey are byte-sized).\n\nActual inspection of the object representation is not implemented.\nComparisons are done only between elements with the same object size;\nthat is, `memchr` will fail when inspecting at least one character unit\nof a multibyte element. The integer types are assumed to have two\'s\ncomplement representation with 0 for `false`, 1 for `true`, and no\npadding bits.\n\n`memcmp` on multibyte elements will only be able to fold in cases where\nenough elements are equal for the answer to be 0.\n\nVarious tests are added to guard against incorrect folding for cases\nthat miscompile on some system or other prior to this patch. At the same\ntime, the unsigned 32-bit `wchar_t` testing in\n`test/SemaCXX/constexpr-string.cpp` is restored.\n\nReviewers: rsmith, aaron.ballman, hfinkel\n\nReviewed By: rsmith\n\nSubscribers: cfe-commits\n\nDifferential Revision: https://reviews.llvm.org/D55510\n\nllvm-svn: 348938"},
		[d]={{n,9340,"bool PointerExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E, unsigned BuiltinOp) {\n  // ...\n  case Builtin::BI__builtin_strchr:\n  case Builtin::BI__builtin_wcschr:\n  case Builtin::BI__builtin_memchr:\n  case Builtin::BI__builtin_char_memchr:\n  case Builtin::BI__builtin_wmemchr: {\n    // ...\n    // Pointers to const void may point to objects of incomplete type.\n    if (IsRawByte && CharTy->isIncompleteType()) {\n      Info.FFDiag(E, diag::note_constexpr_ltor_incomplete_type) << CharTy;"}},
		[m]={
			[gb]={"SemaCXX/constexpr-string.cpp:406:17: note: read of incomplete type \'struct Incomplete\' is not allowed in a constant expression"}
		}
	},
	["note_constexpr_ltor_non_const_int"]={
		[b]="note_constexpr_ltor_non_const_int",
		[c]="read of non-const variable %0 is not allowed in a constant expression",
		[e]="read of non-const variable A is not allowed in a constant expression",
		[g]=f,
		[h]="read of non\\-const variable (.*?) is not allowed in a constant expression",
		[i]=a,
		[j]=o,
		[k]={"f2b681b4d819",1324443886,"constexpr: diagnostic improvements for invalid lvalue-to-rvalue conversions in","constexpr: diagnostic improvements for invalid lvalue-to-rvalue conversions in\nconstant expressions.\n\nllvm-svn: 147035"},
		[d]={{n,4129,"/// Find the complete object to which an LValue refers.\nstatic CompleteObject findCompleteObject(EvalInfo &Info, const Expr *E, AccessKinds AK, const LValue &LVal, QualType LValType) {\n  // ...\n  if (Info.getLangOpts().CPlusPlus14 && LVal.Base == Info.EvaluatingDecl && lifetimeStartedInEvaluation(Info, LVal.Base)) {\n  // ...\n  } else if (const ValueDecl *D = LVal.Base.dyn_cast<const ValueDecl *>()) {\n    // ...\n    // Unless we\'re looking at a local variable or argument in a constexpr call,\n    // the variable we\'re reading must be const.\n    if (!Frame) {\n      if (IsAccess && isa<ParmVarDecl>(VD)) {\n      // ...\n      } else if (Info.getLangOpts().CPlusPlus14 && lifetimeStartedInEvaluation(Info, LVal.Base)) {\n      // ...\n      } else if (isModification(AK)) {\n      // ...\n      } else if (VD->isConstexpr()) {\n      // ...\n      } else if (BaseType->isIntegralOrEnumerationType()) {\n        if (!IsConstant) {\n          // ...\n          if (Info.getLangOpts().CPlusPlus) {\n            Info.FFDiag(E, diag::note_constexpr_ltor_non_const_int, 1) << VD;"}},
		[m]={
			["clang/test/SemaCXX/c99-variable-length-array.cpp"]={"clang/test/SemaCXX/c99-variable-length-array.cpp:43:14: note: read of non-const variable \'value\' is not allowed in a constant expression","clang/test/SemaCXX/c99-variable-length-array.cpp:60:25: note: read of non-const variable \'value\' is not allowed in a constant expression","clang/test/SemaCXX/c99-variable-length-array.cpp:118:16: note: read of non-const variable \'M\' is not allowed in a constant expression"}
		}
	},
	["note_constexpr_ltor_non_constexpr"]={
		[b]="note_constexpr_ltor_non_constexpr",
		[c]="read of non-constexpr variable %0 is not allowed in a constant expression",
		[e]="read of non-constexpr variable A is not allowed in a constant expression",
		[g]=f,
		[h]="read of non\\-constexpr variable (.*?) is not allowed in a constant expression",
		[i]=a,
		[j]=o,
		[k]={"f2b681b4d819",1324443886,"constexpr: diagnostic improvements for invalid lvalue-to-rvalue conversions in","constexpr: diagnostic improvements for invalid lvalue-to-rvalue conversions in\nconstant expressions.\n\nllvm-svn: 147035"},
		[d]={{n,3357,"/// Try to evaluate the initializer for a variable declaration.\n///\n/// \\param Info   Information about the ongoing evaluation.\n/// \\param E      An expression to be used when printing diagnostics.\n/// \\param VD     The variable whose initializer should be obtained.\n/// \\param Version The version of the variable within the frame.\n/// \\param Frame  The frame in which the variable was created. Must be null\n///               if this variable is not local to the evaluation.\n/// \\param Result Filled in with a pointer to the value of the variable.\nstatic bool evaluateVarDeclInit(EvalInfo &Info, const Expr *E, const VarDecl *VD, CallStackFrame *Frame, unsigned Version, APValue *&Result) {\n  // ...\n  if (Init->isValueDependent()) {\n    // ...\n    if (!Info.checkingPotentialConstantExpression()) {\n      Info.FFDiag(E, Info.getLangOpts().CPlusPlus11 ? diag::note_constexpr_ltor_non_constexpr : diag::note_constexpr_ltor_non_integral, 1) << VD << VD->getType();"},{n,4147,"/// Find the complete object to which an LValue refers.\nstatic CompleteObject findCompleteObject(EvalInfo &Info, const Expr *E, AccessKinds AK, const LValue &LVal, QualType LValType) {\n  // ...\n  if (Info.getLangOpts().CPlusPlus14 && LVal.Base == Info.EvaluatingDecl && lifetimeStartedInEvaluation(Info, LVal.Base)) {\n  // ...\n  } else if (const ValueDecl *D = LVal.Base.dyn_cast<const ValueDecl *>()) {\n    // ...\n    // Unless we\'re looking at a local variable or argument in a constexpr call,\n    // the variable we\'re reading must be const.\n    if (!Frame) {\n      if (IsAccess && isa<ParmVarDecl>(VD)) {\n      // ...\n      } else if (Info.getLangOpts().CPlusPlus14 && lifetimeStartedInEvaluation(Info, LVal.Base)) {\n      // ...\n      } else if (isModification(AK)) {\n      // ...\n      } else if (VD->isConstexpr()) {\n      // ...\n      } else if (BaseType->isIntegralOrEnumerationType()) {\n      // ...\n      } else if (!IsAccess) {\n      // ...\n      } else if (IsConstant && Info.checkingPotentialConstantExpression() && BaseType->isLiteralType(Info.Ctx) && !VD->hasDefinition()) {\n      // ...\n      } else if (IsConstant) {\n        // Keep evaluating to see what we can do. In particular, we support\n        // folding of const floating-point types, in order to make static const\n        // data members of such types (supported as an extension) more useful.\n        if (Info.getLangOpts().CPlusPlus) {\n          Info.CCEDiag(E, Info.getLangOpts().CPlusPlus11 ? diag::note_constexpr_ltor_non_constexpr : diag::note_constexpr_ltor_non_integral, 1) << VD << BaseType;"},{n,4158,"/// Find the complete object to which an LValue refers.\nstatic CompleteObject findCompleteObject(EvalInfo &Info, const Expr *E, AccessKinds AK, const LValue &LVal, QualType LValType) {\n  // ...\n  if (Info.getLangOpts().CPlusPlus14 && LVal.Base == Info.EvaluatingDecl && lifetimeStartedInEvaluation(Info, LVal.Base)) {\n  // ...\n  } else if (const ValueDecl *D = LVal.Base.dyn_cast<const ValueDecl *>()) {\n    // ...\n    // Unless we\'re looking at a local variable or argument in a constexpr call,\n    // the variable we\'re reading must be const.\n    if (!Frame) {\n      if (IsAccess && isa<ParmVarDecl>(VD)) {\n      // ...\n      } else if (Info.getLangOpts().CPlusPlus14 && lifetimeStartedInEvaluation(Info, LVal.Base)) {\n      // ...\n      } else if (isModification(AK)) {\n      // ...\n      } else if (VD->isConstexpr()) {\n      // ...\n      } else if (BaseType->isIntegralOrEnumerationType()) {\n      // ...\n      } else if (!IsAccess) {\n      // ...\n      } else if (IsConstant && Info.checkingPotentialConstantExpression() && BaseType->isLiteralType(Info.Ctx) && !VD->hasDefinition()) {\n      // ...\n      } else if (IsConstant) {\n      // ...\n      } else {\n        // Never allow reading a non-const value.\n        if (Info.getLangOpts().CPlusPlus) {\n          Info.FFDiag(E, Info.getLangOpts().CPlusPlus11 ? diag::note_constexpr_ltor_non_constexpr : diag::note_constexpr_ltor_non_integral, 1) << VD << BaseType;"},{y,133,"bool CheckExtern(InterpState &S, CodePtr OpPC, const Pointer &Ptr) {\n  // ...\n  if (!S.checkingPotentialConstantExpression()) {\n    // ...\n    S.FFDiag(Loc, diag::note_constexpr_ltor_non_constexpr, 1) << VD;"}},
		[m]={
			["clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1-11.cpp"]={"clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1-11.cpp:27:4: note: read of non-constexpr variable \'nonconst_np\' is not allowed in a constant expression"}
		}
	},
	["note_constexpr_ltor_non_integral"]={
		[b]={{nil,r,"note_constexpr_ltor_non_integral"}},
		[c]={{nil,r,"read of variable %0 of non-integral, non-enumeration type %1 is not allowed in a constant expression"}},
		[e]={{nil,r,"read of variable A of non-integral, non-enumeration type B is not allowed in a constant expression"}},
		[g]=f,
		[h]="read of variable (.*?) of non\\-integral, non\\-enumeration type (.*?) is not allowed in a constant expression",
		[i]=a,
		[j]={{nil,r,o}},
		[k]={"00068c452a59",1594250761,"Improve diagnostics for constant evaluation that fails because a","Improve diagnostics for constant evaluation that fails because a\nvariable\'s initializer is not known.\n\nThe hope is that a better diagnostic for this case will reduce the rate\nat which duplicates of non-bug PR41093 are reported."},
		[d]={{n,3358,"/// Try to evaluate the initializer for a variable declaration.\n///\n/// \\param Info   Information about the ongoing evaluation.\n/// \\param E      An expression to be used when printing diagnostics.\n/// \\param VD     The variable whose initializer should be obtained.\n/// \\param Version The version of the variable within the frame.\n/// \\param Frame  The frame in which the variable was created. Must be null\n///               if this variable is not local to the evaluation.\n/// \\param Result Filled in with a pointer to the value of the variable.\nstatic bool evaluateVarDeclInit(EvalInfo &Info, const Expr *E, const VarDecl *VD, CallStackFrame *Frame, unsigned Version, APValue *&Result) {\n  // ...\n  if (Init->isValueDependent()) {\n    // ...\n    if (!Info.checkingPotentialConstantExpression()) {\n      Info.FFDiag(E, Info.getLangOpts().CPlusPlus11 ? diag::note_constexpr_ltor_non_constexpr : diag::note_constexpr_ltor_non_integral, 1) << VD << VD->getType();"},{n,4148,"/// Find the complete object to which an LValue refers.\nstatic CompleteObject findCompleteObject(EvalInfo &Info, const Expr *E, AccessKinds AK, const LValue &LVal, QualType LValType) {\n  // ...\n  if (Info.getLangOpts().CPlusPlus14 && LVal.Base == Info.EvaluatingDecl && lifetimeStartedInEvaluation(Info, LVal.Base)) {\n  // ...\n  } else if (const ValueDecl *D = LVal.Base.dyn_cast<const ValueDecl *>()) {\n    // ...\n    // Unless we\'re looking at a local variable or argument in a constexpr call,\n    // the variable we\'re reading must be const.\n    if (!Frame) {\n      if (IsAccess && isa<ParmVarDecl>(VD)) {\n      // ...\n      } else if (Info.getLangOpts().CPlusPlus14 && lifetimeStartedInEvaluation(Info, LVal.Base)) {\n      // ...\n      } else if (isModification(AK)) {\n      // ...\n      } else if (VD->isConstexpr()) {\n      // ...\n      } else if (BaseType->isIntegralOrEnumerationType()) {\n      // ...\n      } else if (!IsAccess) {\n      // ...\n      } else if (IsConstant && Info.checkingPotentialConstantExpression() && BaseType->isLiteralType(Info.Ctx) && !VD->hasDefinition()) {\n      // ...\n      } else if (IsConstant) {\n        // Keep evaluating to see what we can do. In particular, we support\n        // folding of const floating-point types, in order to make static const\n        // data members of such types (supported as an extension) more useful.\n        if (Info.getLangOpts().CPlusPlus) {\n          Info.CCEDiag(E, Info.getLangOpts().CPlusPlus11 ? diag::note_constexpr_ltor_non_constexpr : diag::note_constexpr_ltor_non_integral, 1) << VD << BaseType;"},{n,4159,"/// Find the complete object to which an LValue refers.\nstatic CompleteObject findCompleteObject(EvalInfo &Info, const Expr *E, AccessKinds AK, const LValue &LVal, QualType LValType) {\n  // ...\n  if (Info.getLangOpts().CPlusPlus14 && LVal.Base == Info.EvaluatingDecl && lifetimeStartedInEvaluation(Info, LVal.Base)) {\n  // ...\n  } else if (const ValueDecl *D = LVal.Base.dyn_cast<const ValueDecl *>()) {\n    // ...\n    // Unless we\'re looking at a local variable or argument in a constexpr call,\n    // the variable we\'re reading must be const.\n    if (!Frame) {\n      if (IsAccess && isa<ParmVarDecl>(VD)) {\n      // ...\n      } else if (Info.getLangOpts().CPlusPlus14 && lifetimeStartedInEvaluation(Info, LVal.Base)) {\n      // ...\n      } else if (isModification(AK)) {\n      // ...\n      } else if (VD->isConstexpr()) {\n      // ...\n      } else if (BaseType->isIntegralOrEnumerationType()) {\n      // ...\n      } else if (!IsAccess) {\n      // ...\n      } else if (IsConstant && Info.checkingPotentialConstantExpression() && BaseType->isLiteralType(Info.Ctx) && !VD->hasDefinition()) {\n      // ...\n      } else if (IsConstant) {\n      // ...\n      } else {\n        // Never allow reading a non-const value.\n        if (Info.getLangOpts().CPlusPlus) {\n          Info.FFDiag(E, Info.getLangOpts().CPlusPlus11 ? diag::note_constexpr_ltor_non_constexpr : diag::note_constexpr_ltor_non_integral, 1) << VD << BaseType;"},{n,8367,"bool LValueExprEvaluator::VisitVarDecl(const Expr *E, const VarDecl *VD) {\n  // ...\n  if (!Info.getLangOpts().CPlusPlus11) {\n    Info.CCEDiag(E, diag::note_constexpr_ltor_non_integral, 1) << VD << VD->getType();"}},
		[m]={
			["clang/test/SemaCXX/constant-expression.cpp"]={"clang/test/SemaCXX/constant-expression.cpp:103:5: note: read of variable \'p\' of non-integral, non-enumeration type \'const int &\' is not allowed in a constant expression"}
		}
	},
	["note_constexpr_mem_pointer_weak_comparison"]={
		[b]={{nil,x,"note_constexpr_mem_pointer_weak_comparison"}},
		[c]={{nil,x,"comparison against pointer to weak member %q0 can only be performed at runtime"}},
		[e]={{nil,x,"comparison against pointer to weak member A can only be performed at runtime"}},
		[g]=f,
		[h]="comparison against pointer to weak member (.*?) can only be performed at runtime",
		[i]=a,
		[j]={{nil,x,o}},
		[k]={nb,1662843785,jb,ob},
		[d]={{n,13224,"template <class SuccessCB, class AfterCB> static bool EvaluateComparisonBinaryOperator(EvalInfo &Info, const BinaryOperator *E, SuccessCB &&Success, AfterCB &&DoAfter) {\n  // ...\n  if (LHSTy->isMemberPointerType()) {\n    // ...\n    // If either operand is a pointer to a weak function, the comparison is not\n    // constant.\n    if (LHSValue.getDecl() && LHSValue.getDecl()->isWeak()) {\n      Info.FFDiag(E, diag::note_constexpr_mem_pointer_weak_comparison) << LHSValue.getDecl();"},{n,13229,"template <class SuccessCB, class AfterCB> static bool EvaluateComparisonBinaryOperator(EvalInfo &Info, const BinaryOperator *E, SuccessCB &&Success, AfterCB &&DoAfter) {\n  // ...\n  if (LHSTy->isMemberPointerType()) {\n    // ...\n    if (RHSValue.getDecl() && RHSValue.getDecl()->isWeak()) {\n      Info.FFDiag(E, diag::note_constexpr_mem_pointer_weak_comparison) << RHSValue.getDecl();"}},
		[m]={
			["clang/test/SemaCXX/attr-weak.cpp"]={"clang/test/SemaCXX/attr-weak.cpp:49:71: note: comparison against pointer to weak member \'WithWeakMember::weak_method\' can only be performed at runtime","clang/test/SemaCXX/attr-weak.cpp:56:87: note: comparison against pointer to weak member \'WithWeakMember::virtual_weak_method\' can only be performed at runtime"}
		}
	},
	["note_constexpr_memchr_unsupported"]={
		[b]={{nil,r,"note_constexpr_memchr_unsupported"}},
		[c]={{nil,r,"constant evaluation of %0 on array of type %1 is not supported; only arrays of narrow character types can be searched"}},
		[e]={{nil,r,"constant evaluation of A on array of type B is not supported; only arrays of narrow character types can be searched"}},
		[g]=f,
		[h]="constant evaluation of (.*?) on array of type (.*?) is not supported; only arrays of narrow character types can be searched",
		[i]=a,
		[j]={{nil,r,o}},
		[k]={ec,1579695612,pc,hc},
		[d]={{n,9346,"bool PointerExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E, unsigned BuiltinOp) {\n  // ...\n  case Builtin::BI__builtin_strchr:\n  case Builtin::BI__builtin_wcschr:\n  case Builtin::BI__builtin_memchr:\n  case Builtin::BI__builtin_char_memchr:\n  case Builtin::BI__builtin_wmemchr: {\n    // ...\n    // Give up on byte-oriented matching against multibyte elements.\n    // FIXME: We can compare the bytes in the correct order.\n    if (IsRawByte && !isOneByteCharacterType(CharTy)) {\n      Info.FFDiag(E, diag::note_constexpr_memchr_unsupported) << (\"\'\" + Info.Ctx.BuiltinInfo.getName(BuiltinOp) + \"\'\").str() << CharTy;"}},
		[m]={
			[gb]={"SemaCXX/constexpr-string.cpp:416:17: note: constant evaluation of \'__builtin_memchr\' on array of type \'E\' is not supported; only arrays of narrow character types can be searched","SemaCXX/constexpr-string.cpp:420:39: note: constant evaluation of \'__builtin_memchr\' on array of type \'const bool\' is not supported; only arrays of narrow character types can be searched","SemaCXX/constexpr-string.cpp:421:39: note: constant evaluation of \'__builtin_memchr\' on array of type \'const bool\' is not supported; only arrays of narrow character types can be searched","SemaCXX/constexpr-string.cpp:422:39: note: constant evaluation of \'__builtin_memchr\' on array of type \'const bool\' is not supported; only arrays of narrow character types can be searched","SemaCXX/constexpr-string.cpp:423:39: note: constant evaluation of \'__builtin_memchr\' on array of type \'const bool\' is not supported; only arrays of narrow character types can be searched"}
		}
	},
	["note_constexpr_memcmp_unsupported"]={
		[b]={{nil,r,"note_constexpr_memcmp_unsupported"}},
		[c]={{nil,r,"constant evaluation of %0 between arrays of types %1 and %2 is not supported; only arrays of narrow character types can be compared"}},
		[e]={{nil,r,"constant evaluation of A between arrays of types B and C is not supported; only arrays of narrow character types can be compared"}},
		[g]=f,
		[h]="constant evaluation of (.*?) between arrays of types (.*?) and (.*?) is not supported; only arrays of narrow character types can be compared",
		[i]=a,
		[j]={{nil,r,o}},
		[k]={ec,1579695612,pc,hc},
		[d]={{n,12366,"bool IntExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E, unsigned BuiltinOp) {\n  // ...\n  case Builtin::BI__builtin_strcmp:\n  case Builtin::BI__builtin_wcscmp:\n  case Builtin::BI__builtin_strncmp:\n  case Builtin::BI__builtin_wcsncmp:\n  case Builtin::BI__builtin_memcmp:\n  case Builtin::BI__builtin_bcmp:\n  case Builtin::BI__builtin_wmemcmp: {\n    // ...\n    // For memcmp, allow comparing any arrays of \'[[un]signed] char\' or\n    // \'char8_t\', but no other types.\n    if (IsRawByte && !(isOneByteCharacterType(CharTy1) && isOneByteCharacterType(CharTy2))) {\n      // ...\n      Info.FFDiag(E, diag::note_constexpr_memcmp_unsupported) << (\"\'\" + Info.Ctx.BuiltinInfo.getName(BuiltinOp) + \"\'\").str() << CharTy1 << CharTy2;"}},
		[m]={
			[gb]={"SemaCXX/constexpr-string.cpp:138:17: note: constant evaluation of \'__builtin_memcmp\' between arrays of types \'struct Incomplete\' and \'const char\' is not supported; only arrays of narrow character types can be compared","SemaCXX/constexpr-string.cpp:139:17: note: constant evaluation of \'__builtin_memcmp\' between arrays of types \'const char\' and \'struct Incomplete\' is not supported; only arrays of narrow character types can be compared","SemaCXX/constexpr-string.cpp:143:17: note: constant evaluation of \'__builtin_bcmp\' between arrays of types \'struct Incomplete\' and \'const char\' is not supported; only arrays of narrow character types can be compared","SemaCXX/constexpr-string.cpp:144:17: note: constant evaluation of \'__builtin_bcmp\' between arrays of types \'const char\' and \'struct Incomplete\' is not supported; only arrays of narrow character types can be compared","SemaCXX/constexpr-string.cpp:172:39: note: constant evaluation of \'__builtin_memcmp\' between arrays of types \'const signed char\' and \'const bool\' is not supported; only arrays of narrow character types can be compared","SemaCXX/constexpr-string.cpp:173:39: note: constant evaluation of \'__builtin_memcmp\' between arrays of types \'const signed char\' and \'const bool\' is not supported; only arrays of narrow character types can be compared","SemaCXX/constexpr-string.cpp:175:39: note: constant evaluation of \'__builtin_bcmp\' between arrays of types \'const signed char\' and \'const bool\' is not supported; only arrays of narrow character types can be compared","SemaCXX/constexpr-string.cpp:176:39: note: constant evaluation of \'__builtin_bcmp\' between arrays of types \'const signed char\' and \'const bool\' is not supported; only arrays of narrow character types can be compared","SemaCXX/constexpr-string.cpp:190:17: note: constant evaluation of \'__builtin_memcmp\' between arrays of types \'const long\' and \'const unsigned int\' is not supported; only arrays of narrow character types can be compared","SemaCXX/constexpr-string.cpp:191:17: note: constant evaluation of \'__builtin_memcmp\' between arrays of types \'const long\' and \'const unsigned int\' is not supported; only arrays of narrow character types can be compared","SemaCXX/constexpr-string.cpp:192:17: note: constant evaluation of \'__builtin_memcmp\' between arrays of types \'const long\' and \'const unsigned int\' is not supported; only arrays of narrow character types can be compared","SemaCXX/constexpr-string.cpp:193:17: note: constant evaluation of \'__builtin_memcmp\' between arrays of types \'const long\' and \'const unsigned int\' is not supported; only arrays of narrow character types can be compared","SemaCXX/constexpr-string.cpp:194:17: note: constant evaluation of \'__builtin_memcmp\' between arrays of types \'const long\' and \'const unsigned int\' is not supported; only arrays of narrow character types can be compared","SemaCXX/constexpr-string.cpp:195:17: note: constant evaluation of \'__builtin_memcmp\' between arrays of types \'const long\' and \'const unsigned int\' is not supported; only arrays of narrow character types can be compared","SemaCXX/constexpr-string.cpp:196:17: note: constant evaluation of \'__builtin_memcmp\' between arrays of types \'const long\' and \'const unsigned int\' is not supported; only arrays of narrow character types can be compared","SemaCXX/constexpr-string.cpp:197:17: note: constant evaluation of \'__builtin_memcmp\' between arrays of types \'const long\' and \'const unsigned int\' is not supported; only arrays of narrow character types can be compared","SemaCXX/constexpr-string.cpp:198:17: note: constant evaluation of \'__builtin_memcmp\' between arrays of types \'const long\' and \'const unsigned int\' is not supported; only arrays of narrow character types can be compared","SemaCXX/constexpr-string.cpp:200:17: note: constant evaluation of \'__builtin_bcmp\' between arrays of types \'const long\' and \'const unsigned int\' is not supported; only arrays of narrow character types can be compared","SemaCXX/constexpr-string.cpp:201:17: note: constant evaluation of \'__builtin_bcmp\' between arrays of types \'const long\' and \'const unsigned int\' is not supported; only arrays of narrow character types can be compared","SemaCXX/constexpr-string.cpp:202:17: note: constant evaluation of \'__builtin_bcmp\' between arrays of types \'const long\' and \'const unsigned int\' is not supported; only arrays of narrow character types can be compared","SemaCXX/constexpr-string.cpp:203:17: note: constant evaluation of \'__builtin_bcmp\' between arrays of types \'const long\' and \'const unsigned int\' is not supported; only arrays of narrow character types can be compared","SemaCXX/constexpr-string.cpp:204:17: note: constant evaluation of \'__builtin_bcmp\' between arrays of types \'const long\' and \'const unsigned int\' is not supported; only arrays of narrow character types can be compared","SemaCXX/constexpr-string.cpp:205:17: note: constant evaluation of \'__builtin_bcmp\' between arrays of types \'const long\' and \'const unsigned int\' is not supported; only arrays of narrow character types can be compared","SemaCXX/constexpr-string.cpp:206:17: note: constant evaluation of \'__builtin_bcmp\' between arrays of types \'const long\' and \'const unsigned int\' is not supported; only arrays of narrow character types can be compared","SemaCXX/constexpr-string.cpp:207:17: note: constant evaluation of \'__builtin_bcmp\' between arrays of types \'const long\' and \'const unsigned int\' is not supported; only arrays of narrow character types can be compared","SemaCXX/constexpr-string.cpp:208:17: note: constant evaluation of \'__builtin_bcmp\' between arrays of types \'const long\' and \'const unsigned int\' is not supported; only arrays of narrow character types can be compared"}
		}
	},
	["note_constexpr_memcpy_incomplete_type"]={
		[b]={{nil,s,"note_constexpr_memcpy_incomplete_type"}},
		[c]={{nil,s,"cannot constant evaluate \'%select{memcpy|memmove}0\' between objects of incomplete type %1"}},
		[e]={{nil,s,{"cannot constant evaluate \'",{Wb,kc},"\' between objects of incomplete type B"}}},
		[g]=f,
		[h]="cannot constant evaluate \'(?:memcpy|memmove)\' between objects of incomplete type (.*?)",
		[i]=a,
		[j]={{nil,s,o}},
		[k]={"ed083f2c1f56",1538645144,"[constexpr] Fix ICE when memcpy() is given a pointer to an incomplete array","[constexpr] Fix ICE when memcpy() is given a pointer to an incomplete array\n\nFix code for constant evaluation of __builtin_memcpy() and\n__builtin_memmove() that would attempt to divide by zero when given two\npointers to an incomplete array.\n\nDifferential Revision: https://reviews.llvm.org/D51855\n\nllvm-svn: 343761"},
		[d]={{n,9471,"bool PointerExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E, unsigned BuiltinOp) {\n  // ...\n  case Builtin::BI__builtin_memcpy:\n  case Builtin::BI__builtin_memmove:\n  case Builtin::BI__builtin_wmemcpy:\n  case Builtin::BI__builtin_wmemmove: {\n    // ...\n    if (T->isIncompleteType()) {\n      Info.FFDiag(E, diag::note_constexpr_memcpy_incomplete_type) << Move << T;"}},
		[m]={
			[gb]={"SemaCXX/constexpr-string.cpp:663:5: note: cannot constant evaluate \'memmove\' between objects of incomplete type \'int[]\'","SemaCXX/constexpr-string.cpp:663:5: note: cannot constant evaluate \'memmove\' between objects of incomplete type \'int[]\'","SemaCXX/constexpr-string.cpp:673:5: note: cannot constant evaluate \'memcpy\' between objects of incomplete type \'Incomplete\'","SemaCXX/constexpr-string.cpp:673:5: note: cannot constant evaluate \'memcpy\' between objects of incomplete type \'Incomplete\'"}
		}
	},
	["note_constexpr_memcpy_nontrivial"]={
		[b]={{nil,s,"note_constexpr_memcpy_nontrivial"}},
		[c]={{nil,s,"cannot constant evaluate \'%select{memcpy|memmove}0\' between objects of non-trivially-copyable type %1"}},
		[e]={{nil,s,{"cannot constant evaluate \'",{Wb,kc},"\' between objects of non-trivially-copyable type B"}}},
		[g]=f,
		[h]="cannot constant evaluate \'(?:memcpy|memmove)\' between objects of non\\-trivially\\-copyable type (.*?)",
		[i]=a,
		[j]={{nil,s,o}},
		[k]={"96beffba15bc",1533080109,"[constexpr] Support for constant evaluation of __builtin_memcpy and","[constexpr] Support for constant evaluation of __builtin_memcpy and\n__builtin_memmove (in non-type-punning cases).\n\nThis is intended to permit libc++ to make std::copy etc constexpr\nwithout sacrificing the optimization that uses memcpy on\ntrivially-copyable types.\n\n__builtin_strcpy and __builtin_wcscpy are not handled by this change.\nThey\'d be straightforward to add, but we haven\'t encountered a need for\nthem just yet.\n\nllvm-svn: 338455"},
		[d]={{n,9475,"bool PointerExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E, unsigned BuiltinOp) {\n  // ...\n  case Builtin::BI__builtin_memcpy:\n  case Builtin::BI__builtin_memmove:\n  case Builtin::BI__builtin_wmemcpy:\n  case Builtin::BI__builtin_wmemmove: {\n    // ...\n    if (!T.isTriviallyCopyableType(Info.Ctx)) {\n      Info.FFDiag(E, diag::note_constexpr_memcpy_nontrivial) << Move << T;"}},
		[m]={
			[gb]={"SemaCXX/constexpr-string.cpp:606:5: note: cannot constant evaluate \'memcpy\' between objects of non-trivially-copyable type \'NonTrivial\'","SemaCXX/constexpr-string.cpp:606:5: note: cannot constant evaluate \'memcpy\' between objects of non-trivially-copyable type \'NonTrivial\'","SemaCXX/constexpr-string.cpp:612:5: note: cannot constant evaluate \'memcpy\' between objects of non-trivially-copyable type \'NonTrivial\'","SemaCXX/constexpr-string.cpp:612:5: note: cannot constant evaluate \'memcpy\' between objects of non-trivially-copyable type \'NonTrivial\'"}
		}
	},
	["note_constexpr_memcpy_null"]={
		[b]={{nil,s,"note_constexpr_memcpy_null"}},
		[c]={{nil,s,"%select{source|destination}2 of \'%select{%select{memcpy|wmemcpy}1|%select{memmove|wmemmove}1}0\' is %3"}},
		[e]={{nil,s,{{d,"destination"}," of \'",{{{Wb,"wmemcpy"}},{{kc,"wmemmove"}}},"\' is D"}}},
		[g]=f,
		[h]="(?:source|destination) of \'(?:(?:memcpy|wmemcpy)|(?:memmove|wmemmove))\' is (.*?)",
		[i]=a,
		[j]={{nil,s,o}},
		[k]={"128719c4fe7c",1536878853,"Fix crash on call to __builtin_memcpy with a null pointer to an","Fix crash on call to __builtin_memcpy with a null pointer to an\nincomplete type.\n\nAlso improve the diagnostics for similar situations.\n\nllvm-svn: 342192"},
		[d]={{n,9452,"bool PointerExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E, unsigned BuiltinOp) {\n  // ...\n  case Builtin::BI__builtin_memcpy:\n  case Builtin::BI__builtin_memmove:\n  case Builtin::BI__builtin_wmemcpy:\n  case Builtin::BI__builtin_wmemmove: {\n    // ...\n    // Otherwise, if either of the operands is null, we can\'t proceed. Don\'t\n    // try to determine the type of the copied objects, because there aren\'t\n    // any.\n    if (!Src.Base || !Dest.Base) {\n      // ...\n      Info.FFDiag(E, diag::note_constexpr_memcpy_null) << Move << WChar << !!Src.Base << Val.getAsString(Info.Ctx, E->getArg(0)->getType());"}},
		[m]={
			[gb]={"SemaCXX/constexpr-string.cpp:575:17: note: source of \'memcpy\' is nullptr","SemaCXX/constexpr-string.cpp:576:17: note: source of \'memmove\' is nullptr","SemaCXX/constexpr-string.cpp:577:17: note: source of \'wmemcpy\' is nullptr","SemaCXX/constexpr-string.cpp:578:17: note: source of \'wmemmove\' is nullptr","SemaCXX/constexpr-string.cpp:579:17: note: destination of \'memcpy\' is nullptr","SemaCXX/constexpr-string.cpp:580:17: note: destination of \'memmove\' is nullptr","SemaCXX/constexpr-string.cpp:581:17: note: destination of \'wmemcpy\' is nullptr","SemaCXX/constexpr-string.cpp:582:17: note: destination of \'wmemmove\' is nullptr","SemaCXX/constexpr-string.cpp:583:17: note: source of \'memcpy\' is (void *)123","SemaCXX/constexpr-string.cpp:584:17: note: destination of \'memcpy\' is (void *)123","SemaCXX/constexpr-string.cpp:586:17: note: source of \'memcpy\' is nullptr"}
		}
	},
	["note_constexpr_memcpy_overlap"]={
		[b]={{nil,s,"note_constexpr_memcpy_overlap"}},
		[c]={{nil,s,"\'%select{memcpy|wmemcpy}0\' between overlapping memory regions"}},
		[e]={{nil,s,{"\'",{Wb,"wmemcpy"},"\' between overlapping memory regions"}}},
		[g]=f,
		[h]="\'(?:memcpy|wmemcpy)\' between overlapping memory regions",
		[i]=a,
		[j]={{nil,s,o}},
		[k]={"96beffba15bc",1533080109,"[constexpr] Support for constant evaluation of __builtin_memcpy and","[constexpr] Support for constant evaluation of __builtin_memcpy and\n__builtin_memmove (in non-type-punning cases).\n\nThis is intended to permit libc++ to make std::copy etc constexpr\nwithout sacrificing the optimization that uses memcpy on\ntrivially-copyable types.\n\n__builtin_strcpy and __builtin_wcscpy are not handled by this change.\nThey\'d be straightforward to add, but we haven\'t encountered a need for\nthem just yet.\n\nllvm-svn: 338455"},
		[d]={{n,9515,"bool PointerExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E, unsigned BuiltinOp) {\n  // ...\n  case Builtin::BI__builtin_memcpy:\n  case Builtin::BI__builtin_memmove:\n  case Builtin::BI__builtin_wmemcpy:\n  case Builtin::BI__builtin_wmemmove: {\n    // ...\n    if (HasSameBase(Src, Dest)) {\n      // ...\n      if (DestOffset >= SrcOffset && DestOffset - SrcOffset < NBytes) {\n        // Dest is inside the source region.\n        if (!Move) {\n          Info.FFDiag(E, diag::note_constexpr_memcpy_overlap) << WChar;"},{n,9526,"bool PointerExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E, unsigned BuiltinOp) {\n  // ...\n  case Builtin::BI__builtin_memcpy:\n  case Builtin::BI__builtin_memmove:\n  case Builtin::BI__builtin_wmemcpy:\n  case Builtin::BI__builtin_wmemmove: {\n    // ...\n    if (HasSameBase(Src, Dest)) {\n      // ...\n      if (DestOffset >= SrcOffset && DestOffset - SrcOffset < NBytes) {\n      // ...\n      } else if (!Move && SrcOffset >= DestOffset && SrcOffset - DestOffset < NBytes) {\n        // ...\n        Info.FFDiag(E, diag::note_constexpr_memcpy_overlap) << WChar;"}},
		[m]={
			[gb]={"SemaCXX/constexpr-string.cpp:504:5: note: \'memcpy\' between overlapping memory regions","SemaCXX/constexpr-string.cpp:504:5: note: \'memcpy\' between overlapping memory regions","SemaCXX/constexpr-string.cpp:521:5: note: \'wmemcpy\' between overlapping memory regions","SemaCXX/constexpr-string.cpp:521:5: note: \'wmemcpy\' between overlapping memory regions"}
		}
	},
	["note_constexpr_memcpy_type_pun"]={
		[b]={{nil,s,"note_constexpr_memcpy_type_pun"}},
		[c]={{nil,s,"cannot constant evaluate \'%select{memcpy|memmove}0\' from object of type %1 to object of type %2"}},
		[e]={{nil,s,{"cannot constant evaluate \'",{Wb,kc},"\' from object of type B to object of type C"}}},
		[g]=f,
		[h]="cannot constant evaluate \'(?:memcpy|memmove)\' from object of type (.*?) to object of type (.*?)",
		[i]=a,
		[j]={{nil,s,o}},
		[k]={"96beffba15bc",1533080109,"[constexpr] Support for constant evaluation of __builtin_memcpy and","[constexpr] Support for constant evaluation of __builtin_memcpy and\n__builtin_memmove (in non-type-punning cases).\n\nThis is intended to permit libc++ to make std::copy etc constexpr\nwithout sacrificing the optimization that uses memcpy on\ntrivially-copyable types.\n\n__builtin_strcpy and __builtin_wcscpy are not handled by this change.\nThey\'d be straightforward to add, but we haven\'t encountered a need for\nthem just yet.\n\nllvm-svn: 338455"},
		[d]={{n,9467,"bool PointerExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E, unsigned BuiltinOp) {\n  // ...\n  case Builtin::BI__builtin_memcpy:\n  case Builtin::BI__builtin_memmove:\n  case Builtin::BI__builtin_wmemcpy:\n  case Builtin::BI__builtin_wmemmove: {\n    // ...\n    if (!Info.Ctx.hasSameUnqualifiedType(T, SrcT)) {\n      // ...\n      Info.FFDiag(E, diag::note_constexpr_memcpy_type_pun) << Move << SrcT << T;"}},
		[m]={
			[gb]={"SemaCXX/constexpr-string.cpp:620:5: note: cannot constant evaluate \'memcpy\' from object of type \'const unsigned int\' to object of type \'float\'"}
		}
	},
	["note_constexpr_memcpy_unsupported"]={
		[b]={{nil,s,"note_constexpr_memcpy_unsupported"}},
		[c]={{nil,s,"\'%select{%select{memcpy|wmemcpy}1|%select{memmove|wmemmove}1}0\' not supported: %select{size to copy (%4) is not a multiple of size of element type %3 (%5)|source is not a contiguous array of at least %4 elements of type %3|destination is not a contiguous array of at least %4 elements of type %3}2"}},
		[e]={{nil,s,{"\'",{{{Wb,"wmemcpy"}},{{kc,"wmemmove"}}},"\' not supported: ",{"size to copy (E) is not a multiple of size of element type D (F)","source is not a contiguous array of at least E elements of type D","destination is not a contiguous array of at least E elements of type D"}}}},
		[g]=f,
		[h]="\'(?:(?:memcpy|wmemcpy)|(?:memmove|wmemmove))\' not supported\\: (?:size to copy \\((.*?)\\) is not a multiple of size of element type (.*?) \\((.*?)\\)|source is not a contiguous array of at least (.*?) elements of type (.*?)|destination is not a contiguous array of at least (.*?) elements of type (.*?))",
		[i]=a,
		[j]={{nil,s,o}},
		[k]={"96beffba15bc",1533080109,"[constexpr] Support for constant evaluation of __builtin_memcpy and","[constexpr] Support for constant evaluation of __builtin_memcpy and\n__builtin_memmove (in non-type-punning cases).\n\nThis is intended to permit libc++ to make std::copy etc constexpr\nwithout sacrificing the optimization that uses memcpy on\ntrivially-copyable types.\n\n__builtin_strcpy and __builtin_wcscpy are not handled by this change.\nThey\'d be straightforward to add, but we haven\'t encountered a need for\nthem just yet.\n\nllvm-svn: 338455"},
		[d]={{n,9486,"bool PointerExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E, unsigned BuiltinOp) {\n  // ...\n  case Builtin::BI__builtin_memcpy:\n  case Builtin::BI__builtin_memmove:\n  case Builtin::BI__builtin_wmemcpy:\n  case Builtin::BI__builtin_wmemmove: {\n    // ...\n    if (!WChar) {\n      // ...\n      if (Remainder) {\n        Info.FFDiag(E, diag::note_constexpr_memcpy_unsupported) << Move << WChar << 0 << T << toString(OrigN, 10, /*Signed*/ false) << (unsigned)TSize;"},{n,9499,"bool PointerExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E, unsigned BuiltinOp) {\n  // ...\n  case Builtin::BI__builtin_memcpy:\n  case Builtin::BI__builtin_memmove:\n  case Builtin::BI__builtin_wmemcpy:\n  case Builtin::BI__builtin_wmemmove: {\n    // ...\n    if (N.ugt(RemainingSrcSize) || N.ugt(RemainingDestSize)) {\n      Info.FFDiag(E, diag::note_constexpr_memcpy_unsupported) << Move << WChar << (N.ugt(RemainingSrcSize) ? 1 : 2) << T << toString(N, 10, /*Signed*/ false);"}},
		[m]={
			[gb]={"SemaCXX/constexpr-string.cpp:504:5: note: \'memcpy\' not supported: size to copy (1) is not a multiple of size of element type \'int\' (4)","SemaCXX/constexpr-string.cpp:504:5: note: \'memcpy\' not supported: source is not a contiguous array of at least 2 elements of type \'int\'","SemaCXX/constexpr-string.cpp:504:5: note: \'memcpy\' not supported: destination is not a contiguous array of at least 3 elements of type \'int\'","SemaCXX/constexpr-string.cpp:513:5: note: \'memmove\' not supported: size to copy (1) is not a multiple of size of element type \'int\' (4)","SemaCXX/constexpr-string.cpp:513:5: note: \'memmove\' not supported: source is not a contiguous array of at least 2 elements of type \'int\'","SemaCXX/constexpr-string.cpp:513:5: note: \'memmove\' not supported: destination is not a contiguous array of at least 3 elements of type \'int\'","SemaCXX/constexpr-string.cpp:521:5: note: \'wmemcpy\' not supported: source is not a contiguous array of at least 2 elements of type \'wchar_t\' (aka \'unsigned int\')","SemaCXX/constexpr-string.cpp:521:5: note: \'wmemcpy\' not supported: destination is not a contiguous array of at least 3 elements of type \'wchar_t\' (aka \'unsigned int\')","SemaCXX/constexpr-string.cpp:529:5: note: \'wmemmove\' not supported: source is not a contiguous array of at least 2 elements of type \'wchar_t\' (aka \'unsigned int\')","SemaCXX/constexpr-string.cpp:529:5: note: \'wmemmove\' not supported: destination is not a contiguous array of at least 3 elements of type \'wchar_t\' (aka \'unsigned int\')","SemaCXX/constexpr-string.cpp:632:5: note: \'memcpy\' not supported: source is not a contiguous array of at least 2 elements of type \'MemcpyEtc::Base\'","SemaCXX/constexpr-string.cpp:654:5: note: \'memmove\' not supported: source is not a contiguous array of at least 4 elements of type \'int\'","SemaCXX/constexpr-string.cpp:654:5: note: \'memmove\' not supported: source is not a contiguous array of at least 4 elements of type \'int\'"}
		}
	},
	["note_constexpr_memory_leak"]={
		[b]={{nil,l,"note_constexpr_memory_leak"}},
		[c]={{nil,l,"allocation performed here was not deallocated%plural{0:|: (along with %0 other memory leak%s0)}0"}},
		[e]={{nil,l,{"allocation performed here was not deallocated",{a," (along with A other memory leakA)"}}}},
		[g]=f,
		[h]="allocation performed here was not deallocated(?:| \\(along with (.*?) other memory leak(.*?)\\))",
		[i]=a,
		[j]={{nil,l,o}},
		[k]={O,1569547607,P,N},
		[d]={{n,2502,"/// Enforce C++2a [expr.const]/4.17, which disallows new-expressions unless\n/// \"the allocated storage is deallocated within the evaluation\".\nstatic bool CheckMemoryLeaks(EvalInfo &Info) {\n  if (!Info.HeapAllocs.empty()) {\n    // ...\n    Info.CCEDiag(Info.HeapAllocs.begin()->second.AllocExpr, diag::note_constexpr_memory_leak) << unsigned(Info.HeapAllocs.size() - 1);"}},
		[m]={
			["clang/test/SemaCXX/static-assert-cxx26.cpp"]={"clang/test/SemaCXX/static-assert-cxx26.cpp:121:16: note: allocation performed here was not deallocated"}
		}
	},
	["note_constexpr_modify_const_type"]={
		[b]="note_constexpr_modify_const_type",
		[c]="modification of object of const-qualified type %0 is not allowed in a constant expression",
		[e]="modification of object of const-qualified type A is not allowed in a constant expression",
		[g]=f,
		[h]="modification of object of const\\-qualified type (.*?) is not allowed in a constant expression",
		[i]=a,
		[j]=o,
		[k]={mb,1366986990,lb,kb},
		[d]={{n,3896,"struct ModifySubobjectHandler {\n  // ...\n  bool checkConst(QualType QT) {\n    // Assigning to a const object has undefined behavior.\n    if (QT.isConstQualified()) {\n      Info.FFDiag(E, diag::note_constexpr_modify_const_type) << QT;"},{n,4385,"struct CompoundAssignSubobjectHandler {\n  // ...\n  bool checkConst(QualType QT) {\n    // Assigning to a const object has undefined behavior.\n    if (QT.isConstQualified()) {\n      Info.FFDiag(E, diag::note_constexpr_modify_const_type) << QT;"},{n,4527,"struct IncDecSubobjectHandler {\n  // ...\n  bool checkConst(QualType QT) {\n    // Assigning to a const object has undefined behavior.\n    if (QT.isConstQualified()) {\n      Info.FFDiag(E, diag::note_constexpr_modify_const_type) << QT;"},{y,219,"bool CheckConst(InterpState &S, CodePtr OpPC, const Pointer &Ptr) {\n  // ...\n  S.FFDiag(Loc, diag::note_constexpr_modify_const_type) << Ty;"}},
		[m]={
			["clang/test/SemaCXX/constant-expression-cxx14.cpp"]={"clang/test/SemaCXX/constant-expression-cxx14.cpp:257:43: note: modification of object of const-qualified type \'const int\' is not allowed in a constant expression","clang/test/SemaCXX/constant-expression-cxx14.cpp:257:43: note: modification of object of const-qualified type \'const int\' is not allowed in a constant expression","clang/test/SemaCXX/constant-expression-cxx14.cpp:1212:30: note: modification of object of const-qualified type \'const int\' is not allowed in a constant expression"}
		}
	},
	["note_constexpr_modify_global"]={
		[b]="note_constexpr_modify_global",
		[c]="a constant expression cannot modify an object that is visible outside that expression",
		[e]="a constant expression cannot modify an object that is visible outside that expression",
		[g]=f,
		[h]="a constant expression cannot modify an object that is visible outside that expression",
		[i]=a,
		[j]=o,
		[k]={mb,1366986990,lb,kb},
		[d]={{n,4055,"/// Find the complete object to which an LValue refers.\nstatic CompleteObject findCompleteObject(EvalInfo &Info, const Expr *E, AccessKinds AK, const LValue &LVal, QualType LValType) {\n  // ...\n  if (Info.getLangOpts().CPlusPlus14 && LVal.Base == Info.EvaluatingDecl && lifetimeStartedInEvaluation(Info, LVal.Base)) {\n  // ...\n  } else if (const ValueDecl *D = LVal.Base.dyn_cast<const ValueDecl *>()) {\n    // Allow reading from a GUID declaration.\n    if (auto *GD = dyn_cast<MSGuidDecl>(D)) {\n      if (isModification(AK)) {\n        // ...\n        Info.FFDiag(E, diag::note_constexpr_modify_global);"},{n,4070,"/// Find the complete object to which an LValue refers.\nstatic CompleteObject findCompleteObject(EvalInfo &Info, const Expr *E, AccessKinds AK, const LValue &LVal, QualType LValType) {\n  // ...\n  if (Info.getLangOpts().CPlusPlus14 && LVal.Base == Info.EvaluatingDecl && lifetimeStartedInEvaluation(Info, LVal.Base)) {\n  // ...\n  } else if (const ValueDecl *D = LVal.Base.dyn_cast<const ValueDecl *>()) {\n    // ...\n    // Allow reading the APValue from an UnnamedGlobalConstantDecl.\n    if (auto *GCD = dyn_cast<UnnamedGlobalConstantDecl>(D)) {\n      if (isModification(AK)) {\n        Info.FFDiag(E, diag::note_constexpr_modify_global);"},{n,4080,"/// Find the complete object to which an LValue refers.\nstatic CompleteObject findCompleteObject(EvalInfo &Info, const Expr *E, AccessKinds AK, const LValue &LVal, QualType LValType) {\n  // ...\n  if (Info.getLangOpts().CPlusPlus14 && LVal.Base == Info.EvaluatingDecl && lifetimeStartedInEvaluation(Info, LVal.Base)) {\n  // ...\n  } else if (const ValueDecl *D = LVal.Base.dyn_cast<const ValueDecl *>()) {\n    // ...\n    // Allow reading from template parameter objects.\n    if (auto *TPO = dyn_cast<TemplateParamObjectDecl>(D)) {\n      if (isModification(AK)) {\n        Info.FFDiag(E, diag::note_constexpr_modify_global);"},{n,4120,"/// Find the complete object to which an LValue refers.\nstatic CompleteObject findCompleteObject(EvalInfo &Info, const Expr *E, AccessKinds AK, const LValue &LVal, QualType LValType) {\n  // ...\n  if (Info.getLangOpts().CPlusPlus14 && LVal.Base == Info.EvaluatingDecl && lifetimeStartedInEvaluation(Info, LVal.Base)) {\n  // ...\n  } else if (const ValueDecl *D = LVal.Base.dyn_cast<const ValueDecl *>()) {\n    // ...\n    // Unless we\'re looking at a local variable or argument in a constexpr call,\n    // the variable we\'re reading must be const.\n    if (!Frame) {\n      if (IsAccess && isa<ParmVarDecl>(VD)) {\n      // ...\n      } else if (Info.getLangOpts().CPlusPlus14 && lifetimeStartedInEvaluation(Info, LVal.Base)) {\n      // ...\n      } else if (isModification(AK)) {\n        // ...\n        Info.FFDiag(E, diag::note_constexpr_modify_global);"},{y,117,"static bool CheckGlobal(InterpState &S, CodePtr OpPC, const Pointer &Ptr) {\n  if (auto ID = Ptr.getDeclID()) {\n    // ...\n    S.FFDiag(S.Current->getLocation(OpPC), diag::note_constexpr_modify_global);"}},
		[m]={
			[T]={"clang/test/CXX/expr/expr.const/p2-0x.cpp:447:14: note: a constant expression cannot modify an object that is visible outside that expression","clang/test/CXX/expr/expr.const/p2-0x.cpp:472:13: note: a constant expression cannot modify an object that is visible outside that expression","clang/test/CXX/expr/expr.const/p2-0x.cpp:473:13: note: a constant expression cannot modify an object that is visible outside that expression","clang/test/CXX/expr/expr.const/p2-0x.cpp:592:16: note: a constant expression cannot modify an object that is visible outside that expression","clang/test/CXX/expr/expr.const/p2-0x.cpp:593:16: note: a constant expression cannot modify an object that is visible outside that expression"}
		}
	},
	["note_constexpr_negative_shift"]={
		[b]="note_constexpr_negative_shift",
		[c]="negative shift count %0",
		[e]="negative shift count A",
		[g]=f,
		[h]="negative shift count (.*?)",
		[i]=a,
		[j]=o,
		[k]={"fe800031ec14",1327982900,"constexpr: catch a collection of integral undefined behaviors:","constexpr: catch a collection of integral undefined behaviors:\n  -INT_MIN and INT_MIN / -1\n  Shift by a negative or too large quantity\n  Left shift of negative value\n  Overflow in left shift\n\nllvm-svn: 149344"},
		[d]={{n,2825,"/// Perform the given binary integer operation.\nstatic bool handleIntIntBinOp(EvalInfo &Info, const Expr *E, const APSInt &LHS, BinaryOperatorKind Opcode, APSInt RHS, APSInt &Result) {\n  // ...\n  case BO_Shl: {\n    if (Info.getLangOpts().OpenCL)\n    // ...\n    else if (RHS.isSigned() && RHS.isNegative()) {\n      // ...\n      Info.CCEDiag(E, diag::note_constexpr_negative_shift) << RHS;"},{n,2858,"/// Perform the given binary integer operation.\nstatic bool handleIntIntBinOp(EvalInfo &Info, const Expr *E, const APSInt &LHS, BinaryOperatorKind Opcode, APSInt RHS, APSInt &Result) {\n  // ...\n  case BO_Shr: {\n    if (Info.getLangOpts().OpenCL)\n    // ...\n    else if (RHS.isSigned() && RHS.isNegative()) {\n      // ...\n      Info.CCEDiag(E, diag::note_constexpr_negative_shift) << RHS;"},{n,14044,"bool FixedPointExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {\n  // ...\n  case BO_Shl:\n  case BO_Shr: {\n    // ...\n    // Embedded-C 4.1.6.2.2:\n    //   The right operand must be nonnegative and less than the total number\n    //   of (nonpadding) bits of the fixed-point operand ...\n    if (RHSVal.isNegative())\n      Info.CCEDiag(E, diag::note_constexpr_negative_shift) << RHSVal;"}},
		[m]={
			[T]={"clang/test/CXX/expr/expr.const/p2-0x.cpp:155:28: note: negative shift count -1","clang/test/CXX/expr/expr.const/p2-0x.cpp:171:28: note: negative shift count -1"}
		}
	},
	["note_constexpr_new"]={
		[b]={{nil,l,"note_constexpr_new"}},
		[c]={{nil,l,"dynamic memory allocation is not permitted in constant expressions until C++20"}},
		[e]={{nil,l,"dynamic memory allocation is not permitted in constant expressions until C++20"}},
		[g]=f,
		[h]="dynamic memory allocation is not permitted in constant expressions until C\\+\\+20",
		[i]=a,
		[j]={{nil,l,o}},
		[k]={O,1569547607,P,N},
		[d]={{n,6716,"/// Perform a call to \'perator new\' or to `__builtin_operator_new\'.\nstatic bool HandleOperatorNewCall(EvalInfo &Info, const CallExpr *E, LValue &Result) {\n  // ...\n  if (!Caller) {\n    Info.FFDiag(E->getExprLoc(), Info.getLangOpts().CPlusPlus20 ? diag::note_constexpr_new_untyped : diag::note_constexpr_new);"},{n,9563,"bool PointerExprEvaluator::VisitCXXNewExpr(const CXXNewExpr *E) {\n  if (!Info.getLangOpts().CPlusPlus20)\n    Info.CCEDiag(E, diag::note_constexpr_new);"},{n,15015,"bool VoidExprEvaluator::VisitCXXDeleteExpr(const CXXDeleteExpr *E) {\n  // ...\n  // Deleting a null pointer has no effect.\n  if (Pointer.isNullPointer()) {\n    // This is the only case where we need to produce an extension warning:\n    // the only other way we can succeed is if we find a dynamic allocation,\n    // and we will have warned when we allocated it in that case.\n    if (!Info.getLangOpts().CPlusPlus20)\n      Info.CCEDiag(E, diag::note_constexpr_new);"}},
		[m]={
			["clang/test/SemaCXX/builtin-object-size-cxx14.cpp"]={"clang/test/SemaCXX/builtin-object-size-cxx14.cpp:119:13: note: dynamic memory allocation is not permitted in constant expressions until C++20"}
		}
	},
	["note_constexpr_new_delete_mismatch"]={
		[b]={{nil,l,"note_constexpr_new_delete_mismatch"}},
		[c]={{nil,l,"%plural{2:\'delete\' used to delete pointer to object allocated with \'std::allocator<...>::allocate\'|:%select{non-array delete|array delete|\'std::allocator<...>::deallocate\'}0 used to delete pointer to %select{array object of type %2|non-array object of type %2|object allocated with \'new\'}0}1"}},
		[e]={{nil,l,{{"\'delete\' used to delete pointer to object allocated with \'std::allocator<...>::allocate\'",{{"non-array delete","array delete","\'std::allocator<...>::deallocate\'"}," used to delete pointer to ",{"array object of type C","non-array object of type C","object allocated with \'new\'"}}}}}},
		[g]=f,
		[h]="(?:\'delete\' used to delete pointer to object allocated with \'std\\:\\:allocator\\<\\.\\.\\.\\>\\:\\:allocate\'|(?:non\\-array delete|array delete|\'std\\:\\:allocator\\<\\.\\.\\.\\>\\:\\:deallocate\') used to delete pointer to (?:array object of type (.*?)|non\\-array object of type (.*?)|object allocated with \'new\'))",
		[i]=a,
		[j]={{nil,l,o}},
		[k]={O,1569547607,P,N},
		[d]={{n,6811,"/// Check that the given object is a suitable pointer to a heap allocation that\n/// still exists and is of the right kind for the purpose of a deletion.\n///\n/// On success, returns the heap allocation to deallocate. On failure, produces\n/// a diagnostic and returns std::nullopt.\nstatic std::optional<DynAlloc *> CheckDeleteKind(EvalInfo &Info, const Expr *E, const LValue &Pointer, DynAlloc::Kind DeallocKind) {\n  // ...\n  if (DeallocKind != (*Alloc)->getKind()) {\n    Info.FFDiag(E, diag::note_constexpr_new_delete_mismatch) << DeallocKind << (*Alloc)->getKind() << AllocType;"}},
		[m]={
			[db]={"clang/test/SemaCXX/cxx2a-constexpr-dynalloc.cpp:20:7: note: \'std::allocator<...>::deallocate\' used to delete pointer to object allocated with \'new\'","clang/test/SemaCXX/cxx2a-constexpr-dynalloc.cpp:20:7: note: \'std::allocator<...>::deallocate\' used to delete pointer to object allocated with \'new\'","clang/test/SemaCXX/cxx2a-constexpr-dynalloc.cpp:66:5: note: \'delete\' used to delete pointer to object allocated with \'std::allocator<...>::allocate\'","clang/test/SemaCXX/cxx2a-constexpr-dynalloc.cpp:69:5: note: \'delete\' used to delete pointer to object allocated with \'std::allocator<...>::allocate\'"}
		}
	},
	["note_constexpr_new_negative"]={
		[b]={{nil,l,"note_constexpr_new_negative"}},
		[c]={{nil,l,"cannot allocate array; evaluated array bound %0 is negative"}},
		[e]={{nil,l,"cannot allocate array; evaluated array bound A is negative"}},
		[g]=f,
		[h]="cannot allocate array; evaluated array bound (.*?) is negative",
		[i]=a,
		[j]={{nil,l,o}},
		[k]={O,1569547607,P,N},
		[d]={{n,9633,"bool PointerExprEvaluator::VisitCXXNewExpr(const CXXNewExpr *E) {\n  // ...\n  if (std::optional<const Expr *> ArraySize = E->getArraySize()) {\n    // ...\n    // C++ [expr.new]p9:\n    //   The expression is erroneous if:\n    //   -- [...] its value before converting to size_t [or] applying the\n    //      second standard conversion sequence is less than zero\n    if (ArrayBound.isSigned() && ArrayBound.isNegative()) {\n      // ...\n      Info.FFDiag(*ArraySize, diag::note_constexpr_new_negative) << ArrayBound << (*ArraySize)->getSourceRange();"}},
		[m]={
			[W]={"clang/test/SemaCXX/constant-expression-cxx2a.cpp:888:22: note: cannot allocate array; evaluated array bound -1 is negative"}
		}
	},
	["note_constexpr_new_non_replaceable"]={
		[b]={{nil,l,"note_constexpr_new_non_replaceable"}},
		[c]={{nil,l,"call to %select{placement|class-specific}0 %1"}},
		[e]={{nil,l,{"call to ",{"placement","class-specific"}," B"}}},
		[g]=f,
		[h]="call to (?:placement|class\\-specific) (.*?)",
		[i]=a,
		[j]={{nil,l,o}},
		[k]={O,1569547607,P,N},
		[d]={{n,9583,"bool PointerExprEvaluator::VisitCXXNewExpr(const CXXNewExpr *E) {\n  // ...\n  if (OperatorNew->isReservedGlobalPlacementOperator() && Info.CurrentCall->isStdFunction() && !E->isArray()) {\n  // ...\n  } else if (!OperatorNew->isReplaceableGlobalAllocationFunction()) {\n    Info.FFDiag(E, diag::note_constexpr_new_non_replaceable) << isa<CXXMethodDecl>(OperatorNew) << OperatorNew;"},{n,14996,"bool VoidExprEvaluator::VisitCXXDeleteExpr(const CXXDeleteExpr *E) {\n  // ...\n  if (!OperatorDelete->isReplaceableGlobalAllocationFunction()) {\n    Info.FFDiag(E, diag::note_constexpr_new_non_replaceable) << isa<CXXMethodDecl>(OperatorDelete) << OperatorDelete;"},{n,15040,"bool VoidExprEvaluator::VisitCXXDeleteExpr(const CXXDeleteExpr *E) {\n  // ...\n  // For a class type with a virtual destructor, the selected operator delete\n  // is the one looked up when building the destructor.\n  if (!E->isArrayForm() && !E->isGlobalDelete()) {\n    // ...\n    if (VirtualDelete && !VirtualDelete->isReplaceableGlobalAllocationFunction()) {\n      Info.FFDiag(E, diag::note_constexpr_new_non_replaceable) << isa<CXXMethodDecl>(VirtualDelete) << VirtualDelete;"}},
		[m]={
			[db]={"clang/test/SemaCXX/cxx2a-constexpr-dynalloc.cpp:95:3: note: call to placement \'operator new\'"}
		}
	},
	["note_constexpr_new_not_complete_object_type"]={
		[b]={{nil,l,"note_constexpr_new_not_complete_object_type"}},
		[c]={{nil,l,"cannot allocate memory of %select{incomplete|function}0 type %1"}},
		[e]={{nil,l,{"cannot allocate memory of ",{"incomplete","function"}," type B"}}},
		[g]=f,
		[h]="cannot allocate memory of (?:incomplete|function) type (.*?)",
		[i]=a,
		[j]={{nil,l,o}},
		[k]={"19ad5239713c",1570063173,"For P0784R7: allow direct calls to operator new / operator delete from","For P0784R7: allow direct calls to operator new / operator delete from\nstd::allocator::{allocate,deallocate} in constant evaluation.\n\nllvm-svn: 373546"},
		[d]={{n,6723,"/// Perform a call to \'perator new\' or to `__builtin_operator_new\'.\nstatic bool HandleOperatorNewCall(EvalInfo &Info, const CallExpr *E, LValue &Result) {\n  // ...\n  if (ElemType->isIncompleteType() || ElemType->isFunctionType()) {\n    Info.FFDiag(E->getExprLoc(), diag::note_constexpr_new_not_complete_object_type) << (ElemType->isIncompleteType() ? 0 : 1) << ElemType;"}},
		[m]={
			[db]={"clang/test/SemaCXX/cxx2a-constexpr-dynalloc.cpp:34:39: note: cannot allocate memory of function type \'void ()\'","clang/test/SemaCXX/cxx2a-constexpr-dynalloc.cpp:40:39: note: cannot allocate memory of incomplete type \'Incomplete\'"}
		}
	},
	["note_constexpr_new_placement"]={
		[b]={{nil,l,"note_constexpr_new_placement"}},
		[c]={{nil,l,"this placement new expression is not yet supported in constant expressions"}},
		[e]={{nil,l,"this placement new expression is not yet supported in constant expressions"}},
		[g]=f,
		[h]="this placement new expression is not yet supported in constant expressions",
		[i]=a,
		[j]={{nil,l,o}},
		[k]={O,1569547607,P,N},
		[d]={{n,9599,"bool PointerExprEvaluator::VisitCXXNewExpr(const CXXNewExpr *E) {\n  // ...\n  if (OperatorNew->isReservedGlobalPlacementOperator() && Info.CurrentCall->isStdFunction() && !E->isArray()) {\n  // ...\n  } else if (!OperatorNew->isReplaceableGlobalAllocationFunction()) {\n  // ...\n  } else if (E->getNumPlacementArgs()) {\n    // The only new-placement list we support is of the form (std::nothrow).\n    //\n    // FIXME: There is no restriction on this, but it\'s not clear that any\n    // other form makes any sense. We get here for cases such as:\n    //\n    //   new (std::align_val_t{N}) X(int)\n    //\n    // (which should presumably be valid only if N is a multiple of\n    // alignof(int), and in any case can\'t be deallocated unless N is\n    // alignof(X) and X has new-extended alignment).\n    if (E->getNumPlacementArgs() != 1 || !E->getPlacementArg(0)->getType()->isNothrowT())\n      return Error(E, diag::note_constexpr_new_placement);"}},
		[m]={
			[W]={"clang/test/SemaCXX/constant-expression-cxx2a.cpp:1015:14: note: this placement new expression is not yet supported in constant expressions"}
		}
	},
	["note_constexpr_new_too_large"]={
		[b]={{nil,l,"note_constexpr_new_too_large"}},
		[c]={{nil,l,"cannot allocate array; evaluated array bound %0 is too large"}},
		[e]={{nil,l,"cannot allocate array; evaluated array bound A is too large"}},
		[g]=f,
		[h]="cannot allocate array; evaluated array bound (.*?) is too large",
		[i]=a,
		[j]={{nil,l,o}},
		[k]={O,1569547607,P,N},
		[d]={{n,6756,"/// Perform a call to \'perator new\' or to `__builtin_operator_new\'.\nstatic bool HandleOperatorNewCall(EvalInfo &Info, const CallExpr *E, LValue &Result) {\n  // ...\n  if (ByteSize.getActiveBits() > ConstantArrayType::getMaxSizeBits(Info.Ctx)) {\n    // ...\n    Info.FFDiag(E, diag::note_constexpr_new_too_large) << APSInt(Size, true);"},{n,9646,"bool PointerExprEvaluator::VisitCXXNewExpr(const CXXNewExpr *E) {\n  // ...\n  if (std::optional<const Expr *> ArraySize = E->getArraySize()) {\n    // ...\n    //   -- its value is such that the size of the allocated object would\n    //      exceed the implementation-defined limit\n    if (ConstantArrayType::getNumAddressingBits(Info.Ctx, AllocType, ArrayBound) > ConstantArrayType::getMaxSizeBits(Info.Ctx)) {\n      // ...\n      Info.FFDiag(*ArraySize, diag::note_constexpr_new_too_large) << ArrayBound << (*ArraySize)->getSourceRange();"}},
		[m]={
			[W]={"clang/test/SemaCXX/constant-expression-cxx2a.cpp:888:22: note: cannot allocate array; evaluated array bound 4611686018427387904 is too large"}
		}
	},
	["note_constexpr_new_too_small"]={
		[b]={{nil,l,"note_constexpr_new_too_small"}},
		[c]={{nil,l,"cannot allocate array; evaluated array bound %0 is too small to hold %1 explicitly initialized elements"}},
		[e]={{nil,l,"cannot allocate array; evaluated array bound A is too small to hold B explicitly initialized elements"}},
		[g]=f,
		[h]="cannot allocate array; evaluated array bound (.*?) is too small to hold (.*?) explicitly initialized elements",
		[i]=a,
		[j]={{nil,l,o}},
		[k]={O,1569547607,P,N},
		[d]={{n,9673,"bool PointerExprEvaluator::VisitCXXNewExpr(const CXXNewExpr *E) {\n  // ...\n  if (std::optional<const Expr *> ArraySize = E->getArraySize()) {\n    // ...\n    //   -- the new-initializer is a braced-init-list and the number of\n    //      array elements for which initializers are provided [...]\n    //      exceeds the number of elements to initialize\n    if (!Init) {\n    // ...\n    } else if (isa<CXXScalarValueInitExpr>(Init) || isa<ImplicitValueInitExpr>(Init)) {\n    // ...\n    } else if (auto *CCE = dyn_cast<CXXConstructExpr>(Init)) {\n    // ...\n    } else {\n      // ...\n      if (InitBound.ugt(AllocBound)) {\n        // ...\n        Info.FFDiag(*ArraySize, diag::note_constexpr_new_too_small) << toString(AllocBound, 10, /*Signed=*/false) << toString(InitBound, 10, /*Signed=*/false) << (*ArraySize)->getSourceRange();"}},
		[m]={
			[W]={"clang/test/SemaCXX/constant-expression-cxx2a.cpp:851:17: note: cannot allocate array; evaluated array bound 2 is too small to hold 3 explicitly initialized elements","clang/test/SemaCXX/constant-expression-cxx2a.cpp:849:17: note: cannot allocate array; evaluated array bound 3 is too small to hold 4 explicitly initialized elements"}
		}
	},
	["note_constexpr_new_untyped"]={
		[b]={{nil,l,"note_constexpr_new_untyped"}},
		[c]={{nil,l,"cannot allocate untyped memory in a constant expression; use \'std::allocator<T>::allocate\' to allocate memory of type \'T\'"}},
		[e]={{nil,l,"cannot allocate untyped memory in a constant expression; use \'std::allocator<T>::allocate\' to allocate memory of type \'T\'"}},
		[g]=f,
		[h]="cannot allocate untyped memory in a constant expression; use \'std\\:\\:allocator\\<T\\>\\:\\:allocate\' to allocate memory of type \'T\'",
		[i]=a,
		[j]={{nil,l,o}},
		[k]={"19ad5239713c",1570063173,"For P0784R7: allow direct calls to operator new / operator delete from","For P0784R7: allow direct calls to operator new / operator delete from\nstd::allocator::{allocate,deallocate} in constant evaluation.\n\nllvm-svn: 373546"},
		[d]={{n,6715,"/// Perform a call to \'perator new\' or to `__builtin_operator_new\'.\nstatic bool HandleOperatorNewCall(EvalInfo &Info, const CallExpr *E, LValue &Result) {\n  // ...\n  if (!Caller) {\n    Info.FFDiag(E->getExprLoc(), Info.getLangOpts().CPlusPlus20 ? diag::note_constexpr_new_untyped : diag::note_constexpr_new);"}},
		[m]={
			[db]={"clang/test/SemaCXX/cxx2a-constexpr-dynalloc.cpp:6:13: note: cannot allocate untyped memory in a constant expression; use \'std::allocator<T>::allocate\' to allocate memory of type \'T\'"}
		}
	},
	["note_constexpr_no_return"]={
		[b]="note_constexpr_no_return",
		[c]="control reached end of constexpr function",
		[e]="control reached end of constexpr function",
		[g]=f,
		[h]="control reached end of constexpr function",
		[i]=a,
		[j]=o,
		[k]={"d9f663b510c4",1366644711,"C++1y constexpr extensions, round 1: Allow most forms of declaration and","C++1y constexpr extensions, round 1: Allow most forms of declaration and\nstatement in constexpr functions. Everything which doesn\'t require variable\nmutation is also allowed as an extension in C++11. \'void\' becomes a literal\ntype to support constexpr functions which return \'void\'.\n\nllvm-svn: 180022"},
		[d]={{n,6258,"/// Evaluate a function call.\nstatic bool HandleFunctionCall(SourceLocation CallLoc, const FunctionDecl *Callee, const LValue *This, const Expr *E, ArrayRef<const Expr *> Args, CallRef Call, const Stmt *Body, EvalInfo &Info, APValue &Result, const LValue *ResultSlot) {\n  // ...\n  if (ESR == ESR_Succeeded) {\n    // ...\n    Info.FFDiag(Callee->getEndLoc(), diag::note_constexpr_no_return);"}},
		[m]={
			["clang/test/SemaCXX/constant-expression-cxx14.cpp"]={"clang/test/SemaCXX/constant-expression-cxx14.cpp:70:1: note: control reached end of constexpr function","clang/test/SemaCXX/constant-expression-cxx14.cpp:70:1: note: control reached end of constexpr function"}
		}
	},
	["note_constexpr_non_global"]={
		[b]="note_constexpr_non_global",
		[c]="%select{pointer|reference}0 to %select{|subobject of }1%select{temporary|%3}2 is not a constant expression",
		[e]={{nil,nil,{{ic,Db}," to ",{a,"subobject of "},{Cb,"D"}," is not a constant expression"}}},
		[g]=f,
		[h]="(?:pointer|reference) to (?:|subobject of )(?:temporary|(.*?)) is not a constant expression",
		[i]=a,
		[j]=o,
		[k]={zb,1323758398,Ab,Bb},
		[d]={{n,2207,"/// Check that this reference or pointer core constant expression is a valid\n/// value for an address or reference constant expression. Return true if we\n/// can fold this expression, whether or not it\'s a constant expression.\nstatic bool CheckLValueConstantExpression(EvalInfo &Info, SourceLocation Loc, QualType Type, const LValue &LVal, ConstantExprKind Kind, CheckedTemporaries &CheckedTemps) {\n  // ...\n  // Check that the object is a global. Note that the fake \'this\' object we\n  // manufacture when checking potential constant expressions is conservatively\n  // assumed to be global here.\n  if (!IsGlobalLValue(Base)) {\n    if (Info.getLangOpts().CPlusPlus11) {\n      Info.FFDiag(Loc, diag::note_constexpr_non_global, 1) << IsReferenceType << !Designator.Entries.empty() << !!BaseVD << BaseVD;"}},
		[m]={
			["clang/test/SemaCXX/cxx2a-consteval.cpp"]={"clang/test/SemaCXX/cxx2a-consteval.cpp:302:11: note: reference to temporary is not a constant expression","clang/test/SemaCXX/cxx2a-consteval.cpp:304:11: note: reference to temporary is not a constant expression","clang/test/SemaCXX/cxx2a-consteval.cpp:360:11: note: reference to temporary is not a constant expression","clang/test/SemaCXX/cxx2a-consteval.cpp:362:11: note: reference to temporary is not a constant expression","clang/test/SemaCXX/cxx2a-consteval.cpp:412:7: note: pointer to temporary is not a constant expression","clang/test/SemaCXX/cxx2a-consteval.cpp:428:7: note: pointer to temporary is not a constant expression"}
		}
	},
	["note_constexpr_nonliteral"]={
		[b]="note_constexpr_nonliteral",
		[c]="non-literal type %0 cannot be used in a constant expression",
		[e]="non-literal type A cannot be used in a constant expression",
		[g]=f,
		[h]="non\\-literal type (.*?) cannot be used in a constant expression",
		[i]=a,
		[j]=o,
		[k]={zb,1323758398,Ab,Bb},
		[d]={{n,2369,"/// Check that this core constant expression is of literal type, and if not,\n/// produce an appropriate diagnostic.\nstatic bool CheckLiteralType(EvalInfo &Info, const Expr *E, const LValue *This = nullptr) {\n  // ...\n  // Prvalue constant expressions must be of literal types.\n  if (Info.getLangOpts().CPlusPlus11)\n    Info.FFDiag(E, diag::note_constexpr_nonliteral) << E->getType();"},{n,4671,"/// Build an lvalue for the object argument of a member function call.\nstatic bool EvaluateObjectArgument(EvalInfo &Info, const Expr *Object, LValue &This) {\n  // ...\n  Info.FFDiag(Object, diag::note_constexpr_nonliteral) << Object->getType();"},{n,15127,"static bool Evaluate(APValue &Result, EvalInfo &Info, const Expr *E) {\n  // ...\n  if (E->isGLValue() || T->isFunctionType()) {\n  // ...\n  } else if (T->isVectorType()) {\n  // ...\n  } else if (T->isIntegralOrEnumerationType()) {\n  // ...\n  } else if (T->hasPointerRepresentation()) {\n  // ...\n  } else if (T->isRealFloatingType()) {\n  // ...\n  } else if (T->isAnyComplexType()) {\n  // ...\n  } else if (T->isFixedPointType()) {\n  // ...\n  } else if (T->isMemberPointerType()) {\n  // ...\n  } else if (T->isArrayType()) {\n  // ...\n  } else if (T->isRecordType()) {\n  // ...\n  } else if (T->isVoidType()) {\n    if (!Info.getLangOpts().CPlusPlus11)\n      Info.CCEDiag(E, diag::note_constexpr_nonliteral) << E->getType();"},{n,15145,"static bool Evaluate(APValue &Result, EvalInfo &Info, const Expr *E) {\n  // ...\n  if (E->isGLValue() || T->isFunctionType()) {\n  // ...\n  } else if (T->isVectorType()) {\n  // ...\n  } else if (T->isIntegralOrEnumerationType()) {\n  // ...\n  } else if (T->hasPointerRepresentation()) {\n  // ...\n  } else if (T->isRealFloatingType()) {\n  // ...\n  } else if (T->isAnyComplexType()) {\n  // ...\n  } else if (T->isFixedPointType()) {\n  // ...\n  } else if (T->isMemberPointerType()) {\n  // ...\n  } else if (T->isArrayType()) {\n  // ...\n  } else if (T->isRecordType()) {\n  // ...\n  } else if (T->isVoidType()) {\n  // ...\n  } else if (T->isAtomicType()) {\n  // ...\n  } else if (Info.getLangOpts().CPlusPlus11) {\n    Info.FFDiag(E, diag::note_constexpr_nonliteral) << E->getType();"}},
		[m]={
			["clang/test/SemaCXX/constexpr-value-init.cpp"]={"clang/test/SemaCXX/constexpr-value-init.cpp:38:19: note: non-literal type \'Z<V>\' cannot be used in a constant expression"}
		}
	},
	["note_constexpr_not_static"]={
		[b]={{nil,u,"note_constexpr_not_static"}},
		[c]={{nil,u,"address of non-static constexpr variable %0 may differ on each invocation of the enclosing function; add \'static\' to give it a constant address"}},
		[e]={{nil,u,"address of non-static constexpr variable A may differ on each invocation of the enclosing function; add \'static\' to give it a constant address"}},
		[g]=f,
		[h]="address of non\\-static constexpr variable (.*?) may differ on each invocation of the enclosing function; add \'static\' to give it a constant address",
		[i]=a,
		[j]={{nil,u,o}},
		[k]={"0fd3d379e26d",1597104144,"Improve diagnostic for an expression that\'s not constant because it uses","Improve diagnostic for an expression that\'s not constant because it uses\nthe address of a constexpr local variable.\n\nSuggest adding \'static\' to give the constexpr local variable a constant\naddress."},
		[d]={{n,2217,"/// Check that this reference or pointer core constant expression is a valid\n/// value for an address or reference constant expression. Return true if we\n/// can fold this expression, whether or not it\'s a constant expression.\nstatic bool CheckLValueConstantExpression(EvalInfo &Info, SourceLocation Loc, QualType Type, const LValue &LVal, ConstantExprKind Kind, CheckedTemporaries &CheckedTemps) {\n  // ...\n  // Check that the object is a global. Note that the fake \'this\' object we\n  // manufacture when checking potential constant expressions is conservatively\n  // assumed to be global here.\n  if (!IsGlobalLValue(Base)) {\n    if (Info.getLangOpts().CPlusPlus11) {\n      // ...\n      if (VarD && VarD->isConstexpr()) {\n        // ...\n        Info.Note(VarD->getLocation(), diag::note_constexpr_not_static) << VarD << FixItHint::CreateInsertion(VarD->getBeginLoc(), \"static \");"}},
		[m]={
			["clang/test/SemaCXX/builtins.cpp"]={"clang/test/SemaCXX/builtins.cpp:128:17: note: address of non-static constexpr variable \'i\' may differ on each invocation of the enclosing function; add \'static\' to give it a constant address"}
		}
	},
	["note_constexpr_null_callee"]={
		[b]="note_constexpr_null_callee",
		[c]="\'%0\' evaluates to a null function pointer",
		[e]="\'A\' evaluates to a null function pointer",
		[g]=f,
		[h]="\'(.*?)\' evaluates to a null function pointer",
		[i]=a,
		[j]=o,
		[k]={nb,1662843785,jb,ob},
		[d]={{n,7719,"template <class Derived> class ExprEvaluatorBase : public ConstStmtVisitor<Derived, bool> {\n  // ...\n  bool handleCallExpr(const CallExpr *E, APValue &Result, const LValue *ResultSlot) {\n    // ...\n    // Extract function decl and \'this\' pointer from the callee.\n    if (CalleeType->isSpecificBuiltinType(BuiltinType::BoundMember)) {\n    // ...\n    } else if (CalleeType->isFunctionPointerType()) {\n      // ...\n      if (CalleeLV.isNullPointer()) {\n        Info.FFDiag(Callee, diag::note_constexpr_null_callee) << const_cast<Expr *>(Callee);"}},
		[m]={
			[yb]={"clang/test/SemaCXX/constant-expression-cxx11.cpp:282:54: note: \'F\' evaluates to a null function pointer"}
		}
	},
	["note_constexpr_null_subobject"]={
		[b]="note_constexpr_null_subobject",
		[c]={{nil,q,"cannot %select{access base class of|access derived class of|access field of|access array element of|perform pointer arithmetic on|access real component of|access imaginary component of}0 null pointer"},{s,nil,"cannot %select{access base class of|access derived class of|access field of|access array element of|perform pointer arithmetic on|call member function on|access real component of|access imaginary component of}0 null pointer"}},
		[e]={{nil,q,{"cannot ",{"access base class of","access derived class of","access field of","access array element of","perform pointer arithmetic on","access real component of","access imaginary component of"}," null pointer"}},{s,nil,{"cannot ",{"access base class of","access derived class of","access field of","access array element of","perform pointer arithmetic on","call member function on","access real component of","access imaginary component of"}," null pointer"}}},
		[g]=f,
		[h]="cannot (?:access base class of|access derived class of|access field of|access array element of|perform pointer arithmetic on|access real component of|access imaginary component of) null pointer",
		[i]=a,
		[j]=o,
		[k]={"a8105bc9cecb",1325867940,"C++11 generalized constant expressions: implement checking and diagnostics for","C++11 generalized constant expressions: implement checking and diagnostics for\npointer-arithmetic-related undefined behavior and unspecified results. We\ncontinue to fold such values, but now notice they aren\'t constant expressions.\n\nllvm-svn: 147659"},
		[d]={{n,1647,"#endif\n  // ...\n  bool checkNullPointer(EvalInfo &Info, const Expr *E, CheckSubobjectKind CSK) {\n    return checkNullPointerDiagnosingWith([&Info, E, CSK] { Info.CCEDiag(E, diag::note_constexpr_null_subobject) << CSK; });"},{y,153,"bool CheckLive(InterpState &S, CodePtr OpPC, const Pointer &Ptr, AccessKinds AK) {\n  if (Ptr.isZero()) {\n    // ...\n    if (Ptr.isField())\n      S.FFDiag(Src, diag::note_constexpr_null_subobject) << CSK_Field;"},{y,182,"bool CheckNull(InterpState &S, CodePtr OpPC, const Pointer &Ptr, CheckSubobjectKind CSK) {\n  // ...\n  S.FFDiag(Loc, diag::note_constexpr_null_subobject) << CSK;"}},
		[m]={
			["clang/test/AST/Interp/arrays.cpp"]={"clang/test/AST/Interp/arrays.cpp:73:24: note: cannot perform pointer arithmetic on null pointer"}
		}
	},
	["note_constexpr_operator_new_bad_size"]={
		[b]={{nil,l,"note_constexpr_operator_new_bad_size"}},
		[c]={{nil,l,"allocated size %0 is not a multiple of size %1 of element type %2"}},
		[e]={{nil,l,"allocated size A is not a multiple of size B of element type C"}},
		[g]=f,
		[h]="allocated size (.*?) is not a multiple of size (.*?) of element type (.*?)",
		[i]=a,
		[j]={{nil,l,o}},
		[k]={"19ad5239713c",1570063173,"For P0784R7: allow direct calls to operator new / operator delete from","For P0784R7: allow direct calls to operator new / operator delete from\nstd::allocator::{allocate,deallocate} in constant evaluation.\n\nllvm-svn: 373546"},
		[d]={{n,6745,"/// Perform a call to \'perator new\' or to `__builtin_operator_new\'.\nstatic bool HandleOperatorNewCall(EvalInfo &Info, const CallExpr *E, LValue &Result) {\n  // ...\n  if (Remainder != 0) {\n    // ...\n    Info.FFDiag(E->getExprLoc(), diag::note_constexpr_operator_new_bad_size) << ByteSize << APSInt(ElemSizeAP, true) << ElemType;"}},
		[m]={
			[db]={"clang/test/SemaCXX/cxx2a-constexpr-dynalloc.cpp:47:39: note: allocated size 7 is not a multiple of size 5 of element type \'WrongSize\'"}
		}
	},
	["note_constexpr_overflow"]={
		[b]="note_constexpr_overflow",
		[c]="value %0 is outside the range of representable values of type %1",
		[e]="value A is outside the range of representable values of type B",
		[g]=f,
		[h]="value (.*?) is outside the range of representable values of type (.*?)",
		[i]=a,
		[j]=o,
		[k]={zb,1323758398,Ab,Bb},
		[d]={{n,2579,"template <typename T> static bool HandleOverflow(EvalInfo &Info, const Expr *E, const T &SrcValue, QualType DestType) {\n  Info.CCEDiag(E, diag::note_constexpr_overflow) << SrcValue << DestType;"},{"clang/lib/AST/Interp/InterpState.cpp",45,"bool InterpState::reportOverflow(const Expr *E, const llvm::APSInt &Value) {\n  // ...\n  CCEDiag(E, diag::note_constexpr_overflow) << Value << Type;"}},
		[m]={
			["clang/test/SemaCXX/constant-expression-cxx1z.cpp"]={"clang/test/SemaCXX/constant-expression-cxx1z.cpp:6:36: note: value 6442450941 is outside the range of representable values of type \'int\'"}
		}
	},
	["note_constexpr_past_end"]={
		[b]="note_constexpr_past_end",
		[c]="dereferenced pointer past the end of %select{|subobject of }0%select{temporary|%2}1 is not a constant expression",
		[e]={{nil,nil,{"dereferenced pointer past the end of ",{a,"subobject of "},{Cb,"C"}," is not a constant expression"}}},
		[g]=f,
		[h]="dereferenced pointer past the end of (?:|subobject of )(?:temporary|(.*?)) is not a constant expression",
		[i]=a,
		[j]=o,
		[k]={zb,1323758398,Ab,Bb},
		[d]={{n,2316,"/// Check that this reference or pointer core constant expression is a valid\n/// value for an address or reference constant expression. Return true if we\n/// can fold this expression, whether or not it\'s a constant expression.\nstatic bool CheckLValueConstantExpression(EvalInfo &Info, SourceLocation Loc, QualType Type, const LValue &LVal, ConstantExprKind Kind, CheckedTemporaries &CheckedTemps) {\n  // ...\n  // Does this refer one past the end of some object?\n  if (!Designator.Invalid && Designator.isOnePastTheEnd()) {\n    Info.FFDiag(Loc, diag::note_constexpr_past_end, 1) << !Designator.Entries.empty() << !!BaseVD << BaseVD;"}},
		[m]={
			["clang/test/SemaTemplate/temp_arg_nontype_cxx20.cpp"]={"clang/test/SemaTemplate/temp_arg_nontype_cxx20.cpp:30:20: note: dereferenced pointer past the end of \'n\' is not a constant expression","clang/test/SemaTemplate/temp_arg_nontype_cxx20.cpp:31:20: note: dereferenced pointer past the end of \'n\' is not a constant expression","clang/test/SemaTemplate/temp_arg_nontype_cxx20.cpp:36:20: note: dereferenced pointer past the end of subobject of \'s\' is not a constant expression","clang/test/SemaTemplate/temp_arg_nontype_cxx20.cpp:37:20: note: dereferenced pointer past the end of subobject of \'s\' is not a constant expression"}
		}
	},
	["note_constexpr_past_end_subobject"]={
		[b]="note_constexpr_past_end_subobject",
		[c]={{nil,q,"cannot %select{access base class of|access derived class of|access field of|access array element of|ERROR|access real component of|access imaginary component of}0 pointer past the end of object"},{s,nil,"cannot %select{access base class of|access derived class of|access field of|access array element of|ERROR|call member function on|access real component of|access imaginary component of}0 pointer past the end of object"}},
		[e]={{nil,q,{"cannot ",{"access base class of","access derived class of","access field of","access array element of","ERROR","access real component of","access imaginary component of"}," pointer past the end of object"}},{s,nil,{"cannot ",{"access base class of","access derived class of","access field of","access array element of","ERROR","call member function on","access real component of","access imaginary component of"}," pointer past the end of object"}}},
		[g]=f,
		[h]="cannot (?:access base class of|access derived class of|access field of|access array element of|ERROR|access real component of|access imaginary component of) pointer past the end of object",
		[i]=a,
		[j]=o,
		[k]={"a8105bc9cecb",1325867940,"C++11 generalized constant expressions: implement checking and diagnostics for","C++11 generalized constant expressions: implement checking and diagnostics for\npointer-arithmetic-related undefined behavior and unspecified results. We\ncontinue to fold such values, but now notice they aren\'t constant expressions.\n\nllvm-svn: 147659"},
		[d]={{n,1411,"bool SubobjectDesignator::checkSubobject(EvalInfo &Info, const Expr *E, CheckSubobjectKind CSK) {\n  // ...\n  if (isOnePastTheEnd()) {\n    Info.CCEDiag(E, diag::note_constexpr_past_end_subobject) << CSK;"},{y,200,"bool CheckRange(InterpState &S, CodePtr OpPC, const Pointer &Ptr, CheckSubobjectKind CSK) {\n  // ...\n  S.FFDiag(Loc, diag::note_constexpr_past_end_subobject) << CSK;"}},
		[m]={
			[T]={"clang/test/CXX/expr/expr.const/p2-0x.cpp:195:23: note: cannot access base class of pointer past the end of object","clang/test/CXX/expr/expr.const/p2-0x.cpp:196:23: note: cannot access derived class of pointer past the end of object","clang/test/CXX/expr/expr.const/p2-0x.cpp:197:42: note: cannot access field of pointer past the end of object","clang/test/CXX/expr/expr.const/p2-0x.cpp:198:26: note: cannot access array element of pointer past the end of object"}
		}
	},
	["note_constexpr_placement_new_wrong_type"]={
		[b]={{nil,l,"note_constexpr_placement_new_wrong_type"}},
		[c]={{nil,l,"placement new would change type of storage from %0 to %1"}},
		[e]={{nil,l,"placement new would change type of storage from A to B"}},
		[g]=f,
		[h]="placement new would change type of storage from (.*?) to (.*?)",
		[i]=a,
		[j]={{nil,l,o}},
		[k]={"b542602c5f35",1570063175,"For P0784R7: support placement new-expressions in constant evaluation.","For P0784R7: support placement new-expressions in constant evaluation.\n\nFor now, we restrict this support to use from within the standard\nlibrary implementation, since we\'re required to make parts of the\nstandard library that use placement new work, but not permitted to\nmake uses of placement new from user code work.\n\nllvm-svn: 373547"},
		[d]={{n,9709,"bool PointerExprEvaluator::VisitCXXNewExpr(const CXXNewExpr *E) {\n  // ...\n  if (IsPlacement) {\n    // ...\n    struct FindObjectHandler {\n      // ...\n      bool found(APValue &Subobj, QualType SubobjType) {\n        // FIXME: Reject the cases where [basic.life]p8 would not permit the\n        // old name of the object to be used to name the new object.\n        if (!Info.Ctx.hasSameUnqualifiedType(SubobjType, AllocType)) {\n          Info.FFDiag(E, diag::note_constexpr_placement_new_wrong_type) << SubobjType << AllocType;"}},
		[m]={
			[db]={"clang/test/SemaCXX/cxx2a-constexpr-dynalloc.cpp:111:5: note: placement new would change type of storage from \'int\' to \'float\'"}
		}
	},
	["note_constexpr_pointer_comparison_base_classes"]={
		[b]="note_constexpr_pointer_comparison_base_classes",
		[c]="comparison of addresses of subobjects of different base classes has unspecified value",
		[e]="comparison of addresses of subobjects of different base classes has unspecified value",
		[g]=f,
		[h]="comparison of addresses of subobjects of different base classes has unspecified value",
		[i]=a,
		[j]=o,
		[k]={"84f6dcf2b52c",1328145417,"constexpr:","constexpr:\n  * support the gcc __builtin_constant_p() ? ... : ... folding hack in C++11\n  * check for unspecified values in pointer comparisons and pointer subtractions\n\nllvm-svn: 149578"},
		[d]={{n,13160,"template <class SuccessCB, class AfterCB> static bool EvaluateComparisonBinaryOperator(EvalInfo &Info, const BinaryOperator *E, SuccessCB &&Success, AfterCB &&DoAfter) {\n  // ...\n  if (LHSTy->isPointerType() && RHSTy->isPointerType()) {\n    // ...\n    // C++11 [expr.rel]p2:\n    // - If two pointers point to non-static data members of the same object,\n    //   or to subobjects or array elements fo such members, recursively, the\n    //   pointer to the later declared member compares greater provided the\n    //   two members have the same access control and provided their class is\n    //   not a union.\n    //   [...]\n    // - Otherwise pointer comparisons are unspecified.\n    if (!LHSDesignator.Invalid && !RHSDesignator.Invalid && IsRelational) {\n      // ...\n      // At the point where the designators diverge, the comparison has a\n      // specified value if:\n      //  - we are comparing array indices\n      //  - we are comparing fields of a union, or fields with the same access\n      // Otherwise, the result is unspecified and thus the comparison is not a\n      // constant expression.\n      if (!WasArrayIndex && Mismatch < LHSDesignator.Entries.size() && Mismatch < RHSDesignator.Entries.size()) {\n        // ...\n        if (!LF && !RF)\n          Info.CCEDiag(E, diag::note_constexpr_pointer_comparison_base_classes);"}},
		[m]={
			[T]={"clang/test/CXX/expr/expr.const/p2-0x.cpp:567:34: note: comparison of addresses of subobjects of different base classes has unspecified value"}
		}
	},
	["note_constexpr_pointer_comparison_base_field"]={
		[b]="note_constexpr_pointer_comparison_base_field",
		[c]="comparison of address of base class subobject %0 of class %1 to field %2 has unspecified value",
		[e]="comparison of address of base class subobject A of class B to field C has unspecified value",
		[g]=f,
		[h]="comparison of address of base class subobject (.*?) of class (.*?) to field (.*?) has unspecified value",
		[i]=a,
		[j]=o,
		[k]={"84f6dcf2b52c",1328145417,"constexpr:","constexpr:\n  * support the gcc __builtin_constant_p() ? ... : ... folding hack in C++11\n  * check for unspecified values in pointer comparisons and pointer subtractions\n\nllvm-svn: 149578"},
		[d]={{n,13162,"template <class SuccessCB, class AfterCB> static bool EvaluateComparisonBinaryOperator(EvalInfo &Info, const BinaryOperator *E, SuccessCB &&Success, AfterCB &&DoAfter) {\n  // ...\n  if (LHSTy->isPointerType() && RHSTy->isPointerType()) {\n    // ...\n    // C++11 [expr.rel]p2:\n    // - If two pointers point to non-static data members of the same object,\n    //   or to subobjects or array elements fo such members, recursively, the\n    //   pointer to the later declared member compares greater provided the\n    //   two members have the same access control and provided their class is\n    //   not a union.\n    //   [...]\n    // - Otherwise pointer comparisons are unspecified.\n    if (!LHSDesignator.Invalid && !RHSDesignator.Invalid && IsRelational) {\n      // ...\n      // At the point where the designators diverge, the comparison has a\n      // specified value if:\n      //  - we are comparing array indices\n      //  - we are comparing fields of a union, or fields with the same access\n      // Otherwise, the result is unspecified and thus the comparison is not a\n      // constant expression.\n      if (!WasArrayIndex && Mismatch < LHSDesignator.Entries.size() && Mismatch < RHSDesignator.Entries.size()) {\n        // ...\n        if (!LF && !RF)\n        // ...\n        else if (!LF)\n          Info.CCEDiag(E, diag::note_constexpr_pointer_comparison_base_field) << getAsBaseClass(LHSDesignator.Entries[Mismatch]) << RF->getParent() << RF;"},{n,13166,"template <class SuccessCB, class AfterCB> static bool EvaluateComparisonBinaryOperator(EvalInfo &Info, const BinaryOperator *E, SuccessCB &&Success, AfterCB &&DoAfter) {\n  // ...\n  if (LHSTy->isPointerType() && RHSTy->isPointerType()) {\n    // ...\n    // C++11 [expr.rel]p2:\n    // - If two pointers point to non-static data members of the same object,\n    //   or to subobjects or array elements fo such members, recursively, the\n    //   pointer to the later declared member compares greater provided the\n    //   two members have the same access control and provided their class is\n    //   not a union.\n    //   [...]\n    // - Otherwise pointer comparisons are unspecified.\n    if (!LHSDesignator.Invalid && !RHSDesignator.Invalid && IsRelational) {\n      // ...\n      // At the point where the designators diverge, the comparison has a\n      // specified value if:\n      //  - we are comparing array indices\n      //  - we are comparing fields of a union, or fields with the same access\n      // Otherwise, the result is unspecified and thus the comparison is not a\n      // constant expression.\n      if (!WasArrayIndex && Mismatch < LHSDesignator.Entries.size() && Mismatch < RHSDesignator.Entries.size()) {\n        // ...\n        if (!LF && !RF)\n        // ...\n        else if (!LF)\n        // ...\n        else if (!RF)\n          Info.CCEDiag(E, diag::note_constexpr_pointer_comparison_base_field) << getAsBaseClass(RHSDesignator.Entries[Mismatch]) << LF->getParent() << LF;"}},
		[m]={
			[T]={"clang/test/CXX/expr/expr.const/p2-0x.cpp:568:34: note: comparison of address of base class subobject \'C\' of class \'E\' to field \'e\' has unspecified value","clang/test/CXX/expr/expr.const/p2-0x.cpp:569:33: note: comparison of address of base class subobject \'D\' of class \'E\' to field \'e\' has unspecified value"}
		}
	},
	["note_constexpr_pointer_comparison_differing_access"]={
		[b]="note_constexpr_pointer_comparison_differing_access",
		[c]="comparison of address of fields %0 and %2 of %4 with differing access specifiers (%1 vs %3) has unspecified value",
		[e]="comparison of address of fields A and C of E with differing access specifiers (B vs D) has unspecified value",
		[g]=f,
		[h]="comparison of address of fields (.*?) and (.*?) of (.*?) with differing access specifiers \\((.*?) vs (.*?)\\) has unspecified value",
		[i]=a,
		[j]=o,
		[k]={"84f6dcf2b52c",1328145417,"constexpr:","constexpr:\n  * support the gcc __builtin_constant_p() ? ... : ... folding hack in C++11\n  * check for unspecified values in pointer comparisons and pointer subtractions\n\nllvm-svn: 149578"},
		[d]={{n,13172,"template <class SuccessCB, class AfterCB> static bool EvaluateComparisonBinaryOperator(EvalInfo &Info, const BinaryOperator *E, SuccessCB &&Success, AfterCB &&DoAfter) {\n  // ...\n  if (LHSTy->isPointerType() && RHSTy->isPointerType()) {\n    // ...\n    // C++11 [expr.rel]p2:\n    // - If two pointers point to non-static data members of the same object,\n    //   or to subobjects or array elements fo such members, recursively, the\n    //   pointer to the later declared member compares greater provided the\n    //   two members have the same access control and provided their class is\n    //   not a union.\n    //   [...]\n    // - Otherwise pointer comparisons are unspecified.\n    if (!LHSDesignator.Invalid && !RHSDesignator.Invalid && IsRelational) {\n      // ...\n      // At the point where the designators diverge, the comparison has a\n      // specified value if:\n      //  - we are comparing array indices\n      //  - we are comparing fields of a union, or fields with the same access\n      // Otherwise, the result is unspecified and thus the comparison is not a\n      // constant expression.\n      if (!WasArrayIndex && Mismatch < LHSDesignator.Entries.size() && Mismatch < RHSDesignator.Entries.size()) {\n        // ...\n        if (!LF && !RF)\n        // ...\n        else if (!LF)\n        // ...\n        else if (!RF)\n        // ...\n        else if (!LF->getParent()->isUnion() && LF->getAccess() != RF->getAccess())\n          Info.CCEDiag(E, diag::note_constexpr_pointer_comparison_differing_access) << LF << LF->getAccess() << RF << RF->getAccess() << LF->getParent();"}},
		[m]={
			[T]={"clang/test/CXX/expr/expr.const/p2-0x.cpp:537:44: note: comparison of address of fields \'a\' and \'b\' of \'A\' with differing access specifiers (public vs private) has unspecified value","clang/test/CXX/expr/expr.const/p2-0x.cpp:545:46: note: comparison of address of fields \'a\' and \'b\' of \'B\' with differing access specifiers (public vs protected) has unspecified value"}
		}
	},
	["note_constexpr_pointer_comparison_past_end"]={
		[b]={{nil,x,"note_constexpr_pointer_comparison_past_end"}},
		[c]={{nil,x,"comparison against pointer \'%0\' that points past the end of a complete object has unspecified value"}},
		[e]={{nil,x,"comparison against pointer \'A\' that points past the end of a complete object has unspecified value"}},
		[g]=f,
		[h]="comparison against pointer \'(.*?)\' that points past the end of a complete object has unspecified value",
		[i]=a,
		[j]={{nil,x,o}},
		[k]={nb,1662843785,jb,ob},
		[d]={{n,13106,"template <class SuccessCB, class AfterCB> static bool EvaluateComparisonBinaryOperator(EvalInfo &Info, const BinaryOperator *E, SuccessCB &&Success, AfterCB &&DoAfter) {\n  // ...\n  if (LHSTy->isPointerType() && RHSTy->isPointerType()) {\n    // ...\n    // Reject differing bases from the normal codepath; we special-case\n    // comparisons to null.\n    if (!HasSameBase(LHSValue, RHSValue)) {\n      // ...\n      // We can\'t compare the address of the start of one object with the\n      // past-the-end address of another object, per C++ DR1652.\n      if (LHSValue.Base && LHSValue.Offset.isZero() && isOnePastTheEndOfCompleteObject(Info.Ctx, RHSValue))\n        return DiagComparison(diag::note_constexpr_pointer_comparison_past_end, true);"},{n,13110,"template <class SuccessCB, class AfterCB> static bool EvaluateComparisonBinaryOperator(EvalInfo &Info, const BinaryOperator *E, SuccessCB &&Success, AfterCB &&DoAfter) {\n  // ...\n  if (LHSTy->isPointerType() && RHSTy->isPointerType()) {\n    // ...\n    // Reject differing bases from the normal codepath; we special-case\n    // comparisons to null.\n    if (!HasSameBase(LHSValue, RHSValue)) {\n      // ...\n      if (RHSValue.Base && RHSValue.Offset.isZero() && isOnePastTheEndOfCompleteObject(Info.Ctx, LHSValue))\n        return DiagComparison(diag::note_constexpr_pointer_comparison_past_end, false);"}},
		[m]={
			["clang/test/Sema/const-eval.c"]={"clang/test/Sema/const-eval.c:140:24: note: comparison against pointer \'&PR24622\' that points past the end of a complete object has unspecified value"}
		}
	},
	["note_constexpr_pointer_comparison_unspecified"]={
		[b]={{nil,l,"note_constexpr_pointer_comparison_unspecified"}},
		[c]={{nil,x,"comparison between \'%0\' and \'%1\' has unspecified value"},{I,l,"comparison has unspecified value"}},
		[e]={{nil,x,"comparison between \'A\' and \'B\' has unspecified value"},{I,l,"comparison has unspecified value"}},
		[g]=f,
		[h]="comparison between \'(.*?)\' and \'(.*?)\' has unspecified value",
		[i]=a,
		[j]={{nil,l,o}},
		[k]={"4e9f1379b9cd",1576544926,"If constant evaluation fails due to an unspecified pointer comparison,","If constant evaluation fails due to an unspecified pointer comparison,\nproduce a note saying that rather than the default \"evaluation failed\"\nnote."},
		[d]={{n,13080,"template <class SuccessCB, class AfterCB> static bool EvaluateComparisonBinaryOperator(EvalInfo &Info, const BinaryOperator *E, SuccessCB &&Success, AfterCB &&DoAfter) {\n  // ...\n  if (LHSTy->isPointerType() && RHSTy->isPointerType()) {\n    // ...\n    // Reject differing bases from the normal codepath; we special-case\n    // comparisons to null.\n    if (!HasSameBase(LHSValue, RHSValue)) {\n      // ...\n      // Inequalities and subtractions between unrelated pointers have\n      // unspecified or undefined behavior.\n      if (!IsEquality)\n        return DiagComparison(diag::note_constexpr_pointer_comparison_unspecified);"}},
		[m]={
			["clang/test/AST/Interp/functions.cpp"]={"clang/test/AST/Interp/functions.cpp:185:27: note: comparison between \'&f\' and \'&g\' has unspecified value","clang/test/AST/Interp/functions.cpp:192:27: note: comparison between \'&f\' and \'nullptr\' has unspecified value"}
		}
	},
	["note_constexpr_pointer_comparison_zero_sized"]={
		[b]={{nil,x,"note_constexpr_pointer_comparison_zero_sized"}},
		[c]={{nil,x,"comparison of pointers \'%0\' and \'%1\' to unrelated zero-sized objects"}},
		[e]={{nil,x,"comparison of pointers \'A\' and \'B\' to unrelated zero-sized objects"}},
		[g]=f,
		[h]="comparison of pointers \'(.*?)\' and \'(.*?)\' to unrelated zero\\-sized objects",
		[i]=a,
		[j]={{nil,x,o}},
		[k]={nb,1662843785,jb,ob},
		[d]={{n,13117,"template <class SuccessCB, class AfterCB> static bool EvaluateComparisonBinaryOperator(EvalInfo &Info, const BinaryOperator *E, SuccessCB &&Success, AfterCB &&DoAfter) {\n  // ...\n  if (LHSTy->isPointerType() && RHSTy->isPointerType()) {\n    // ...\n    // Reject differing bases from the normal codepath; we special-case\n    // comparisons to null.\n    if (!HasSameBase(LHSValue, RHSValue)) {\n      // ...\n      // We can\'t tell whether an object is at the same address as another\n      // zero sized object.\n      if ((RHSValue.Base && isZeroSized(LHSValue)) || (LHSValue.Base && isZeroSized(RHSValue)))\n        return DiagComparison(diag::note_constexpr_pointer_comparison_zero_sized);"}},
		[m]={
			[yb]={"clang/test/SemaCXX/constant-expression-cxx11.cpp:2216:24: note: comparison of pointers \'&start\' and \'&end\' to unrelated zero-sized objects"}
		}
	},
	["note_constexpr_pointer_constant_comparison"]={
		[b]={{nil,x,"note_constexpr_pointer_constant_comparison"}},
		[c]={{nil,x,"comparison of numeric address \'%0\' with pointer \'%1\' can only be performed at runtime"}},
		[e]={{nil,x,"comparison of numeric address \'A\' with pointer \'B\' can only be performed at runtime"}},
		[g]=f,
		[h]="comparison of numeric address \'(.*?)\' with pointer \'(.*?)\' can only be performed at runtime",
		[i]=a,
		[j]={{nil,x,o}},
		[k]={nb,1662843785,jb,ob},
		[d]={{n,13088,"template <class SuccessCB, class AfterCB> static bool EvaluateComparisonBinaryOperator(EvalInfo &Info, const BinaryOperator *E, SuccessCB &&Success, AfterCB &&DoAfter) {\n  // ...\n  if (LHSTy->isPointerType() && RHSTy->isPointerType()) {\n    // ...\n    // Reject differing bases from the normal codepath; we special-case\n    // comparisons to null.\n    if (!HasSameBase(LHSValue, RHSValue)) {\n      // ...\n      // A constant address may compare equal to the address of a symbol.\n      // The one exception is that address of an object cannot compare equal\n      // to a null pointer constant.\n      // TODO: Should we restrict this to actual null pointers, and exclude the\n      // case of zero cast to pointer type?\n      if ((!LHSValue.Base && !LHSValue.Offset.isZero()) || (!RHSValue.Base && !RHSValue.Offset.isZero()))\n        return DiagComparison(diag::note_constexpr_pointer_constant_comparison, !RHSValue.Base);"}}
	},
	["note_constexpr_pointer_subtraction_not_same_array"]={
		[b]="note_constexpr_pointer_subtraction_not_same_array",
		[c]="subtracted pointers are not elements of the same array",
		[e]="subtracted pointers are not elements of the same array",
		[g]=f,
		[h]="subtracted pointers are not elements of the same array",
		[i]=a,
		[j]=o,
		[k]={"84f6dcf2b52c",1328145417,"constexpr:","constexpr:\n  * support the gcc __builtin_constant_p() ? ... : ... folding hack in C++11\n  * check for unspecified values in pointer comparisons and pointer subtractions\n\nllvm-svn: 149578"},
		[d]={{n,13410,"bool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {\n  // ...\n  if (LHSTy->isPointerType() && RHSTy->isPointerType() && E->getOpcode() == BO_Sub) {\n    // ...\n    // C++11 [expr.add]p6:\n    //   Unless both pointers point to elements of the same array object, or\n    //   one past the last element of the array object, the behavior is\n    //   undefined.\n    if (!LHSDesignator.Invalid && !RHSDesignator.Invalid && !AreElementsOfSameArray(getType(LHSValue.Base), LHSDesignator, RHSDesignator))\n      Info.CCEDiag(E, diag::note_constexpr_pointer_subtraction_not_same_array);"}},
		[m]={
			[T]={"clang/test/CXX/expr/expr.const/p2-0x.cpp:222:36: note: subtracted pointers are not elements of the same array","clang/test/CXX/expr/expr.const/p2-0x.cpp:225:38: note: subtracted pointers are not elements of the same array","clang/test/CXX/expr/expr.const/p2-0x.cpp:227:40: note: subtracted pointers are not elements of the same array"}
		}
	},
	["note_constexpr_pointer_subtraction_zero_size"]={
		[b]="note_constexpr_pointer_subtraction_zero_size",
		[c]="subtraction of pointers to type %0 of zero size",
		[e]="subtraction of pointers to type A of zero size",
		[g]=f,
		[h]="subtraction of pointers to type (.*?) of zero size",
		[i]=a,
		[j]=o,
		[k]={"84c6b3d293d9",1378848854,"PR5683: Issue a warning when subtracting pointers to types of zero size, and","PR5683: Issue a warning when subtracting pointers to types of zero size, and\ntreat such subtractions as being non-constant. Patch by Serge Pavlov! With a\nfew tweaks by me.\n\nllvm-svn: 190439"},
		[d]={{n,13423,"bool IntExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) {\n  // ...\n  if (LHSTy->isPointerType() && RHSTy->isPointerType() && E->getOpcode() == BO_Sub) {\n    // ...\n    // As an extension, a type may have zero size (empty struct or union in\n    // C, array of zero length). Pointer subtraction in such cases has\n    // undefined behavior, so is not constant.\n    if (ElementSize.isZero()) {\n      Info.FFDiag(E, diag::note_constexpr_pointer_subtraction_zero_size) << ElementType;"}},
		[m]={
			[yb]={"clang/test/SemaCXX/constant-expression-cxx11.cpp:2091:24: note: subtraction of pointers to type \'int[0]\' of zero size","clang/test/SemaCXX/constant-expression-cxx11.cpp:2097:20: note: subtraction of pointers to type \'int[0]\' of zero size"}
		}
	},
	["note_constexpr_pointer_weak_comparison"]={
		[b]={{nil,x,"note_constexpr_pointer_weak_comparison"}},
		[c]={{nil,x,"comparison against address of weak declaration \'%0\' can only be performed at runtime"}},
		[e]={{nil,x,"comparison against address of weak declaration \'A\' can only be performed at runtime"}},
		[g]=f,
		[h]="comparison against address of weak declaration \'(.*?)\' can only be performed at runtime",
		[i]=a,
		[j]={{nil,x,o}},
		[k]={nb,1662843785,jb,ob},
		[d]={{n,13100,"template <class SuccessCB, class AfterCB> static bool EvaluateComparisonBinaryOperator(EvalInfo &Info, const BinaryOperator *E, SuccessCB &&Success, AfterCB &&DoAfter) {\n  // ...\n  if (LHSTy->isPointerType() && RHSTy->isPointerType()) {\n    // ...\n    // Reject differing bases from the normal codepath; we special-case\n    // comparisons to null.\n    if (!HasSameBase(LHSValue, RHSValue)) {\n      // ...\n      // We can\'t tell whether weak symbols will end up pointing to the same\n      // object.\n      if (IsWeakLValue(LHSValue) || IsWeakLValue(RHSValue))\n        return DiagComparison(diag::note_constexpr_pointer_weak_comparison, !IsWeakLValue(LHSValue));"}},
		[m]={
			["clang/test/SemaCXX/attr-weak.cpp"]={"clang/test/SemaCXX/attr-weak.cpp:47:59: note: comparison against address of weak declaration \'&weak_function\' can only be performed at runtime"}
		}
	},
	["note_constexpr_polymorphic_unknown_dynamic_type"]={
		[b]={{nil,q,"note_constexpr_polymorphic_unknown_dynamic_type"}},
		[c]={{nil,l,"%select{|||||virtual function called on|dynamic_cast applied to|typeid applied to|construction of|destruction of}0 object \'%1\' whose dynamic type is not constant"},{q,q,"%select{||||virtual function called on|dynamic_cast applied to|typeid applied to}0 object \'%1\' whose dynamic type is not constant"}},
		[e]={{nil,l,{{a,a,a,a,a,"virtual function called on","dynamic_cast applied to",J,rb,Y}," object \'B\' whose dynamic type is not constant"}},{q,q,{{a,a,a,a,"virtual function called on","dynamic_cast applied to",J}," object \'B\' whose dynamic type is not constant"}}},
		[g]=f,
		[h]="(?:|||||virtual function called on|dynamic_cast applied to|typeid applied to|construction of|destruction of) object \'(.*?)\' whose dynamic type is not constant",
		[i]=a,
		[j]={{nil,q,o}},
		[k]={"7bd54ab58665",1557951741,"[c++20] For P1327R1: support dynamic_cast in constant expression","[c++20] For P1327R1: support dynamic_cast in constant expression\nevaluation.\n\nllvm-svn: 360806"},
		[d]={{n,5672,"/// Check that we can access the notional vptr of an object / determine its\n/// dynamic type.\nstatic bool checkDynamicType(EvalInfo &Info, const Expr *E, const LValue &This, AccessKinds AK, bool Polymorphic) {\n  // ...\n  if (!Obj.Value) {\n    // The object is not usable in constant expressions, so we can\'t inspect\n    // its value to see if it\'s in-lifetime or what the active union members\n    // are. We can still check for a one-past-the-end lvalue.\n    if (This.Designator.isOnePastTheEnd() || This.Designator.isMostDerivedAnUnsizedArray()) {\n    // ...\n    } else if (Polymorphic) {\n      // ...\n      Info.FFDiag(E, diag::note_constexpr_polymorphic_unknown_dynamic_type) << AK << Val.getAsString(Info.Ctx, StarThisType);"}},
		[m]={
			[W]={"clang/test/SemaCXX/constant-expression-cxx2a.cpp:186:33: note: virtual function called on object \'d_not_constexpr\' whose dynamic type is not constant","clang/test/SemaCXX/constant-expression-cxx2a.cpp:312:18: note: typeid applied to object \'extern_b2\' whose dynamic type is not constant"}
		}
	},
	["note_constexpr_pseudo_destructor"]={
		[b]={{nil,l,"note_constexpr_pseudo_destructor"}},
		[c]={{nil,l,"pseudo-destructor call is not permitted in constant expressions until C++20"}},
		[e]={{nil,l,"pseudo-destructor call is not permitted in constant expressions until C++20"}},
		[g]=f,
		[h]="pseudo\\-destructor call is not permitted in constant expressions until C\\+\\+20",
		[i]=a,
		[j]={{nil,l,o}},
		[k]={"61422f96653f",1569615876,"For P0784R7: add support for explicit destructor calls and","For P0784R7: add support for explicit destructor calls and\npseudo-destructor calls in constant evaluation.\n\nllvm-svn: 373122"},
		[d]={{n,7705,"template <class Derived> class ExprEvaluatorBase : public ConstStmtVisitor<Derived, bool> {\n  // ...\n  bool handleCallExpr(const CallExpr *E, APValue &Result, const LValue *ResultSlot) {\n    // ...\n    // Extract function decl and \'this\' pointer from the callee.\n    if (CalleeType->isSpecificBuiltinType(BuiltinType::BoundMember)) {\n      // ...\n      if (const MemberExpr *ME = dyn_cast<MemberExpr>(Callee)) {\n      // ...\n      } else if (const BinaryOperator *BE = dyn_cast<BinaryOperator>(Callee)) {\n      // ...\n      } else if (const auto *PDE = dyn_cast<CXXPseudoDestructorExpr>(Callee)) {\n        if (!Info.getLangOpts().CPlusPlus20)\n          Info.CCEDiag(PDE, diag::note_constexpr_pseudo_destructor);"}},
		[m]={
			[T]={"clang/test/CXX/expr/expr.const/p2-0x.cpp:452:9: note: pseudo-destructor call is not permitted in constant expressions until C++20","clang/test/CXX/expr/expr.const/p2-0x.cpp:462:9: note: pseudo-destructor call is not permitted in constant expressions until C++20","clang/test/CXX/expr/expr.const/p2-0x.cpp:462:9: note: pseudo-destructor call is not permitted in constant expressions until C++20"}
		}
	},
	["note_constexpr_pure_virtual_call"]={
		[b]={{nil,q,"note_constexpr_pure_virtual_call"}},
		[c]={{nil,q,"pure virtual function %q0 called"}},
		[e]={{nil,q,"pure virtual function A called"}},
		[g]=f,
		[h]="pure virtual function (.*?) called",
		[i]=a,
		[j]={{nil,q,o}},
		[k]={"5c5be6b2f7fc",1557733330,"[c++20] P1064R0: Allow virtual function calls in constant expression","[c++20] P1064R0: Allow virtual function calls in constant expression\nevaluation.\n\nllvm-svn: 360559"},
		[d]={{n,5797,"/// Perform virtual dispatch.\nstatic const CXXMethodDecl *HandleVirtualDispatch(EvalInfo &Info, const Expr *E, LValue &This, const CXXMethodDecl *Found, llvm::SmallVectorImpl<QualType> &CovariantAdjustmentPath) {\n  // ...\n  // C++2a [class.abstract]p6:\n  //   the effect of making a virtual call to a pure virtual function [...] is\n  //   undefined\n  if (Callee->isPure()) {\n    Info.FFDiag(E, diag::note_constexpr_pure_virtual_call, 1) << Callee;"},{y,378,"bool CheckPure(InterpState &S, CodePtr OpPC, const CXXMethodDecl *MD) {\n  // ...\n  S.FFDiag(E, diag::note_constexpr_pure_virtual_call, 1) << MD;"}},
		[m]={
			[W]={"clang/test/SemaCXX/constant-expression-cxx2a.cpp:229:30: note: pure virtual function \'Virtual::Abstract::f\' called"}
		}
	},
	["note_constexpr_static_local"]={
		[b]={{nil,I,"note_constexpr_static_local"}},
		[c]={{nil,I,"control flows through the definition of a %select{static|thread_local}0 variable"}},
		[e]={{nil,I,{"control flows through the definition of a ",{"static","thread_local"}," variable"}}},
		[g]=f,
		[h]="control flows through the definition of a (?:static|thread_local) variable",
		[i]=a,
		[j]={{nil,I,o}},
		[k]={"683e83c56f98",1633469611,"[Clang][C++2b] P2242R3: Non-literal variables [...] in constexpr","[Clang][C++2b] P2242R3: Non-literal variables [...] in constexpr\n\nAllow goto, labelled statements as well as `static`, `thread_local`, and\nnon-literal variables in `constexpr` functions.\n\nAs specified. for all of the above (except labelled statements) constant\nevaluation of the construct still fails.\n\nFor `constexpr` bodies, the proposal is implemented with diagnostics as\na language extension in older language modes. For determination of\nwhether a lambda body satisfies the requirements for a constexpr\nfunction, the proposal is implemented only in C++2b mode to retain the\nsemantics of older modes for programs conforming to them.\n\nReviewed By: aaron.ballman, hubert.reinterpretcast, erichkeane\n\nDifferential Revision: https://reviews.llvm.org/D111400"},
		[d]={{n,5090,"static bool CheckLocalVariableDeclaration(EvalInfo &Info, const VarDecl *VD) {\n  // An expression E is a core constant expression unless the evaluation of E\n  // would evaluate one of the following: [C++23] - a control flow that passes\n  // through a declaration of a variable with static or thread storage duration\n  // unless that variable is usable in constant expressions.\n  if (VD->isLocalVarDecl() && VD->isStaticLocal() && !VD->isUsableInConstantExpressions(Info.Ctx)) {\n    Info.CCEDiag(VD->getLocation(), diag::note_constexpr_static_local) << (VD->getTSCSpec() == TSCS_unspecified ? 0 : 1) << VD;"}},
		[m]={
			["clang/test/SemaCXX/constant-expression-cxx2b.cpp"]={"clang/test/SemaCXX/constant-expression-cxx2b.cpp:14:20: note: control flows through the definition of a static variable","clang/test/SemaCXX/constant-expression-cxx2b.cpp:19:26: note: control flows through the definition of a thread_local variable","clang/test/SemaCXX/constant-expression-cxx2b.cpp:25:28: note: control flows through the definition of a thread_local variable","clang/test/SemaCXX/constant-expression-cxx2b.cpp:31:23: note: control flows through the definition of a thread_local variable","clang/test/SemaCXX/constant-expression-cxx2b.cpp:37:20: note: control flows through the definition of a static variable","clang/test/SemaCXX/constant-expression-cxx2b.cpp:42:26: note: control flows through the definition of a thread_local variable","clang/test/SemaCXX/constant-expression-cxx2b.cpp:67:20: note: control flows through the definition of a static variable","clang/test/SemaCXX/constant-expression-cxx2b.cpp:78:26: note: control flows through the definition of a thread_local variable","clang/test/SemaCXX/constant-expression-cxx2b.cpp:190:22: note: control flows through the definition of a static variable"}
		}
	},
	["note_constexpr_step_limit_exceeded"]={
		[b]="note_constexpr_step_limit_exceeded",
		[c]="constexpr evaluation hit maximum step limit; possible infinite loop?",
		[e]="constexpr evaluation hit maximum step limit; possible infinite loop?",
		[g]=f,
		[h]="constexpr evaluation hit maximum step limit; possible infinite loop\\?",
		[i]=a,
		[j]=o,
		[k]={"a3d3bd215bcd",1367979123,"C++1y: Add a step limit to constexpr evaluation, to catch runaway loops.","C++1y: Add a step limit to constexpr evaluation, to catch runaway loops.\n\nllvm-svn: 181388"},
		[d]={{n,1041,"/// EvalInfo - This is a private struct used by the evaluator to capture\n/// information about a subexpression as it is folded.  It retains information\n/// about the AST context, but also maintains information about the folded\n/// expression.\n///\n/// If an expression could be evaluated, it is still possible it is not a C\n/// \"integer constant expression\" or constant expression.  If not, this struct\n/// captures information about how and why not.\n///\n/// One bit of information passed *into* the request for constant folding\n/// indicates whether the subexpression is \"evaluated\" or not according to C\n/// rules.  For example, the RHS of (0 && foo()) is not evaluated.  We can\n/// evaluate the expression regardless of what the RHS is, but C only allows\n/// certain things in certain situations.\nclass EvalInfo : public interp::State {\n  // ...\n  bool nextStep(const Stmt *S) {\n    if (!StepsLeft) {\n      FFDiag(S->getBeginLoc(), diag::note_constexpr_step_limit_exceeded);"}},
		[m]={
			["clang/test/SemaCXX/constexpr-steps.cpp"]={"clang/test/SemaCXX/constexpr-steps.cpp:13:3: note: constexpr evaluation hit maximum step limit; possible infinite loop?"}
		}
	},
	["note_constexpr_stmt_expr_unsupported"]={
		[b]="note_constexpr_stmt_expr_unsupported",
		[c]="this use of statement expressions is not supported in a constant expression",
		[e]="this use of statement expressions is not supported in a constant expression",
		[g]=f,
		[h]="this use of statement expressions is not supported in a constant expression",
		[i]=a,
		[j]=o,
		[k]={"51f0317e527d",1371697205,"PR16377: Allow evaluation of statement expressions in constant evaluation,","PR16377: Allow evaluation of statement expressions in constant evaluation,\nwhy not. Apparently GCC supports this.\n\nllvm-svn: 184396"},
		[d]={{n,5077,"/// Evaluate a switch statement.\nstatic EvalStmtResult EvaluateSwitch(StmtResult &Result, EvalInfo &Info, const SwitchStmt *SS) {\n  // ...\n  case ESR_CaseNotFound:\n    // ...\n    Info.FFDiag(Found->getBeginLoc(), diag::note_constexpr_stmt_expr_unsupported);"},{n,8028,"template <class Derived> class ExprEvaluatorBase : public ConstStmtVisitor<Derived, bool> {\n  // ...\n  bool VisitStmtExpr(const StmtExpr *E) {\n    // ...\n    for (CompoundStmt::const_body_iterator BI = CS->body_begin(), BE = CS->body_end();\n      // ...\n      if (BI + 1 == BE) {\n        // ...\n        if (!FinalExpr) {\n          Info.FFDiag((*BI)->getBeginLoc(), diag::note_constexpr_stmt_expr_unsupported);"},{n,8043,"template <class Derived> class ExprEvaluatorBase : public ConstStmtVisitor<Derived, bool> {\n  // ...\n  bool VisitStmtExpr(const StmtExpr *E) {\n    // ...\n    for (CompoundStmt::const_body_iterator BI = CS->body_begin(), BE = CS->body_end();\n      // ...\n      if (ESR != ESR_Succeeded) {\n        // FIXME: If the statement-expression terminated due to \'return\',\n        // \'break\', or \'continue\', it would be nice to propagate that to\n        // the outer statement evaluation rather than bailing out.\n        if (ESR != ESR_Failed)\n          Info.FFDiag((*BI)->getBeginLoc(), diag::note_constexpr_stmt_expr_unsupported);"}},
		[m]={
			["clang/test/SemaCXX/constant-expression-cxx14.cpp"]={"clang/test/SemaCXX/constant-expression-cxx14.cpp:835:9: note: this use of statement expressions is not supported in a constant expression","clang/test/SemaCXX/constant-expression-cxx14.cpp:850:8: note: this use of statement expressions is not supported in a constant expression"}
		}
	},
	["note_constexpr_subobject_declared_here"]={
		[b]={{nil,q,"note_constexpr_subobject_declared_here"}},
		[c]={{nil,q,"subobject declared here"}},
		[e]={{nil,q,"subobject declared here"}},
		[g]=f,
		[h]="subobject declared here",
		[i]=a,
		[j]={{nil,q,o}},
		[k]={"31c69a3d6363",1558480520,"[c++20] P1330R0: permit simple-assignments that change the active member","[c++20] P1330R0: permit simple-assignments that change the active member\nof a union within constant expression evaluation.\n\nllvm-svn: 361329"},
		[d]={{n,2387,"static bool CheckEvaluationResult(CheckEvaluationResultKind CERK, EvalInfo &Info, SourceLocation DiagLoc, QualType Type, const APValue &Value, ConstantExprKind Kind, const FieldDecl *SubobjectDecl, CheckedTemporaries &CheckedTemps) {\n  if (!Value.hasValue()) {\n    if (SubobjectDecl) {\n      // ...\n      Info.Note(SubobjectDecl->getLocation(), diag::note_constexpr_subobject_declared_here);"},{y,389,"static void DiagnoseUninitializedSubobject(InterpState &S, const SourceInfo &SI, const FieldDecl *SubObjDecl) {\n  // ...\n  S.Note(SubObjDecl->getLocation(), diag::note_constexpr_subobject_declared_here);"}},
		[m]={
			["clang/test/SemaCXX/cxx2a-consteval.cpp"]={"clang/test/SemaCXX/cxx2a-consteval.cpp:759:7: note: subobject declared here","clang/test/SemaCXX/cxx2a-consteval.cpp:768:6: note: subobject declared here"}
		}
	},
	["note_constexpr_temporary_here"]={
		[b]="note_constexpr_temporary_here",
		[c]="temporary created here",
		[e]="temporary created here",
		[g]=f,
		[h]="temporary created here",
		[i]=a,
		[j]=o,
		[k]={zb,1323758398,Ab,Bb},
		[d]={{n,2125,"static void NoteLValueLocation(EvalInfo &Info, APValue::LValueBase Base) {\n  // ...\n  if (VD)\n  // ...\n  else if (const Expr *E = Base.dyn_cast<const Expr *>())\n    Info.Note(E->getExprLoc(), diag::note_constexpr_temporary_here);"},{n,4218,"/// Find the complete object to which an LValue refers.\nstatic CompleteObject findCompleteObject(EvalInfo &Info, const Expr *E, AccessKinds AK, const LValue &LVal, QualType LValType) {\n  // ...\n  if (Info.getLangOpts().CPlusPlus14 && LVal.Base == Info.EvaluatingDecl && lifetimeStartedInEvaluation(Info, LVal.Base)) {\n  // ...\n  } else if (const ValueDecl *D = LVal.Base.dyn_cast<const ValueDecl *>()) {\n  // ...\n  } else if (DynamicAllocLValue DA = LVal.Base.dyn_cast<DynamicAllocLValue>()) {\n  // ...\n  } else {\n    // ...\n    if (!Frame) {\n      if (const MaterializeTemporaryExpr *MTE = dyn_cast_or_null<MaterializeTemporaryExpr>(Base)) {\n        // ...\n        // C++20 [expr.const]p4: [DR2126]\n        //   An object or reference is usable in constant expressions if it is\n        //   - a temporary object of non-volatile const-qualified literal type\n        //     whose lifetime is extended to that of a variable that is usable\n        //     in constant expressions\n        //\n        // C++20 [expr.const]p5:\n        //  an lvalue-to-rvalue conversion [is not allowed unless it applies to]\n        //   - a non-volatile glvalue that refers to an object that is usable\n        //     in constant expressions, or\n        //   - a non-volatile glvalue of literal type that refers to a\n        //     non-volatile object whose lifetime began within the evaluation\n        //     of E;\n        //\n        // C++11 misses the \'began within the evaluation of e\' check and\n        // instead allows all temporaries, including things like:\n        //   int &&r = 1;\n        //   int x = ++r;\n        //   constexpr int k = r;\n        // Therefore we use the C++14-onwards rules in C++11 too.\n        //\n        // Note that temporaries whose lifetimes began while evaluating a\n        // variable\'s constructor are not usable while evaluating the\n        // corresponding destructor, not even if they\'re of const-qualified\n        // types.\n        if (!MTE->isUsableInConstantExpressions(Info.Ctx) && !lifetimeStartedInEvaluation(Info, LVal.Base)) {\n          // ...\n          Info.Note(MTE->getExprLoc(), diag::note_constexpr_temporary_here);"},{y,103,"static bool CheckTemporary(InterpState &S, CodePtr OpPC, const Pointer &Ptr, AccessKinds AK) {\n  if (auto ID = Ptr.getDeclID()) {\n    // ...\n    S.Note(Ptr.getDeclLoc(), diag::note_constexpr_temporary_here);"},{y,167,"bool CheckLive(InterpState &S, CodePtr OpPC, const Pointer &Ptr, AccessKinds AK) {\n  // ...\n  if (!Ptr.isLive()) {\n    // ...\n    if (IsTemp)\n      S.Note(Ptr.getDeclLoc(), diag::note_constexpr_temporary_here);"}},
		[m]={
			["clang/test/CXX/expr/expr.const/p6-2a.cpp"]={"clang/test/CXX/expr/expr.const/p6-2a.cpp:43:26: note: temporary created here"}
		}
	},
	["note_constexpr_this"]={
		[b]="note_constexpr_this",
		[c]="%select{|implicit }0use of \'this\' pointer is only allowed within the evaluation of a call to a \'constexpr\' member function",
		[e]={{nil,nil,{{a,"implicit "},"use of \'this\' pointer is only allowed within the evaluation of a call to a \'constexpr\' member function"}}},
		[g]=f,
		[h]="(?:|implicit )use of \'this\' pointer is only allowed within the evaluation of a call to a \'constexpr\' member function",
		[i]=a,
		[j]=o,
		[k]={"22a5d61b5d39",1404712813,"Add an explicit diagnostic for the case where an expression is not a constant","Add an explicit diagnostic for the case where an expression is not a constant\nexpression because it uses \'this\'. Inspired by PR20219 comment#2.\n\nllvm-svn: 212433"},
		[d]={{n,8809,"class PointerExprEvaluator : public ExprEvaluatorBase<PointerExprEvaluator> {\n  // ...\n  bool VisitCXXThisExpr(const CXXThisExpr *E) {\n    // ...\n    if (!Info.CurrentCall->This) {\n      if (Info.getLangOpts().CPlusPlus11)\n        Info.FFDiag(E, diag::note_constexpr_this) << E->isImplicit();"},{y,367,"bool CheckThis(InterpState &S, CodePtr OpPC, const Pointer &This) {\n  // ...\n  if (S.getLangOpts().CPlusPlus11)\n    S.FFDiag(Loc, diag::note_constexpr_this) << IsImplicit;"}},
		[m]={
			["clang/test/SemaCXX/cxx2a-consteval.cpp"]={"clang/test/SemaCXX/cxx2a-consteval.cpp:746:5: note: use of \'this\' pointer is only allowed within the evaluation of a call to a \'constexpr\' member function","clang/test/SemaCXX/cxx2a-consteval.cpp:751:5: note: implicit use of \'this\' pointer is only allowed within the evaluation of a call to a \'constexpr\' member function"}
		}
	},
	["note_constexpr_typeid_polymorphic"]={
		[b]="note_constexpr_typeid_polymorphic",
		[c]={{nil,l,"typeid applied to expression of polymorphic type %0 is not allowed in a constant expression in C++ standards before C++20"},{q,q,"typeid applied to expression of polymorphic type %0 is not allowed in a constant expression in C++ standards before C++2a"},{s,nil,"typeid applied to expression of polymorphic type %0 is not allowed in a constant expression"}},
		[e]={{nil,l,"typeid applied to expression of polymorphic type A is not allowed in a constant expression in C++ standards before C++20"},{q,q,"typeid applied to expression of polymorphic type A is not allowed in a constant expression in C++ standards before C++2a"},{s,nil,"typeid applied to expression of polymorphic type A is not allowed in a constant expression"}},
		[g]=f,
		[h]="typeid applied to expression of polymorphic type (.*?) is not allowed in a constant expression in C\\+\\+ standards before C\\+\\+20",
		[i]=a,
		[j]=o,
		[k]={"6e52514c5deb",1324988308,"constexpr: support for evaluation and codegen of typeid constants.","constexpr: support for evaluation and codegen of typeid constants.\n\nllvm-svn: 147290"},
		[d]={{n,8493,"bool LValueExprEvaluator::VisitCXXTypeidExpr(const CXXTypeidExpr *E) {\n  // ...\n  if (!E->isPotentiallyEvaluated()) {\n  // ...\n  } else {\n    if (!Info.Ctx.getLangOpts().CPlusPlus20) {\n      Info.CCEDiag(E, diag::note_constexpr_typeid_polymorphic) << E->getExprOperand()->getType() << E->getExprOperand()->getSourceRange();"}},
		[m]={
			[T]={"clang/test/CXX/expr/expr.const/p2-0x.cpp:487:41: note: typeid applied to expression of polymorphic type \'S\' is not allowed in a constant expression in C++ standards before C++20"}
		}
	},
	["note_constexpr_uninitialized"]={
		[b]="note_constexpr_uninitialized",
		[c]="subobject %select{of type |}0%1 is not initialized",
		[e]={{nil,nil,{"subobject ",{"of type ",a},"B is not initialized"}},{x,nil,{{a,"sub"},"object of type B is not initialized"}}},
		[g]=f,
		[h]="subobject (?:of type |)(.*?) is not initialized",
		[i]=a,
		[j]=o,
		[k]={"1a90f5956d15",1371577911,"PR14503: Don\'t assert if a constexpr constructor temploid instantiates to a","PR14503: Don\'t assert if a constexpr constructor temploid instantiates to a\nconstructor that does not initialize all members, and that constructor is used\nto initialize a global.\n\nllvm-svn: 184211"},
		[d]={{n,2384,"static bool CheckEvaluationResult(CheckEvaluationResultKind CERK, EvalInfo &Info, SourceLocation DiagLoc, QualType Type, const APValue &Value, ConstantExprKind Kind, const FieldDecl *SubobjectDecl, CheckedTemporaries &CheckedTemps) {\n  if (!Value.hasValue()) {\n    if (SubobjectDecl) {\n      Info.FFDiag(DiagLoc, diag::note_constexpr_uninitialized) << /*(name)*/ 1 << SubobjectDecl;"},{n,2389,"static bool CheckEvaluationResult(CheckEvaluationResultKind CERK, EvalInfo &Info, SourceLocation DiagLoc, QualType Type, const APValue &Value, ConstantExprKind Kind, const FieldDecl *SubobjectDecl, CheckedTemporaries &CheckedTemps) {\n  if (!Value.hasValue()) {\n    if (SubobjectDecl) {\n    // ...\n    } else {\n      Info.FFDiag(DiagLoc, diag::note_constexpr_uninitialized) << /*of type*/ 0 << Type;"},{y,386,"static void DiagnoseUninitializedSubobject(InterpState &S, const SourceInfo &SI, const FieldDecl *SubObjDecl) {\n  // ...\n  S.FFDiag(SI, diag::note_constexpr_uninitialized) << /*(name)*/ 1 << SubObjDecl;"}},
		[m]={
			["clang/test/SemaCXX/cxx2a-consteval.cpp"]={"clang/test/SemaCXX/cxx2a-consteval.cpp:763:3: note: subobject \'Val\' is not initialized","clang/test/SemaCXX/cxx2a-consteval.cpp:772:8: note: subobject \'Val\' is not initialized"}
		}
	},
	["note_constexpr_uninitialized_base"]={
		[b]="note_constexpr_uninitialized_base",
		[c]="constructor of base class %0 is not called",
		[e]="constructor of base class A is not called",
		[g]=f,
		[h]="constructor of base class (.*?) is not called",
		[i]=a,
		[j]=o,
		[k]={"8c5c652ed71b",1691496625,"[clang][ExprConstant] Fix crash on uninitialized base class subobject","[clang][ExprConstant] Fix crash on uninitialized base class subobject\n\nThis patch fixes the reported regression caused by D146358 through adding notes about an uninitialized base class when we diagnose uninitialized constructor.\n\nThis also changes the wording from the old one in order to make it clear that the uninitialized subobject is a base class and its constructor is not called.\nWording changes:\nBEFORE: `subobject of type \'Base\' is not initialized`\nAFTER: `constructor of base class \'Base\' is not called`\n\nFixes https://github.com/llvm/llvm-project/issues/63496\n\nReviewed By: aaron.ballman\nDifferential Revision: https://reviews.llvm.org/D153969"},
		[d]={{n,2430,"static bool CheckEvaluationResult(CheckEvaluationResultKind CERK, EvalInfo &Info, SourceLocation DiagLoc, QualType Type, const APValue &Value, ConstantExprKind Kind, const FieldDecl *SubobjectDecl, CheckedTemporaries &CheckedTemps) {\n  // ...\n  if (Value.isStruct()) {\n    // ...\n    if (const CXXRecordDecl *CD = dyn_cast<CXXRecordDecl>(RD)) {\n      // ...\n      for (const CXXBaseSpecifier &BS : CD->bases()) {\n        // ...\n        if (!BaseValue.hasValue()) {\n          // ...\n          Info.FFDiag(TypeBeginLoc, diag::note_constexpr_uninitialized_base) << BS.getType() << SourceRange(TypeBeginLoc, BS.getEndLoc());"}},
		[m]={
			["clang/test/SemaCXX/constexpr-subobj-initialization.cpp"]={"clang/test/SemaCXX/constexpr-subobj-initialization.cpp:8:14: note: constructor of base class \'DelBase\' is not called","clang/test/SemaCXX/constexpr-subobj-initialization.cpp:8:14: note: constructor of base class \'DelBase\' is not called","clang/test/SemaCXX/constexpr-subobj-initialization.cpp:18:12: note: constructor of base class \'Base\' is not called","clang/test/SemaCXX/constexpr-subobj-initialization.cpp:24:12: note: constructor of base class \'Base\' is not called"}
		}
	},
	["note_constexpr_union_member_change_during_init"]={
		[b]={{nil,r,"note_constexpr_union_member_change_during_init"}},
		[c]={{nil,r,"assignment would change active union member during the initialization of a different member of the same union"}},
		[e]={{nil,r,"assignment would change active union member during the initialization of a different member of the same union"}},
		[g]=f,
		[h]="assignment would change active union member during the initialization of a different member of the same union",
		[i]=a,
		[j]={{nil,r,o}},
		[k]={ec,1579695612,pc,hc},
		[d]={{n,5999,"struct StartLifetimeOfUnionMemberHandler {\n  // ...\n  bool found(APValue &Subobj, QualType SubobjType) {\n    // ...\n    if (declaresSameEntity(Subobj.getUnionField(), Field)) {\n    // ...\n    } else if (DuringInit) {\n      // ...\n      Info.FFDiag(LHSExpr, diag::note_constexpr_union_member_change_during_init);"}},
		[m]={
			[W]={"clang/test/SemaCXX/constant-expression-cxx2a.cpp:1377:9: note: assignment would change active union member during the initialization of a different member of the same union","clang/test/SemaCXX/constant-expression-cxx2a.cpp:1388:27: note: assignment would change active union member during the initialization of a different member of the same union","clang/test/SemaCXX/constant-expression-cxx2a.cpp:1392:28: note: assignment would change active union member during the initialization of a different member of the same union"}
		}
	},
	["note_constexpr_unsized_array_indexed"]={
		[b]={{nil,E,"note_constexpr_unsized_array_indexed"}},
		[c]={{nil,E,"indexing of array without known bound is not allowed in a constant expression"}},
		[e]={{nil,E,"indexing of array without known bound is not allowed in a constant expression"}},
		[g]=f,
		[h]="indexing of array without known bound is not allowed in a constant expression",
		[i]=a,
		[j]={{nil,E,o}},
		[k]={"2cd56048239f",1503971533,"Improve constant expression evaluation of arrays of unknown bound.","Improve constant expression evaluation of arrays of unknown bound.\n\nThe standard is not clear on how these are supposed to be handled, so we\nconservatively treat as non-constant any cases whose value is unknown or whose\nevaluation might result in undefined behavior.\n\nllvm-svn: 311970"},
		[d]={{n,1424,"void SubobjectDesignator::diagnoseUnsizedArrayPointerArithmetic(EvalInfo &Info, const Expr *E) {\n  Info.CCEDiag(E, diag::note_constexpr_unsized_array_indexed);"},{y,143,"bool CheckArray(InterpState &S, CodePtr OpPC, const Pointer &Ptr) {\n  // ...\n  S.FFDiag(E, diag::note_constexpr_unsized_array_indexed);"}},
		[m]={
			["clang/test/SemaCXX/constexpr-array-unknown-bound.cpp"]={"clang/test/SemaCXX/constexpr-array-unknown-bound.cpp:20:27: note: indexing of array without known bound is not allowed in a constant expression"}
		}
	},
	["note_constexpr_unsupported_destruction"]={
		[b]={{nil,l,"note_constexpr_unsupported_destruction"}},
		[c]={{nil,l,"non-trivial destruction of type %0 in a constant expression is not supported"}},
		[e]={{nil,l,"non-trivial destruction of type A in a constant expression is not supported"}},
		[g]=f,
		[h]="non\\-trivial destruction of type (.*?) in a constant expression is not supported",
		[i]=a,
		[j]={{nil,l,o}},
		[k]={"457226e02a6e",1569210524,"For P0784R7: add support for constexpr destructors, and call them as","For P0784R7: add support for constexpr destructors, and call them as\nappropriate during constant evaluation.\n\nNote that the evaluator is sometimes invoked on incomplete expressions.\nIn such cases, if an object is constructed but we never reach the point\nwhere it would be destroyed (and it has non-trivial destruction), we\ntreat the expression as having an unmodeled side-effect.\n\nllvm-svn: 372538"},
		[d]={{n,6540,"static bool HandleDestructionImpl(EvalInfo &Info, SourceLocation CallLoc, const LValue &This, APValue &Value, QualType T) {\n  // ...\n  if (!RD) {\n    if (T.isDestructedType()) {\n      Info.FFDiag(CallLoc, diag::note_constexpr_unsupported_destruction) << T;"}}
	},
	["note_constexpr_unsupported_flexible_array"]={
		[b]={{nil,I,"note_constexpr_unsupported_flexible_array"}},
		[c]={{nil,I,"flexible array initialization is not yet supported"}},
		[e]={{nil,I,"flexible array initialization is not yet supported"}},
		[g]=f,
		[h]="flexible array initialization is not yet supported",
		[i]=a,
		[j]={{nil,I,o}},
		[k]={"ec273d3e3a8c",1643408541,"Add a warning for not packing non-POD members in packed structs","Add a warning for not packing non-POD members in packed structs\n\nDifferential Revision: https://reviews.llvm.org/D118511"},
		[d]={{n,10128,"bool RecordExprEvaluator::VisitCXXParenListOrInitListExpr(const Expr *ExprToVisit, ArrayRef<Expr *> Args) {\n  // ...\n  // Initialize members.\n  for (const auto *Field : RD->fields()) {\n    // ...\n    if (Field->getType()->isIncompleteArrayType()) {\n      if (auto *CAT = Info.Ctx.getAsConstantArrayType(Init->getType())) {\n        if (!CAT->getSize().isZero()) {\n          // ...\n          Info.FFDiag(Init, diag::note_constexpr_unsupported_flexible_array);"}},
		[m]={
			[yb]={"clang/test/SemaCXX/constant-expression-cxx11.cpp:2419:23: note: flexible array initialization is not yet supported"}
		}
	},
	["note_constexpr_unsupported_layout"]={
		[b]={{nil,r,"note_constexpr_unsupported_layout"}},
		[c]={{nil,r,"type %0 has unexpected layout"}},
		[e]={{nil,r,"type A has unexpected layout"}},
		[g]=f,
		[h]="type (.*?) has unexpected layout",
		[i]=a,
		[j]={{nil,r,o}},
		[k]={ec,1579695612,pc,hc},
		[d]={{n,4060,"/// Find the complete object to which an LValue refers.\nstatic CompleteObject findCompleteObject(EvalInfo &Info, const Expr *E, AccessKinds AK, const LValue &LVal, QualType LValType) {\n  // ...\n  if (Info.getLangOpts().CPlusPlus14 && LVal.Base == Info.EvaluatingDecl && lifetimeStartedInEvaluation(Info, LVal.Base)) {\n  // ...\n  } else if (const ValueDecl *D = LVal.Base.dyn_cast<const ValueDecl *>()) {\n    // Allow reading from a GUID declaration.\n    if (auto *GD = dyn_cast<MSGuidDecl>(D)) {\n      // ...\n      if (V.isAbsent()) {\n        Info.FFDiag(E, diag::note_constexpr_unsupported_layout) << GD->getType();"},{n,10239,"bool RecordExprEvaluator::VisitCXXStdInitializerListExpr(const CXXStdInitializerListExpr *E) {\n  // ...\n  auto InvalidType = [&] {\n    Info.FFDiag(E, diag::note_constexpr_unsupported_layout) << E->getType();"}},
		[m]={
			["clang/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp"]={"clang/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp:377:22: note: type \'const std::initializer_list<weird>\' has unexpected layout"}
		}
	},
	["note_constexpr_unsupported_temporary_nontrivial_dtor"]={
		[b]={{nil,u,"note_constexpr_unsupported_temporary_nontrivial_dtor"}},
		[c]={{nil,u,"non-trivial destruction of lifetime-extended temporary with type %0 used in the result of a constant expression is not yet supported"}},
		[e]={{nil,u,"non-trivial destruction of lifetime-extended temporary with type A used in the result of a constant expression is not yet supported"}},
		[g]=f,
		[h]="non\\-trivial destruction of lifetime\\-extended temporary with type (.*?) used in the result of a constant expression is not yet supported",
		[i]=a,
		[j]={{nil,u,o}},
		[k]={"2e204e23911b",1601401476,"[clang] Enable support for #pragma STDC FENV_ACCESS","[clang] Enable support for #pragma STDC FENV_ACCESS\n\nReviewers: rjmccall, rsmith, sepavloff\n\nDifferential Revision: https://reviews.llvm.org/D87528"},
		[d]={{n,2288,"/// Check that this reference or pointer core constant expression is a valid\n/// value for an address or reference constant expression. Return true if we\n/// can fold this expression, whether or not it\'s a constant expression.\nstatic bool CheckLValueConstantExpression(EvalInfo &Info, SourceLocation Loc, QualType Type, const LValue &LVal, ConstantExprKind Kind, CheckedTemporaries &CheckedTemps) {\n  // ...\n  if (BaseVD) {\n  // ...\n  } else if (const auto *MTE = dyn_cast_or_null<MaterializeTemporaryExpr>(BaseE)) {\n    if (CheckedTemps.insert(MTE).second) {\n      // ...\n      if (TempType.isDestructedType()) {\n        Info.FFDiag(MTE->getExprLoc(), diag::note_constexpr_unsupported_temporary_nontrivial_dtor) << TempType;"}},
		[m]={
			[W]={"clang/test/SemaCXX/constant-expression-cxx2a.cpp:1294:21: note: non-trivial destruction of lifetime-extended temporary with type \'A\' used in the result of a constant expression is not yet supported","clang/test/SemaCXX/constant-expression-cxx2a.cpp:1297:21: note: non-trivial destruction of lifetime-extended temporary with type \'A\' used in the result of a constant expression is not yet supported","clang/test/SemaCXX/constant-expression-cxx2a.cpp:1300:26: note: non-trivial destruction of lifetime-extended temporary with type \'const A\' used in the result of a constant expression is not yet supported"}
		}
	},
	["note_constexpr_unsupported_unsized_array"]={
		[b]={{nil,E,"note_constexpr_unsupported_unsized_array"}},
		[c]={{nil,E,"array-to-pointer decay of array member without known bound is not supported"}},
		[e]={{nil,E,"array-to-pointer decay of array member without known bound is not supported"}},
		[g]=f,
		[h]="array\\-to\\-pointer decay of array member without known bound is not supported",
		[i]=a,
		[j]={{nil,E,o}},
		[k]={"2cd56048239f",1503971533,"Improve constant expression evaluation of arrays of unknown bound.","Improve constant expression evaluation of arrays of unknown bound.\n\nThe standard is not clear on how these are supposed to be handled, so we\nconservatively treat as non-constant any cases whose value is unknown or whose\nevaluation might result in undefined behavior.\n\nllvm-svn: 311970"},
		[d]={{n,1672,"#endif\n  // ...\n  void addUnsizedArray(EvalInfo &Info, const Expr *E, QualType ElemTy) {\n    if (!Designator.Entries.empty()) {\n      Info.CCEDiag(E, diag::note_constexpr_unsupported_unsized_array);"}},
		[m]={
			["clang/test/SemaCXX/constexpr-array-unknown-bound.cpp"]={"clang/test/SemaCXX/constexpr-array-unknown-bound.cpp:15:21: note: array-to-pointer decay of array member without known bound is not supported","clang/test/SemaCXX/constexpr-array-unknown-bound.cpp:16:21: note: array-to-pointer decay of array member without known bound is not supported"}
		}
	},
	["note_constexpr_use_uninit_reference"]={
		[b]="note_constexpr_use_uninit_reference",
		[c]="use of reference outside its lifetime is not allowed in a constant expression",
		[e]="use of reference outside its lifetime is not allowed in a constant expression",
		[g]=f,
		[h]="use of reference outside its lifetime is not allowed in a constant expression",
		[i]=a,
		[j]=o,
		[k]={"08d6a2cc7a58",1374649917,"C++1y: track object lifetime during constexpr evaluation, and don\'t allow","C++1y: track object lifetime during constexpr evaluation, and don\'t allow\nobjects to be used once their lifetimes end. This completes the C++1y\nconstexpr extensions.\n\nllvm-svn: 187025"},
		[d]={{n,8379,"bool LValueExprEvaluator::VisitVarDecl(const Expr *E, const VarDecl *VD) {\n  // ...\n  if (!V->hasValue()) {\n    // FIXME: Is it possible for V to be indeterminate here? If so, we should\n    // adjust the diagnostic to say that.\n    if (!Info.checkingPotentialConstantExpression())\n      Info.FFDiag(E, diag::note_constexpr_use_uninit_reference);"}},
		[m]={
			[yb]={"clang/test/SemaCXX/constant-expression-cxx11.cpp:1964:24: note: use of reference outside its lifetime is not allowed in a constant expression"}
		}
	},
	["note_constexpr_var_init_non_constant"]={
		[b]="note_constexpr_var_init_non_constant",
		[c]="initializer of %0 is not a constant expression",
		[e]="initializer of A is not a constant expression",
		[g]=f,
		[h]="initializer of (.*?) is not a constant expression",
		[i]=a,
		[j]=o,
		[k]={"d0b4dd656d11",1324275561,"constexpr handling improvements. Produce detailed diagnostics when a \'constexpr\'","constexpr handling improvements. Produce detailed diagnostics when a \'constexpr\'\nvariable is initialized by a non-constant expression, and pass in the variable\nbeing declared so that earlier-initialized fields\' values can be used.\n\nRearrange VarDecl init evaluation to make this possible, and in so doing fix a\nlong-standing issue in our C++ constant expression handling, where we would\nmishandle cases like:\n\n  extern const int a;\n  const int n = a;\n  const int a = 5;\n  int arr[n];\n\nHere, n is not initialized by a constant expression, so can\'t be used in an ICE,\neven though the initialization expression would be an ICE if it appeared later\nin the TU. This requires computing whether the initializer is an ICE eagerly,\nand saving that information in PCH files.\n\nllvm-svn: 146856"},
		[d]={{n,3368,"/// Try to evaluate the initializer for a variable declaration.\n///\n/// \\param Info   Information about the ongoing evaluation.\n/// \\param E      An expression to be used when printing diagnostics.\n/// \\param VD     The variable whose initializer should be obtained.\n/// \\param Version The version of the variable within the frame.\n/// \\param Frame  The frame in which the variable was created. Must be null\n///               if this variable is not local to the evaluation.\n/// \\param Result Filled in with a pointer to the value of the variable.\nstatic bool evaluateVarDeclInit(EvalInfo &Info, const Expr *E, const VarDecl *VD, CallStackFrame *Frame, unsigned Version, APValue *&Result) {\n  // ...\n  // Check that we can fold the initializer. In C++, we will have already done\n  // this in the cases where it matters for conformance.\n  if (!VD->evaluateValue()) {\n    Info.FFDiag(E, diag::note_constexpr_var_init_non_constant, 1) << VD;"},{n,3386,"/// Try to evaluate the initializer for a variable declaration.\n///\n/// \\param Info   Information about the ongoing evaluation.\n/// \\param E      An expression to be used when printing diagnostics.\n/// \\param VD     The variable whose initializer should be obtained.\n/// \\param Version The version of the variable within the frame.\n/// \\param Frame  The frame in which the variable was created. Must be null\n///               if this variable is not local to the evaluation.\n/// \\param Result Filled in with a pointer to the value of the variable.\nstatic bool evaluateVarDeclInit(EvalInfo &Info, const Expr *E, const VarDecl *VD, CallStackFrame *Frame, unsigned Version, APValue *&Result) {\n  // ...\n  // Check that the variable is actually usable in constant expressions. For a\n  // const integral variable or a reference, we might have a non-constant\n  // initializer that we can nonetheless evaluate the initializer for. Such\n  // variables are not usable in constant expressions. In C++98, the\n  // initializer also syntactically needs to be an ICE.\n  //\n  // FIXME: We don\'t diagnose cases that aren\'t potentially usable in constant\n  // expressions here; doing so would regress diagnostics for things like\n  // reading from a volatile constexpr variable.\n  if ((Info.getLangOpts().CPlusPlus && !VD->hasConstantInitialization() && VD->mightBeUsableInConstantExpressions(Info.Ctx)) || ((Info.getLangOpts().CPlusPlus || Info.getLangOpts().OpenCL) && !Info.getLangOpts().CPlusPlus11 && !VD->hasICEInitializer(Info.Ctx))) {\n    Info.CCEDiag(E, diag::note_constexpr_var_init_non_constant, 1) << VD;"}},
		[m]={
			["clang/test/SemaCXX/c99-variable-length-array.cpp"]={"clang/test/SemaCXX/c99-variable-length-array.cpp:104:15: note: initializer of \'value\' is not a constant expression","clang/test/SemaCXX/c99-variable-length-array.cpp:104:15: note: initializer of \'value\' is not a constant expression"}
		}
	},
	["note_constexpr_var_init_unknown"]={
		[b]={{nil,r,"note_constexpr_var_init_unknown"}},
		[c]={{nil,r,"initializer of %0 is unknown"}},
		[e]={{nil,r,"initializer of A is unknown"}},
		[g]=f,
		[h]="initializer of (.*?) is unknown",
		[i]=a,
		[j]={{nil,r,o}},
		[k]={"00068c452a59",1594250761,"Improve diagnostics for constant evaluation that fails because a","Improve diagnostics for constant evaluation that fails because a\nvariable\'s initializer is not known.\n\nThe hope is that a better diagnostic for this case will reduce the rate\nat which duplicates of non-bug PR41093 are reported."},
		[d]={{n,3341,"/// Try to evaluate the initializer for a variable declaration.\n///\n/// \\param Info   Information about the ongoing evaluation.\n/// \\param E      An expression to be used when printing diagnostics.\n/// \\param VD     The variable whose initializer should be obtained.\n/// \\param Version The version of the variable within the frame.\n/// \\param Frame  The frame in which the variable was created. Must be null\n///               if this variable is not local to the evaluation.\n/// \\param Result Filled in with a pointer to the value of the variable.\nstatic bool evaluateVarDeclInit(EvalInfo &Info, const Expr *E, const VarDecl *VD, CallStackFrame *Frame, unsigned Version, APValue *&Result) {\n  // ...\n  if (!Init) {\n    // Don\'t diagnose during potential constant expression checking; an\n    // initializer might be added later.\n    if (!Info.checkingPotentialConstantExpression()) {\n      Info.FFDiag(E, diag::note_constexpr_var_init_unknown, 1) << VD;"}},
		[m]={
			["clang/test/SemaCXX/c99-variable-length-array.cpp"]={"clang/test/SemaCXX/c99-variable-length-array.cpp:156:13: note: initializer of \'sz\' is unknown"}
		}
	},
	["note_constexpr_var_init_weak"]={
		[b]={{nil,r,"note_constexpr_var_init_weak"}},
		[c]={{nil,r,"initializer of weak variable %0 is not considered constant because it may be different at runtime"}},
		[e]={{nil,r,"initializer of weak variable A is not considered constant because it may be different at runtime"}},
		[g]=f,
		[h]="initializer of weak variable (.*?) is not considered constant because it may be different at runtime",
		[i]=a,
		[j]={{nil,r,o}},
		[k]={"00068c452a59",1594250761,"Improve diagnostics for constant evaluation that fails because a","Improve diagnostics for constant evaluation that fails because a\nvariable\'s initializer is not known.\n\nThe hope is that a better diagnostic for this case will reduce the rate\nat which duplicates of non-bug PR41093 are reported."},
		[d]={{n,3393,"/// Try to evaluate the initializer for a variable declaration.\n///\n/// \\param Info   Information about the ongoing evaluation.\n/// \\param E      An expression to be used when printing diagnostics.\n/// \\param VD     The variable whose initializer should be obtained.\n/// \\param Version The version of the variable within the frame.\n/// \\param Frame  The frame in which the variable was created. Must be null\n///               if this variable is not local to the evaluation.\n/// \\param Result Filled in with a pointer to the value of the variable.\nstatic bool evaluateVarDeclInit(EvalInfo &Info, const Expr *E, const VarDecl *VD, CallStackFrame *Frame, unsigned Version, APValue *&Result) {\n  // ...\n  // Never use the initializer of a weak variable, not even for constant\n  // folding. We can\'t be sure that this is the definition that will be used.\n  if (VD->isWeak()) {\n    Info.FFDiag(E, diag::note_constexpr_var_init_weak) << VD;"}},
		[m]={
			["clang/test/SemaCXX/weak-init.cpp"]={"clang/test/SemaCXX/weak-init.cpp:5:15: note: initializer of weak variable \'W1\' is not considered constant because it may be different at runtime","clang/test/SemaCXX/weak-init.cpp:14:20: note: initializer of weak variable \'W3\' is not considered constant because it may be different at runtime"}
		}
	},
	["note_constexpr_virtual_base"]={
		[b]="note_constexpr_virtual_base",
		[c]="cannot construct object of type %0 with virtual base class in a constant expression",
		[e]="cannot construct object of type A with virtual base class in a constant expression",
		[g]=f,
		[h]="cannot construct object of type (.*?) with virtual base class in a constant expression",
		[i]=a,
		[j]=o,
		[k]={"3607ffee5cca",1329105243,"Update constexpr implementation to match CWG\'s chosen approach for core issues","Update constexpr implementation to match CWG\'s chosen approach for core issues\n1358, 1360, 1452 and 1453.\n - Instantiations of constexpr functions are always constexpr. This removes the\n   need for separate declaration/definition checking, which is now gone.\n - This makes it possible for a constexpr function to be virtual, if they are\n   only dependently virtual. Virtual calls to such functions are not constant\n   expressions.\n - Likewise, it\'s now possible for a literal type to have virtual base classes.\n   A constexpr constructor for such a type cannot actually produce a constant\n   expression, though, so add a special-case diagnostic for a constructor call\n   to such a type rather than trying to evaluate it.\n - Classes with trivial default constructors (for which value initialization can\n   produce a fully-initialized value) are considered literal types.\n - Classes with volatile members are not literal types.\n - constexpr constructors can be members of non-literal types. We do not yet use\n   static initialization for global objects constructed in this way.\n\nllvm-svn: 150359"},
		[d]={{n,6274,"/// Evaluate a constructor call.\nstatic bool HandleConstructorCall(const Expr *E, const LValue &This, CallRef Call, const CXXConstructorDecl *Definition, EvalInfo &Info, APValue &Result) {\n  // ...\n  if (RD->getNumVBases()) {\n    Info.FFDiag(CallLoc, diag::note_constexpr_virtual_base) << RD;"},{n,6549,"static bool HandleDestructionImpl(EvalInfo &Info, SourceLocation CallLoc, const LValue &This, APValue &Value, QualType T) {\n  // ...\n  if (RD->getNumVBases()) {\n    Info.FFDiag(CallLoc, diag::note_constexpr_virtual_base) << RD;"},{n,9974,"bool RecordExprEvaluator::ZeroInitialization(const Expr *E, QualType T) {\n  // ...\n  if (isa<CXXRecordDecl>(RD) && cast<CXXRecordDecl>(RD)->getNumVBases()) {\n    Info.FFDiag(E, diag::note_constexpr_virtual_base) << RD;"}},
		[m]={
			["clang/test/CXX/basic/basic.types/p10.cpp"]={"clang/test/CXX/basic/basic.types/p10.cpp:102:25: note: cannot construct object of type \'DerivedFromVBase<HasVBase>\' with virtual base class in a constant expression"}
		}
	},
	["note_constexpr_virtual_base_here"]={
		[b]="note_constexpr_virtual_base_here",
		[c]="virtual base class declared here",
		[e]="virtual base class declared here",
		[g]=f,
		[h]="virtual base class declared here",
		[i]=a,
		[j]=p,
		[k]={"eb3c10c248ac",1317436288,"constexpr: semantic checking for constexpr functions and constructors. Based in","constexpr: semantic checking for constexpr functions and constructors. Based in\npart on patches by Peter Collingbourne.\n\nWe diverge from the C++11 standard in a few areas, mostly related to checking\nconstexpr function declarations, and not just definitions. See WG21 paper\nN3308=11-0078 for details.\n\nFunction invocation substitution is not available in this patch; constexpr\nfunctions cannot yet be used from within constant expressions.\n\nllvm-svn: 140926"},
		[d]={{t,1793,"// Check whether a function declaration satisfies the requirements of a\n// constexpr function definition or a constexpr constructor definition. If so,\n// return true. If not, produce appropriate diagnostics (unless asked not to by\n// Kind) and return false.\n//\n// This implements C++11 [dcl.constexpr]p3,4, as amended by DR1360.\nbool Sema::CheckConstexprFunctionDefinition(const FunctionDecl *NewFD, CheckConstexprKind Kind) {\n  // ...\n  if (MD && MD->isInstance()) {\n    // ...\n    if (RD->getNumVBases()) {\n      // ...\n      for (const auto &I : RD->vbases())\n        Diag(I.getBeginLoc(), diag::note_constexpr_virtual_base_here) << I.getSourceRange();"},{"clang/lib/Sema/SemaType.cpp",9342,"/// Ensure that the type T is a literal type.\n///\n/// This routine checks whether the type @p T is a literal type. If @p T is an\n/// incomplete type, an attempt is made to complete it. If @p T is a literal\n/// type, or @p AllowIncompleteType is true and @p T is an incomplete type,\n/// returns false. Otherwise, this routine issues the diagnostic @p PD (giving\n/// it the type @p T), along with notes explaining why the type is not a\n/// literal type, and returns true.\n///\n/// @param Loc  The location in the source that the non-literal type\n/// diagnostic should refer to.\n///\n/// @param T  The type that this routine is examining for literalness.\n///\n/// @param Diagnoser Emits a diagnostic if T is not a literal type.\n///\n/// @returns @c true if @p T is not a literal type and a diagnostic was emitted,\n/// @c false otherwise.\nbool Sema::RequireLiteralType(SourceLocation Loc, QualType T, TypeDiagnoser &Diagnoser) {\n  // ...\n  // If the class has virtual base classes, then it\'s not an aggregate, and\n  // cannot have any constexpr constructors or a trivial default constructor,\n  // so is non-literal. This is better to diagnose than the resulting absence\n  // of constexpr constructors.\n  if (RD->getNumVBases()) {\n    // ...\n    for (const auto &I : RD->vbases())\n      Diag(I.getBeginLoc(), diag::note_constexpr_virtual_base_here) << I.getSourceRange();"}},
		[m]={
			["clang/test/CXX/special/class.ctor/p6-0x.cpp"]={"clang/test/CXX/special/class.ctor/p6-0x.cpp:24:24: note: virtual base class declared here"}
		}
	},
	["note_constexpr_virtual_call"]={
		[b]="note_constexpr_virtual_call",
		[c]={{nil,l,"cannot evaluate call to virtual function in a constant expression in C++ standards before C++20"},{q,q,"cannot evaluate call to virtual function in a constant expression in C++ standards before C++2a"},{s,nil,"cannot evaluate virtual function call in a constant expression"}},
		[e]={{nil,l,"cannot evaluate call to virtual function in a constant expression in C++ standards before C++20"},{q,q,"cannot evaluate call to virtual function in a constant expression in C++ standards before C++2a"},{s,nil,"cannot evaluate virtual function call in a constant expression"}},
		[g]=f,
		[h]="cannot evaluate call to virtual function in a constant expression in C\\+\\+ standards before C\\+\\+20",
		[i]=a,
		[j]=o,
		[k]={"3607ffee5cca",1329105243,"Update constexpr implementation to match CWG\'s chosen approach for core issues","Update constexpr implementation to match CWG\'s chosen approach for core issues\n1358, 1360, 1452 and 1453.\n - Instantiations of constexpr functions are always constexpr. This removes the\n   need for separate declaration/definition checking, which is now gone.\n - This makes it possible for a constexpr function to be virtual, if they are\n   only dependently virtual. Virtual calls to such functions are not constant\n   expressions.\n - Likewise, it\'s now possible for a literal type to have virtual base classes.\n   A constexpr constructor for such a type cannot actually produce a constant\n   expression, though, so add a special-case diagnostic for a constructor call\n   to such a type rather than trying to evaluate it.\n - Classes with trivial default constructors (for which value initialization can\n   produce a fully-initialized value) are considered literal types.\n - Classes with volatile members are not literal types.\n - constexpr constructors can be members of non-literal types. We do not yet use\n   static initialization for global objects constructed in this way.\n\nllvm-svn: 150359"},
		[d]={{n,5592,"/// CheckConstexprFunction - Check that a function can be called in a constant\n/// expression.\nstatic bool CheckConstexprFunction(EvalInfo &Info, SourceLocation CallLoc, const FunctionDecl *Declaration, const FunctionDecl *Definition, const Stmt *Body) {\n  // ...\n  // DR1872: An instantiated virtual constexpr function can\'t be called in a\n  // constant expression (prior to C++20). We can still constant-fold such a\n  // call.\n  if (!Info.Ctx.getLangOpts().CPlusPlus20 && isa<CXXMethodDecl>(Declaration) && cast<CXXMethodDecl>(Declaration)->isVirtual())\n    Info.CCEDiag(CallLoc, diag::note_constexpr_virtual_call);"},{y,303,"bool CheckCallable(InterpState &S, CodePtr OpPC, const Function *F) {\n  if (F->isVirtual() && !S.getLangOpts().CPlusPlus20) {\n    // ...\n    S.CCEDiag(Loc, diag::note_constexpr_virtual_call);"}},
		[m]={
			["clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p6.cpp"]={"clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p6.cpp:30:57: note: cannot evaluate call to virtual function in a constant expression in C++ standards before C++20","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constexpr/p6.cpp:32:94: note: cannot evaluate call to virtual function in a constant expression in C++ standards before C++20"}
		}
	},
	["note_constexpr_void_comparison"]={
		[b]="note_constexpr_void_comparison",
		[c]="comparison between unequal pointers to void has unspecified result",
		[e]="comparison between unequal pointers to void has unspecified result",
		[g]=f,
		[h]="comparison between unequal pointers to void has unspecified result",
		[i]=a,
		[j]=o,
		[k]={"de21b245c664",1327992090,"constexpr: the result of a relational operator between pointers to void is","constexpr: the result of a relational operator between pointers to void is\nunspecified unless the pointers are equal; therefore, such a comparison is not\na constant expression unless the pointers are equal.\n\nllvm-svn: 149366"},
		[d]={{n,13135,"template <class SuccessCB, class AfterCB> static bool EvaluateComparisonBinaryOperator(EvalInfo &Info, const BinaryOperator *E, SuccessCB &&Success, AfterCB &&DoAfter) {\n  // ...\n  if (LHSTy->isPointerType() && RHSTy->isPointerType()) {\n    // ...\n    // C++11 [expr.rel]p3:\n    //   Pointers to void (after pointer conversions) can be compared, with a\n    //   result defined as follows: If both pointers represent the same\n    //   address or are both the null pointer value, the result is true if the\n    //   operator is <= or >= and false otherwise; otherwise the result is\n    //   unspecified.\n    // We interpret this as applying to pointers to *cv* void.\n    if (LHSTy->isVoidPointerType() && LHSOffset != RHSOffset && IsRelational)\n      Info.CCEDiag(E, diag::note_constexpr_void_comparison);"}},
		[m]={
			[T]={"clang/test/CXX/expr/expr.const/p2-0x.cpp:582:26: note: comparison between unequal pointers to void has unspecified result","clang/test/CXX/expr/expr.const/p2-0x.cpp:585:26: note: comparison between unequal pointers to void has unspecified result"}
		}
	},
	["note_constexpr_volatile_here"]={
		[b]={{nil,q,"note_constexpr_volatile_here"}},
		[c]={{nil,q,"volatile %select{temporary created|object declared|member declared}0 here"}},
		[e]={{nil,q,{"volatile ",{"temporary created","object declared","member declared"}," here"}}},
		[g]=f,
		[h]="volatile (?:temporary created|object declared|member declared) here",
		[i]=a,
		[j]={{nil,q,o}},
		[k]={"c0fe5eb39c85",1557518732,"Fix handling of objects under construction during constant expression","Fix handling of objects under construction during constant expression\nevaluation.\n\nIt\'s not enough to just track the LValueBase that we\'re evaluating, we\nneed to also track the path to the objects whose constructors are\nrunning.\n\nllvm-svn: 360464"},
		[d]={{n,3721,"/// Find the designated sub-object of an rvalue.\ntemplate <typename SubobjectHandler> typename SubobjectHandler::result_type findSubobject(EvalInfo &Info, const Expr *E, const CompleteObject &Obj, const SubobjectDesignator &Sub, SubobjectHandler &handler) {\n  // ...\n  // Walk the designator\'s path to find the subobject.\n  for (unsigned I = 0, N = Sub.Entries.size(); /**/; ++I) {\n    // ...\n    // If this is our last pass, check that the final object type is OK.\n    if (I == N || (I == N - 1 && ObjType->isAnyComplexType())) {\n      // Accesses to volatile objects are prohibited.\n      if (ObjType.isVolatileQualified() && isFormalAccess(handler.AccessKind)) {\n        if (Info.getLangOpts().CPlusPlus) {\n          // ...\n          Info.Note(Loc, diag::note_constexpr_volatile_here) << DiagKind;"}},
		[m]={
			[T]={"clang/test/CXX/expr/expr.const/p2-0x.cpp:324:22: note: volatile object declared here","clang/test/CXX/expr/expr.const/p2-0x.cpp:324:22: note: volatile object declared here","clang/test/CXX/expr/expr.const/p2-0x.cpp:346:24: note: volatile object declared here"}
		}
	},
	["note_constinit_missing_here"]={
		[b]={{nil,l,"note_constinit_missing_here"}},
		[c]={{nil,l,"add the %select{\'require_constant_initialization\' attribute|\'constinit\' specifier}0 to the initializing declaration here"}},
		[e]={{nil,l,{"add the ",{"\'require_constant_initialization\' attribute","\'constinit\' specifier"}," to the initializing declaration here"}}},
		[g]=f,
		[h]="add the (?:\'require_constant_initialization\' attribute|\'constinit\' specifier) to the initializing declaration here",
		[i]=a,
		[j]={{nil,l,p}},
		[k]={Lb,1567434909,Kb,Ib},
		[d]={{M,3175,"static void diagnoseMissingConstinit(Sema &S, const VarDecl *InitDecl, const ConstInitAttr *CIAttr, bool AttrBeforeInit) {\n  // ...\n  if (AttrBeforeInit) {\n  // ...\n  } else {\n    // ...\n    S.Diag(InitDecl->getLocation(), diag::note_constinit_missing_here) << CIAttr->isConstinit() << FixItHint::CreateInsertion(InsertLoc, SuitableSpelling);"}},
		[m]={
			["clang/test/CXX/dcl.dcl/dcl.spec/dcl.constinit/p1.cpp"]={"clang/test/CXX/dcl.dcl/dcl.spec/dcl.constinit/p1.cpp:14:7: note: add the \'constinit\' specifier to the initializing declaration here","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constinit/p1.cpp:35:24: note: add the \'constinit\' specifier to the initializing declaration here","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constinit/p1.cpp:36:20: note: add the \'constinit\' specifier to the initializing declaration here","clang/test/CXX/dcl.dcl/dcl.spec/dcl.constinit/p1.cpp:37:20: note: add the \'constinit\' specifier to the initializing declaration here"}
		}
	},
	["note_constinit_specified_here"]={
		[b]={{nil,l,"note_constinit_specified_here"}},
		[c]={{nil,l,"variable declared constinit here"}},
		[e]={{nil,l,"variable declared constinit here"}},
		[g]=f,
		[h]="variable declared constinit here",
		[i]=a,
		[j]={{nil,l,p}},
		[k]={Lb,1567434909,Kb,Ib},
		[d]={{M,3167,"static void diagnoseMissingConstinit(Sema &S, const VarDecl *InitDecl, const ConstInitAttr *CIAttr, bool AttrBeforeInit) {\n  // ...\n  if (AttrBeforeInit) {\n    // ...\n    S.Diag(CIAttr->getLocation(), diag::note_constinit_specified_here);"}},
		[m]={
			["clang/test/CXX/dcl.dcl/dcl.spec/dcl.constinit/p2.cpp"]={"clang/test/CXX/dcl.dcl/dcl.spec/dcl.constinit/p2.cpp:7:8: note: variable declared constinit here"}
		}
	},
	["note_constraint_normalization_here"]={
		[b]={{nil,l,"note_constraint_normalization_here"}},
		[c]={{nil,l,"while calculating associated constraint of template \'%0\' here"}},
		[e]={{nil,l,"while calculating associated constraint of template \'A\' here"}},
		[g]=f,
		[h]="while calculating associated constraint of template \'(.*?)\' here",
		[i]=a,
		[j]={{nil,l,p}},
		[k]={"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"},
		[d]={{U,1059,"/// Prints the current instantiation stack through a series of\n/// notes.\nvoid Sema::PrintInstantiationStack() {\n  // ...\n  for (SmallVectorImpl<CodeSynthesisContext>::reverse_iterator Active = CodeSynthesisContexts.rbegin(), ActiveEnd = CodeSynthesisContexts.rend(); Active != ActiveEnd; ++Active, ++InstantiationIdx) {\n    // ...\n    case CodeSynthesisContext::ConstraintNormalization:\n      Diags.Report(Active->PointOfInstantiation, diag::note_constraint_normalization_here) << cast<NamedDecl>(Active->Entity)->getName() << Active->InstantiationRange;"}},
		[m]={
			["clang/test/CXX/temp/temp.constr/temp.constr.normal/p1.cpp"]={"clang/test/CXX/temp/temp.constr/temp.constr.normal/p1.cpp:16:31: note: while calculating associated constraint of template \'S2\' here"}
		}
	},
	["note_constraint_references_error"]={
		[b]={{nil,x,"note_constraint_references_error"}},
		[c]={{nil,x,"constraint depends on a previously diagnosed expression"}},
		[e]={{nil,x,"constraint depends on a previously diagnosed expression"}},
		[g]=f,
		[h]="constraint depends on a previously diagnosed expression",
		[i]=a,
		[j]={{nil,x,p}},
		[k]={"95f50964fbf5",1625925174,"Implement P2361 Unevaluated string literals","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"},
		[d]={{Gb,250,"template <typename AtomicEvaluator> static ExprResult calculateConstraintSatisfaction(Sema &S, const Expr *ConstraintExpr, ConstraintSatisfaction &Satisfaction, AtomicEvaluator &&Evaluator) {\n  // ...\n  // We don\'t have the ability to evaluate this, since it contains a\n  // RecoveryExpr, so we want to fail overload resolution.  Otherwise,\n  // we\'d potentially pick up a different overload, and cause confusing\n  // diagnostics. SO, add a failure detail that will cause us to make this\n  // overload set not viable.\n  if (SubstitutedAtomicExpr.get()->containsErrors()) {\n    // ...\n    PartialDiagnostic Msg = S.PDiag(diag::note_constraint_references_error);"}}
	},
	["note_constraint_substitution_here"]={
		[b]={{nil,l,"note_constraint_substitution_here"}},
		[c]={{nil,l,"while substituting template arguments into constraint expression here"}},
		[e]={{nil,l,"while substituting template arguments into constraint expression here"}},
		[g]=f,
		[h]="while substituting template arguments into constraint expression here",
		[i]=a,
		[j]={{nil,l,p}},
		[k]={Lb,1567434909,Kb,Ib},
		[d]={{U,1054,"/// Prints the current instantiation stack through a series of\n/// notes.\nvoid Sema::PrintInstantiationStack() {\n  // ...\n  for (SmallVectorImpl<CodeSynthesisContext>::reverse_iterator Active = CodeSynthesisContexts.rbegin(), ActiveEnd = CodeSynthesisContexts.rend(); Active != ActiveEnd; ++Active, ++InstantiationIdx) {\n    // ...\n    case CodeSynthesisContext::ConstraintSubstitution:\n      Diags.Report(Active->PointOfInstantiation, diag::note_constraint_substitution_here) << Active->InstantiationRange;"}},
		[m]={
			["clang/test/CXX/temp/temp.constr/temp.constr.constr/partial-specializations.cpp"]={"clang/test/CXX/temp/temp.constr/temp.constr.constr/partial-specializations.cpp:22:33: note: while substituting template arguments into constraint expression here","clang/test/CXX/temp/temp.constr/temp.constr.constr/partial-specializations.cpp:71:33: note: while substituting template arguments into constraint expression here"}
		}
	},
	["note_conv_function_declared_at"]={
		[b]="note_conv_function_declared_at",
		[c]="type conversion function declared here",
		[e]="type conversion function declared here",
		[g]=f,
		[h]="type conversion function declared here",
		[i]=a,
		[j]=p,
		[k]={"01d96986d843",1480719628,"More diagnostic name fixups: w_ -> warn_, warning_ -> warn_, not_ -> note_.","More diagnostic name fixups: w_ -> warn_, warning_ -> warn_, not_ -> note_.\nIn passing, add a warning group for \"ignored qualifier in inline assembly\" warnings.\n\nllvm-svn: 288548"},
		[d]={{"clang/lib/Sema/SemaPseudoObject.cpp",1117,"/// CheckSubscriptingKind - This routine decide what type\n/// of indexing represented by \"FromE\" is being done.\nSema::ObjCSubscriptKind Sema::CheckSubscriptingKind(Expr *FromE) {\n  // ...\n  for (unsigned int i = 0; i < ConversionDecls.size(); i++)\n    Diag(ConversionDecls[i]->getLocation(), diag::note_conv_function_declared_at);"}},
		[m]={
			["clang/test/SemaObjCXX/objc-container-subscripting.mm"]={"clang/test/SemaObjCXX/objc-container-subscripting.mm:130:4: note: type conversion function declared here","clang/test/SemaObjCXX/objc-container-subscripting.mm:131:4: note: type conversion function declared here"}
		}
	},
	["note_convert_inline_to_static"]={
		[b]="note_convert_inline_to_static",
		[c]="use \'static\' to give inline function %0 internal linkage",
		[e]="use \'static\' to give inline function A internal linkage",
		[g]=f,
		[h]="use \'static\' to give inline function (.*?) internal linkage",
		[i]=a,
		[j]=p,
		[k]={"2684c68ddc2f",1339784388,"Warn when a static variable is referenced in a non-static inline function.","Warn when a static variable is referenced in a non-static inline function.\n\nThis is explicitly forbidden in C99 6.7.4p3. This is /not/ forbidden in C++,\nprobably because by default file-scope const/constexpr variables have internal\nlinkage, while functions have external linkage. There\'s also the issue of\nanonymous namespaces to consider. Nevertheless, there should probably be a\nsimilar warning, since the semantics of inlining a function that references\na variable with internal linkage do not seem well-defined.\n\n<rdar://problem/11577619>\n\nllvm-svn: 158531"},
		[d]={{z,207,"void Sema::MaybeSuggestAddingStaticToDecl(const FunctionDecl *Cur) {\n  // ...\n  // Suggest \"static\" on the function, if possible.\n  if (!hasAnyExplicitStorageClass(First)) {\n    // ...\n    Diag(DeclBegin, diag::note_convert_inline_to_static) << Cur << FixItHint::CreateInsertion(DeclBegin, \"static \");"}},
		[m]={
			["clang/test/Sema/inline.c"]={"clang/test/Sema/inline.c:13:1: note: use \'static\' to give inline function \'useStatic\' internal linkage","clang/test/Sema/inline.c:13:1: note: use \'static\' to give inline function \'useStatic\' internal linkage","clang/test/Sema/inline.c:13:1: note: use \'static\' to give inline function \'useStatic\' internal linkage","clang/test/Sema/inline.c:69:1: note: use \'static\' to give inline function \'useStaticAgain\' internal linkage","clang/test/Sema/inline.c:69:1: note: use \'static\' to give inline function \'useStaticAgain\' internal linkage","clang/test/Sema/inline.c:76:1: note: use \'static\' to give inline function \'defineStaticVar\' internal linkage","XXX.h:1:1: note: use \'static\' to give inline function \'useStaticMainFileInLineMarker\' internal linkage","XXX.h:1:1: note: use \'static\' to give inline function \'useStaticMainFileInLineMarker\' internal linkage"}
		}
	},
	["note_coroutine_function_declare_noexcept"]={
		[b]={{nil,r,"note_coroutine_function_declare_noexcept"}},
		[c]={{nil,r,"must be declared with \'noexcept\'"}},
		[e]={{nil,r,"must be declared with \'noexcept\'"}},
		[g]=f,
		[h]="must be declared with \'noexcept\'",
		[i]=a,
		[j]={{nil,r,Jb}},
		[k]={"14f6bfcb52e7",1582847864,"[clang] Implement objc_non_runtime_protocol to remove protocol metadata","[clang] Implement objc_non_runtime_protocol to remove protocol metadata\n\nSummary:\nMotivated by the new objc_direct attribute, this change adds a new\nattribute that remotes metadata from Protocols that the programmer knows\nisn\'t going to be used at runtime. We simply have the frontend skip\ngenerating any protocol metadata entries (e.g. OBJC_CLASS_NAME,\n_OBJC_$_PROTOCOL_INSTANCE_METHDOS, _OBJC_PROTOCOL, etc) for a protocol\nmarked with `__attribute__((objc_non_runtime_protocol))`.\n\nThere are a few APIs used to retrieve a protocol at runtime.\n`@protocol(SomeProtocol)` will now error out of the requested protocol\nis marked with attribute. `objc_getProtocol` will return `NULL` which\nis consistent with the behavior of a non-existing protocol.\n\nSubscribers: cfe-commits\n\nTags: #clang\n\nDifferential Revision: https://reviews.llvm.org/D75574"},
		[d]={{V,684,"bool Sema::checkFinalSuspendNoThrow(const Stmt *FinalSuspend) {\n  // ...\n  for (const auto *D : SortedDecls) {\n    Diag(D->getEndLoc(), diag::note_coroutine_function_declare_noexcept);"}},
		[m]={
			["clang/test/SemaCXX/coroutine-final-suspend-noexcept.cpp"]={"clang/test/SemaCXX/coroutine-final-suspend-noexcept.cpp:24:38: note: must be declared with \'noexcept\'","clang/test/SemaCXX/coroutine-final-suspend-noexcept.cpp:25:43: note: must be declared with \'noexcept\'","clang/test/SemaCXX/coroutine-final-suspend-noexcept.cpp:26:24: note: must be declared with \'noexcept\'","clang/test/SemaCXX/coroutine-final-suspend-noexcept.cpp:27:35: note: must be declared with \'noexcept\'","clang/test/SemaCXX/coroutine-final-suspend-noexcept.cpp:45:34: note: must be declared with \'noexcept\'","clang/test/SemaCXX/coroutine-final-suspend-noexcept.cpp:90:41: note: must be declared with \'noexcept\'","clang/test/SemaCXX/coroutine-final-suspend-noexcept.cpp:24:38: note: must be declared with \'noexcept\'","clang/test/SemaCXX/coroutine-final-suspend-noexcept.cpp:25:43: note: must be declared with \'noexcept\'","clang/test/SemaCXX/coroutine-final-suspend-noexcept.cpp:26:24: note: must be declared with \'noexcept\'","clang/test/SemaCXX/coroutine-final-suspend-noexcept.cpp:27:35: note: must be declared with \'noexcept\'","clang/test/SemaCXX/coroutine-final-suspend-noexcept.cpp:45:34: note: must be declared with \'noexcept\'"}
		}
	},
	["note_coroutine_promise_call_implicitly_required"]={
		[b]={{nil,G,"note_coroutine_promise_call_implicitly_required"}},
		[c]={{nil,G,"call to %0 implicitly required by coroutine function here"}},
		[e]={{nil,G,"call to A implicitly required by coroutine function here"}},
		[g]=f,
		[h]="call to (.*?) implicitly required by coroutine function here",
		[i]=a,
		[j]={{nil,G,Jb}},
		[k]={"20f25cb6dfb3",1488843495,"[coroutines] Add DependentCoawaitExpr and fix re-building CoroutineBodyStmt.","[coroutines] Add DependentCoawaitExpr and fix re-building CoroutineBodyStmt.\n\nSummary:\nThe changes contained in this patch are:\n\n1. Defines a new AST node `CoawaitDependentExpr` for representing co_await expressions while the promise type is still dependent.\n2. Correctly detect and transform the \'co_await\' operand to  `p.await_transform(<expr>)`  when possible.\n3. Change the initial/final suspend points to build during the initial parse, so they have the correct operator co_await lookup results.\n4.  Fix transformation of the CoroutineBodyStmt so that it doesn\'t re-build the final/initial suspends.\n\n\n@rsmith: This change is a little big, but it\'s not trivial for me to split it up. Please let me know if you would prefer this submitted as multiple patches.\n\n\n\nReviewers: rsmith, GorNishanov\n\nReviewed By: rsmith\n\nSubscribers: ABataev, rsmith, mehdi_amini, cfe-commits\n\nDifferential Revision: https://reviews.llvm.org/D26057\n\nllvm-svn: 297093"},
		[d]={{V,409,"/// Build calls to await_ready, await_suspend, and await_resume for a co_await\n/// expression.\n/// The generated AST tries to clean up temporary objects as early as\n/// possible so that they don\'t live across suspension points if possible.\n/// Having temporary objects living across suspension points unnecessarily can\n/// lead to large frame size, and also lead to memory corruptions if the\n/// coroutine frame is destroyed after coming back from suspension. This is done\n/// by wrapping both the await_ready call and the await_suspend call with\n/// ExprWithCleanups. In the end of this function, we also need to explicitly\n/// set cleanup state so that the CoawaitExpr is also wrapped with an\n/// ExprWithCleanups to clean up the awaiter associated with the co_await\n/// expression.\nstatic ReadySuspendResumeResult buildCoawaitCalls(Sema &S, VarDecl *CoroPromise, SourceLocation Loc, Expr *E) {\n  // ...\n  if (!AwaitReady->getType()->isDependentType()) {\n    // ...\n    if (Conv.isInvalid()) {\n      // ...\n      S.Diag(Loc, diag::note_coroutine_promise_call_implicitly_required) << AwaitReady->getDirectCallee() << E->getSourceRange();"},{V,450,"/// Build calls to await_ready, await_suspend, and await_resume for a co_await\n/// expression.\n/// The generated AST tries to clean up temporary objects as early as\n/// possible so that they don\'t live across suspension points if possible.\n/// Having temporary objects living across suspension points unnecessarily can\n/// lead to large frame size, and also lead to memory corruptions if the\n/// coroutine frame is destroyed after coming back from suspension. This is done\n/// by wrapping both the await_ready call and the await_suspend call with\n/// ExprWithCleanups. In the end of this function, we also need to explicitly\n/// set cleanup state so that the CoawaitExpr is also wrapped with an\n/// ExprWithCleanups to clean up the awaiter associated with the co_await\n/// expression.\nstatic ReadySuspendResumeResult buildCoawaitCalls(Sema &S, VarDecl *CoroPromise, SourceLocation Loc, Expr *E) {\n  // ...\n  if (!AwaitSuspend->getType()->isDependentType()) {\n    // ...\n    // Support for coroutine_handle returning await_suspend.\n    if (Expr *TailCallSuspend = maybeTailCall(S, RetType, AwaitSuspend, Loc))\n    // ...\n    else {\n      // non-class prvalues always have cv-unqualified types\n      if (RetType->isReferenceType() || (!RetType->isBooleanType() && !RetType->isVoidType())) {\n        // ...\n        S.Diag(Loc, diag::note_coroutine_promise_call_implicitly_required) << AwaitSuspend->getDirectCallee();"},{V,1499,"bool CoroutineStmtBuilder::makeNewAndDeleteExpr() {\n  // ...\n  if (RequiresNoThrowAlloc) {\n    // ...\n    if (!FT->isNothrow(/*ResultIfDependent*/ false)) {\n      // ...\n      S.Diag(Loc, diag::note_coroutine_promise_call_implicitly_required) << OperatorNew;"}},
		[m]={
			["clang/test/SemaCXX/coroutines.cpp"]={"clang/test/SemaCXX/coroutines.cpp:837:22: note: call to \'operator new\' implicitly required by coroutine function here","clang/test/SemaCXX/coroutines.cpp:842:9: note: call to \'operator new\' implicitly required by coroutine function here","clang/test/SemaCXX/coroutines.cpp:1042:14: note: call to \'await_ready\' implicitly required by coroutine function here","clang/test/SemaCXX/coroutines.cpp:1046:14: note: call to \'await_suspend\' implicitly required by coroutine function here","clang/test/SemaCXX/coroutines.cpp:1057:14: note: call to \'await_suspend\' implicitly required by coroutine function here","clang/test/SemaCXX/coroutines.cpp:1058:14: note: call to \'await_suspend\' implicitly required by coroutine function here"}
		}
	},
	["note_coroutine_promise_implicit_await_transform_required_here"]={
		[b]={{nil,G,"note_coroutine_promise_implicit_await_transform_required_here"}},
		[c]={{nil,G,"call to \'await_transform\' implicitly required by \'co_await\' here"}},
		[e]={{nil,G,"call to \'await_transform\' implicitly required by \'co_await\' here"}},
		[g]=f,
		[h]="call to \'await_transform\' implicitly required by \'co_await\' here",
		[i]=a,
		[j]={{nil,G,Jb}},
		[k]={"20f25cb6dfb3",1488843495,"[coroutines] Add DependentCoawaitExpr and fix re-building CoroutineBodyStmt.","[coroutines] Add DependentCoawaitExpr and fix re-building CoroutineBodyStmt.\n\nSummary:\nThe changes contained in this patch are:\n\n1. Defines a new AST node `CoawaitDependentExpr` for representing co_await expressions while the promise type is still dependent.\n2. Correctly detect and transform the \'co_await\' operand to  `p.await_transform(<expr>)`  when possible.\n3. Change the initial/final suspend points to build during the initial parse, so they have the correct operator co_await lookup results.\n4.  Fix transformation of the CoroutineBodyStmt so that it doesn\'t re-build the final/initial suspends.\n\n\n@rsmith: This change is a little big, but it\'s not trivial for me to split it up. Please let me know if you would prefer this submitted as multiple patches.\n\n\n\nReviewers: rsmith, GorNishanov\n\nReviewed By: rsmith\n\nSubscribers: ABataev, rsmith, mehdi_amini, cfe-commits\n\nDifferential Revision: https://reviews.llvm.org/D26057\n\nllvm-svn: 297093"},
		[d]={{V,859,"// Attempts to resolve and build a CoawaitExpr from \"raw\" inputs, bailing out to\n// DependentCoawaitExpr if needed.\nExprResult Sema::BuildUnresolvedCoawaitExpr(SourceLocation Loc, Expr *Operand, UnresolvedLookupExpr *Lookup) {\n  // ...\n  if (lookupMember(*this, \"await_transform\", RD, Loc)) {\n    // ...\n    if (R.isInvalid()) {\n      Diag(Loc, diag::note_coroutine_promise_implicit_await_transform_required_here) << Operand->getSourceRange();"}},
		[m]={
			["clang/test/SemaCXX/co_await-range-for.cpp"]={"clang/test/SemaCXX/co_await-range-for.cpp:53:23: note: call to \'await_transform\' implicitly required by \'co_await\' here","clang/test/SemaCXX/co_await-range-for.cpp:75:23: note: call to \'await_transform\' implicitly required by \'co_await\' here","clang/test/SemaCXX/co_await-range-for.cpp:82:23: note: call to \'await_transform\' implicitly required by \'co_await\' here"}
		}
	},
	["note_coroutine_promise_suspend_implicitly_required"]={
		[b]={{nil,G,"note_coroutine_promise_suspend_implicitly_required"}},
		[c]={{nil,G,"call to \'%select{initial_suspend|final_suspend}0\' implicitly required by the %select{initial suspend point|final suspend point}0"}},
		[e]={{nil,G,{"call to \'",{"initial_suspend","final_suspend"},"\' implicitly required by the ",{"initial suspend point","final suspend point"}}}},
		[g]=f,
		[h]="call to \'(?:initial_suspend|final_suspend)\' implicitly required by the (?:initial suspend point|final suspend point)",
		[i]=a,
		[j]={{nil,G,Jb}},
		[k]={"627a63cf5081",1492334399,"[coroutines] Fix building of new/delete expressions when get_return_object_on_allocation_failure() i...","[coroutines] Fix building of new/delete expressions when get_return_object_on_allocation_failure() is present.\n\nSummary:\nThis patch implements [dcl.fct.def.coroutine]p8:\n> The unqualified-id get_return_object_on_allocation_failure is looked up in the scope of\n> class P by class member access lookup (3.4.5). If a declaration is found, ..., and if a \n> global allocation function is selected, the ::operator new(size_t, nothrow_t) form shall be used.\n> [...]\n> The allocation function used in this case must have a non-throwing noexcept-specification.\n\nReviewers: GorNishanov, rsmith, majnemer, aaron.ballman\n\nReviewed By: GorNishanov\n\nSubscribers: cfe-commits\n\nDifferential Revision: https://reviews.llvm.org/D31562\n\nllvm-svn: 300420"},
		[d]={{V,719,"bool Sema::ActOnCoroutineBodyStart(Scope *SC, SourceLocation KWLoc, StringRef Keyword) {\n  // ...\n  // Build the initial suspend point\n  auto buildSuspends = [&](StringRef Name) mutable -> StmtResult {\n    // ...\n    if (Suspend.isInvalid()) {\n      Diag(Loc, diag::note_coroutine_promise_suspend_implicitly_required) << ((Name == \"initial_suspend\") ? 0 : 1);"}},
		[m]={
			["clang/test/SemaCXX/coroutines.cpp"]={"clang/test/SemaCXX/coroutines.cpp:148:6: note: call to \'initial_suspend\' implicitly required by the initial suspend point","clang/test/SemaCXX/coroutines.cpp:483:29: note: call to \'initial_suspend\' implicitly required by the initial suspend point","clang/test/SemaCXX/coroutines.cpp:501:31: note: call to \'initial_suspend\' implicitly required by the initial suspend point","clang/test/SemaCXX/coroutines.cpp:610:21: note: call to \'initial_suspend\' implicitly required by the initial suspend point","clang/test/SemaCXX/coroutines.cpp:622:21: note: call to \'final_suspend\' implicitly required by the final suspend point","clang/test/SemaCXX/coroutines.cpp:768:7: note: call to \'initial_suspend\' implicitly required by the initial suspend point"}
		}
	},
	["note_covariant_thunk"]={
		[b]="note_covariant_thunk",
		[c]="covariant thunk required by %0",
		[e]="covariant thunk required by A",
		[g]=f,
		[h]="covariant thunk required by (.*?)",
		[i]=a,
		[j]="VTable ABI Issue",
		[k]={"70e6a00170a4",1430516145,"[MS ABI] Detect and diagnose vftables which cannot be created","[MS ABI] Detect and diagnose vftables which cannot be created\n\nThe MSVC ABI has a bug introduced by appending to the end of vftables\nwhich come from virtual bases: covariant thunks introduces via\nnon-overlapping regions of the inheritance lattice both append to the\nsame slot in the vftable.\n\nIt is possible to generate correct vftables in cases where one node in\nthe lattice completely dominates the other on the way to the base with\nthe vfptr; in all other cases, we must raise a diagnostic in order to\nprevent the illusion that we succeeded in laying out the vftable.\n\nThis fixes PR16759.\n\nllvm-svn: 236354"},
		[d]={{"clang/lib/AST/VTableBuilder.cpp",3555,"// We want to select the path which introduces the most covariant overrides.  If\n// two paths introduce overrides which the other path doesn\'t contain, issue a\n// diagnostic.\nstatic const FullPathTy *selectBestPath(ASTContext &Context, const CXXRecordDecl *RD, const VPtrInfo &Info, std::list<FullPathTy> &FullPaths) {\n  // ...\n  for (const FullPathTy &SpecificPath : FullPaths) {\n    // ...\n    if (MissingOverrides.empty()) {\n    // ...\n    } else {\n      // ...\n      Diags.Report(CovariantMD->getLocation(), diag::note_covariant_thunk) << CovariantMD;"},{"clang/lib/AST/VTableBuilder.cpp",3557,"// We want to select the path which introduces the most covariant overrides.  If\n// two paths introduce overrides which the other path doesn\'t contain, issue a\n// diagnostic.\nstatic const FullPathTy *selectBestPath(ASTContext &Context, const CXXRecordDecl *RD, const VPtrInfo &Info, std::list<FullPathTy> &FullPaths) {\n  // ...\n  for (const FullPathTy &SpecificPath : FullPaths) {\n    // ...\n    if (MissingOverrides.empty()) {\n    // ...\n    } else {\n      // ...\n      Diags.Report(ConflictMD->getLocation(), diag::note_covariant_thunk) << ConflictMD;"}}
	},
	["note_cuda_conflicting_device_function_declared_here"]={
		[b]="note_cuda_conflicting_device_function_declared_here",
		[c]="conflicting __device__ function declared here",
		[e]="conflicting __device__ function declared here",
		[g]=f,
		[h]="conflicting __device__ function declared here",
		[i]=a,
		[j]=p,
		[k]={"ba122ab42fe5",1459380621,"[CUDA] Make unattributed constexpr functions implicitly host+device.","[CUDA] Make unattributed constexpr functions implicitly host+device.\n\nWith this patch, by a constexpr function is implicitly host+device\nunless:\n\n a) it\'s a variadic function (variadic functions are not allowed on the\n    device side), or\n b) it\'s preceeded by a __device__ overload in a system header.\n\nThe restriction on overloading __host__ __device__ functions on the\nbasis of their CUDA attributes remains in place, but we use (b) to allow\nus to define __device__ overloads for constexpr functions in cmath,\nwhich would otherwise be __host__ __device__ and thus not overloadable.\n\nYou can disable this behavior with -fno-cuda-host-device-constexpr.\n\nReviewers: tra, rnk, rsmith\n\nSubscribers: cfe-commits\n\nDifferential Revision: http://reviews.llvm.org/D18380\n\nllvm-svn: 264964"},
		[d]={{"clang/lib/Sema/SemaCUDA.cpp",700,"// With -fcuda-host-device-constexpr, an unattributed constexpr function is\n// treated as implicitly __host__ __device__, unless:\n//  * it is a variadic function (device-side variadic functions are not\n//    allowed), or\n//  * a __device__ function with this signature was already declared, in which\n//    case in which case we output an error, unless the __device__ decl is in a\n//    system header, in which case we leave the constexpr function unattributed.\n//\n// In addition, all function decls are treated as __host__ __device__ when\n// ForceCUDAHostDeviceDepth > 0 (corresponding to code within a\n//   #pragma clang force_cuda_host_device_begin/end\n// pair).\nvoid Sema::maybeAddCUDAHostDeviceAttrs(FunctionDecl *NewD, const LookupResult &Previous) {\n  // ...\n  if (It != Previous.end()) {\n    // ...\n    if (!getSourceManager().isInSystemHeader(Match->getLocation())) {\n      // ...\n      Diag(Match->getLocation(), diag::note_cuda_conflicting_device_function_declared_here);"}},
		[m]={
			["clang/test/SemaCUDA/host-device-constexpr.cu"]={"clang/test/SemaCUDA/host-device-constexpr.cu:42:16: note: conflicting __device__ function declared here"}
		}
	},
	["note_cuda_const_var_unpromoted"]={
		[b]={{nil,A,"note_cuda_const_var_unpromoted"}},
		[c]={{nil,A,"const variable cannot be emitted on device side due to dynamic initialization"}},
		[e]={{nil,A,"const variable cannot be emitted on device side due to dynamic initialization"}},
		[g]=f,
		[h]="const variable cannot be emitted on device side due to dynamic initialization",
		[i]=a,
		[j]={{nil,A,p}},
		[k]={nc,1615397021,tc,sc},
		[d]={{z,19016,"/// Directly mark a variable odr-used. Given a choice, prefer to use\n/// MarkVariableReferenced since it does additional checks and then\n/// calls MarkVarDeclODRUsed.\n/// If the variable must be captured:\n///  - if FunctionScopeIndexToStopAt is null, capture it in the CurContext\n///  - else capture it in the DeclContext that maps to the\n///    *FunctionScopeIndexToStopAt on the FunctionScopeInfo stack.\nstatic void MarkVarDeclODRUsed(ValueDecl *V, SourceLocation Loc, Sema &SemaRef, const unsigned *const FunctionScopeIndexToStopAt = nullptr) {\n  // ...\n  if (SemaRef.LangOpts.CUDA && Var->hasGlobalStorage()) {\n    // ...\n    if (VarTarget == Sema::CVT_Host && (UserTarget == Sema::CFT_Device || UserTarget == Sema::CFT_HostDevice || UserTarget == Sema::CFT_Global)) {\n      // Diagnose ODR-use of host global variables in device functions.\n      // Reference of device global variables in host functions is allowed\n      // through shadow variables therefore it is not diagnosed.\n      if (SemaRef.LangOpts.CUDAIsDevice) {\n        // ...\n        SemaRef.targetDiag(Var->getLocation(), Var->getType().isConstQualified() ? diag::note_cuda_const_var_unpromoted : diag::note_cuda_host_var);"}},
		[m]={
			["clang/test/SemaCUDA/const-var.cu"]={"clang/test/SemaCUDA/const-var.cu:43:15: note: const variable cannot be emitted on device side due to dynamic initialization"}
		}
	},
	["note_cuda_device_builtin_surftex_cls_should_have_match_arg"]={
		[b]={{nil,r,"note_cuda_device_builtin_surftex_cls_should_have_match_arg"}},
		[c]={{nil,r,"the %select{1st|2nd|3rd}1 template parameter of %0 needs to be %select{a type|an integer or enum value}2"}},
		[e]={{nil,r,{"the ",{"1st","2nd","3rd"}," template parameter of A needs to be ",{"a type","an integer or enum value"}}}},
		[g]=f,
		[h]="the (?:1st|2nd|3rd) template parameter of (.*?) needs to be (?:a type|an integer or enum value)",
		[i]=a,
		[j]={{nil,r,p}},
		[k]={"931fcd3ba011",1576908663,"[WebAssembly] Improve clang diagnostics for wasm attributes","[WebAssembly] Improve clang diagnostics for wasm attributes\n\nThis patch addresses the review comments on r352930:\n\n - Removes redundant diagnostic checking code\n - Removes errnoneous use of diag::err_alias_is_definition, which\n   turned out to be ineffective anyway since functions can be defined later\n   in the translation unit and avoid detection.\n - Adds a test for various invalid cases for import_name and import_module.\n\nDifferential Revision: https://reviews.llvm.org/D59520"},
		[d]={{t,6348,"static void checkCUDADeviceBuiltinSurfaceClassTemplate(Sema &S, CXXRecordDecl *Class) {\n  // ...\n  if (N > 0 && !isa<TemplateTypeParmDecl>(Params->getParam(0))) {\n    // ...\n    S.Diag(TD->getLocation(), diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg) << TD << /*1st*/ 0 << /*type*/ 0;"},{t,6356,"static void checkCUDADeviceBuiltinSurfaceClassTemplate(Sema &S, CXXRecordDecl *Class) {\n  // ...\n  if (N > 1) {\n    // ...\n    if (!NTTP || !NTTP->getType()->isIntegralOrEnumerationType()) {\n      // ...\n      S.Diag(TD->getLocation(), diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg) << TD << /*2nd*/ 1 << /*integer*/ 1;"},{t,6402,"static void checkCUDADeviceBuiltinTextureClassTemplate(Sema &S, CXXRecordDecl *Class) {\n  // ...\n  if (N > 0 && !isa<TemplateTypeParmDecl>(Params->getParam(0))) {\n    // ...\n    S.Diag(TD->getLocation(), diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg) << TD << /*1st*/ 0 << /*type*/ 0;"},{t,6410,"static void checkCUDADeviceBuiltinTextureClassTemplate(Sema &S, CXXRecordDecl *Class) {\n  // ...\n  if (N > 1) {\n    // ...\n    if (!NTTP || !NTTP->getType()->isIntegralOrEnumerationType()) {\n      // ...\n      S.Diag(TD->getLocation(), diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg) << TD << /*2nd*/ 1 << /*integer*/ 1;"},{t,6419,"static void checkCUDADeviceBuiltinTextureClassTemplate(Sema &S, CXXRecordDecl *Class) {\n  // ...\n  if (N > 2) {\n    // ...\n    if (!NTTP || !NTTP->getType()->isIntegralOrEnumerationType()) {\n      // ...\n      S.Diag(TD->getLocation(), diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg) << TD << /*3rd*/ 2 << /*integer*/ 1;"}},
		[m]={
			["clang/test/SemaCUDA/bad-attributes.cu"]={"clang/test/SemaCUDA/bad-attributes.cu:90:53: note: the 1st template parameter of \'s3_cls_template\' needs to be a type","clang/test/SemaCUDA/bad-attributes.cu:90:53: note: the 2nd template parameter of \'s3_cls_template\' needs to be an integer or enum value","clang/test/SemaCUDA/bad-attributes.cu:94:53: note: the 1st template parameter of \'t3_cls_template\' needs to be a type","clang/test/SemaCUDA/bad-attributes.cu:94:53: note: the 3rd template parameter of \'t3_cls_template\' needs to be an integer or enum value"}
		}
	},
	["note_cuda_device_builtin_surftex_cls_should_have_n_args"]={
		[b]={{nil,r,"note_cuda_device_builtin_surftex_cls_should_have_n_args"}},
		[c]={{nil,r,"%0 needs to have exactly %1 template parameters"}},
		[e]={{nil,r,"A needs to have exactly B template parameters"}},
		[g]=f,
		[h]="(.*?) needs to have exactly (.*?) template parameters",
		[i]=a,
		[j]={{nil,r,p}},
		[k]={"931fcd3ba011",1576908663,"[WebAssembly] Improve clang diagnostics for wasm attributes","[WebAssembly] Improve clang diagnostics for wasm attributes\n\nThis patch addresses the review comments on r352930:\n\n - Removes redundant diagnostic checking code\n - Removes errnoneous use of diag::err_alias_is_definition, which\n   turned out to be ineffective anyway since functions can be defined later\n   in the translation unit and avoid detection.\n - Adds a test for various invalid cases for import_name and import_module.\n\nDifferential Revision: https://reviews.llvm.org/D59520"},
		[d]={{t,6342,"static void checkCUDADeviceBuiltinSurfaceClassTemplate(Sema &S, CXXRecordDecl *Class) {\n  // ...\n  if (N != 2) {\n    // ...\n    S.Diag(TD->getLocation(), diag::note_cuda_device_builtin_surftex_cls_should_have_n_args) << TD << 2;"},{t,6396,"static void checkCUDADeviceBuiltinTextureClassTemplate(Sema &S, CXXRecordDecl *Class) {\n  // ...\n  if (N != 3) {\n    // ...\n    S.Diag(TD->getLocation(), diag::note_cuda_device_builtin_surftex_cls_should_have_n_args) << TD << 3;"}},
		[m]={
			["clang/test/SemaCUDA/bad-attributes.cu"]={"clang/test/SemaCUDA/bad-attributes.cu:83:53: note: \'s2_cls_template\' needs to have exactly 2 template parameters","clang/test/SemaCUDA/bad-attributes.cu:86:53: note: \'t2_cls_template\' needs to have exactly 3 template parameters"}
		}
	},
	["note_cuda_device_builtin_surftex_should_be_template_class"]={
		[b]={{nil,r,"note_cuda_device_builtin_surftex_should_be_template_class"}},
		[c]={{nil,r,"%0 needs to be instantiated from a class template with proper template arguments"}},
		[e]={{nil,r,"A needs to be instantiated from a class template with proper template arguments"}},
		[g]=f,
		[h]="(.*?) needs to be instantiated from a class template with proper template arguments",
		[i]=a,
		[j]={{nil,r,p}},
		[k]={"931fcd3ba011",1576908663,"[WebAssembly] Improve clang diagnostics for wasm attributes","[WebAssembly] Improve clang diagnostics for wasm attributes\n\nThis patch addresses the review comments on r352930:\n\n - Removes redundant diagnostic checking code\n - Removes errnoneous use of diag::err_alias_is_definition, which\n   turned out to be ineffective anyway since functions can be defined later\n   in the translation unit and avoid detection.\n - Adds a test for various invalid cases for import_name and import_module.\n\nDifferential Revision: https://reviews.llvm.org/D59520"},
		[d]={{t,6329,"static void checkCUDADeviceBuiltinSurfaceClassTemplate(Sema &S, CXXRecordDecl *Class) {\n  // ...\n  if (!TD) {\n    // ...\n    if (!SD) {\n      // ...\n      S.Diag(Class->getLocation(), diag::note_cuda_device_builtin_surftex_should_be_template_class) << Class;"},{t,6383,"static void checkCUDADeviceBuiltinTextureClassTemplate(Sema &S, CXXRecordDecl *Class) {\n  // ...\n  if (!TD) {\n    // ...\n    if (!SD) {\n      // ...\n      S.Diag(Class->getLocation(), diag::note_cuda_device_builtin_surftex_should_be_template_class) << Class;"}},
		[m]={
			["clang/test/SemaCUDA/bad-attributes.cu"]={"clang/test/SemaCUDA/bad-attributes.cu:77:53: note: \'s1_ref\' needs to be instantiated from a class template with proper template arguments","clang/test/SemaCUDA/bad-attributes.cu:79:53: note: \'t1_ref\' needs to be instantiated from a class template with proper template arguments"}
		}
	},
	["note_cuda_host_var"]={
		[b]={{nil,A,"note_cuda_host_var"}},
		[c]={{nil,A,"host variable declared here"}},
		[e]={{nil,A,"host variable declared here"}},
		[g]=f,
		[h]="host variable declared here",
		[i]=a,
		[j]={{nil,A,p}},
		[k]={nc,1615397021,tc,sc},
		[d]={{z,19079,"/// Directly mark a variable odr-used. Given a choice, prefer to use\n/// MarkVariableReferenced since it does additional checks and then\n/// calls MarkVarDeclODRUsed.\n/// If the variable must be captured:\n///  - if FunctionScopeIndexToStopAt is null, capture it in the CurContext\n///  - else capture it in the DeclContext that maps to the\n///    *FunctionScopeIndexToStopAt on the FunctionScopeInfo stack.\nstatic void MarkVarDeclODRUsed(ValueDecl *V, SourceLocation Loc, Sema &SemaRef, const unsigned *const FunctionScopeIndexToStopAt = nullptr) {\n  // ...\n  if (SemaRef.LangOpts.CUDA && Var->hasGlobalStorage()) {\n    // ...\n    if (VarTarget == Sema::CVT_Host && (UserTarget == Sema::CFT_Device || UserTarget == Sema::CFT_HostDevice || UserTarget == Sema::CFT_Global)) {\n      // Diagnose ODR-use of host global variables in device functions.\n      // Reference of device global variables in host functions is allowed\n      // through shadow variables therefore it is not diagnosed.\n      if (SemaRef.LangOpts.CUDAIsDevice) {\n        // ...\n        SemaRef.targetDiag(Var->getLocation(), Var->getType().isConstQualified() ? diag::note_cuda_const_var_unpromoted : diag::note_cuda_host_var);"}},
		[m]={
			["clang/test/SemaCUDA/static-device-var.cu"]={"clang/test/SemaCUDA/static-device-var.cu:34:12: note: host variable declared here"}
		}
	},
	["note_cuda_ovl_candidate_target_mismatch"]={
		[b]="note_cuda_ovl_candidate_target_mismatch",
		[c]="candidate template ignored: target attributes do not match",
		[e]="candidate template ignored: target attributes do not match",
		[g]=f,
		[h]="candidate template ignored\\: target attributes do not match",
		[i]=a,
		[j]=p,
		[k]={"13e9b4d76851",1481138836,"[CUDA] Improve target attribute checking for function templates.","[CUDA] Improve target attribute checking for function templates.\n\n* __host__ __device__ functions are no longer considered to be\n  redeclarations of __host__ or __device__ functions. This prevents\n  unintentional merging of target attributes across them.\n* Function target attributes are not considered (and must match) during\n  explicit instantiation and specialization of function templates.\n\nDifferential Revision: https://reviews.llvm.org/D25809\n\nllvm-svn: 288962"},
		[d]={{cc,11366,"/// 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_CUDATargetMismatch:\n    S.Diag(Templated->getLocation(), diag::note_cuda_ovl_candidate_target_mismatch);"}},
		[m]={
			["clang/test/SemaCUDA/function-template-overload.cu"]={"clang/test/SemaCUDA/function-template-overload.cu:13:40: note: candidate template ignored: target attributes do not match","clang/test/SemaCUDA/function-template-overload.cu:10:38: note: candidate template ignored: target attributes do not match","clang/test/SemaCUDA/function-template-overload.cu:13:40: note: candidate template ignored: target attributes do not match","clang/test/SemaCUDA/function-template-overload.cu:10:38: note: candidate template ignored: target attributes do not match","clang/test/SemaCUDA/function-template-overload.cu:62:35: note: candidate template ignored: target attributes do not match","clang/test/SemaCUDA/function-template-overload.cu:62:35: note: candidate template ignored: target attributes do not match","clang/test/SemaCUDA/function-template-overload.cu:62:35: note: candidate template ignored: target attributes do not match"}
		}
	},
	["note_cxx20_compat_utf8_string_remove_u8"]={
		[b]={{nil,r,"note_cxx20_compat_utf8_string_remove_u8"}},
		[c]={{nil,r,"remove \'u8\' prefix to avoid a change of behavior; Clang encodes unprefixed narrow string literals as UTF-8"}},
		[e]={{nil,r,"remove \'u8\' prefix to avoid a change of behavior; Clang encodes unprefixed narrow string literals as UTF-8"}},
		[g]=f,
		[h]="remove \'u8\' prefix to avoid a change of behavior; Clang encodes unprefixed narrow string literals as UTF\\-8",
		[i]=a,
		[j]={{nil,r,p}},
		[k]={"28ddb91decff",1542229474,"[c++20] Implement P0482R6: enable -fchar8_t by default in C++20 mode.","[c++20] Implement P0482R6: enable -fchar8_t by default in C++20 mode.\n\nThis unfortunately results in a substantial breaking change when\nswitching to C++20, but it\'s not yet clear what / how much we should\ndo about that. We may want to add a compatibility conversion from\nu8 string literals to const char*, similar to how C++98 provided a\ncompatibility conversion from string literals to non-const char*,\nbut that\'s not handled by this patch.\n\nThe feature can be disabled in C++20 mode with -fno-char8_t.\n\nllvm-svn: 346892"},
		[d]={{z,1997,"/// ActOnStringLiteral - The specified tokens were lexed as pasted string\n/// fragments (e.g. \"foo\" \"bar\" L\"baz\").  The result string has to handle string\n/// concatenation ([C99 5.1.1.2, translation phase #6]), so it may come from\n/// multiple tokens.  However, the common case is that StringToks points to one\n/// string.\n///\nExprResult Sema::ActOnStringLiteral(ArrayRef<Token> StringToks, Scope *UDLScope) {\n  // ...\n  // Warn on initializing an array of char from a u8 string literal; this\n  // becomes ill-formed in C++2a.\n  if (getLangOpts().CPlusPlus && !getLangOpts().CPlusPlus20 && !getLangOpts().Char8 && Kind == StringLiteral::UTF8) {\n    // ...\n    auto RemovalDiag = PDiag(diag::note_cxx20_compat_utf8_string_remove_u8);"}},
		[m]={
			["clang/test/SemaCXX/cxx2a-compat.cpp"]={"clang/test/SemaCXX/cxx2a-compat.cpp:28:16: note: remove \'u8\' prefix to avoid a change of behavior; Clang encodes unprefixed narrow string literals as UTF-8","clang/test/SemaCXX/cxx2a-compat.cpp:29:26: note: remove \'u8\' prefix to avoid a change of behavior; Clang encodes unprefixed narrow string literals as UTF-8","clang/test/SemaCXX/cxx2a-compat.cpp:30:16: note: remove \'u8\' prefix to avoid a change of behavior; Clang encodes unprefixed narrow string literals as UTF-8"}
		}
	},
	["note_decl_hiding_tag_type"]={
		[b]="note_decl_hiding_tag_type",
		[c]="%1 %0 is hidden by a non-type declaration of %0 here",
		[e]="B A is hidden by a non-type declaration of A here",
		[g]=f,
		[h]="(.*?) (.*?) is hidden by a non\\-type declaration of (.*?) here",
		[i]=a,
		[j]="Parse Issue",
		[k]={"3fe3f857699f",1335551209,"Imrpove the note text for when a non-type decl hides a tag type","Imrpove the note text for when a non-type decl hides a tag type\n\nllvm-svn: 155723"},
		[d]={{"clang/lib/Parse/ParseDecl.cpp",2830,"/// ParseImplicitInt - This method is called when we have an non-typename\n/// identifier in a declspec (which normally terminates the decl spec) when\n/// the declspec has no type specifier.  In this case, the declspec is either\n/// malformed or is \"implicit int\" (in K&R and C89).\n///\n/// This method handles diagnosing this prettily and returns false if the\n/// declspec is done being processed.  If it recovers and thinks there may be\n/// other pieces of declspec after it, it returns true.\n///\nbool Parser::ParseImplicitInt(DeclSpec &DS, CXXScopeSpec *SS, const ParsedTemplateInfo &TemplateInfo, AccessSpecifier AS, DeclSpecContext DSC, ParsedAttributes &Attrs) {\n  // ...\n  // Otherwise, if we don\'t consume this token, we are going to emit an\n  // error anyway.  Try to recover from various common problems.  Check\n  // to see if this was a reference to a tag name without a tag specified.\n  // This is a common problem in C (saying \'foo\' instead of \'struct foo\').\n  //\n  // C++ doesn\'t need this, and isTagName doesn\'t take SS.\n  if (SS == nullptr) {\n    // ...\n    if (TagName) {\n      // ...\n      if (Actions.LookupParsedName(R, getCurScope(), SS)) {\n        for (LookupResult::iterator I = R.begin(), IEnd = R.end(); I != IEnd; ++I)\n          Diag((*I)->getLocation(), diag::note_decl_hiding_tag_type) << TokenName << TagName;"},{M,889,"static bool isTagTypeWithMissingTag(Sema &SemaRef, LookupResult &Result, Scope *S, CXXScopeSpec &SS, IdentifierInfo *&Name, SourceLocation NameLoc) {\n  // ...\n  if (TagDecl *Tag = R.getAsSingle<TagDecl>()) {\n    // ...\n    for (LookupResult::iterator I = Result.begin(), IEnd = Result.end(); I != IEnd; ++I)\n      SemaRef.Diag((*I)->getLocation(), diag::note_decl_hiding_tag_type) << Name << TagName;"}},
		[m]={
			["clang/test/Parser/cxx-using-declaration.cpp"]={"clang/test/Parser/cxx-using-declaration.cpp:54:6: note: class \'Bar\' is hidden by a non-type declaration of \'Bar\' here"}
		}
	},
	["note_decl_unguarded_availability_silence"]={
		[b]={{nil,E,"note_decl_unguarded_availability_silence"}},
		[c]={{nil,E,"annotate %select{%1|anonymous %1}0 with an availability attribute to silence this warning"}},
		[e]={{nil,E,{"annotate ",{"B","anonymous B"}," with an availability attribute to silence this warning"}}},
		[g]=f,
		[h]="annotate (?:(.*?)|anonymous (.*?)) with an availability attribute to silence this warning",
		[i]=a,
		[j]={{nil,E,p}},
		[k]={"8b352c4d9d82",1502740152,"[Sema] Improve some -Wunguarded-availability diagnostics","[Sema] Improve some -Wunguarded-availability diagnostics\n\nrdar://33543523\nDifferential revision: https://reviews.llvm.org/D36200\n\nllvm-svn: 310874"},
		[d]={{hb,404,"/// Actually emit an availability diagnostic for a reference to an unavailable\n/// decl.\n///\n/// \\param Ctx The context that the reference occurred in\n/// \\param ReferringDecl The exact declaration that was referenced.\n/// \\param OffendingDecl A related decl to \\c ReferringDecl that has an\n/// availability attribute corresponding to \\c K attached to it. Note that this\n/// may not be the same as ReferringDecl, i.e. if an EnumDecl is annotated and\n/// we refer to a member EnumConstantDecl, ReferringDecl is the EnumConstantDecl\n/// and OffendingDecl is the EnumDecl.\nstatic void DoEmitAvailabilityWarning(Sema &S, AvailabilityResult K, Decl *Ctx, const NamedDecl *ReferringDecl, const NamedDecl *OffendingDecl, StringRef Message, ArrayRef<SourceLocation> Locs, const ObjCInterfaceDecl *UnknownObjCClass, const ObjCPropertyDecl *ObjCProperty, bool ObjCPropertyAccess) {\n  // ...\n  case AR_NotYetIntroduced: {\n    // ...\n    if (const auto *Enclosing = findEnclosingDeclToAnnotate(Ctx)) {\n      if (const auto *TD = dyn_cast<TagDecl>(Enclosing))\n        if (TD->getDeclName().isEmpty()) {\n          S.Diag(TD->getLocation(), diag::note_decl_unguarded_availability_silence) << /*Anonymous*/ 1 << TD->getKindName();"},{hb,410,"/// Actually emit an availability diagnostic for a reference to an unavailable\n/// decl.\n///\n/// \\param Ctx The context that the reference occurred in\n/// \\param ReferringDecl The exact declaration that was referenced.\n/// \\param OffendingDecl A related decl to \\c ReferringDecl that has an\n/// availability attribute corresponding to \\c K attached to it. Note that this\n/// may not be the same as ReferringDecl, i.e. if an EnumDecl is annotated and\n/// we refer to a member EnumConstantDecl, ReferringDecl is the EnumConstantDecl\n/// and OffendingDecl is the EnumDecl.\nstatic void DoEmitAvailabilityWarning(Sema &S, AvailabilityResult K, Decl *Ctx, const NamedDecl *ReferringDecl, const NamedDecl *OffendingDecl, StringRef Message, ArrayRef<SourceLocation> Locs, const ObjCInterfaceDecl *UnknownObjCClass, const ObjCPropertyDecl *ObjCProperty, bool ObjCPropertyAccess) {\n  // ...\n  case AR_NotYetIntroduced: {\n    // ...\n    if (const auto *Enclosing = findEnclosingDeclToAnnotate(Ctx)) {\n      // ...\n      auto FixitNoteDiag = S.Diag(Enclosing->getLocation(), diag::note_decl_unguarded_availability_silence) << /*Named*/ 0 << Enclosing;"}},
		[m]={
			["clang/test/Parser/objc-implementation-attrs.m"]={"clang/test/Parser/objc-implementation-attrs.m:27:12: note: annotate \'I4\' with an availability attribute to silence this warning"}
		}
	},
	["note_declaration_not_a_prototype"]={
		[b]="note_declaration_not_a_prototype",
		[c]={{nil,q,"this declaration is not a prototype; add %select{\'void\'|parameter declarations}0 to make it %select{a prototype for a zero-parameter function|one}0"},{s,nil,"this declaration is not a prototype; add \'void\' to make it a prototype for a zero-parameter function"}},
		[e]={{nil,q,{"this declaration is not a prototype; add ",{"\'void\'","parameter declarations"}," to make it ",{"a prototype for a zero-parameter function","one"}}},{s,nil,"this declaration is not a prototype; add \'void\' to make it a prototype for a zero-parameter function"}},
		[g]=f,
		[h]="this declaration is not a prototype; add (?:\'void\'|parameter declarations) to make it (?:a prototype for a zero\\-parameter function|one)",
		[i]=a,
		[j]=p,
		[k]={"2a45e409a8ae",1355794160,"When warning about a missing prototype because a function declaration is missing \'void\', insert a fi...","When warning about a missing prototype because a function declaration is missing \'void\', insert a fixit to add the void.\n\nllvm-svn: 170399"},
		[d]={{M,15671,"Decl *Sema::ActOnFinishFunctionBody(Decl *dcl, Stmt *Body, bool IsInstantiation) {\n  // ...\n  {\n    // ...\n    if (FD) {\n      // ...\n      if (ShouldWarnAboutMissingPrototype(FD, PossiblePrototype)) {\n        // ...\n        if (PossiblePrototype) {\n          // We found a declaration that is not a prototype,\n          // but that could be a zero-parameter prototype\n          if (TypeSourceInfo *TI = PossiblePrototype->getTypeSourceInfo()) {\n            // ...\n            if (FunctionNoProtoTypeLoc FTL = TL.getAs<FunctionNoProtoTypeLoc>())\n              Diag(PossiblePrototype->getLocation(), diag::note_declaration_not_a_prototype) << (FD->getNumParams() != 0) << (FD->getNumParams() == 0 ? FixItHint::CreateInsertion(FTL.getRParenLoc(), \"void\") : FixItHint{});"}},
		[m]={
			["clang/test/Sema/warn-missing-prototypes.c"]={"clang/test/Sema/warn-missing-prototypes.c:4:5: note: this declaration is not a prototype; add parameter declarations to make it one","clang/test/Sema/warn-missing-prototypes.c:25:5: note: this declaration is not a prototype; add parameter declarations to make it one","clang/test/Sema/warn-missing-prototypes.c:49:6: note: this declaration is not a prototype; add \'void\' to make it a prototype for a zero-parameter function"}
		}
	},
	["note_declare_parameter_strong"]={
		[b]="note_declare_parameter_strong",
		[c]="declare the parameter __strong or capture a __block __strong variable to keep values alive across autorelease pools",
		[e]="declare the parameter __strong or capture a __block __strong variable to keep values alive across autorelease pools",
		[g]=f,
		[h]="declare the parameter __strong or capture a __block __strong variable to keep values alive across autorelease pools",
		[i]=a,
		[j]="ARC Semantic Issue",
		[k]={"c81708e6ecf0",1477345554,"[Sema][ObjC] Warn about implicitly autoreleasing out-parameters captured","[Sema][ObjC] Warn about implicitly autoreleasing out-parameters captured\nby blocks.\n\nAdd a new warning \"-Wblock-capture-autoreleasing\". The warning warns\nabout implicitly autoreleasing out-parameters captured by blocks which\ncan introduce use-after-free bugs that are hard to debug.\n\nrdar://problem/15377548\n\nDifferential Revision: https://reviews.llvm.org/D25844\n\nllvm-svn: 285031"},
		[d]={{z,19346,"// Returns true if the capture by block was successful.\nstatic bool captureInBlock(BlockScopeInfo *BSI, ValueDecl *Var, SourceLocation Loc, const bool BuildAndDiagnose, QualType &CaptureType, QualType &DeclRefType, const bool Nested, Sema &S, bool Invalid) {\n  // ...\n  // Warn about implicitly autoreleasing indirect parameters captured by blocks.\n  if (const auto *PT = CaptureType->getAs<PointerType>()) {\n    // ...\n    if (!Invalid && PointeeTy->getAs<ObjCObjectPointerType>() && PointeeTy.getObjCLifetime() == Qualifiers::OCL_Autoreleasing && !S.Context.hasDirectOwnershipQualifier(PointeeTy)) {\n      if (BuildAndDiagnose) {\n        // ...\n        S.Diag(VarLoc, diag::note_declare_parameter_strong);"}},
		[m]={
			["clang/test/SemaObjC/arc.m"]={"clang/test/SemaObjC/arc.m:816:38: note: declare the parameter __strong or capture a __block __strong variable to keep values alive across autorelease pools","clang/test/SemaObjC/arc.m:817:49: note: declare the parameter __strong or capture a __block __strong variable to keep values alive across autorelease pools","clang/test/SemaObjC/arc.m:819:49: note: declare the parameter __strong or capture a __block __strong variable to keep values alive across autorelease pools","clang/test/SemaObjC/arc.m:822:38: note: declare the parameter __strong or capture a __block __strong variable to keep values alive across autorelease pools","clang/test/SemaObjC/arc.m:823:48: note: declare the parameter __strong or capture a __block __strong variable to keep values alive across autorelease pools","clang/test/SemaObjC/arc.m:825:49: note: declare the parameter __strong or capture a __block __strong variable to keep values alive across autorelease pools"}
		}
	},
	["note_declared_at"]={
		[b]="note_declared_at",
		[c]="declared here",
		[e]="declared here",
		[g]=f,
		[h]="declared here",
		[i]=a,
		[j]=o,
		[k]={"b1c4d5507fad",1236199783,"The basic representation of diagnostics information in tablegen format, plus (uncommented and incomp...","The basic representation of diagnostics information in tablegen format, plus (uncommented and incomplete) test conversions of the existing def files to this format.\n\nllvm-svn: 66064"},
		[d]={
			[1]={n,2123,"static void NoteLValueLocation(EvalInfo &Info, APValue::LValueBase Base) {\n  // ...\n  if (VD)\n    Info.Note(VD->getLocation(), diag::note_declared_at);"},
			[2]={n,2198,"/// Check that this reference or pointer core constant expression is a valid\n/// value for an address or reference constant expression. Return true if we\n/// can fold this expression, whether or not it\'s a constant expression.\nstatic bool CheckLValueConstantExpression(EvalInfo &Info, SourceLocation Loc, QualType Type, const LValue &LVal, ConstantExprKind Kind, CheckedTemporaries &CheckedTemps) {\n  // ...\n  if (auto *FD = dyn_cast_or_null<FunctionDecl>(BaseVD); FD && FD->isImmediateFunction()) {\n    // ...\n    Info.Note(FD->getLocation(), diag::note_declared_at);"},
			[3]={n,2337,"/// Member pointers are constant expressions unless they point to a\n/// non-virtual dllimport member function.\nstatic bool CheckMemberPointerConstantExpression(EvalInfo &Info, SourceLocation Loc, QualType Type, const APValue &Value, ConstantExprKind Kind) {\n  // ...\n  if (FD->isImmediateFunction()) {\n    // ...\n    Info.Note(FD->getLocation(), diag::note_declared_at);"},
			[4]={n,3543,"/// Diagnose an attempt to read from any unreadable field within the specified\n/// type, which might be a class type.\nstatic bool diagnoseMutableFields(EvalInfo &Info, const Expr *E, AccessKinds AK, QualType T) {\n  // ...\n  for (auto *Field : RD->fields()) {\n    // If we\'re actually going to read this field in some way, then it can\'t\n    // be mutable. If we\'re in a union, then assigning to a mutable field\n    // (even an empty one) can change the active member, so that\'s not OK.\n    // FIXME: Add core issue number for the union case.\n    if (Field->isMutable() && (RD->isUnion() || isReadByLvalueToRvalueConversion(Field->getType()))) {\n      // ...\n      Info.Note(Field->getLocation(), diag::note_declared_at);"},
			[5]={n,3806,"/// Find the designated sub-object of an rvalue.\ntemplate <typename SubobjectHandler> typename SubobjectHandler::result_type findSubobject(EvalInfo &Info, const Expr *E, const CompleteObject &Obj, const SubobjectDesignator &Sub, SubobjectHandler &handler) {\n  // ...\n  // Walk the designator\'s path to find the subobject.\n  for (unsigned I = 0, N = Sub.Entries.size(); /**/; ++I) {\n    // ...\n    if (ObjType->isArrayType()) {\n    // ...\n    } else if (ObjType->isAnyComplexType()) {\n    // ...\n    } else if (const FieldDecl *Field = getAsField(Sub.Entries[I])) {\n      if (Field->isMutable() && !Obj.mayAccessMutableMembers(Info, handler.AccessKind)) {\n        // ...\n        Info.Note(Field->getLocation(), diag::note_declared_at);"},
			[6]={n,4130,"/// Find the complete object to which an LValue refers.\nstatic CompleteObject findCompleteObject(EvalInfo &Info, const Expr *E, AccessKinds AK, const LValue &LVal, QualType LValType) {\n  // ...\n  if (Info.getLangOpts().CPlusPlus14 && LVal.Base == Info.EvaluatingDecl && lifetimeStartedInEvaluation(Info, LVal.Base)) {\n  // ...\n  } else if (const ValueDecl *D = LVal.Base.dyn_cast<const ValueDecl *>()) {\n    // ...\n    // Unless we\'re looking at a local variable or argument in a constexpr call,\n    // the variable we\'re reading must be const.\n    if (!Frame) {\n      if (IsAccess && isa<ParmVarDecl>(VD)) {\n      // ...\n      } else if (Info.getLangOpts().CPlusPlus14 && lifetimeStartedInEvaluation(Info, LVal.Base)) {\n      // ...\n      } else if (isModification(AK)) {\n      // ...\n      } else if (VD->isConstexpr()) {\n      // ...\n      } else if (BaseType->isIntegralOrEnumerationType()) {\n        if (!IsConstant) {\n          // ...\n          if (Info.getLangOpts().CPlusPlus) {\n            // ...\n            Info.Note(VD->getLocation(), diag::note_declared_at);"},
			[7]={n,4150,"/// Find the complete object to which an LValue refers.\nstatic CompleteObject findCompleteObject(EvalInfo &Info, const Expr *E, AccessKinds AK, const LValue &LVal, QualType LValType) {\n  // ...\n  if (Info.getLangOpts().CPlusPlus14 && LVal.Base == Info.EvaluatingDecl && lifetimeStartedInEvaluation(Info, LVal.Base)) {\n  // ...\n  } else if (const ValueDecl *D = LVal.Base.dyn_cast<const ValueDecl *>()) {\n    // ...\n    // Unless we\'re looking at a local variable or argument in a constexpr call,\n    // the variable we\'re reading must be const.\n    if (!Frame) {\n      if (IsAccess && isa<ParmVarDecl>(VD)) {\n      // ...\n      } else if (Info.getLangOpts().CPlusPlus14 && lifetimeStartedInEvaluation(Info, LVal.Base)) {\n      // ...\n      } else if (isModification(AK)) {\n      // ...\n      } else if (VD->isConstexpr()) {\n      // ...\n      } else if (BaseType->isIntegralOrEnumerationType()) {\n      // ...\n      } else if (!IsAccess) {\n      // ...\n      } else if (IsConstant && Info.checkingPotentialConstantExpression() && BaseType->isLiteralType(Info.Ctx) && !VD->hasDefinition()) {\n      // ...\n      } else if (IsConstant) {\n        // Keep evaluating to see what we can do. In particular, we support\n        // folding of const floating-point types, in order to make static const\n        // data members of such types (supported as an extension) more useful.\n        if (Info.getLangOpts().CPlusPlus) {\n          // ...\n          Info.Note(VD->getLocation(), diag::note_declared_at);"},
			[8]={n,4161,"/// Find the complete object to which an LValue refers.\nstatic CompleteObject findCompleteObject(EvalInfo &Info, const Expr *E, AccessKinds AK, const LValue &LVal, QualType LValType) {\n  // ...\n  if (Info.getLangOpts().CPlusPlus14 && LVal.Base == Info.EvaluatingDecl && lifetimeStartedInEvaluation(Info, LVal.Base)) {\n  // ...\n  } else if (const ValueDecl *D = LVal.Base.dyn_cast<const ValueDecl *>()) {\n    // ...\n    // Unless we\'re looking at a local variable or argument in a constexpr call,\n    // the variable we\'re reading must be const.\n    if (!Frame) {\n      if (IsAccess && isa<ParmVarDecl>(VD)) {\n      // ...\n      } else if (Info.getLangOpts().CPlusPlus14 && lifetimeStartedInEvaluation(Info, LVal.Base)) {\n      // ...\n      } else if (isModification(AK)) {\n      // ...\n      } else if (VD->isConstexpr()) {\n      // ...\n      } else if (BaseType->isIntegralOrEnumerationType()) {\n      // ...\n      } else if (!IsAccess) {\n      // ...\n      } else if (IsConstant && Info.checkingPotentialConstantExpression() && BaseType->isLiteralType(Info.Ctx) && !VD->hasDefinition()) {\n      // ...\n      } else if (IsConstant) {\n      // ...\n      } else {\n        // Never allow reading a non-const value.\n        if (Info.getLangOpts().CPlusPlus) {\n          // ...\n          Info.Note(VD->getLocation(), diag::note_declared_at);"},
			[9]={n,4319,"/// Perform an lvalue-to-rvalue conversion on the given glvalue. This\n/// can also be used for \'lvalue-to-lvalue\' conversions for looking up the\n/// glvalue referred to by an entity of reference type.\n///\n/// \\param Info - Information about the ongoing evaluation.\n/// \\param Conv - The expression for which we are performing the conversion.\n///               Used for diagnostics.\n/// \\param Type - The type of the glvalue (before stripping cv-qualifiers in the\n///               case of a non-class type).\n/// \\param LVal - The glvalue on which we are attempting to perform this action.\n/// \\param RVal - The produced value will be placed here.\n/// \\param WantObjectRepresentation - If true, we\'re looking for the object\n///               representation rather than the value, and in particular,\n///               there is no requirement that the result be fully initialized.\nstatic bool handleLValueToRValueConversion(EvalInfo &Info, const Expr *Conv, QualType Type, const LValue &LVal, APValue &RVal, bool WantObjectRepresentation = false) {\n  // ...\n  if (Base && !LVal.getLValueCallIndex() && !Type.isVolatileQualified()) {\n    if (const CompoundLiteralExpr *CLE = dyn_cast<CompoundLiteralExpr>(Base)) {\n      // ...\n      if (CLETy->isArrayType() && !Type->isArrayType()) {\n        if (!CLETy.isConstant(Info.Ctx)) {\n          // ...\n          Info.Note(CLE->getExprLoc(), diag::note_declared_at);"},
			[10]={n,5559,"/// CheckTrivialDefaultConstructor - Check whether a constructor is a trivial\n/// default constructor. If so, we\'ll fold it whether or not it\'s marked as\n/// constexpr. If it is marked as constexpr, we will never implicitly define it,\n/// so we need special handling.\nstatic bool CheckTrivialDefaultConstructor(EvalInfo &Info, SourceLocation Loc, const CXXConstructorDecl *CD, bool IsValueInitialization) {\n  // ...\n  // Value-initialization does not call a trivial default constructor, so such a\n  // call is a core constant expression whether or not the constructor is\n  // constexpr.\n  if (!CD->isConstexpr() && !IsValueInitialization) {\n    if (Info.getLangOpts().CPlusPlus11) {\n      // ...\n      Info.Note(CD->getLocation(), diag::note_declared_at);"},
			[11]={n,5624,"/// CheckConstexprFunction - Check that a function can be called in a constant\n/// expression.\nstatic bool CheckConstexprFunction(EvalInfo &Info, SourceLocation CallLoc, const FunctionDecl *Declaration, const FunctionDecl *Definition, const Stmt *Body) {\n  // ...\n  if (Info.getLangOpts().CPlusPlus11) {\n    // ...\n    Info.Note(DiagDecl->getLocation(), diag::note_declared_at);"},
			[12]={n,5798,"/// Perform virtual dispatch.\nstatic const CXXMethodDecl *HandleVirtualDispatch(EvalInfo &Info, const Expr *E, LValue &This, const CXXMethodDecl *Found, llvm::SmallVectorImpl<QualType> &CovariantAdjustmentPath) {\n  // ...\n  // C++2a [class.abstract]p6:\n  //   the effect of making a virtual call to a pure virtual function [...] is\n  //   undefined\n  if (Callee->isPure()) {\n    // ...\n    Info.Note(Callee->getLocation(), diag::note_declared_at);"},
			[13]={n,8369,"bool LValueExprEvaluator::VisitVarDecl(const Expr *E, const VarDecl *VD) {\n  // ...\n  if (!Info.getLangOpts().CPlusPlus11) {\n    // ...\n    Info.Note(VD->getLocation(), diag::note_declared_at);"},
			[14]={y,134,"bool CheckExtern(InterpState &S, CodePtr OpPC, const Pointer &Ptr) {\n  // ...\n  if (!S.checkingPotentialConstantExpression()) {\n    // ...\n    S.Note(VD->getLocation(), diag::note_declared_at);"},
			[15]={y,169,"bool CheckLive(InterpState &S, CodePtr OpPC, const Pointer &Ptr, AccessKinds AK) {\n  // ...\n  if (!Ptr.isLive()) {\n    // ...\n    if (IsTemp)\n    // ...\n    else\n      S.Note(Ptr.getDeclLoc(), diag::note_declared_at);"},
			[16]={y,232,"bool CheckMutable(InterpState &S, CodePtr OpPC, const Pointer &Ptr) {\n  // ...\n  S.Note(Field->getLocation(), diag::note_declared_at);"},
			[17]={y,335,"bool CheckCallable(InterpState &S, CodePtr OpPC, const Function *F) {\n  // ...\n  if (!F->isConstexpr()) {\n    // ...\n    if (S.getLangOpts().CPlusPlus11) {\n      // ...\n      S.Note(DiagDecl->getLocation(), diag::note_declared_at);"},
			[18]={y,379,"bool CheckPure(InterpState &S, CodePtr OpPC, const CXXMethodDecl *MD) {\n  // ...\n  S.Note(MD->getLocation(), diag::note_declared_at);"},
			[19]={"clang/lib/Sema/SemaAttr.cpp",702,"bool Sema::UnifySection(StringRef SectionName, int SectionFlags, NamedDecl *Decl) {\n  // ...\n  if (Section.Decl)\n    Diag(Section.Decl->getLocation(), diag::note_declared_at) << Section.Decl->getName();"},
			[20]={"clang/lib/Sema/SemaAttr.cpp",723,"bool Sema::UnifySection(StringRef SectionName, int SectionFlags, SourceLocation PragmaSectionLocation) {\n  // ...\n  if (SectionIt != Context.SectionInfos.end()) {\n    // ...\n    if (!(Section.SectionFlags & ASTContext::PSF_Implicit)) {\n      // ...\n      if (Section.Decl)\n        Diag(Section.Decl->getLocation(), diag::note_declared_at) << Section.Decl->getName();"},
			[21]={"clang/lib/Sema/SemaCXXScopeSpec.cpp",300,"/// Require that the EnumDecl is completed with its enumerators defined or\n/// instantiated. SS, if provided, is the ScopeRef parsed.\n///\nbool Sema::RequireCompleteEnumDecl(EnumDecl *EnumD, SourceLocation L, CXXScopeSpec *SS) {\n  // ...\n  if (SS) {\n  // ...\n  } else {\n    // ...\n    Diag(EnumD->getLocation(), diag::note_declared_at);"},
			[22]={"clang/lib/Sema/SemaCXXScopeSpec.cpp",593,"/// Build a new nested-name-specifier for \"identifier::\", as described\n/// by ActOnCXXNestedNameSpecifier.\n///\n/// \\param S Scope in which the nested-name-specifier occurs.\n/// \\param IdInfo Parser information about an identifier in the\n///        nested-name-spec.\n/// \\param EnteringContext If true, enter the context specified by the\n///        nested-name-specifier.\n/// \\param SS Optional nested name specifier preceding the identifier.\n/// \\param ScopeLookupResult Provides the result of name lookup within the\n///        scope of the nested-name-specifier that was computed at template\n///        definition time.\n/// \\param ErrorRecoveryLookup Specifies if the method is called to improve\n///        error recovery and what kind of recovery is performed.\n/// \\param IsCorrectedToColon If not null, suggestion of replace \'::\' -> \':\'\n///        are allowed.  The bool value pointed by this parameter is set to\n///       \'true\' if the identifier is treated as if it was followed by \':\',\n///        not \'::\'.\n/// \\param OnlyNamespace If true, only considers namespaces in lookup.\n///\n/// This routine differs only slightly from ActOnCXXNestedNameSpecifier, in\n/// that it contains an extra parameter \\p ScopeLookupResult, which provides\n/// the result of name lookup within the scope of the nested-name-specifier\n/// that was computed at template definition time.\n///\n/// If ErrorRecoveryLookup is true, then this call is used to improve error\n/// recovery.  This means that it should not emit diagnostics, it should\n/// just return true on failure.  It also means it should only return a valid\n/// scope if it *knows* that the result is correct.  It should not return in a\n/// dependent context, for example. Nor will it extend \\p SS with the scope\n/// specifier.\nbool Sema::BuildCXXNestedNameSpecifier(Scope *S, NestedNameSpecInfo &IdInfo, bool EnteringContext, CXXScopeSpec &SS, NamedDecl *ScopeLookupResult, bool ErrorRecoveryLookup, bool *IsCorrectedToColon, bool OnlyNamespace) {\n  // ...\n  if (Found.empty() && !ErrorRecoveryLookup) {\n    // ...\n    if (!R.empty()) {\n      // ...\n      // The identifier is found in ordinary lookup. If correction to colon is\n      // allowed, suggest replacement to \':\'.\n      if (IsCorrectedToColon) {\n        // ...\n        if (NamedDecl *ND = R.getAsSingle<NamedDecl>())\n          Diag(ND->getLocation(), diag::note_declared_at);"},
			[23]={M,17431,"/// 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(PrevDecl->getLocation(), diag::note_declared_at);"},
			[24]={t,1066,"static bool lookupStdTypeTraitMember(Sema &S, LookupResult &TraitMemberLookup, SourceLocation Loc, StringRef Trait, TemplateArgumentListInfo &Args, unsigned DiagID) {\n  // ...\n  if (!TraitTD) {\n    // ...\n    S.Diag(Found->getLocation(), diag::note_declared_at);"},
			[25]={t,1174,"/// \\return std::tuple_element<I, T>::type.\nstatic QualType getTupleLikeElementType(Sema &S, SourceLocation Loc, unsigned I, QualType T) {\n  // ...\n  if (!TD) {\n    // ...\n    if (!R.empty())\n      S.Diag(R.getRepresentativeDecl()->getLocation(), diag::note_declared_at);"},
			[26]={t,1453,"static bool checkMemberDecomposition(Sema &S, ArrayRef<BindingDecl *> Bindings, ValueDecl *Src, QualType DecompType, const CXXRecordDecl *OrigRD) {\n  // ...\n  for (auto *FD : RD->fields()) {\n    // ...\n    // All the non-static data members are required to be nameable, so they\n    // must all have names.\n    if (!FD->getDeclName()) {\n      // ...\n      if (FD->isAnonymousStructOrUnion()) {\n        // ...\n        S.Diag(FD->getLocation(), diag::note_declared_at);"},
			[27]={t,5052,"static bool BuildImplicitMemberInitializer(Sema &SemaRef, CXXConstructorDecl *Constructor, ImplicitInitializerKind ImplicitInitKind, FieldDecl *Field, IndirectFieldDecl *Indirect, CXXCtorInitializer *&CXXMemberInit) {\n  // ...\n  if (!Field->getParent()->isUnion()) {\n    if (FieldBaseElementType->isReferenceType()) {\n      // ...\n      SemaRef.Diag(Field->getLocation(), diag::note_declared_at);"},
			[28]={t,5062,"static bool BuildImplicitMemberInitializer(Sema &SemaRef, CXXConstructorDecl *Constructor, ImplicitInitializerKind ImplicitInitKind, FieldDecl *Field, IndirectFieldDecl *Indirect, CXXCtorInitializer *&CXXMemberInit) {\n  // ...\n  if (!Field->getParent()->isUnion()) {\n    // ...\n    if (FieldBaseElementType.isConstQualified()) {\n      // ...\n      SemaRef.Diag(Field->getLocation(), diag::note_declared_at);"},
			[29]={t,8839,"bool Sema::CheckExplicitlyDefaultedComparison(Scope *S, FunctionDecl *FD, DefaultedComparisonKind DCK) {\n  // ...\n  if (IsMethod) {\n  } else if (isa<CXXRecordDecl>(FD->getLexicalDeclContext())) {\n  // ...\n  } else {\n    // ...\n    if (llvm::none_of(RD->friends(), [&](const FriendDecl *F) { return FD->getCanonicalDecl() == F->getFriendDecl()->getCanonicalDecl(); })) {\n      // ...\n      Diag(RD->getCanonicalDecl()->getLocation(), diag::note_declared_at);"},
			[30]={t,9927,"/// Check whether the special member selected for a given type would be trivial.\nstatic bool checkTrivialSubobjectCall(Sema &S, SourceLocation SubobjLoc, QualType SubType, bool ConstRHS, Sema::CXXSpecialMember CSM, TrivialSubobjectKind Kind, Sema::TrivialABIHandling TAH, bool Diagnose) {\n  // ...\n  if (Diagnose) {\n    // ...\n    if (!Selected && CSM == Sema::CXXDefaultConstructor) {\n    // ...\n    } else if (!Selected)\n    // ...\n    else if (Selected->isUserProvided()) {\n      if (Kind == TSK_CompleteObject)\n      // ...\n      else {\n        // ...\n        S.Diag(Selected->getLocation(), diag::note_declared_at);"},
			[31]={t,14861,"void Sema::DefineImplicitCopyAssignment(SourceLocation CurrentLocation, CXXMethodDecl *CopyAssignOperator) {\n  // ...\n  // Assign non-static members.\n  for (auto *Field : ClassDecl->fields()) {\n    // ...\n    // Check for members of reference type; we can\'t copy those.\n    if (Field->getType()->isReferenceType()) {\n      // ...\n      Diag(Field->getLocation(), diag::note_declared_at);"},
			[32]={t,14871,"void Sema::DefineImplicitCopyAssignment(SourceLocation CurrentLocation, CXXMethodDecl *CopyAssignOperator) {\n  // ...\n  // Assign non-static members.\n  for (auto *Field : ClassDecl->fields()) {\n    // ...\n    if (!BaseType->getAs<RecordType>() && BaseType.isConstQualified()) {\n      // ...\n      Diag(Field->getLocation(), diag::note_declared_at);"},
			[33]={t,15236,"void Sema::DefineImplicitMoveAssignment(SourceLocation CurrentLocation, CXXMethodDecl *MoveAssignOperator) {\n  // ...\n  // Assign non-static members.\n  for (auto *Field : ClassDecl->fields()) {\n    // ...\n    // Check for members of reference type; we can\'t move those.\n    if (Field->getType()->isReferenceType()) {\n      // ...\n      Diag(Field->getLocation(), diag::note_declared_at);"},
			[34]={t,15246,"void Sema::DefineImplicitMoveAssignment(SourceLocation CurrentLocation, CXXMethodDecl *MoveAssignOperator) {\n  // ...\n  // Assign non-static members.\n  for (auto *Field : ClassDecl->fields()) {\n    // ...\n    if (!BaseType->getAs<RecordType>() && BaseType.isConstQualified()) {\n      // ...\n      Diag(Field->getLocation(), diag::note_declared_at);"},
			[35]={z,3388,"/// Complete semantic analysis for a reference to the given declaration.\nExprResult Sema::BuildDeclarationNameExpr(const CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo, NamedDecl *D, NamedDecl *FoundD, const TemplateArgumentListInfo *TemplateArgs, bool AcceptInvalidDecl) {\n  // ...\n  // Make sure that we\'re referring to a value.\n  if (!isa<ValueDecl, UnresolvedUsingIfExistsDecl>(D)) {\n    // ...\n    Diag(D->getLocation(), diag::note_declared_at);"},
			[36]={z,4468,"/// Check the constraints on expression operands to unary type expression\n/// and type traits.\n///\n/// Completes any types necessary and validates the constraints on the operand\n/// expression. The logic mostly mirrors the type-based overload, but may modify\n/// the expression as it completes the type for that expression through template\n/// instantiation, etc.\nbool Sema::CheckUnaryExprOrTypeTraitOperand(Expr *E, UnaryExprOrTypeTrait ExprKind) {\n  // ...\n  if (ExprKind == UETT_SizeOf) {\n    if (const auto *DeclRef = dyn_cast<DeclRefExpr>(E->IgnoreParens())) {\n      if (const auto *PVD = dyn_cast<ParmVarDecl>(DeclRef->getFoundDecl())) {\n        // ...\n        if (Type->isPointerType() && OType->isArrayType()) {\n          // ...\n          Diag(PVD->getLocation(), diag::note_declared_at);"},
			[37]={z,18444,"static void EvaluateAndDiagnoseImmediateInvocation(Sema &SemaRef, Sema::ImmediateInvocationCandidate Candidate) {\n  // ...\n  if (!Result || !Notes.empty()) {\n    // ...\n    if (auto Context = SemaRef.InnermostDeclarationWithDelayedImmediateInvocations()) {\n      // ...\n      SemaRef.Diag(Context->Decl->getBeginLoc(), diag::note_declared_at);"},
			[38]={z,18449,"static void HandleImmediateInvocations(Sema &SemaRef, Sema::ExpressionEvaluationContextRecord &Rec) {\n  // ...\n  for (auto *DR : Rec.ReferenceToConsteval) {\n    // ...\n    if (!Rec.InImmediateEscalatingFunctionContext || (SemaRef.inTemplateInstantiation() && !ImmediateEscalating)) {\n      // ...\n      SemaRef.Diag(ND->getLocation(), diag::note_declared_at);"},
			[39]={z,18477,"static void HandleImmediateInvocations(Sema &SemaRef, Sema::ExpressionEvaluationContextRecord &Rec) {\n  // ...\n  for (auto *DR : Rec.ReferenceToConsteval) {\n    // ...\n    if (!Rec.InImmediateEscalatingFunctionContext || (SemaRef.inTemplateInstantiation() && !ImmediateEscalating)) {\n      // ...\n      if (auto Context = SemaRef.InnermostDeclarationWithDelayedImmediateInvocations()) {\n        // ...\n        SemaRef.Diag(Context->Decl->getBeginLoc(), diag::note_declared_at);"},
			[40]={z,19164,"// Certain capturing entities (lambdas, blocks etc.) are not allowed to capture\n// certain types of variables (unnamed, variably modified types etc.)\n// so check for eligibility.\nstatic bool isVariableCapturable(CapturingScopeInfo *CSI, ValueDecl *Var, SourceLocation Loc, const bool Diagnose, Sema &S) {\n  // ...\n  // Lambdas are not allowed to capture unnamed variables\n  // (e.g. anonymous unions).\n  // FIXME: The C++11 rule don\'t actually state this explicitly, but I\'m\n  // assuming that\'s the intent.\n  if (IsLambda && !Var->getDeclName()) {\n    if (Diagnose) {\n      // ...\n      S.Diag(Var->getLocation(), diag::note_declared_at);"},
			[41]={w,4045,"template <typename TB> static bool CheckObjCBridgeNSCast(Sema &S, QualType castType, Expr *castExpr, bool &HadTheAttribute, bool warn) {\n  // ...\n  while (const auto *TD = T->getAs<TypedefType>()) {\n    // ...\n    if (TB *ObjCBAttr = getObjCBridgeAttr<TB>(TD)) {\n      if (IdentifierInfo *Parm = ObjCBAttr->getBridgedType()) {\n        // ...\n        if (S.LookupName(R, S.TUScope)) {\n          // ...\n          if (Target && isa<ObjCInterfaceDecl>(Target)) {\n            // ...\n            if (const ObjCObjectPointerType *InterfacePointerType = castType->getAsObjCInterfacePointerType()) {\n            // ...\n            } else if (castType->isObjCIdType() || (S.Context.ObjCObjectAdoptsQTypeProtocols(castType, ExprClass)))\n            // ...\n            else {\n              if (warn) {\n                // ...\n                S.Diag(TDNDecl->getBeginLoc(), diag::note_declared_at);"},
			[42]={w,4046,"template <typename TB> static bool CheckObjCBridgeNSCast(Sema &S, QualType castType, Expr *castExpr, bool &HadTheAttribute, bool warn) {\n  // ...\n  while (const auto *TD = T->getAs<TypedefType>()) {\n    // ...\n    if (TB *ObjCBAttr = getObjCBridgeAttr<TB>(TD)) {\n      if (IdentifierInfo *Parm = ObjCBAttr->getBridgedType()) {\n        // ...\n        if (S.LookupName(R, S.TUScope)) {\n          // ...\n          if (Target && isa<ObjCInterfaceDecl>(Target)) {\n            // ...\n            if (const ObjCObjectPointerType *InterfacePointerType = castType->getAsObjCInterfacePointerType()) {\n            // ...\n            } else if (castType->isObjCIdType() || (S.Context.ObjCObjectAdoptsQTypeProtocols(castType, ExprClass)))\n            // ...\n            else {\n              if (warn) {\n                // ...\n                S.Diag(Target->getBeginLoc(), diag::note_declared_at);"},
			[43]={w,4055,"template <typename TB> static bool CheckObjCBridgeNSCast(Sema &S, QualType castType, Expr *castExpr, bool &HadTheAttribute, bool warn) {\n  // ...\n  while (const auto *TD = T->getAs<TypedefType>()) {\n    // ...\n    if (TB *ObjCBAttr = getObjCBridgeAttr<TB>(TD)) {\n      if (IdentifierInfo *Parm = ObjCBAttr->getBridgedType()) {\n        // ...\n        if (S.LookupName(R, S.TUScope)) {\n        // ...\n        } else if (!castType->isObjCIdType()) {\n          // ...\n          S.Diag(TDNDecl->getBeginLoc(), diag::note_declared_at);"},
			[44]={w,4098,"template <typename TB> static bool CheckObjCBridgeCFCast(Sema &S, QualType castType, Expr *castExpr, bool &HadTheAttribute, bool warn) {\n  // ...\n  while (const auto *TD = T->getAs<TypedefType>()) {\n    // ...\n    if (TB *ObjCBAttr = getObjCBridgeAttr<TB>(TD)) {\n      if (IdentifierInfo *Parm = ObjCBAttr->getBridgedType()) {\n        // ...\n        if (S.LookupName(R, S.TUScope)) {\n          // ...\n          if (Target && isa<ObjCInterfaceDecl>(Target)) {\n            // ...\n            if (const ObjCObjectPointerType *InterfacePointerType = castExpr->getType()->getAsObjCInterfacePointerType()) {\n              // ...\n              if (warn) {\n                // ...\n                S.Diag(TDNDecl->getBeginLoc(), diag::note_declared_at);"},
			[45]={w,4113,"template <typename TB> static bool CheckObjCBridgeCFCast(Sema &S, QualType castType, Expr *castExpr, bool &HadTheAttribute, bool warn) {\n  // ...\n  while (const auto *TD = T->getAs<TypedefType>()) {\n    // ...\n    if (TB *ObjCBAttr = getObjCBridgeAttr<TB>(TD)) {\n      if (IdentifierInfo *Parm = ObjCBAttr->getBridgedType()) {\n        // ...\n        if (S.LookupName(R, S.TUScope)) {\n          // ...\n          if (Target && isa<ObjCInterfaceDecl>(Target)) {\n            // ...\n            if (const ObjCObjectPointerType *InterfacePointerType = castExpr->getType()->getAsObjCInterfacePointerType()) {\n            // ...\n            } else if (castExpr->getType()->isObjCIdType() || (S.Context.QIdProtocolsAdoptObjCObjectProtocols(castExpr->getType(), CastClass)))\n            // ...\n            else {\n              if (warn) {\n                // ...\n                S.Diag(TDNDecl->getBeginLoc(), diag::note_declared_at);"},
			[46]={w,4114,"template <typename TB> static bool CheckObjCBridgeCFCast(Sema &S, QualType castType, Expr *castExpr, bool &HadTheAttribute, bool warn) {\n  // ...\n  while (const auto *TD = T->getAs<TypedefType>()) {\n    // ...\n    if (TB *ObjCBAttr = getObjCBridgeAttr<TB>(TD)) {\n      if (IdentifierInfo *Parm = ObjCBAttr->getBridgedType()) {\n        // ...\n        if (S.LookupName(R, S.TUScope)) {\n          // ...\n          if (Target && isa<ObjCInterfaceDecl>(Target)) {\n            // ...\n            if (const ObjCObjectPointerType *InterfacePointerType = castExpr->getType()->getAsObjCInterfacePointerType()) {\n            // ...\n            } else if (castExpr->getType()->isObjCIdType() || (S.Context.QIdProtocolsAdoptObjCObjectProtocols(castExpr->getType(), CastClass)))\n            // ...\n            else {\n              if (warn) {\n                // ...\n                S.Diag(Target->getBeginLoc(), diag::note_declared_at);"},
			[47]={w,4123,"template <typename TB> static bool CheckObjCBridgeCFCast(Sema &S, QualType castType, Expr *castExpr, bool &HadTheAttribute, bool warn) {\n  // ...\n  while (const auto *TD = T->getAs<TypedefType>()) {\n    // ...\n    if (TB *ObjCBAttr = getObjCBridgeAttr<TB>(TD)) {\n      if (IdentifierInfo *Parm = ObjCBAttr->getBridgedType()) {\n        // ...\n        S.Diag(TDNDecl->getBeginLoc(), diag::note_declared_at);"},
			[48]={w,4125,"template <typename TB> static bool CheckObjCBridgeCFCast(Sema &S, QualType castType, Expr *castExpr, bool &HadTheAttribute, bool warn) {\n  // ...\n  while (const auto *TD = T->getAs<TypedefType>()) {\n    // ...\n    if (TB *ObjCBAttr = getObjCBridgeAttr<TB>(TD)) {\n      if (IdentifierInfo *Parm = ObjCBAttr->getBridgedType()) {\n        // ...\n        if (Target)\n          S.Diag(Target->getBeginLoc(), diag::note_declared_at);"},
			[49]={w,4248,"bool Sema::checkObjCBridgeRelatedComponents(SourceLocation Loc, QualType DestType, QualType SrcType, ObjCInterfaceDecl *&RelatedClass, ObjCMethodDecl *&ClassMethod, ObjCMethodDecl *&InstanceMethod, TypedefNameDecl *&TDNDecl, bool CfToNs, bool Diagnose) {\n  // ...\n  if (!LookupName(R, TUScope)) {\n    if (Diagnose) {\n      // ...\n      Diag(TDNDecl->getBeginLoc(), diag::note_declared_at);"},
			[50]={w,4259,"bool Sema::checkObjCBridgeRelatedComponents(SourceLocation Loc, QualType DestType, QualType SrcType, ObjCInterfaceDecl *&RelatedClass, ObjCMethodDecl *&ClassMethod, ObjCMethodDecl *&InstanceMethod, TypedefNameDecl *&TDNDecl, bool CfToNs, bool Diagnose) {\n  // ...\n  if (Target && isa<ObjCInterfaceDecl>(Target))\n  // ...\n  else {\n    if (Diagnose) {\n      // ...\n      Diag(TDNDecl->getBeginLoc(), diag::note_declared_at);"},
			[51]={w,4261,"bool Sema::checkObjCBridgeRelatedComponents(SourceLocation Loc, QualType DestType, QualType SrcType, ObjCInterfaceDecl *&RelatedClass, ObjCMethodDecl *&ClassMethod, ObjCMethodDecl *&InstanceMethod, TypedefNameDecl *&TDNDecl, bool CfToNs, bool Diagnose) {\n  // ...\n  if (Target && isa<ObjCInterfaceDecl>(Target))\n  // ...\n  else {\n    if (Diagnose) {\n      // ...\n      if (Target)\n        Diag(Target->getBeginLoc(), diag::note_declared_at);"},
			[52]={w,4274,"bool Sema::checkObjCBridgeRelatedComponents(SourceLocation Loc, QualType DestType, QualType SrcType, ObjCInterfaceDecl *&RelatedClass, ObjCMethodDecl *&ClassMethod, ObjCMethodDecl *&InstanceMethod, TypedefNameDecl *&TDNDecl, bool CfToNs, bool Diagnose) {\n  // ...\n  // Check for an existing class method with the given selector name.\n  if (CfToNs && CMId) {\n    // ...\n    if (!ClassMethod) {\n      if (Diagnose) {\n        // ...\n        Diag(TDNDecl->getBeginLoc(), diag::note_declared_at);"},
			[53]={w,4288,"bool Sema::checkObjCBridgeRelatedComponents(SourceLocation Loc, QualType DestType, QualType SrcType, ObjCInterfaceDecl *&RelatedClass, ObjCMethodDecl *&ClassMethod, ObjCMethodDecl *&InstanceMethod, TypedefNameDecl *&TDNDecl, bool CfToNs, bool Diagnose) {\n  // ...\n  // Check for an existing instance method with the given selector name.\n  if (!CfToNs && IMId) {\n    // ...\n    if (!InstanceMethod) {\n      if (Diagnose) {\n        // ...\n        Diag(TDNDecl->getBeginLoc(), diag::note_declared_at);"},
			[54]={w,4332,"bool Sema::CheckObjCBridgeRelatedConversions(SourceLocation Loc, QualType DestType, QualType SrcType, Expr *&SrcExpr, bool Diagnose) {\n  // ...\n  if (CfToNs) {\n    // Implicit conversion from CF to ObjC object is needed.\n    if (ClassMethod) {\n      if (Diagnose) {\n        // ...\n        Diag(RelatedClass->getBeginLoc(), diag::note_declared_at);"},
			[55]={w,4333,"bool Sema::CheckObjCBridgeRelatedConversions(SourceLocation Loc, QualType DestType, QualType SrcType, Expr *&SrcExpr, bool Diagnose) {\n  // ...\n  if (CfToNs) {\n    // Implicit conversion from CF to ObjC object is needed.\n    if (ClassMethod) {\n      if (Diagnose) {\n        // ...\n        Diag(TDNDecl->getBeginLoc(), diag::note_declared_at);"},
			[56]={w,4375,"bool Sema::CheckObjCBridgeRelatedConversions(SourceLocation Loc, QualType DestType, QualType SrcType, Expr *&SrcExpr, bool Diagnose) {\n  // ...\n  if (CfToNs) {\n  // ...\n  } else {\n    // Implicit conversion from ObjC type to CF object is needed.\n    if (InstanceMethod) {\n      if (Diagnose) {\n        // ...\n        Diag(RelatedClass->getBeginLoc(), diag::note_declared_at);"},
			[57]={w,4376,"bool Sema::CheckObjCBridgeRelatedConversions(SourceLocation Loc, QualType DestType, QualType SrcType, Expr *&SrcExpr, bool Diagnose) {\n  // ...\n  if (CfToNs) {\n  // ...\n  } else {\n    // Implicit conversion from ObjC type to CF object is needed.\n    if (InstanceMethod) {\n      if (Diagnose) {\n        // ...\n        Diag(TDNDecl->getBeginLoc(), diag::note_declared_at);"},
			[58]={fb,1730,"bool Sema::DiagnosePropertyAccessorMismatch(ObjCPropertyDecl *property, ObjCMethodDecl *GetterMethod, SourceLocation Loc) {\n  // ...\n  if (!compat) {\n    // ...\n    if ((propertyObjCPtr = PropertyRValueType->getAs<ObjCObjectPointerType>()) && (getterObjCPtr = GetterType->getAs<ObjCObjectPointerType>()))\n    // ...\n    else if (CheckAssignmentConstraints(Loc, GetterType, PropertyRValueType) != Compatible) {\n      // ...\n      Diag(GetterMethod->getLocation(), diag::note_declared_at);"},
			[59]={fb,1745,"bool Sema::DiagnosePropertyAccessorMismatch(ObjCPropertyDecl *property, ObjCMethodDecl *GetterMethod, SourceLocation Loc) {\n  // ...\n  if (!compat) {\n    // ...\n    Diag(GetterMethod->getLocation(), diag::note_declared_at);"},
			[60]={fb,2455,"/// ProcessPropertyDecl - Make sure that any user-defined setter/getter methods\n/// have the property type and issue diagnostics if they don\'t.\n/// Also synthesize a getter/setter method if none exist (and update the\n/// appropriate lookup tables.\nvoid Sema::ProcessPropertyDecl(ObjCPropertyDecl *property) {\n  // ...\n  if (!property->isReadOnly() && SetterMethod) {\n    // ...\n    if (SetterMethod->param_size() != 1 || !Context.hasSameUnqualifiedType((*SetterMethod->param_begin())->getType().getNonReferenceType(), property->getType().getNonReferenceType())) {\n      // ...\n      Diag(SetterMethod->getLocation(), diag::note_declared_at);"},
			[61]={H,3060,"ExprResult Sema::ActOnOpenMPIdExpression(Scope *CurScope, CXXScopeSpec &ScopeSpec, const DeclarationNameInfo &Id, OpenMPDirectiveKind Kind) {\n  // ...\n  if (!Lookup.isSingleResult()) {\n  // ...\n  } else if (!(VD = Lookup.getAsSingle<VarDecl>())) {\n    // ...\n    Diag(Lookup.getFoundDecl()->getLocation(), diag::note_declared_at);"},
			[62]={cc,14014,"/// Create a binary operation that may resolve to an overloaded\n/// operator.\n///\n/// \\param OpLoc The location of the operator itself (e.g., \'+\').\n///\n/// \\param Opc The BinaryOperatorKind that describes this operator.\n///\n/// \\param Fns The set of non-member functions that will be\n/// considered by overload resolution. The caller needs to build this\n/// set based on the context using, e.g.,\n/// LookupOverloadedOperatorName() and ArgumentDependentLookup(). This\n/// set should not contain any member functions; those will be added\n/// by CreateOverloadedBinOp().\n///\n/// \\param LHS Left-hand argument.\n/// \\param RHS Right-hand argument.\n/// \\param PerformADL Whether to consider operator candidates found by ADL.\n/// \\param AllowRewrittenCandidates Whether to consider candidates found by\n///        C++20 operator rewrites.\n/// \\param DefaultedFn If we are synthesizing a defaulted operator function,\n///        the function in question. Such a function is never a candidate in\n///        our overload resolution. This also enables synthesizing a three-way\n///        comparison from < and == as described in C++20 [class.spaceship]p1.\nExprResult Sema::CreateOverloadedBinOp(SourceLocation OpLoc, BinaryOperatorKind Opc, const UnresolvedSetImpl &Fns, Expr *LHS, Expr *RHS, bool PerformADL, bool AllowRewrittenCandidates, FunctionDecl *DefaultedFn) {\n  // ...\n  case OR_Success: {\n    // ...\n    if (FnDecl) {\n      // ...\n      // C++2a [over.match.oper]p9:\n      //   If a rewritten operator== candidate is selected by overload\n      //   resolution for an operator@, its return type shall be cv bool\n      if (Best->RewriteKind && ChosenOp == OO_EqualEqual && !FnDecl->getReturnType()->isBooleanType()) {\n        // ...\n        Diag(FnDecl->getLocation(), diag::note_declared_at);"},
			[63]={ib,2928,"/// BuildCXXForRangeStmt - Build or instantiate a C++11 for-range statement.\nStmtResult Sema::BuildCXXForRangeStmt(SourceLocation ForLoc, SourceLocation CoawaitLoc, Stmt *InitStmt, SourceLocation ColonLoc, Stmt *RangeDecl, Stmt *Begin, Stmt *End, Expr *Cond, Expr *Inc, Stmt *LoopVarDecl, SourceLocation RParenLoc, BuildForRangeKind Kind) {\n  // ...\n  if (RangeVarType->isDependentType()) {\n  // ...\n  } else if (!BeginDeclStmt.get()) {\n    // ...\n    if (const ArrayType *UnqAT = RangeType->getAsArrayTypeUnsafe()) {\n    // ...\n    } else {\n      // ...\n      if (Kind == BFRK_Build && RangeStatus == FRS_NoViableFunction && BEFFailure == BEF_begin) {\n        // If the range is being built from an array parameter, emit a\n        // a diagnostic that it is being treated as a pointer.\n        if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Range)) {\n          if (ParmVarDecl *PVD = dyn_cast<ParmVarDecl>(DRE->getDecl())) {\n            // ...\n            if (PointerTy->isPointerType() && ArrayTy->isArrayType()) {\n              // ...\n              Diag(PVD->getLocation(), diag::note_declared_at);"},
			[64]={"clang/lib/Sema/SemaSYCL.cpp",66,"void Sema::deepTypeCheckForSYCLDevice(SourceLocation UsedAt, llvm::DenseSet<QualType> Visited, ValueDecl *DeclToCheck) {\n  // ...\n  auto Check = [&](QualType TypeToCheck, const ValueDecl *D) {\n    // ...\n    // Checks for other types can also be done here.\n    if (ErrorFound) {\n      if (NeedToEmitNotes) {\n        if (auto *FD = dyn_cast<FieldDecl>(D))\n        // ...\n        else\n          SYCLDiagIfDeviceCode(D->getLocation(), diag::note_declared_at);"},
			[65]={vb,4286,"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(TAT->getLocation(), diag::note_declared_at);"}
		},
		[m]={
			["clang/test/SemaHLSL/cb_error.hlsl"]={"clang/test/SemaHLSL/cb_error.hlsl:4:9: note: declared here"}
		}
	},
	["note_declared_coroutine_here"]={
		[b]="note_declared_coroutine_here",
		[c]="function is a coroutine due to use of \'%select{co_await|co_yield|co_return}0\' here",
		[e]={{nil,G,"function is a coroutine due to use of \'A\' here"},{nil,nil,{"function is a coroutine due to use of \'",{"co_await","co_yield","co_return"},"\' here"}}},
		[g]=f,
		[h]="function is a coroutine due to use of \'(.*?)\' here",
		[i]=a,
		[j]=Jb,
		[k]={"cfd53b4e9993",1445494430,"[coroutines] Initial stub Sema functionality for handling coroutine await / yield / return.","[coroutines] Initial stub Sema functionality for handling coroutine await / yield / return.\n\nllvm-svn: 250993"},
		[d]={{V,721,"bool Sema::ActOnCoroutineBodyStart(Scope *SC, SourceLocation KWLoc, StringRef Keyword) {\n  // ...\n  // Build the initial suspend point\n  auto buildSuspends = [&](StringRef Name) mutable -> StmtResult {\n    // ...\n    if (Suspend.isInvalid()) {\n      // ...\n      Diag(KWLoc, diag::note_declared_coroutine_here) << Keyword;"},{V,1124,"void Sema::CheckCompletedCoroutineBody(FunctionDecl *FD, Stmt *&Body) {\n  // ...\n  // [stmt.return.coroutine]p1:\n  //   A coroutine shall not enclose a return statement ([stmt.return]).\n  if (Fn->FirstReturnLoc.isValid()) {\n    // ...\n    Diag(Fn->FirstCoroutineStmtLoc, diag::note_declared_coroutine_here) << Fn->getFirstCoroutineStmtKeyword();"},{V,1229,"static bool diagReturnOnAllocFailure(Sema &S, Expr *E, CXXRecordDecl *PromiseRecordDecl, FunctionScopeInfo &Fn) {\n  // ...\n  S.Diag(Fn.FirstCoroutineStmtLoc, diag::note_declared_coroutine_here) << Fn.getFirstCoroutineStmtKeyword();"},{V,1272,"bool CoroutineStmtBuilder::makeReturnOnAllocFailure() {\n  // ...\n  if (ReturnStmt.isInvalid()) {\n    // ...\n    S.Diag(Fn.FirstCoroutineStmtLoc, diag::note_declared_coroutine_here) << Fn.getFirstCoroutineStmtKeyword();"},{V,1726,"bool CoroutineStmtBuilder::makeOnException() {\n  // ...\n  // Since the body of the coroutine will be wrapped in try-catch, it will\n  // be incompatible with SEH __try if present in a function.\n  if (!S.getLangOpts().Borland && Fn.FirstSEHTryLoc.isValid()) {\n    // ...\n    S.Diag(Fn.FirstCoroutineStmtLoc, diag::note_declared_coroutine_here) << Fn.getFirstCoroutineStmtKeyword();"},{V,1928,"static void noteMemberDeclaredHere(Sema &S, Expr *E, FunctionScopeInfo &Fn) {\n  // ...\n  S.Diag(Fn.FirstCoroutineStmtLoc, diag::note_declared_coroutine_here) << Fn.getFirstCoroutineStmtKeyword();"}},
		[m]={
			["clang/test/SemaCXX/coroutine-seh.cpp"]={"clang/test/SemaCXX/coroutine-seh.cpp:35:5: note: function is a coroutine due to use of \'co_return\' here"}
		}
	},
	["note_declared_nonnull"]={
		[b]="note_declared_nonnull",
		[c]="declared %select{\'returns_nonnull\'|\'nonnull\'}0 here",
		[e]={{nil,nil,{"declared ",{"\'returns_nonnull\'","\'nonnull\'"}," here"}}},
		[g]=f,
		[h]="declared (?:\'returns_nonnull\'|\'nonnull\') here",
		[i]=a,
		[j]=p,
		[k]={"bc85ec865606",1465967919,"Add a \"declared \'nonnull\' here\" note to warnings where an expression is checked against null.","Add a \"declared \'nonnull\' here\" note to warnings where an expression is checked against null.\n\nllvm-svn: 272755"},
		[d]={{tb,15493,"/// Diagnose pointers that are always non-null.\n/// \\param E the expression containing the pointer\n/// \\param NullKind NPCK_NotNull if E is a cast to bool, otherwise, E is\n/// compared to a null pointer\n/// \\param IsEqual True when the comparison is equal to a null pointer\n/// \\param Range Extra SourceRange to highlight in the diagnostic\nvoid Sema::DiagnoseAlwaysNonNullPointer(Expr *E, Expr::NullPointerConstantKind NullKind, bool IsEqual, SourceRange Range) {\n  // ...\n  auto ComplainAboutNonnullParamOrCall = [&](const Attr *NonnullAttr) {\n    // ...\n    Diag(NonnullAttr->getLocation(), diag::note_declared_nonnull) << IsParam;"}},
		[m]={
			["clang/test/Sema/nonnull.c"]={"clang/test/Sema/nonnull.c:93:16: note: declared \'nonnull\' here","clang/test/Sema/nonnull.c:93:16: note: declared \'nonnull\' here","clang/test/Sema/nonnull.c:112:80: note: declared \'nonnull\' here","clang/test/Sema/nonnull.c:112:80: note: declared \'nonnull\' here","clang/test/Sema/nonnull.c:134:16: note: declared \'nonnull\' here","clang/test/Sema/nonnull.c:148:31: note: declared \'nonnull\' here",Ob,Ob,Ob,Ob,Ob,Ob}
		}
	},
	["note_declared_required_constant_init_here"]={
		[b]="note_declared_required_constant_init_here",
		[c]="required by \'require_constant_initializer\' attribute here",
		[e]="required by \'require_constant_initializer\' attribute here",
		[g]=f,
		[h]="required by (?:\'require_constant_initialization\' attribute|\'constinit\' specifier) here",
		[i]=a,
		[j]=p,
		[k]={"92f8935e63f0",1472840729,"Implement __attribute__((require_constant_initialization)) for safe static initialization.","Implement __attribute__((require_constant_initialization)) for safe static initialization.\n\nSummary:\nThis attribute specifies expectations about the initialization of static and\nthread local variables. Specifically that the variable has a\n[constant initializer](http://en.cppreference.com/w/cpp/language/constant_initialization)\naccording to the rules of [basic.start.static]. Failure to meet this expectation\nwill result in an error.\n\nStatic objects with constant initializers avoid hard-to-find bugs caused by\nthe indeterminate order of dynamic initialization. They can also be safely\nused by other static constructors across translation units.\n\nThis attribute acts as a compile time assertion that the requirements\nfor constant initialization have been met. Since these requirements change\nbetween dialects and have subtle pitfalls it\'s important to fail fast instead\nof silently falling back on dynamic initialization.\n\n```c++\n  // -std=c++14\n  #define SAFE_STATIC __attribute__((require_constant_initialization)) static\n  struct T {\n    constexpr T(int) {}\n    ~T();\n  };\n  SAFE_STATIC T x = {42}; // OK.\n  SAFE_STATIC T y = 42; // error: variable does not have a constant initializer\n  // copy initialization is not a constant expression on a non-literal type.\n```\nThis attribute can only be applied to objects with static or thread-local storage\nduration.\n\nReviewers: majnemer, rsmith, aaron.ballman\n\nSubscribers: jroelofs, cfe-commits\n\nDifferential Revision: https://reviews.llvm.org/D23385\n\nllvm-svn: 280516"},
		[d]={{M,14229,"void Sema::CheckCompleteVariableDeclaration(VarDecl *var) {\n  // ...\n  // Check whether the initializer is sufficiently constant.\n  if (getLangOpts().CPlusPlus && !type->isDependentType() && Init && !Init->isValueDependent() && (GlobalStorage || var->isConstexpr() || var->mightBeUsableInConstantExpressions(Context))) {\n    // ...\n    if (HasConstInit) {\n    // ...\n    } else if (var->isConstexpr()) {\n    // ...\n    } else if (GlobalStorage && var->hasAttr<ConstInitAttr>()) {\n      // ...\n      Diag(Attr->getLocation(), diag::note_declared_required_constant_init_here) << Attr->getRange() << Attr->isConstinit();"}},
		[m]={
			["clang/test/CXX/dcl.dcl/dcl.spec/dcl.constinit/p3.cpp"]={"clang/test/CXX/dcl.dcl/dcl.spec/dcl.constinit/p3.cpp:6:1: note: required by \'constinit\' specifier here"}
		}
	},
	["note_deduced_non_type_template_arg_type_mismatch"]={
		[b]="note_deduced_non_type_template_arg_type_mismatch",
		[c]="deduced non-type template argument does not have the same type as the corresponding template parameter%diff{ ($ vs $)|}0,1",
		[e]={{nil,nil,{"deduced non-type template argument does not have the same type as the corresponding template parameter",{" (A vs B)",a}}}},
		[g]=f,
		[h]="deduced non\\-type template argument does not have the same type as the corresponding template parameter(?: \\((.*?) vs (.*?)\\)|)",
		[i]=a,
		[j]=o,
		[m]={
			["clang/test/SemaTemplate/temp_arg_nontype.cpp"]={"clang/test/SemaTemplate/temp_arg_nontype.cpp:414:38: note: deduced non-type template argument does not have the same type as the corresponding template parameter (\'const int\' vs \'int &\')","clang/test/SemaTemplate/temp_arg_nontype.cpp:420:32: note: deduced non-type template argument does not have the same type as the corresponding template parameter (\'int\' vs \'const int &\')","clang/test/SemaTemplate/temp_arg_nontype.cpp:426:31: note: deduced non-type template argument does not have the same type as the corresponding template parameter (\'int\' vs \'const int &\')"}
		}
	},
	["note_deduced_template_arg_substitution_here"]={
		[b]="note_deduced_template_arg_substitution_here",
		[c]="during template argument deduction for %select{class|variable}0 template %select{partial specialization |}1%2 %3",
		[e]={{nil,nil,{"during template argument deduction for ",{"class","variable"}," template ",{"partial specialization ",a},"C D"}}},
		[g]=f,
		[h]="during template argument deduction for (?:class|variable) template (?:partial specialization |)(.*?) (.*?)",
		[i]=a,
		[j]=p,
		[k]={"e68a38f0a8ab",1482553231,"Fix crash if substitution fails during deduction of variable template partial specialization argumen...","Fix crash if substitution fails during deduction of variable template partial specialization arguments.\n\nllvm-svn: 290484"},
		[d]={{U,858,"/// Prints the current instantiation stack through a series of\n/// notes.\nvoid Sema::PrintInstantiationStack() {\n  // ...\n  for (SmallVectorImpl<CodeSynthesisContext>::reverse_iterator Active = CodeSynthesisContexts.rbegin(), ActiveEnd = CodeSynthesisContexts.rend(); Active != ActiveEnd; ++Active, ++InstantiationIdx) {\n    // ...\n    case CodeSynthesisContext::DeducedTemplateArgumentSubstitution: {\n      if (FunctionTemplateDecl *FnTmpl = dyn_cast<FunctionTemplateDecl>(Active->Entity)) {\n      // ...\n      } else {\n        // ...\n        Diags.Report(Active->PointOfInstantiation, diag::note_deduced_template_arg_substitution_here) << IsVar << IsTemplate << cast<NamedDecl>(Active->Entity) << getTemplateArgumentBindingsText(Params, Active->TemplateArgs, Active->NumTemplateArgs) << Active->InstantiationRange;"}},
		[m]={
			["clang/test/CXX/temp/temp.constr/temp.constr.constr/partial-specializations.cpp"]={"clang/test/CXX/temp/temp.constr/temp.constr.constr/partial-specializations.cpp:29:24: note: during template argument deduction for class template partial specialization \'B<T *>\' [with T = int *]","clang/test/CXX/temp/temp.constr/temp.constr.constr/partial-specializations.cpp:29:24: note: during template argument deduction for class template partial specialization \'B<T **>\' [with T = int]","clang/test/CXX/temp/temp.constr/temp.constr.constr/partial-specializations.cpp:78:17: note: during template argument deduction for variable template partial specialization \'v1<T *>\' [with T = int *]","clang/test/CXX/temp/temp.constr/temp.constr.constr/partial-specializations.cpp:78:17: note: during template argument deduction for variable template partial specialization \'v1<T **>\' [with T = int]"}
		}
	},
	["note_deduction_guide_access"]={
		[b]={{nil,F,"note_deduction_guide_access"}},
		[c]={{nil,F,"deduction guide declared %0 by intervening access specifier"}},
		[e]={{nil,F,"deduction guide declared A by intervening access specifier"}},
		[g]=f,
		[h]="deduction guide declared (.*?) by intervening access specifier",
		[i]=a,
		[j]={{nil,F,p}},
		[k]={"e4899c16480d",1527718423,"PR37631: verify that a member deduction guide has the same access as its template.","PR37631: verify that a member deduction guide has the same access as its template.\n\nllvm-svn: 333599"},
		[d]={{t,3676,"/// 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    // C++ [temp.deduct.guide]p3:\n    //   A deduction guide [...] for a member class template [shall be\n    //   declared] with the same access [as the template].\n    if (auto *DG = dyn_cast<CXXDeductionGuideDecl>(NonTemplateMember)) {\n      // ...\n      // Access specifiers are only meaningful if both the template and the\n      // deduction guide are from the same scope.\n      if (AS != TD->getAccess() && TD->getDeclContext()->getRedeclContext()->Equals(DG->getDeclContext()->getRedeclContext())) {\n        // ...\n        Diag(LastAccessSpec->getBeginLoc(), diag::note_deduction_guide_access) << AS;"}},
		[m]={
			["clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp"]={"clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp:365:3: note: deduction guide declared protected by intervening access specifier","clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp:369:3: note: deduction guide declared private by intervening access specifier","clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp:372:3: note: deduction guide declared public by intervening access specifier","clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp:372:3: note: deduction guide declared public by intervening access specifier"}
		}
	},
	["note_deduction_guide_template_access"]={
		[b]={{nil,F,"note_deduction_guide_template_access"}},
		[c]={{nil,F,"member template declared %0 here"}},
		[e]={{nil,F,"member template declared A here"}},
		[g]=f,
		[h]="member template declared (.*?) here",
		[i]=a,
		[j]={{nil,F,p}},
		[k]={"e4899c16480d",1527718423,"PR37631: verify that a member deduction guide has the same access as its template.","PR37631: verify that a member deduction guide has the same access as its template.\n\nllvm-svn: 333599"},
		[d]={{t,3668,"/// 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    // C++ [temp.deduct.guide]p3:\n    //   A deduction guide [...] for a member class template [shall be\n    //   declared] with the same access [as the template].\n    if (auto *DG = dyn_cast<CXXDeductionGuideDecl>(NonTemplateMember)) {\n      // ...\n      // Access specifiers are only meaningful if both the template and the\n      // deduction guide are from the same scope.\n      if (AS != TD->getAccess() && TD->getDeclContext()->getRedeclContext()->Equals(DG->getDeclContext()->getRedeclContext())) {\n        // ...\n        Diag(TD->getBeginLoc(), diag::note_deduction_guide_template_access) << TD->getAccess();"}},
		[m]={
			["clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp"]={"clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp:363:5: note: member template declared public here","clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp:366:5: note: member template declared protected here","clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp:366:5: note: member template declared protected here","clang/test/SemaCXX/cxx1z-class-template-argument-deduction.cpp:370:5: note: member template declared private here"}
		}
	},
	["note_default_arg_instantiation_here"]={
		[b]="note_default_arg_instantiation_here",
		[c]="in instantiation of default argument for \'%0\' required here",
		[e]="in instantiation of default argument for \'A\' required here",
		[g]=f,
		[h]="in instantiation of default argument for \'(.*?)\' required here",
		[i]=a,
		[j]=p,
		[k]={"5a8987ca5113",1237025389,"Update tablegen diagnostic files to be in sync with the def files.","Update tablegen diagnostic files to be in sync with the def files.\n\nllvm-svn: 67004"},
		[d]={{U,811,"/// Prints the current instantiation stack through a series of\n/// notes.\nvoid Sema::PrintInstantiationStack() {\n  // ...\n  for (SmallVectorImpl<CodeSynthesisContext>::reverse_iterator Active = CodeSynthesisContexts.rbegin(), ActiveEnd = CodeSynthesisContexts.rend(); Active != ActiveEnd; ++Active, ++InstantiationIdx) {\n    // ...\n    case CodeSynthesisContext::DefaultTemplateArgumentInstantiation: {\n      // ...\n      Diags.Report(Active->PointOfInstantiation, diag::note_default_arg_instantiation_here) << OS.str() << Active->InstantiationRange;"}},
		[m]={
			["clang/test/SemaTemplate/instantiation-default-1.cpp"]={"clang/test/SemaTemplate/instantiation-default-1.cpp:36:1: note: in instantiation of default argument for \'Def2<int_ref_t>\' required here"}
		}
	},
	["note_default_argument_declared_here"]={
		[b]="note_default_argument_declared_here",
		[c]="default argument declared here",
		[e]="default argument declared here",
		[g]=f,
		[h]="default argument declared here",
		[i]=a,
		[j]=p,
		[k]={"84613c4eba08",1244825500,"It\'s an error to use a function declared in a class definition as a default argument before the func...","It\'s an error to use a function declared in a class definition as a default argument before the function has been declared.\n\nllvm-svn: 73234"},
		[d]={{z,6327,"bool Sema::CheckCXXDefaultArgExpr(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param, Expr *RewrittenInit, bool SkipImmediateInvocations) {\n  if (Param->hasUnparsedDefaultArg()) {\n    // ...\n    Diag(UnparsedDefaultArgLocs[Param], diag::note_default_argument_declared_here);"}},
		[m]={
			["clang/test/SemaCXX/default2.cpp"]={"clang/test/SemaCXX/default2.cpp:118:22: note: default argument declared here","clang/test/SemaCXX/default2.cpp:124:22: note: default argument declared here"}
		}
	},
	["note_default_function_arg_instantiation_here"]={
		[b]="note_default_function_arg_instantiation_here",
		[c]="in instantiation of default function argument expression for \'%0\' required here",
		[e]="in instantiation of default function argument expression for \'A\' required here",
		[g]=f,
		[h]="in instantiation of default function argument expression for \'(.*?)\' required here",
		[i]=a,
		[j]=p,
		[k]={"657bad441eda",1252127659,"Use a separate diagnostic for default function argument expressions.","Use a separate diagnostic for default function argument expressions.\n\nllvm-svn: 81062"},
		[d]={{U,877,"/// Prints the current instantiation stack through a series of\n/// notes.\nvoid Sema::PrintInstantiationStack() {\n  // ...\n  for (SmallVectorImpl<CodeSynthesisContext>::reverse_iterator Active = CodeSynthesisContexts.rbegin(), ActiveEnd = CodeSynthesisContexts.rend(); Active != ActiveEnd; ++Active, ++InstantiationIdx) {\n    // ...\n    case CodeSynthesisContext::DefaultFunctionArgumentInstantiation: {\n      // ...\n      Diags.Report(Active->PointOfInstantiation, diag::note_default_function_arg_instantiation_here) << OS.str() << Active->InstantiationRange;"}},
		[m]={
			["clang/test/SemaCXX/attr-unavailable.cpp"]={"clang/test/SemaCXX/attr-unavailable.cpp:159:22: note: in instantiation of default function argument expression for \'has_default_arg_template<int>\' required here"}
		}
	},
	["note_default_member_initializer_not_yet_parsed"]={
		[b]={{nil,u,"note_default_member_initializer_not_yet_parsed"}},
		[c]={{nil,u,"default member initializer declared here"}},
		[e]={{nil,u,"default member initializer declared here"}},
		[g]=f,
		[h]="default member initializer declared here",
		[i]=a,
		[j]={{nil,u,p}},
		[k]={"14f6bfcb52e7",1582847864,"[clang] Implement objc_non_runtime_protocol to remove protocol metadata","[clang] Implement objc_non_runtime_protocol to remove protocol metadata\n\nSummary:\nMotivated by the new objc_direct attribute, this change adds a new\nattribute that remotes metadata from Protocols that the programmer knows\nisn\'t going to be used at runtime. We simply have the frontend skip\ngenerating any protocol metadata entries (e.g. OBJC_CLASS_NAME,\n_OBJC_$_PROTOCOL_INSTANCE_METHDOS, _OBJC_PROTOCOL, etc) for a protocol\nmarked with `__attribute__((objc_non_runtime_protocol))`.\n\nThere are a few APIs used to retrieve a protocol at runtime.\n`@protocol(SomeProtocol)` will now error out of the requested protocol\nis marked with attribute. `objc_getProtocol` will return `NULL` which\nis consistent with the behavior of a non-existing protocol.\n\nSubscribers: cfe-commits\n\nTags: #clang\n\nDifferential Revision: https://reviews.llvm.org/D75574"},
		[d]={{z,6457,"ExprResult Sema::BuildCXXDefaultInitExpr(SourceLocation Loc, FieldDecl *Field) {\n  // ...\n  Diag(Field->getEndLoc(), diag::note_default_member_initializer_not_yet_parsed);"},{U,3520,"/// Instantiate the definition of a field from the given pattern.\n///\n/// \\param PointOfInstantiation The point of instantiation within the\n///        source code.\n/// \\param Instantiation is the declaration whose definition is being\n///        instantiated. This will be a class of a class temploid\n///        specialization, or a local enumeration within a function temploid\n///        specialization.\n/// \\param Pattern The templated declaration from which the instantiation\n///        occurs.\n/// \\param TemplateArgs The template arguments to be substituted into\n///        the pattern.\n///\n/// \\return \\c true if an error occurred, \\c false otherwise.\nbool Sema::InstantiateInClassInitializer(SourceLocation PointOfInstantiation, FieldDecl *Instantiation, FieldDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs) {\n  // ...\n  if (!OldInit) {\n    // ...\n    Diag(Pattern->getEndLoc(), diag::note_default_member_initializer_not_yet_parsed);"}},
		[m]={
			["clang/test/SemaCXX/cxx1y-initializer-aggregates.cpp"]={"clang/test/SemaCXX/cxx1y-initializer-aggregates.cpp:68:14: note: default member initializer declared here","clang/test/SemaCXX/cxx1y-initializer-aggregates.cpp:70:14: note: default member initializer declared here"}
		}
	},
	["note_defaulted_comparison_ambiguous"]={
		[b]={{nil,l,"note_defaulted_comparison_ambiguous"}},
		[c]={{nil,l,"defaulted %0 is implicitly deleted because implied %select{|\'==\' |\'<\' }1comparison %select{|for member %3 |for base class %3 }2is ambiguous"}},
		[e]={{nil,l,{"defaulted A is implicitly deleted because implied ",{a,"\'==\' ","\'<\' "},"comparison ",{a,"for member D ","for base class D "},"is ambiguous"}}},
		[g]=f,
		[h]="defaulted (.*?) is implicitly deleted because implied (?:|\'\\=\\=\' |\'\\<\' )comparison (?:|for member (.*?) |for base class (.*?) )is ambiguous",
		[i]=a,
		[j]={{nil,l,p}},
		[k]={bb,1573070592,cb,eb},
		[d]={{t,8200,"/// A visitor over the notional body of a defaulted comparison that determines\n/// whether that body would be deleted or constexpr.\nclass DefaultedComparisonAnalyzer : public DefaultedComparisonVisitor<DefaultedComparisonAnalyzer, DefaultedComparisonInfo, DefaultedComparisonInfo, DefaultedComparisonSubobject> {\n  // ...\n  Result visitBinaryOperator(OverloadedOperatorKind OO, ArrayRef<Expr *> Args, Subobject Subobj, OverloadCandidateSet *SpaceshipCandidates = nullptr) {\n    // ...\n    case OR_Ambiguous:\n      if (Diagnose == ExplainDeleted) {\n        // ...\n        CandidateSet.NoteCandidates(PartialDiagnosticAt(Subobj.Loc, S.PDiag(diag::note_defaulted_comparison_ambiguous) << FD << Kind << Subobj.Kind << Subobj.Decl), S, OCD_AmbiguousCandidates, Args);"}},
		[m]={
			["clang/test/CXX/class/class.compare/class.spaceship/p1.cpp"]={"clang/test/CXX/class/class.compare/class.spaceship/p1.cpp:87:37: note: defaulted \'operator<=>\' is implicitly deleted because implied comparison for base class \'F\' is ambiguous","clang/test/CXX/class/class.compare/class.spaceship/p1.cpp:120:7: note: defaulted \'operator<=>\' is implicitly deleted because implied comparison for member \'arr\' is ambiguous"}
		}
	},
	["note_defaulted_comparison_calls_deleted"]={
		[b]={{nil,l,"note_defaulted_comparison_calls_deleted"}},
		[c]={{nil,l,"defaulted %0 is implicitly deleted because it would invoke a deleted comparison function%select{| for member %2| for base class %2}1"}},
		[e]={{nil,l,{"defaulted A is implicitly deleted because it would invoke a deleted comparison function",{a," for member C"," for base class C"}}}},
		[g]=f,
		[h]="defaulted (.*?) is implicitly deleted because it would invoke a deleted comparison function(?:| for member (.*?)| for base class (.*?))",
		[i]=a,
		[j]={{nil,l,p}},
		[k]={bb,1573070592,cb,eb},
		[d]={{t,8217,"/// A visitor over the notional body of a defaulted comparison that determines\n/// whether that body would be deleted or constexpr.\nclass DefaultedComparisonAnalyzer : public DefaultedComparisonVisitor<DefaultedComparisonAnalyzer, DefaultedComparisonInfo, DefaultedComparisonInfo, DefaultedComparisonSubobject> {\n  // ...\n  Result visitBinaryOperator(OverloadedOperatorKind OO, ArrayRef<Expr *> Args, Subobject Subobj, OverloadCandidateSet *SpaceshipCandidates = nullptr) {\n    // ...\n    case OR_Deleted:\n      if (Diagnose == ExplainDeleted) {\n        if ((DCK == DefaultedComparisonKind::NotEqual || DCK == DefaultedComparisonKind::Relational) && !Best->RewriteKind) {\n        // ...\n        } else {\n          S.Diag(Subobj.Loc, diag::note_defaulted_comparison_calls_deleted) << FD << Subobj.Kind << Subobj.Decl;"}},
		[m]={
			["clang/test/CXX/class/class.compare/class.rel/p2.cpp"]={"clang/test/CXX/class/class.compare/class.rel/p2.cpp:25:17: note: defaulted \'operator<\' is implicitly deleted because it would invoke a deleted comparison function","clang/test/CXX/class/class.compare/class.rel/p2.cpp:26:17: note: defaulted \'operator<=\' is implicitly deleted because it would invoke a deleted comparison function","clang/test/CXX/class/class.compare/class.rel/p2.cpp:27:17: note: defaulted \'operator>\' is implicitly deleted because it would invoke a deleted comparison function","clang/test/CXX/class/class.compare/class.rel/p2.cpp:28:17: note: defaulted \'operator>=\' is implicitly deleted because it would invoke a deleted comparison function","clang/test/CXX/class/class.compare/class.rel/p2.cpp:56:17: note: defaulted \'operator!=\' is implicitly deleted because it would invoke a deleted comparison function"}
		}
	},
	["note_defaulted_comparison_cannot_deduce"]={
		[b]={{nil,l,"note_defaulted_comparison_cannot_deduce"}},
		[c]={{nil,l,"return type of defaulted \'operator<=>\' cannot be deduced because return type %2 of three-way comparison for %select{|member|base class}0 %1 is not a standard comparison category type"}},
		[e]={{nil,l,{"return type of defaulted \'operator<=>\' cannot be deduced because return type C of three-way comparison for ",{a,qc,"base class"}," B is not a standard comparison category type"}}},
		[g]=f,
		[h]="return type of defaulted \'operator\\<\\=\\>\' cannot be deduced because return type (.*?) of three\\-way comparison for (?:|member|base class) (.*?) is not a standard comparison category type",
		[i]=a,
		[j]={{nil,l,p}},
		[k]={"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"},
		[d]={{t,8162,"/// A visitor over the notional body of a defaulted comparison that determines\n/// whether that body would be deleted or constexpr.\nclass DefaultedComparisonAnalyzer : public DefaultedComparisonVisitor<DefaultedComparisonAnalyzer, DefaultedComparisonInfo, DefaultedComparisonInfo, DefaultedComparisonSubobject> {\n  // ...\n  Result visitBinaryOperator(OverloadedOperatorKind OO, ArrayRef<Expr *> Args, Subobject Subobj, OverloadCandidateSet *SpaceshipCandidates = nullptr) {\n    // ...\n    case OR_Success: {\n      // ...\n      if (FunctionDecl *BestFD = Best->Function) {\n        // ...\n        if (NeedsDeducing) {\n          // ...\n          if (!Info) {\n            if (Diagnose == ExplainDeleted) {\n              S.Diag(Subobj.Loc, diag::note_defaulted_comparison_cannot_deduce) << Subobj.Kind << Subobj.Decl << BestFD->getCallResultType().withoutLocalFastQualifiers();"}},
		[m]={
			["clang/test/CXX/class/class.compare/class.spaceship/p2.cpp"]={"clang/test/CXX/class/class.compare/class.spaceship/p2.cpp:44:7: note: return type of defaulted \'operator<=>\' cannot be deduced because return type \'A\' of three-way comparison for member \'a\' is not a standard comparison category type"}
		}
	},
	["note_defaulted_comparison_cannot_deduce_callee"]={
		[b]={{nil,l,"note_defaulted_comparison_cannot_deduce_callee"}},
		[c]={{nil,l,"selected \'operator<=>\' for %select{|member|base class}0 %1 declared here"}},
		[e]={{nil,l,{"selected \'operator<=>\' for ",{a,qc,"base class"}," B declared here"}}},
		[g]=f,
		[h]="selected \'operator\\<\\=\\>\' for (?:|member|base class) (.*?) declared here",
		[i]=a,
		[j]={{nil,l,p}},
		[k]={"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"},
		[d]={{t,8153,"/// A visitor over the notional body of a defaulted comparison that determines\n/// whether that body would be deleted or constexpr.\nclass DefaultedComparisonAnalyzer : public DefaultedComparisonVisitor<DefaultedComparisonAnalyzer, DefaultedComparisonInfo, DefaultedComparisonInfo, DefaultedComparisonSubobject> {\n  // ...\n  Result visitBinaryOperator(OverloadedOperatorKind OO, ArrayRef<Expr *> Args, Subobject Subobj, OverloadCandidateSet *SpaceshipCandidates = nullptr) {\n    // ...\n    case OR_Success: {\n      // ...\n      if (FunctionDecl *BestFD = Best->Function) {\n        // ...\n        if (NeedsDeducing) {\n          // If any callee has an undeduced return type, deduce it now.\n          // FIXME: It\'s not clear how a failure here should be handled. For\n          // now, we produce an eager diagnostic, because that is forward\n          // compatible with most (all?) other reasonable options.\n          if (BestFD->getReturnType()->isUndeducedType() && S.DeduceReturnType(BestFD, FD->getLocation(),\n            // ...\n            // Don\'t produce a duplicate error when asked to explain why the\n            // comparison is deleted: we diagnosed that when initially checking\n            // the defaulted operator.\n            if (Diagnose == NoDiagnostics) {\n              // ...\n              S.Diag(BestFD->getLocation(), diag::note_defaulted_comparison_cannot_deduce_callee) << Subobj.Kind << Subobj.Decl;"},{t,8166,"/// A visitor over the notional body of a defaulted comparison that determines\n/// whether that body would be deleted or constexpr.\nclass DefaultedComparisonAnalyzer : public DefaultedComparisonVisitor<DefaultedComparisonAnalyzer, DefaultedComparisonInfo, DefaultedComparisonInfo, DefaultedComparisonSubobject> {\n  // ...\n  Result visitBinaryOperator(OverloadedOperatorKind OO, ArrayRef<Expr *> Args, Subobject Subobj, OverloadCandidateSet *SpaceshipCandidates = nullptr) {\n    // ...\n    case OR_Success: {\n      // ...\n      if (FunctionDecl *BestFD = Best->Function) {\n        // ...\n        if (NeedsDeducing) {\n          // ...\n          if (!Info) {\n            if (Diagnose == ExplainDeleted) {\n              // ...\n              S.Diag(BestFD->getLocation(), diag::note_defaulted_comparison_cannot_deduce_callee) << Subobj.Kind << Subobj.Decl;"}},
		[m]={
			["clang/test/CXX/class/class.compare/class.spaceship/p2.cpp"]={"clang/test/CXX/class/class.compare/class.spaceship/p2.cpp:41:7: note: selected \'operator<=>\' for member \'a\' declared here","clang/test/CXX/class/class.compare/class.spaceship/p2.cpp:119:10: note: selected \'operator<=>\' for base class \'c\' declared here"}
		}
	},
	["note_defaulted_comparison_cannot_deduce_undeduced_auto"]={
		[b]={{nil,l,"note_defaulted_comparison_cannot_deduce_undeduced_auto"}},
		[c]={{nil,l,"%select{|member|base class}0 %1 declared here"}},
		[e]={{nil,l,{{a,qc,"base class"}," B declared here"}}},
		[g]=f,
		[h]="(?:|member|base class) (.*?) declared here",
		[i]=a,
		[j]={{nil,l,p}},
		[k]={"1228d42ddab8",1576809732,"[OpenMP][Part 2] Use reusable OpenMP context/traits handling","[OpenMP][Part 2] Use reusable OpenMP context/traits handling\n\nThis patch implements an almost complete handling of OpenMP\ncontexts/traits such that we can reuse most of the logic in Flang\nthrough the OMPContext.{h,cpp} in llvm/Frontend/OpenMP.\n\nAll but construct SIMD specifiers, e.g., inbranch, and the device ISA\nselector are define in `llvm/lib/Frontend/OpenMP/OMPKinds.def`. From\nthese definitions we generate the enum classes `TraitSet`,\n`TraitSelector`, and `TraitProperty` as well as conversion and helper\nfunctions in `llvm/lib/Frontend/OpenMP/OMPContext.{h,cpp}`.\n\nThe above enum classes are used in the parser, sema, and the AST\nattribute. The latter is not a collection of multiple primitive variant\narguments that contain encodings via numbers and strings but instead a\ntree that mirrors the `match` clause (see `struct OpenMPTraitInfo`).\n\nThe changes to the parser make it more forgiving when wrong syntax is\nread and they also resulted in more specialized diagnostics. The tests\nare updated and the core issues are detected as before. Here and\nelsewhere this patch tries to be generic, thus we do not distinguish\nwhat selector set, selector, or property is parsed except if they do\nbehave exceptionally, as for example `user={condition(EXPR)}` does.\n\nThe sema logic changed in two ways: First, the OMPDeclareVariantAttr\nrepresentation changed, as mentioned above, and the sema was adjusted to\nwork with the new `OpenMPTraitInfo`. Second, the matching and scoring\nlogic moved into `OMPContext.{h,cpp}`. It is implemented on a flat\nrepresentation of the `match` clause that is not tied to clang.\n`OpenMPTraitInfo` provides a method to generate this flat structure (see\n`struct VariantMatchInfo`) by computing integer score values and boolean\nuser conditions from the `clang::Expr` we keep for them.\n\nThe OpenMP context is now an explicit object (see `struct OMPContext`).\nThis is in anticipation of construct traits that need to be tracked. The\nOpenMP context, as well as the `VariantMatchInfo`, are basically made up\nof a set of active or respectively required traits, e.g., \'host\', and an\nordered container of constructs which allows duplication. Matching and\nscoring is kept as generic as possible to allow easy extension in the\nfuture.\n\n---\n\nTest changes:\n\nThe messages checked in `OpenMP/declare_variant_messages.{c,cpp}` have\nbeen auto generated to match the new warnings and notes of the parser.\nThe \"subset\" checks were reversed causing the wrong version to be\npicked. The tests have been adjusted to correct this.\nWe do not print scores if the user did not provide one.\nWe print spaces to make lists in the `match` clause more legible.\n\nReviewers: kiranchandramohan, ABataev, RaviNarayanaswamy, gtbercea, grokos, sdmitriev, JonChesterfield, hfinkel, fghanim\n\nSubscribers: merge_guards_bot, rampitec, mgorny, hiraditya, aheejin, fedor.sergeev, simoncook, bollu, guansong, dexonsmith, jfb, s.egerton, llvm-commits, cfe-commits\n\nTags: #clang, #llvm\n\nDifferential Revision: https://reviews.llvm.org/D71830"},
		[d]={{t,8150,"/// A visitor over the notional body of a defaulted comparison that determines\n/// whether that body would be deleted or constexpr.\nclass DefaultedComparisonAnalyzer : public DefaultedComparisonVisitor<DefaultedComparisonAnalyzer, DefaultedComparisonInfo, DefaultedComparisonInfo, DefaultedComparisonSubobject> {\n  // ...\n  Result visitBinaryOperator(OverloadedOperatorKind OO, ArrayRef<Expr *> Args, Subobject Subobj, OverloadCandidateSet *SpaceshipCandidates = nullptr) {\n    // ...\n    case OR_Success: {\n      // ...\n      if (FunctionDecl *BestFD = Best->Function) {\n        // ...\n        if (NeedsDeducing) {\n          // If any callee has an undeduced return type, deduce it now.\n          // FIXME: It\'s not clear how a failure here should be handled. For\n          // now, we produce an eager diagnostic, because that is forward\n          // compatible with most (all?) other reasonable options.\n          if (BestFD->getReturnType()->isUndeducedType() && S.DeduceReturnType(BestFD, FD->getLocation(),\n            // ...\n            // Don\'t produce a duplicate error when asked to explain why the\n            // comparison is deleted: we diagnosed that when initially checking\n            // the defaulted operator.\n            if (Diagnose == NoDiagnostics) {\n              // ...\n              S.Diag(Subobj.Loc, diag::note_defaulted_comparison_cannot_deduce_undeduced_auto) << Subobj.Kind << Subobj.Decl;"}}
	},
	["note_defaulted_comparison_inaccessible"]={
		[b]={{nil,l,"note_defaulted_comparison_inaccessible"}},
		[c]={{nil,l,"defaulted %0 is implicitly deleted because it would invoke a %select{private|protected}3 %4%select{ member of %6| member of %6 to compare member %2| to compare base class %2}1"}},
		[e]={{nil,l,{"defaulted A is implicitly deleted because it would invoke a ",{"private","protected"}," E",{" member of G"," member of G to compare member C"," to compare base class C"}}}},
		[g]=f,
		[h]="defaulted (.*?) is implicitly deleted because it would invoke a (?:private|protected) (.*?)(?: member of (.*?)| member of (.*?) to compare member (.*?)| to compare base class (.*?))",
		[i]=a,
		[j]={{nil,l,p}},
		[k]={"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"},
		[d]={{t,8105,"/// A visitor over the notional body of a defaulted comparison that determines\n/// whether that body would be deleted or constexpr.\nclass DefaultedComparisonAnalyzer : public DefaultedComparisonVisitor<DefaultedComparisonAnalyzer, DefaultedComparisonInfo, DefaultedComparisonInfo, DefaultedComparisonSubobject> {\n  // ...\n  Result visitBinaryOperator(OverloadedOperatorKind OO, ArrayRef<Expr *> Args, Subobject Subobj, OverloadCandidateSet *SpaceshipCandidates = nullptr) {\n    // ...\n    case OR_Success: {\n      // ...\n      if (ArgClass && Best->FoundDecl.getDecl() && Best->FoundDecl.getDecl()->isCXXClassMember()) {\n        // ...\n        if (!S.isMemberAccessibleForDeletion(ArgClass, Best->FoundDecl, ObjectType, Subobj.Loc, Diagnose == ExplainDeleted ? S.PDiag(diag::note_defaulted_comparison_inaccessible) << FD << Subobj.Kind << Subobj.Decl : S.PDiag()))"}},
		[m]={
			["clang/test/CXX/class/class.compare/class.rel/p2.cpp"]={"clang/test/CXX/class/class.compare/class.rel/p2.cpp:81:17: note: defaulted \'operator<\' is implicitly deleted because it would invoke a private \'operator<=>\' member of \'Access::A\'"}
		}
	},
	["note_defaulted_comparison_no_viable_function"]={
		[b]={{nil,l,"note_defaulted_comparison_no_viable_function"}},
		[c]={{nil,K,"defaulted %0 is implicitly deleted because there is no viable %select{three-way comparison function|\'operator==\'}1 for %select{|member |base class }2%3"},{A,A,"defaulted %0 is implicitly deleted because there is no viable three-way comparison function for%select{| member| base class}1 %2"},{u,l,"defaulted %0 is implicitly deleted because there is no viable comparison function%select{| for member %2| for base class %2}1"}},
		[e]={{nil,K,{"defaulted A is implicitly deleted because there is no viable ",{"three-way comparison function","\'operator==\'"}," for ",{a,"member ","base class "},"D"}},{A,A,{"defaulted A is implicitly deleted because there is no viable three-way comparison function for",{a," member"," base class"}," C"}},{u,l,{"defaulted A is implicitly deleted because there is no viable comparison function",{a," for member C"," for base class C"}}}},
		[g]=f,
		[h]="defaulted (.*?) is implicitly deleted because there is no viable (?:three\\-way comparison function|\'operator\\=\\=\') for (?:|member |base class )(.*?)",
		[i]=a,
		[j]={{nil,l,p}},
		[k]={bb,1573070592,cb,eb},
		[d]={{t,8239,"/// A visitor over the notional body of a defaulted comparison that determines\n/// whether that body would be deleted or constexpr.\nclass DefaultedComparisonAnalyzer : public DefaultedComparisonVisitor<DefaultedComparisonAnalyzer, DefaultedComparisonInfo, DefaultedComparisonInfo, DefaultedComparisonSubobject> {\n  // ...\n  Result visitBinaryOperator(OverloadedOperatorKind OO, ArrayRef<Expr *> Args, Subobject Subobj, OverloadCandidateSet *SpaceshipCandidates = nullptr) {\n    // ...\n    case OR_No_Viable_Function:\n      // ...\n      if (Diagnose == ExplainDeleted) {\n        S.Diag(Subobj.Loc, diag::note_defaulted_comparison_no_viable_function) << FD << (OO == OO_EqualEqual || OO == OO_ExclaimEqual) << Subobj.Kind << Subobj.Decl;"}},
		[m]={
			["clang/test/CXX/class/class.compare/class.compare.default/p2.cpp"]={"clang/test/CXX/class/class.compare/class.compare.default/p2.cpp:46:8: note: defaulted \'operator<\' is implicitly deleted because there is no viable three-way comparison function for \'A3\'"}
		}
	},
	["note_defaulted_comparison_no_viable_function_synthesized"]={
		[b]={{nil,l,"note_defaulted_comparison_no_viable_function_synthesized"}},
		[c]={{nil,l,"three-way comparison cannot be synthesized because there is no viable function for %select{\'==\'|\'<\'}0 comparison"}},
		[e]={{nil,l,{"three-way comparison cannot be synthesized because there is no viable function for ",{"\'==\'","\'<\'"}," comparison"}}},
		[g]=f,
		[h]="three\\-way comparison cannot be synthesized because there is no viable function for (?:\'\\=\\=\'|\'\\<\') comparison",
		[i]=a,
		[j]={{nil,l,p}},
		[k]={bb,1573070592,cb,eb},
		[d]={{t,8251,"/// A visitor over the notional body of a defaulted comparison that determines\n/// whether that body would be deleted or constexpr.\nclass DefaultedComparisonAnalyzer : public DefaultedComparisonVisitor<DefaultedComparisonAnalyzer, DefaultedComparisonInfo, DefaultedComparisonInfo, DefaultedComparisonSubobject> {\n  // ...\n  Result visitBinaryOperator(OverloadedOperatorKind OO, ArrayRef<Expr *> Args, Subobject Subobj, OverloadCandidateSet *SpaceshipCandidates = nullptr) {\n    // ...\n    case OR_No_Viable_Function:\n      // ...\n      if (Diagnose == ExplainDeleted) {\n        // ...\n        // For a three-way comparison, list both the candidates for the\n        // original operator and the candidates for the synthesized operator.\n        if (SpaceshipCandidates) {\n          // ...\n          S.Diag(Subobj.Loc, diag::note_defaulted_comparison_no_viable_function_synthesized) << (OO == OO_EqualEqual ? 0 : 1);"}},
		[m]={
			["clang/test/CXX/class/class.compare/class.spaceship/p1.cpp"]={"clang/test/CXX/class/class.compare/class.spaceship/p1.cpp:87:37: note: three-way comparison cannot be synthesized because there is no viable function for \'<\' comparison","clang/test/CXX/class/class.compare/class.spaceship/p1.cpp:87:37: note: three-way comparison cannot be synthesized because there is no viable function for \'==\' comparison","clang/test/CXX/class/class.compare/class.spaceship/p1.cpp:120:7: note: three-way comparison cannot be synthesized because there is no viable function for \'<\' comparison","clang/test/CXX/class/class.compare/class.spaceship/p1.cpp:120:7: note: three-way comparison cannot be synthesized because there is no viable function for \'==\' comparison"}
		}
	},
	["note_defaulted_comparison_not_constexpr"]={
		[b]={{nil,l,"note_defaulted_comparison_not_constexpr"}},
		[c]={{nil,l,"non-constexpr comparison function would be used to compare %select{|member %1|base class %1}0"}},
		[e]={{nil,l,{"non-constexpr comparison function would be used to compare ",{a,"member B","base class B"}}}},
		[g]=f,
		[h]="non\\-constexpr comparison function would be used to compare (?:|member (.*?)|base class (.*?))",
		[i]=a,
		[j]={{nil,l,p}},
		[k]={bb,1573070592,cb,eb},
		[d]={{t,8123,"/// A visitor over the notional body of a defaulted comparison that determines\n/// whether that body would be deleted or constexpr.\nclass DefaultedComparisonAnalyzer : public DefaultedComparisonVisitor<DefaultedComparisonAnalyzer, DefaultedComparisonInfo, DefaultedComparisonInfo, DefaultedComparisonSubobject> {\n  // ...\n  Result visitBinaryOperator(OverloadedOperatorKind OO, ArrayRef<Expr *> Args, Subobject Subobj, OverloadCandidateSet *SpaceshipCandidates = nullptr) {\n    // ...\n    case OR_Success: {\n      // ...\n      if (FunctionDecl *BestFD = Best->Function) {\n        // ...\n        // If it\'s not constexpr, explain why not.\n        if (Diagnose == ExplainConstexpr && !BestFD->isConstexpr()) {\n          if (Subobj.Kind != Subobject::CompleteObject)\n            S.Diag(Subobj.Loc, diag::note_defaulted_comparison_not_constexpr) << Subobj.Kind << Subobj.Decl;"}},
		[m]={
			["clang/test/CXX/class/class.compare/class.compare.default/p4.cpp"]={"clang/test/CXX/class/class.compare/class.compare.default/p4.cpp:86:5: note: non-constexpr comparison function would be used to compare member \'h\'","clang/test/CXX/class/class.compare/class.compare.default/p4.cpp:151:7: note: non-constexpr comparison function would be used to compare member \'value\'"}
		}
	},
	["note_defaulted_comparison_not_constexpr_here"]={
		[b]={{nil,l,"note_defaulted_comparison_not_constexpr_here"}},
		[c]={{nil,l,"non-constexpr comparison function declared here"}},
		[e]={{nil,l,"non-constexpr comparison function declared here"}},
		[g]=f,
		[h]="non\\-constexpr comparison function declared here",
		[i]=a,
		[j]={{nil,l,p}},
		[k]={bb,1573070592,cb,eb},
		[d]={{t,8126,"/// A visitor over the notional body of a defaulted comparison that determines\n/// whether that body would be deleted or constexpr.\nclass DefaultedComparisonAnalyzer : public DefaultedComparisonVisitor<DefaultedComparisonAnalyzer, DefaultedComparisonInfo, DefaultedComparisonInfo, DefaultedComparisonSubobject> {\n  // ...\n  Result visitBinaryOperator(OverloadedOperatorKind OO, ArrayRef<Expr *> Args, Subobject Subobj, OverloadCandidateSet *SpaceshipCandidates = nullptr) {\n    // ...\n    case OR_Success: {\n      // ...\n      if (FunctionDecl *BestFD = Best->Function) {\n        // ...\n        // If it\'s not constexpr, explain why not.\n        if (Diagnose == ExplainConstexpr && !BestFD->isConstexpr()) {\n          // ...\n          S.Diag(BestFD->getLocation(), diag::note_defaulted_comparison_not_constexpr_here);"}},
		[m]={
			["clang/test/CXX/class/class.compare/class.compare.default/p4.cpp"]={"clang/test/CXX/class/class.compare/class.compare.default/p4.cpp:81:8: note: non-constexpr comparison function declared here","clang/test/CXX/class/class.compare/class.compare.default/p4.cpp:157:17: note: non-constexpr comparison function declared here"}
		}
	},
	["note_defaulted_comparison_not_rewritten_callee"]={
		[b]={{nil,l,"note_defaulted_comparison_not_rewritten_callee"}},
		[c]={{nil,l,"defaulted %0 is implicitly deleted because this non-rewritten comparison function would be the best match for the comparison"}},
		[e]={{nil,l,"defaulted A is implicitly deleted because this non-rewritten comparison function would be the best match for the comparison"}},
		[g]=f,
		[h]="defaulted (.*?) is implicitly deleted because this non\\-rewritten comparison function would be the best match for the comparison",
		[i]=a,
		[j]={{nil,l,p}},
		[k]={bb,1573070592,cb,eb},
		[d]={{t,8072,"/// A visitor over the notional body of a defaulted comparison that determines\n/// whether that body would be deleted or constexpr.\nclass DefaultedComparisonAnalyzer : public DefaultedComparisonVisitor<DefaultedComparisonAnalyzer, DefaultedComparisonInfo, DefaultedComparisonInfo, DefaultedComparisonSubobject> {\n  // ...\n  Result visitBinaryOperator(OverloadedOperatorKind OO, ArrayRef<Expr *> Args, Subobject Subobj, OverloadCandidateSet *SpaceshipCandidates = nullptr) {\n    // ...\n    case OR_Success: {\n      // C++2a [class.compare.secondary]p2 [P2002R0]:\n      //   The operator function [...] is defined as deleted if [...] the\n      //   candidate selected by overload resolution is not a rewritten\n      //   candidate.\n      if ((DCK == DefaultedComparisonKind::NotEqual || DCK == DefaultedComparisonKind::Relational) && !Best->RewriteKind) {\n        if (Diagnose == ExplainDeleted) {\n          if (Best->Function) {\n            S.Diag(Best->Function->getLocation(), diag::note_defaulted_comparison_not_rewritten_callee) << FD;"},{t,8213,"/// A visitor over the notional body of a defaulted comparison that determines\n/// whether that body would be deleted or constexpr.\nclass DefaultedComparisonAnalyzer : public DefaultedComparisonVisitor<DefaultedComparisonAnalyzer, DefaultedComparisonInfo, DefaultedComparisonInfo, DefaultedComparisonSubobject> {\n  // ...\n  Result visitBinaryOperator(OverloadedOperatorKind OO, ArrayRef<Expr *> Args, Subobject Subobj, OverloadCandidateSet *SpaceshipCandidates = nullptr) {\n    // ...\n    case OR_Deleted:\n      if (Diagnose == ExplainDeleted) {\n        if ((DCK == DefaultedComparisonKind::NotEqual || DCK == DefaultedComparisonKind::Relational) && !Best->RewriteKind) {\n          S.Diag(Best->Function->getLocation(), diag::note_defaulted_comparison_not_rewritten_callee) << FD;"}},
		[m]={
			["clang/test/CXX/class/class.compare/class.rel/p2.cpp"]={"clang/test/CXX/class/class.compare/class.rel/p2.cpp:37:17: note: defaulted \'operator<\' is implicitly deleted because this non-rewritten comparison function would be the best match for the comparison","clang/test/CXX/class/class.compare/class.rel/p2.cpp:62:17: note: defaulted \'operator!=\' is implicitly deleted because this non-rewritten comparison function would be the best match for the comparison","clang/test/CXX/class/class.compare/class.rel/p2.cpp:72:10: note: defaulted \'operator!=\' is implicitly deleted because this non-rewritten comparison function would be the best match for the comparison","clang/test/CXX/class/class.compare/class.rel/p2.cpp:71:17: note: defaulted \'operator!=\' is implicitly deleted because this non-rewritten comparison function would be the best match for the comparison"}
		}
	},
	["note_defaulted_comparison_not_rewritten_conversion"]={
		[b]={{nil,K,"note_defaulted_comparison_not_rewritten_conversion"}},
		[c]={{nil,K,"defaulted %0 is implicitly deleted because a builtin comparison function using this conversion would be the best match for the comparison"}},
		[e]={{nil,K,"defaulted A is implicitly deleted because a builtin comparison function using this conversion would be the best match for the comparison"}},
		[g]=f,
		[h]="defaulted (.*?) is implicitly deleted because a builtin comparison function using this conversion would be the best match for the comparison",
		[i]=a,
		[j]={{nil,K,p}},
		[k]={nc,1615397021,tc,sc},
		[d]={{t,8082,"/// A visitor over the notional body of a defaulted comparison that determines\n/// whether that body would be deleted or constexpr.\nclass DefaultedComparisonAnalyzer : public DefaultedComparisonVisitor<DefaultedComparisonAnalyzer, DefaultedComparisonInfo, DefaultedComparisonInfo, DefaultedComparisonSubobject> {\n  // ...\n  Result visitBinaryOperator(OverloadedOperatorKind OO, ArrayRef<Expr *> Args, Subobject Subobj, OverloadCandidateSet *SpaceshipCandidates = nullptr) {\n    // ...\n    case OR_Success: {\n      // C++2a [class.compare.secondary]p2 [P2002R0]:\n      //   The operator function [...] is defined as deleted if [...] the\n      //   candidate selected by overload resolution is not a rewritten\n      //   candidate.\n      if ((DCK == DefaultedComparisonKind::NotEqual || DCK == DefaultedComparisonKind::Relational) && !Best->RewriteKind) {\n        if (Diagnose == ExplainDeleted) {\n          if (Best->Function) {\n          // ...\n          } else {\n            // ...\n            S.Diag(Best->Conversions[0].UserDefined.FoundConversionFunction.getDecl()->getLocation(), diag::note_defaulted_comparison_not_rewritten_conversion) << FD;"}},
		[m]={
			["clang/test/CXX/class/class.compare/class.compare.secondary/p2.cpp"]={"clang/test/CXX/class/class.compare/class.compare.secondary/p2.cpp:31:3: note: defaulted \'operator!=\' is implicitly deleted because a builtin comparison function using this conversion would be the best match for the comparison","clang/test/CXX/class/class.compare/class.compare.secondary/p2.cpp:53:3: note: defaulted \'operator<\' is implicitly deleted because a builtin comparison function using this conversion would be the best match for the comparison"}
		}
	},
	["note_defaulted_comparison_reference_member"]={
		[b]={{nil,l,"note_defaulted_comparison_reference_member"}},
		[c]={{nil,l,"defaulted %0 is implicitly deleted because class %1 has a reference member"}},
		[e]={{nil,l,"defaulted A is implicitly deleted because class B has a reference member"}},
		[g]=f,
		[h]="defaulted (.*?) is implicitly deleted because class (.*?) has a reference member",
		[i]=a,
		[j]={{nil,l,p}},
		[k]={bb,1573070592,cb,eb},
		[d]={{t,8015,"/// A visitor over the notional body of a defaulted comparison that determines\n/// whether that body would be deleted or constexpr.\nclass DefaultedComparisonAnalyzer : public DefaultedComparisonVisitor<DefaultedComparisonAnalyzer, DefaultedComparisonInfo, DefaultedComparisonInfo, DefaultedComparisonSubobject> {\n  // ...\n  Result visitExpandedSubobject(QualType Type, Subobject Subobj) {\n    // C++2a [class.compare.default]p2 [P2002R0]:\n    //   A defaulted <=> or == operator function for class C is defined as\n    //   deleted if any non-static data member of C is of reference type\n    if (Type->isReferenceType()) {\n      if (Diagnose == ExplainDeleted) {\n        S.Diag(Subobj.Loc, diag::note_defaulted_comparison_reference_member) << FD << RD;"}},
		[m]={
			["clang/test/CXX/class/class.compare/class.compare.default/p2.cpp"]={"clang/test/CXX/class/class.compare/class.compare.default/p2.cpp:5:8: note: defaulted \'operator==\' is implicitly deleted because class \'A1\' has a reference member",Fb,"clang/test/CXX/class/class.compare/class.compare.default/p2.cpp:5:8: note: defaulted \'operator==\' is implicitly deleted because class \'A1\' has a reference member","clang/test/CXX/class/class.compare/class.compare.default/p2.cpp:5:8: note: defaulted \'operator==\' is implicitly deleted because class \'A1\' has a reference member",Fb,Fb,Fb,Fb,Fb,"clang/test/CXX/class/class.compare/class.compare.default/p2.cpp:43:8: note: defaulted \'operator==\' is implicitly deleted because class \'A3\' has a reference member","clang/test/CXX/class/class.compare/class.compare.default/p2.cpp:53:10: note: defaulted \'operator==\' is implicitly deleted because class \'B1\' has a reference member","clang/test/CXX/class/class.compare/class.compare.default/p2.cpp:53:10: note: defaulted \'operator<=>\' is implicitly deleted because class \'B1\' has a reference member"}
		}
	},
	["note_defaulted_comparison_union"]={
		[b]={{nil,l,"note_defaulted_comparison_union"}},
		[c]={{nil,l,"defaulted %0 is implicitly deleted because %2 is a %select{union-like class|union}1 with variant members"}},
		[e]={{nil,l,{"defaulted A is implicitly deleted because C is a ",{"union-like class","union"}," with variant members"}}},
		[g]=f,
		[h]="defaulted (.*?) is implicitly deleted because (.*?) is a (?:union\\-like class|union) with variant members",
		[i]=a,
		[j]={{nil,l,p}},
		[k]={bb,1573070592,cb,eb},
		[d]={{t,7986,"/// A visitor over the notional body of a defaulted comparison that determines\n/// whether that body would be deleted or constexpr.\nclass DefaultedComparisonAnalyzer : public DefaultedComparisonVisitor<DefaultedComparisonAnalyzer, DefaultedComparisonInfo, DefaultedComparisonInfo, DefaultedComparisonSubobject> {\n  // ...\n  Result visit() {\n    if ((DCK == DefaultedComparisonKind::Equal || DCK == DefaultedComparisonKind::ThreeWay) && RD->hasVariantMembers()) {\n      // C++2a [class.compare.default]p2 [P2002R0]:\n      //   A defaulted comparison operator function for class C is defined as\n      //   deleted if [...] C has variant members.\n      if (Diagnose == ExplainDeleted) {\n        S.Diag(FD->getLocation(), diag::note_defaulted_comparison_union) << FD << RD->isUnion() << RD;"}},
		[m]={
			["clang/test/CXX/class/class.compare/class.compare.default/p2.cpp"]={"clang/test/CXX/class/class.compare/class.compare.default/p2.cpp:79:8: note: defaulted \'operator==\' is implicitly deleted because \'C1\' is a union with variant members","clang/test/CXX/class/class.compare/class.compare.default/p2.cpp:80:8: note: defaulted \'operator<=>\' is implicitly deleted because \'C1\' is a union with variant members","clang/test/CXX/class/class.compare/class.compare.default/p2.cpp:101:8: note: defaulted \'operator==\' is implicitly deleted because \'D1\' is a union-like class with variant members","clang/test/CXX/class/class.compare/class.compare.default/p2.cpp:102:8: note: defaulted \'operator<=>\' is implicitly deleted because \'D1\' is a union-like class with variant members","clang/test/CXX/class/class.compare/class.compare.default/p2.cpp:147:15: note: defaulted \'operator==\' is implicitly deleted because \'F\' is a union-like class with variant members","clang/test/CXX/class/class.compare/class.compare.default/p2.cpp:149:15: note: defaulted \'operator<=>\' is implicitly deleted because \'F\' is a union-like class with variant members"}
		}
	},
	["note_defined_here"]={
		[b]="note_defined_here",
		[c]="%0 defined here",
		[e]="A defined here",
		[g]=f,
		[h]="(.*?) defined here",
		[i]=a,
		[j]=p,
		[k]={"74f7d50f6a5b",1329334432,"When overload resolution picks an implicitly-deleted special member","When overload resolution picks an implicitly-deleted special member\nfunction, provide a specialized diagnostic that indicates the kind of\nspecial member function (default constructor, copy assignment\noperator, etc.) and that it was implicitly deleted. Add a hook where\nwe can provide more detailed information later.\n\nllvm-svn: 150611"},
		[d]={{"clang/lib/Sema/Sema.cpp",2006,"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      // ...\n      if (D)\n        targetDiag(D->getLocation(), diag::note_defined_here, FD) << D;"},{"clang/lib/Sema/Sema.cpp",2032,"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      // ...\n      if (D)\n        targetDiag(D->getLocation(), diag::note_defined_here, FD) << D;"},{"clang/lib/Sema/Sema.cpp",2051,"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      // ...\n      if (D)\n        targetDiag(D->getLocation(), diag::note_defined_here, FD) << D;"},{V,1700,"bool CoroutineStmtBuilder::makeOnException() {\n  // ...\n  if (!lookupMember(S, \"unhandled_exception\", PromiseRecordDecl, Loc)) {\n    // ...\n    S.Diag(PromiseRecordDecl->getLocation(), diag::note_defined_here) << PromiseRecordDecl;"},{M,4783,"void Sema::notePreviousDefinition(const NamedDecl *Old, SourceLocation New) {\n  // ...\n  auto noteFromModuleOrInclude = [&](Module *Mod, SourceLocation IncLoc) -> bool {\n    // Redefinition errors with modules are common with non modular mapped\n    // headers, example: a non-modular header H in module A that also gets\n    // included directly in a TU. Pointing twice to the same header/definition\n    // is confusing, try to get better diagnostics when modules is on.\n    if (IncLoc.isValid()) {\n      if (Mod) {\n        // ...\n        if (!Mod->DefinitionLoc.isInvalid())\n          Diag(Mod->DefinitionLoc, diag::note_defined_here) << Mod->getFullModuleName();"},{Q,4645,"bool Sema::checkMSInheritanceAttrOnDefinition(CXXRecordDecl *RD, SourceRange Range, bool BestCase, MSInheritanceModel ExplicitModel) {\n  // ...\n  Diag(RD->getDefinition()->getLocation(), diag::note_defined_here) << RD;"},{t,2453,"bool Sema::CheckImmediateEscalatingFunctionDefinition(FunctionDecl *FD, const sema::FunctionScopeInfo *FSI) {\n  // ...\n  if (FSI->FoundImmediateEscalatingExpression) {\n    // ...\n    if (it != UndefinedButUsed.end()) {\n      // ...\n      Diag(FD->getLocation(), diag::note_defined_here) << FD;"},{qb,3135,"Sema::DeclGroupPtrTy Sema::ActOnForwardClassDeclaration(SourceLocation AtClassLoc, IdentifierInfo **IdentList, SourceLocation *IdentLocs, ArrayRef<ObjCTypeParamList *> TypeParamLists, unsigned NumElts) {\n  // ...\n  for (unsigned i = 0; i != NumElts; ++i) {\n    // ...\n    if (PrevIDecl && TypeParams) {\n      if (ObjCTypeParamList *PrevTypeParams = PrevIDecl->getTypeParamList()) {\n      // ...\n      } else if (ObjCInterfaceDecl *Def = PrevIDecl->getDefinition()) {\n        // ...\n        Diag(Def->getLocation(), diag::note_defined_here) << ClassName;"},{H,1720,"static bool rejectConstNotMutableType(Sema &SemaRef, const ValueDecl *D, QualType Type, OpenMPClauseKind CKind, SourceLocation ELoc, bool AcceptIfMutable = true, bool ListItemNotVar = false) {\n  // ...\n  if (isConstNotMutableType(SemaRef, Type, AcceptIfMutable, &IsClassType)) {\n    // ...\n    if (!ListItemNotVar && D) {\n      // ...\n      SemaRef.Diag(D->getLocation(), IsDecl ? diag::note_previous_decl : diag::note_defined_here) << D;"},{H,3073,"ExprResult Sema::ActOnOpenMPIdExpression(Scope *CurScope, CXXScopeSpec &ScopeSpec, const DeclarationNameInfo &Id, OpenMPDirectiveKind Kind) {\n  // ...\n  // OpenMP [2.9.2, Syntax, C/C++]\n  //   Variables must be file-scope, namespace-scope, or static block-scope.\n  if (Kind == OMPD_threadprivate && !VD->hasGlobalStorage()) {\n    // ...\n    Diag(VD->getLocation(), IsDecl ? diag::note_previous_decl : diag::note_defined_here) << VD;"},{H,3090,"ExprResult Sema::ActOnOpenMPIdExpression(Scope *CurScope, CXXScopeSpec &ScopeSpec, const DeclarationNameInfo &Id, OpenMPDirectiveKind Kind) {\n  // ...\n  // OpenMP [2.9.2, Restrictions, C/C++, p.2]\n  //   A threadprivate directive for file-scope variables must appear outside\n  //   any definition or declaration.\n  if (CanonicalVD->getDeclContext()->isTranslationUnit() && !getCurLexicalContext()->isTranslationUnit()) {\n    // ...\n    Diag(VD->getLocation(), IsDecl ? diag::note_previous_decl : diag::note_defined_here) << VD;"},{H,3105,"ExprResult Sema::ActOnOpenMPIdExpression(Scope *CurScope, CXXScopeSpec &ScopeSpec, const DeclarationNameInfo &Id, OpenMPDirectiveKind Kind) {\n  // ...\n  // OpenMP [2.9.2, Restrictions, C/C++, p.3]\n  //   A threadprivate directive for static class member variables must appear\n  //   in the class definition, in the same scope in which the member\n  //   variables are declared.\n  if (CanonicalVD->isStaticDataMember() && !CanonicalVD->getDeclContext()->Equals(getCurLexicalContext())) {\n    // ...\n    Diag(VD->getLocation(), IsDecl ? diag::note_previous_decl : diag::note_defined_here) << VD;"},{H,3121,"ExprResult Sema::ActOnOpenMPIdExpression(Scope *CurScope, CXXScopeSpec &ScopeSpec, const DeclarationNameInfo &Id, OpenMPDirectiveKind Kind) {\n  // ...\n  // OpenMP [2.9.2, Restrictions, C/C++, p.4]\n  //   A threadprivate directive for namespace-scope variables must appear\n  //   outside any definition or declaration other than the namespace\n  //   definition itself.\n  if (CanonicalVD->getDeclContext()->isNamespace() && (!getCurLexicalContext()->isFileContext() || !getCurLexicalContext()->Encloses(CanonicalVD->getDeclContext()))) {\n    // ...\n    Diag(VD->getLocation(), IsDecl ? diag::note_previous_decl : diag::note_defined_here) << VD;"},{H,3135,"ExprResult Sema::ActOnOpenMPIdExpression(Scope *CurScope, CXXScopeSpec &ScopeSpec, const DeclarationNameInfo &Id, OpenMPDirectiveKind Kind) {\n  // ...\n  // OpenMP [2.9.2, Restrictions, C/C++, p.6]\n  //   A threadprivate directive for static block-scope variables must appear\n  //   in the scope of the variable and not in a nested scope.\n  if (CanonicalVD->isLocalVarDecl() && CurScope && !isDeclInScope(ND, getCurLexicalContext(), CurScope)) {\n    // ...\n    Diag(VD->getLocation(), IsDecl ? diag::note_previous_decl : diag::note_defined_here) << VD;"},{H,3179,"class LocalVarRefChecker final : public ConstStmtVisitor<LocalVarRefChecker, bool> {\n  // ...\n  bool VisitDeclRefExpr(const DeclRefExpr *E) {\n    if (const auto *VD = dyn_cast<VarDecl>(E->getDecl())) {\n      if (VD->hasLocalStorage()) {\n        // ...\n        SemaRef.Diag(VD->getLocation(), diag::note_defined_here) << VD << VD->getSourceRange();"},{H,3231,"OMPThreadPrivateDecl *Sema::CheckOMPThreadPrivateDecl(SourceLocation Loc, ArrayRef<Expr *> VarList) {\n  // ...\n  for (Expr *RefExpr : VarList) {\n    // ...\n    // OpenMP [2.9.2, Restrictions, C/C++, p.10]\n    //   A threadprivate variable must not have a reference type.\n    if (VD->getType()->isReferenceType()) {\n      // ...\n      Diag(VD->getLocation(), IsDecl ? diag::note_previous_decl : diag::note_defined_here) << VD;"},{H,3249,"OMPThreadPrivateDecl *Sema::CheckOMPThreadPrivateDecl(SourceLocation Loc, ArrayRef<Expr *> VarList) {\n  // ...\n  for (Expr *RefExpr : VarList) {\n    // ...\n    // Check if this is a TLS variable. If TLS is not being supported, produce\n    // the corresponding diagnostic.\n    if ((VD->getTLSKind() != VarDecl::TLS_None && !(VD->hasAttr<OMPThreadPrivateDeclAttr>() && getLangOpts().OpenMPUseTLS && getASTContext().getTargetInfo().isTLSSupported())) || (VD->getStorageClass() == SC_Register && VD->hasAttr<AsmLabelAttr>() && !VD->isLocalVarDecl())) {\n      // ...\n      Diag(VD->getLocation(), IsDecl ? diag::note_previous_decl : diag::note_defined_here) << VD;"},{H,3434,"Sema::DeclGroupPtrTy Sema::ActOnOpenMPAllocateDirective(SourceLocation Loc, ArrayRef<Expr *> VarList, ArrayRef<OMPClause *> Clauses, DeclContext *Owner) {\n  // ...\n  for (Expr *RefExpr : VarList) {\n    // ...\n    // OpenMP, 2.11.3 allocate Directive, Restrictions, C / C++\n    // If a list item has a static storage type, the allocator expression in the\n    // allocator clause must be a constant expression that evaluates to one of\n    // the predefined memory allocator values.\n    if (Allocator && VD->hasGlobalStorage()) {\n      if (AllocatorKind == OMPAllocateDeclAttr::OMPUserDefinedMemAlloc) {\n        // ...\n        Diag(VD->getLocation(), IsDecl ? diag::note_previous_decl : diag::note_defined_here) << VD;"},{H,18117,"OMPClause *Sema::ActOnOpenMPPrivateClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc) {\n  // ...\n  for (Expr *RefExpr : VarList) {\n    // ...\n    // Variably modified types are not supported for tasks.\n    if (!Type->isAnyPointerType() && Type->isVariablyModifiedType() && isOpenMPTaskingDirective(CurrDir)) {\n      // ...\n      Diag(D->getLocation(), IsDecl ? diag::note_previous_decl : diag::note_defined_here) << D;"},{H,18390,"OMPClause *Sema::ActOnOpenMPFirstprivateClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc) {\n  // ...\n  for (Expr *RefExpr : VarList) {\n    // ...\n    // Variably modified types are not supported for tasks.\n    if (!Type->isAnyPointerType() && Type->isVariablyModifiedType() && isOpenMPTaskingDirective(DSAStack->getCurrentDirective())) {\n      // ...\n      Diag(D->getLocation(), IsDecl ? diag::note_previous_decl : diag::note_defined_here) << D;"},{H,18547,"OMPClause *Sema::ActOnOpenMPLastprivateClause(ArrayRef<Expr *> VarList, OpenMPLastprivateModifier LPKind, SourceLocation LPKindLoc, SourceLocation ColonLoc, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc) {\n  // ...\n  for (Expr *RefExpr : VarList) {\n    // ...\n    // OpenMP 5.0 [2.19.4.5 lastprivate Clause, Restrictions]\n    // A list item that appears in a lastprivate clause with the conditional\n    // modifier must be a scalar variable.\n    if (LPKind == OMPC_LASTPRIVATE_conditional && !Type->isScalarType()) {\n      // ...\n      Diag(D->getLocation(), IsDecl ? diag::note_previous_decl : diag::note_defined_here) << D;"},{H,19346,"static bool actOnOMPReductionKindClause(Sema &S, DSAStackTy *Stack, OpenMPClauseKind ClauseKind, ArrayRef<Expr *> VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec, const DeclarationNameInfo &ReductionId, ArrayRef<Expr *> UnresolvedReductions, ReductionData &RD) {\n  // ...\n  for (Expr *RefExpr : VarList) {\n    // ...\n    // OpenMP [2.9.3.6, Restrictions, C/C++, p.4]\n    //  If a list-item is a reference type then it must bind to the same object\n    //  for all threads of the team.\n    if (!ASE && !OASE) {\n      if (VD) {\n        // ...\n        if (VD->getType()->isReferenceType() && VDDef && VDDef->hasInit()) {\n          // ...\n          if (Check.Visit(VDDef->getInit())) {\n            // ...\n            S.Diag(VDDef->getLocation(), diag::note_defined_here) << VDDef;"},{H,19453,"static bool actOnOMPReductionKindClause(Sema &S, DSAStackTy *Stack, OpenMPClauseKind ClauseKind, ArrayRef<Expr *> VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec, const DeclarationNameInfo &ReductionId, ArrayRef<Expr *> UnresolvedReductions, ReductionData &RD) {\n  // ...\n  for (Expr *RefExpr : VarList) {\n    // ...\n    // OpenMP [2.14.3.6, reduction clause, Restrictions]\n    // The type of a list item that appears in a reduction clause must be valid\n    // for the reduction-identifier. For a max or min reduction in C, the type\n    // of the list item must be an allowed arithmetic data type: char, int,\n    // float, double, or _Bool, possibly modified with long, short, signed, or\n    // unsigned. For a max or min reduction in C++, the type of the list item\n    // must be an allowed arithmetic data type: char, wchar_t, int, float,\n    // double, or bool, possibly modified with long, short, signed, or unsigned.\n    if (DeclareReductionRef.isUnset()) {\n      if ((BOK == BO_GT || BOK == BO_LT) && !(Type->isScalarType() || (S.getLangOpts().CPlusPlus && Type->isArithmeticType()))) {\n        // ...\n        if (!ASE && !OASE) {\n          // ...\n          S.Diag(D->getLocation(), IsDecl ? diag::note_previous_decl : diag::note_defined_here) << D;"},{H,19466,"static bool actOnOMPReductionKindClause(Sema &S, DSAStackTy *Stack, OpenMPClauseKind ClauseKind, ArrayRef<Expr *> VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec, const DeclarationNameInfo &ReductionId, ArrayRef<Expr *> UnresolvedReductions, ReductionData &RD) {\n  // ...\n  for (Expr *RefExpr : VarList) {\n    // ...\n    // OpenMP [2.14.3.6, reduction clause, Restrictions]\n    // The type of a list item that appears in a reduction clause must be valid\n    // for the reduction-identifier. For a max or min reduction in C, the type\n    // of the list item must be an allowed arithmetic data type: char, int,\n    // float, double, or _Bool, possibly modified with long, short, signed, or\n    // unsigned. For a max or min reduction in C++, the type of the list item\n    // must be an allowed arithmetic data type: char, wchar_t, int, float,\n    // double, or bool, possibly modified with long, short, signed, or unsigned.\n    if (DeclareReductionRef.isUnset()) {\n      // ...\n      if ((BOK == BO_OrAssign || BOK == BO_AndAssign || BOK == BO_XorAssign) && !S.getLangOpts().CPlusPlus && Type->isFloatingType()) {\n        // ...\n        if (!ASE && !OASE) {\n          // ...\n          S.Diag(D->getLocation(), IsDecl ? diag::note_previous_decl : diag::note_defined_here) << D;"},{H,19664,"static bool actOnOMPReductionKindClause(Sema &S, DSAStackTy *Stack, OpenMPClauseKind ClauseKind, ArrayRef<Expr *> VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec, const DeclarationNameInfo &ReductionId, ArrayRef<Expr *> UnresolvedReductions, ReductionData &RD) {\n  // ...\n  for (Expr *RefExpr : VarList) {\n    // ...\n    if (!RHSVD->hasInit() && DeclareReductionRef.isUnset()) {\n      // ...\n      S.Diag(D->getLocation(), IsDecl ? diag::note_previous_decl : diag::note_defined_here) << D;"},{H,20012,"bool Sema::CheckOpenMPLinearDecl(const ValueDecl *D, SourceLocation ELoc, OpenMPLinearClauseKind LinKind, QualType Type, bool IsDeclareSimd) {\n  // ...\n  if (!Ty || (LinKind != OMPC_LINEAR_ref && !Ty->isDependentType() && !Ty->isIntegralType(Context) && !Ty->isPointerType())) {\n    // ...\n    if (D) {\n      // ...\n      Diag(D->getLocation(), IsDecl ? diag::note_previous_decl : diag::note_defined_here) << D;"},{H,20289,"OMPClause *Sema::ActOnOpenMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc) {\n  // ...\n  for (Expr *RefExpr : VarList) {\n    // ...\n    if (!Ty || (!Ty->isArrayType() && !Ty->isPointerType())) {\n      // ...\n      Diag(D->getLocation(), IsDecl ? diag::note_previous_decl : diag::note_defined_here) << D;"},{H,20491,"OMPClause *Sema::ActOnOpenMPCopyprivateClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc) {\n  // ...\n  for (Expr *RefExpr : VarList) {\n    // ...\n    // Variably modified types are not supported.\n    if (!Type->isAnyPointerType() && Type->isVariablyModifiedType()) {\n      // ...\n      Diag(D->getLocation(), IsDecl ? diag::note_previous_decl : diag::note_defined_here) << D;"},{H,23171,"void Sema::checkDeclIsAllowedInOpenMPTarget(Expr *E, Decl *D, SourceLocation IdLoc) {\n  // ...\n  if (auto *FD = dyn_cast<FunctionDecl>(D)) {\n    // ...\n    if (IdLoc.isValid() && Res && *Res == OMPDeclareTargetDeclAttr::MT_Link) {\n      // ...\n      Diag(FD->getLocation(), diag::note_defined_here) << FD;"}},
		[m]={
			["clang/test/SemaObjC/parameterized_classes.m"]={"clang/test/SemaObjC/parameterized_classes.m:18:12: note: \'NSObject\' defined here"}
		}
	},
	["note_delete_conversion"]={
		[b]="note_delete_conversion",
		[c]="conversion to pointer type %0",
		[e]="conversion to pointer type A",
		[g]=f,
		[h]="conversion to pointer type (.*?)",
		[i]=a,
		[j]=p,
		[k]={"ccc11811052d",1369163148,"Refactor places which perform contextual implicit conversions to go through a","Refactor places which perform contextual implicit conversions to go through a\ncommon function. The C++1y contextual implicit conversion rules themselves are\nnot yet implemented, however.\n\nThis also fixes a subtle bug where template instantiation context notes were\ndropped for diagnostics coming from conversions for integral constant\nexpressions -- we were implicitly slicing a SemaDiagnosticBuilder into a\nDiagnosticBuilder when producing these diagnostics, and losing their context\nnotes in the process.\n\nllvm-svn: 182406"},
		[d]={{Z,3640,"/// ActOnCXXDelete - Parsed a C++ \'delete\' expression (C++ 5.3.5), as in:\n/// @code ::delete ptr; @endcode\n/// or\n/// @code delete [] ptr; @endcode\nExprResult Sema::ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal, bool ArrayForm, Expr *ExE) {\n  // ...\n  if (!Ex.get()->isTypeDependent()) {\n    // ...\n    class DeleteConverter : public ContextualImplicitConverter {\n      // ...\n      SemaDiagnosticBuilder noteExplicitConv(Sema &S, CXXConversionDecl *Conv, QualType ConvTy) override { return S.Diag(Conv->getLocation(), diag::note_delete_conversion) << ConvTy; }"},{Z,3651,"/// ActOnCXXDelete - Parsed a C++ \'delete\' expression (C++ 5.3.5), as in:\n/// @code ::delete ptr; @endcode\n/// or\n/// @code delete [] ptr; @endcode\nExprResult Sema::ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal, bool ArrayForm, Expr *ExE) {\n  // ...\n  if (!Ex.get()->isTypeDependent()) {\n    // ...\n    class DeleteConverter : public ContextualImplicitConverter {\n      // ...\n      SemaDiagnosticBuilder noteAmbiguous(Sema &S, CXXConversionDecl *Conv, QualType ConvTy) override { return S.Diag(Conv->getLocation(), diag::note_delete_conversion) << ConvTy; }"}},
		[m]={
			["clang/test/SemaCXX/conversion-delete-expr.cpp"]={"clang/test/SemaCXX/conversion-delete-expr.cpp:9:3: note: conversion to pointer type \'int *\'","clang/test/SemaCXX/conversion-delete-expr.cpp:5:3: note: conversion to pointer type \'char *\'","clang/test/SemaCXX/conversion-delete-expr.cpp:37:3: note: conversion to pointer type \'int *\'","clang/test/SemaCXX/conversion-delete-expr.cpp:33:3: note: conversion to pointer type \'const int *\'","clang/test/SemaCXX/conversion-delete-expr.cpp:51:3: note: conversion to pointer type \'const int *\'","clang/test/SemaCXX/conversion-delete-expr.cpp:47:3: note: conversion to pointer type \'const int *\'"}
		}
	},
	["note_delete_non_virtual"]={
		[b]="note_delete_non_virtual",
		[c]="qualify call to silence this warning",
		[e]="qualify call to silence this warning",
		[g]=f,
		[h]="qualify call to silence this warning",
		[i]=a,
		[j]=p,
		[k]={"5a9259caa9b7",1452894331,"Make -Wdelete-non-virtual-dtor warn on explicit `a->~A()` dtor calls too.","Make -Wdelete-non-virtual-dtor warn on explicit `a->~A()` dtor calls too.\n\n-Wdelete-non-virtual-dtor warns if A is a type with virtual functions but\nwithout virtual dtor has its constructor called via `delete a`. This makes the\nwarning also fire if the dtor is called via `a->~A()`. This would\'ve found a\nsecurity bug in Chromium at compile time. Fixes PR26137.\n\nTo fix the warning, add a virtual destructor, make the class final, or remove\nits other virtual methods.  If you want to silence the warning, there\'s also\na fixit that shows how:\n\ntest.cc:12:3: warning: destructor called on \'B\' ... [-Wdelete-non-virtual-dtor]\n  b->~B();\n  ^\ntest.cc:12:6: note: qualify call to silence this warning\n  b->~B();\n     ^\n     B::\n\nhttp://reviews.llvm.org/D16206\n\nllvm-svn: 257939"},
		[d]={{Z,3979,"void Sema::CheckVirtualDtorCall(CXXDestructorDecl *dtor, SourceLocation Loc, bool IsDelete, bool CallCanBeVirtual, bool WarnOnNonAbstractTypes, SourceLocation DtorLoc) {\n  // ...\n  if (!IsDelete) {\n    // ...\n    Diag(DtorLoc, diag::note_delete_non_virtual) << FixItHint::CreateInsertion(DtorLoc, TypeStr + \"::\");"}}
	},
	["note_deleted_assign_field"]={
		[b]="note_deleted_assign_field",
		[c]="%select{copy|move}0 assignment operator of %1 is implicitly deleted because field %2 is of %select{reference|const-qualified}4 type %3",
		[e]={{nil,nil,{{"copy","move"}," assignment operator of B is implicitly deleted because field C is of ",{Db,"const-qualified"}," type D"}}},
		[g]=f,
		[h]="(?:copy|move) assignment operator of (.*?) is implicitly deleted because field (.*?) is of (?:reference|const\\-qualified) type (.*?)",
		[i]=a,
		[j]=p,
		[k]={ub,1333140808,xb,wb},
		[d]={{t,9495,"/// Check whether we should delete a special member function due to the class\n/// having a particular non-static data member.\nbool SpecialMemberDeletionInfo::shouldDeleteForField(FieldDecl *FD) {\n  // ...\n  if (CSM == Sema::CXXDefaultConstructor) {\n  // ...\n  } else if (CSM == Sema::CXXCopyConstructor) {\n  // ...\n  } else if (IsAssignment) {\n    // For an assignment operator, data members must not be of reference type.\n    if (FieldType->isReferenceType()) {\n      if (Diagnose)\n        S.Diag(FD->getLocation(), diag::note_deleted_assign_field) << isMove() << MD->getParent() << FD << FieldType << /*Reference*/ 0;"},{t,9503,"/// Check whether we should delete a special member function due to the class\n/// having a particular non-static data member.\nbool SpecialMemberDeletionInfo::shouldDeleteForField(FieldDecl *FD) {\n  // ...\n  if (CSM == Sema::CXXDefaultConstructor) {\n  // ...\n  } else if (CSM == Sema::CXXCopyConstructor) {\n  // ...\n  } else if (IsAssignment) {\n    // ...\n    if (!FieldRecord && FieldType.isConstQualified()) {\n      // C++11 [class.copy]p23:\n      // -- a non-static data member of const non-class type (or array thereof)\n      if (Diagnose)\n        S.Diag(FD->getLocation(), diag::note_deleted_assign_field) << isMove() << MD->getParent() << FD << FD->getType() << /*Const*/ 1;"}},
		[m]={
			["clang/test/CXX/special/class.copy/p23-cxx11.cpp"]={"clang/test/CXX/special/class.copy/p23-cxx11.cpp:78:13: note: copy assignment operator of \'B1\' is implicitly deleted because field \'a\' is of const-qualified type \'const int\'","clang/test/CXX/special/class.copy/p23-cxx11.cpp:78:13: note: move assignment operator of \'B1\' is implicitly deleted because field \'a\' is of const-qualified type \'const int\'","clang/test/CXX/special/class.copy/p23-cxx11.cpp:81:21: note: copy assignment operator of \'B2\' is implicitly deleted because field \'a\' is of const-qualified type \'const void *const[3][9][2]\'","clang/test/CXX/special/class.copy/p23-cxx11.cpp:81:21: note: move assignment operator of \'B2\' is implicitly deleted because field \'a\' is of const-qualified type \'const void *const[3][9][2]\'","clang/test/CXX/special/class.copy/p23-cxx11.cpp:95:8: note: copy assignment operator of \'C1\' is implicitly deleted because field \'a\' is of reference type \'int &\'","clang/test/CXX/special/class.copy/p23-cxx11.cpp:95:8: note: move assignment operator of \'C1\' is implicitly deleted because field \'a\' is of reference type \'int &\'"}
		}
	},
	["note_deleted_copy_ctor_rvalue_reference"]={
		[b]="note_deleted_copy_ctor_rvalue_reference",
		[c]="copy constructor of %0 is implicitly deleted because field %1 is of rvalue reference type %2",
		[e]="copy constructor of A is implicitly deleted because field B is of rvalue reference type C",
		[g]=f,
		[h]="copy constructor of (.*?) is implicitly deleted because field (.*?) is of rvalue reference type (.*?)",
		[i]=a,
		[j]=p,
		[k]={ub,1333140808,xb,wb},
		[d]={{t,9487,"/// Check whether we should delete a special member function due to the class\n/// having a particular non-static data member.\nbool SpecialMemberDeletionInfo::shouldDeleteForField(FieldDecl *FD) {\n  // ...\n  if (CSM == Sema::CXXDefaultConstructor) {\n  // ...\n  } else if (CSM == Sema::CXXCopyConstructor) {\n    // For a copy constructor, data members must not be of rvalue reference\n    // type.\n    if (FieldType->isRValueReferenceType()) {\n      if (Diagnose)\n        S.Diag(FD->getLocation(), diag::note_deleted_copy_ctor_rvalue_reference) << MD->getParent() << FD << FieldType;"}},
		[m]={
			["clang/test/CXX/special/class.copy/p11.0x.copy.cpp"]={"clang/test/CXX/special/class.copy/p11.0x.copy.cpp:126:10: note: copy constructor of \'RValue\' is implicitly deleted because field \'ri\' is of rvalue reference type \'int &&\'","clang/test/CXX/special/class.copy/p11.0x.copy.cpp:134:10: note: copy constructor of \'RValueTmp\' is implicitly deleted because field \'ri\' is of rvalue reference type \'int &&\'"}
		}
	},
	["note_deleted_copy_user_declared_move"]={
		[b]="note_deleted_copy_user_declared_move",
		[c]="copy %select{constructor|assignment operator}0 is implicitly deleted because %1 has a user-declared move %select{constructor|assignment operator}2",
		[e]={{nil,nil,{"copy ",{"constructor","assignment operator"}," is implicitly deleted because B has a user-declared move ",{"constructor","assignment operator"}}}},
		[g]=f,
		[h]="copy (?:constructor|assignment operator) is implicitly deleted because (.*?) has a user\\-declared move (?:constructor|assignment operator)",
		[i]=a,
		[j]=p,
		[k]={ub,1333140808,xb,wb},
		[d]={{t,9653,"/// Determine whether a defaulted special member function should be defined as\n/// deleted, as specified in C++11 [class.ctor]p5, C++11 [class.copy]p11,\n/// C++11 [class.copy]p23, and C++11 [class.dtor]p5.\nbool Sema::ShouldDeleteSpecialMember(CXXMethodDecl *MD, CXXSpecialMember CSM, InheritedConstructorInfo *ICI, bool Diagnose) {\n  // ...\n  // C++11 [class.copy]p7, p18:\n  //   If the class definition declares a move constructor or move assignment\n  //   operator, an implicitly declared copy constructor or copy assignment\n  //   operator is defined as deleted.\n  if (MD->isImplicit() && (CSM == CXXCopyConstructor || CSM == CXXCopyAssignment)) {\n    // ...\n    if (UserDeclaredMove) {\n      Diag(UserDeclaredMove->getLocation(), diag::note_deleted_copy_user_declared_move) << (CSM == CXXCopyAssignment) << RD << UserDeclaredMove->isMoveAssignmentOperator();"}},
		[m]={
			["clang/test/SemaObjCXX/block-variable-move.mm"]={"clang/test/SemaObjCXX/block-variable-move.mm:17:3: note: copy constructor is implicitly deleted because \'MoveOnly\' has a user-declared move constructor","clang/test/SemaObjCXX/block-variable-move.mm:17:3: note: copy constructor is implicitly deleted because \'MoveOnly\' has a user-declared move constructor"}
		}
	},
	["note_deleted_default_ctor_all_const"]={
		[b]="note_deleted_default_ctor_all_const",
		[c]="%select{default constructor of|constructor inherited by}0 %1 is implicitly deleted because all %select{data members|data members of an anonymous union member}2 are const-qualified",
		[e]={{nil,nil,{{"default constructor of","constructor inherited by"}," B is implicitly deleted because all ",{"data members","data members of an anonymous union member"}," are const-qualified"}}},
		[g]=f,
		[h]="(?:default constructor of|constructor inherited by) (.*?) is implicitly deleted because all (?:data members|data members of an anonymous union member) are const\\-qualified",
		[i]=a,
		[j]=p,
		[k]={ub,1333140808,xb,wb},
		[d]={{t,9537,"/// Check whether we should delete a special member function due to the class\n/// having a particular non-static data member.\nbool SpecialMemberDeletionInfo::shouldDeleteForField(FieldDecl *FD) {\n  // ...\n  if (FieldRecord) {\n    // Some additional restrictions exist on the variant members.\n    if (!inUnion() && FieldRecord->isUnion() && FieldRecord->isAnonymousStructOrUnion()) {\n      // ...\n      // At least one member in each anonymous union must be non-const\n      if (CSM == Sema::CXXDefaultConstructor && AllVariantFieldsAreConst && !FieldRecord->field_empty()) {\n        if (Diagnose)\n          S.Diag(FieldRecord->getLocation(), diag::note_deleted_default_ctor_all_const) << !!ICI << MD->getParent() << /*anonymous union*/ 1;"},{t,9571,"/// C++11 [class.ctor] p5:\n///   A defaulted default constructor for a class X is defined as deleted if\n/// X is a union and all of its variant members are of const-qualified type.\nbool SpecialMemberDeletionInfo::shouldDeleteForAllConstMembers() {\n  // This is a silly definition, because it gives an empty union a deleted\n  // default constructor. Don\'t do that.\n  if (CSM == Sema::CXXDefaultConstructor && inUnion() && AllFieldsAreConst) {\n    // ...\n    if (Diagnose)\n      S.Diag(MD->getParent()->getLocation(), diag::note_deleted_default_ctor_all_const) << !!ICI << MD->getParent() << /*not anonymous union*/ 0;"}},
		[m]={
			["clang/test/SemaCXX/cxx0x-deleted-default-ctor.cpp"]={"clang/test/SemaCXX/cxx0x-deleted-default-ctor.cpp:14:7: note: default constructor of \'bad_union2\' is implicitly deleted because all data members are const-qualified","clang/test/SemaCXX/cxx0x-deleted-default-ctor.cpp:26:3: note: default constructor of \'bad_anon2\' is implicitly deleted because all data members of an anonymous union member are const-qualified"}
		}
	},
	["note_deleted_default_ctor_uninit_field"]={
		[b]="note_deleted_default_ctor_uninit_field",
		[c]="%select{default constructor of|constructor inherited by}0 %1 is implicitly deleted because field %2 of %select{reference|const-qualified}4 type %3 would not be initialized",
		[e]={{nil,nil,{{"default constructor of","constructor inherited by"}," B is implicitly deleted because field C of ",{Db,"const-qualified"}," type D would not be initialized"}}},
		[g]=f,
		[h]="(?:default constructor of|constructor inherited by) (.*?) is implicitly deleted because field (.*?) of (?:reference|const\\-qualified) type (.*?) would not be initialized",
		[i]=a,
		[j]=p,
		[k]={ub,1333140808,xb,wb},
		[d]={{t,9464,"/// Check whether we should delete a special member function due to the class\n/// having a particular non-static data member.\nbool SpecialMemberDeletionInfo::shouldDeleteForField(FieldDecl *FD) {\n  // ...\n  if (CSM == Sema::CXXDefaultConstructor) {\n    // For a default constructor, all references must be initialized in-class\n    // and, if a union, it must have a non-const member.\n    if (FieldType->isReferenceType() && !FD->hasInClassInitializer()) {\n      if (Diagnose)\n        S.Diag(FD->getLocation(), diag::note_deleted_default_ctor_uninit_field) << !!ICI << MD->getParent() << FD << FieldType << /*Reference*/ 0;"},{t,9475,"/// Check whether we should delete a special member function due to the class\n/// having a particular non-static data member.\nbool SpecialMemberDeletionInfo::shouldDeleteForField(FieldDecl *FD) {\n  // ...\n  if (CSM == Sema::CXXDefaultConstructor) {\n    // ...\n    // C++11 [class.ctor]p5 (modified by DR2394): any non-variant non-static\n    // data member of const-qualified type (or array thereof) with no\n    // brace-or-equal-initializer is not const-default-constructible.\n    if (!inUnion() && FieldType.isConstQualified() && !FD->hasInClassInitializer() && (!FieldRecord || !FieldRecord->allowConstDefaultInit())) {\n      if (Diagnose)\n        S.Diag(FD->getLocation(), diag::note_deleted_default_ctor_uninit_field) << !!ICI << MD->getParent() << FD << FD->getType() << /*Const*/ 1;"}},
		[m]={
			["clang/test/SemaCXX/value-initialization.cpp"]={"clang/test/SemaCXX/value-initialization.cpp:4:16: note: default constructor of \'A\' is implicitly deleted because field \'i\' of const-qualified type \'const int\' would not be initialized"}
		}
	},
	["note_deleted_dtor_no_operator_delete"]={
		[b]="note_deleted_dtor_no_operator_delete",
		[c]="virtual destructor requires an unambiguous, accessible \'operator delete\'",
		[e]="virtual destructor requires an unambiguous, accessible \'operator delete\'",
		[g]=f,
		[h]="virtual destructor requires an unambiguous, accessible \'operator delete\'",
		[i]=a,
		[j]=p,
		[k]={ub,1333140808,xb,wb},
		[d]={{t,9673,"/// Determine whether a defaulted special member function should be defined as\n/// deleted, as specified in C++11 [class.ctor]p5, C++11 [class.copy]p11,\n/// C++11 [class.copy]p23, and C++11 [class.dtor]p5.\nbool Sema::ShouldDeleteSpecialMember(CXXMethodDecl *MD, CXXSpecialMember CSM, InheritedConstructorInfo *ICI, bool Diagnose) {\n  // ...\n  // C++11 [class.dtor]p5:\n  // -- for a virtual destructor, lookup of the non-array deallocation function\n  //    results in an ambiguity or in a function that is deleted or inaccessible\n  if (CSM == CXXDestructor && MD->isVirtual()) {\n    // ...\n    if (FindDeallocationFunction(MD->getLocation(), MD->getParent(), Name, OperatorDelete, /*Diagnose*/ false)) {\n      if (Diagnose)\n        Diag(RD->getLocation(), diag::note_deleted_dtor_no_operator_delete);"}},
		[m]={
			["clang/test/CXX/special/class.dtor/p5-0x.cpp"]={"clang/test/CXX/special/class.dtor/p5-0x.cpp:93:8: note: virtual destructor requires an unambiguous, accessible \'operator delete\'","clang/test/CXX/special/class.dtor/p5-0x.cpp:93:8: note: virtual destructor requires an unambiguous, accessible \'operator delete\'","clang/test/CXX/special/class.dtor/p5-0x.cpp:97:8: note: virtual destructor requires an unambiguous, accessible \'operator delete\'","clang/test/CXX/special/class.dtor/p5-0x.cpp:102:8: note: virtual destructor requires an unambiguous, accessible \'operator delete\'"}
		}
	},
	["note_deleted_special_member_class_subobject"]={
		[b]="note_deleted_special_member_class_subobject",
		[c]={{nil,q,"%select{default constructor of|copy constructor of|move constructor of|copy assignment operator of|move assignment operator of|destructor of|constructor inherited by}0 %1 is implicitly deleted because %select{base class %3|%select{||||variant }4field %3}2 %select{has %select{no|a deleted|multiple|an inaccessible|a non-trivial}4 %select{%select{default constructor|copy constructor|move constructor|copy assignment operator|move assignment operator|destructor|%select{default|corresponding|default|default|default}4 constructor}0|destructor}5%select{||s||}4|is an ObjC pointer}6"},{s,nil,"%select{default constructor of|copy constructor of|move constructor of|copy assignment operator of|move assignment operator of|destructor of|constructor inherited by}0 %1 is implicitly deleted because %select{base class %3|%select{||||variant }4field %3}2 has %select{no|a deleted|multiple|an inaccessible|a non-trivial}4 %select{%select{default constructor|copy constructor|move constructor|copy assignment operator|move assignment operator|destructor|%select{default|corresponding|default|default|default}4 constructor}0|destructor}5%select{||s||}4"}},
		[e]={{nil,q,{{"default constructor of","copy constructor of","move constructor of","copy assignment operator of","move assignment operator of","destructor of","constructor inherited by"}," B is implicitly deleted because ",{"base class D",{{a,a,a,a,"variant "},"field D"}},ab,{{"has ",{"no","a deleted","multiple","an inaccessible","a non-trivial"},ab,{{{"default constructor","copy constructor","move constructor","copy assignment operator","move assignment operator",lc,{{sb,"corresponding",sb,sb,sb}," constructor"}}},lc},{a,a,"s",a,a}},"is an ObjC pointer"}}},{s,nil,{{"default constructor of","copy constructor of","move constructor of","copy assignment operator of","move assignment operator of","destructor of","constructor inherited by"}," B is implicitly deleted because ",{"base class D",{{a,a,a,a,"variant "},"field D"}}," has ",{"no","a deleted","multiple","an inaccessible","a non-trivial"},ab,{{{"default constructor","copy constructor","move constructor","copy assignment operator","move assignment operator",lc,{{sb,"corresponding",sb,sb,sb}," constructor"}}},lc},{a,a,"s",a,a}}}},
		[g]=f,
		[h]="(?:default constructor of|copy constructor of|move constructor of|copy assignment operator of|move assignment operator of|destructor of|constructor inherited by) (.*?) is implicitly deleted because (?:base class (.*?)|(?:||||variant )field (.*?)) (?:has (?:no|a deleted|multiple|an inaccessible|a non\\-trivial) (?:(?:default constructor|copy constructor|move constructor|copy assignment operator|move assignment operator|destructor|(?:default|corresponding|default|default|default) constructor)|destructor)(?:||s||)|is an ObjC pointer)",
		[i]=a,
		[j]=p,
		[k]={ub,1333140808,xb,wb},
		[d]={{t,9336,"/// Check whether we should delete a special member due to the implicit\n/// definition containing a call to a special member of a subobject.\nbool SpecialMemberDeletionInfo::shouldDeleteForSubobjectCall(Subobject Subobj, Sema::SpecialMemberOverloadResult SMOR, bool IsDtorCallInCtor) {\n  // ...\n  if (Diagnose) {\n    if (Field) {\n      S.Diag(Field->getLocation(), diag::note_deleted_special_member_class_subobject) << getEffectiveCSM() << MD->getParent() << /*IsField*/ true << Field << DiagKind << IsDtorCallInCtor << /*IsObjCPtr*/ false;"},{t,9342,"/// Check whether we should delete a special member due to the implicit\n/// definition containing a call to a special member of a subobject.\nbool SpecialMemberDeletionInfo::shouldDeleteForSubobjectCall(Subobject Subobj, Sema::SpecialMemberOverloadResult SMOR, bool IsDtorCallInCtor) {\n  // ...\n  if (Diagnose) {\n    if (Field) {\n    // ...\n    } else {\n      // ...\n      S.Diag(Base->getBeginLoc(), diag::note_deleted_special_member_class_subobject) << getEffectiveCSM() << MD->getParent() << /*IsField*/ false << Base->getType() << DiagKind << IsDtorCallInCtor << /*IsObjCPtr*/ false;"},{t,9413,"bool SpecialMemberDeletionInfo::shouldDeleteForVariantObjCPtrMember(FieldDecl *FD, QualType FieldType) {\n  // ...\n  if (Diagnose) {\n    // ...\n    S.Diag(FD->getLocation(), diag::note_deleted_special_member_class_subobject) << getEffectiveCSM() << ParentClass << /*IsField*/ true << FD << 4 << /*IsDtorCallInCtor*/ false << /*IsObjCPtr*/ true;"},{t,9439,"/// Check whether we should delete a special member function due to the class\n/// having a particular direct or virtual base class.\nbool SpecialMemberDeletionInfo::shouldDeleteForBase(CXXBaseSpecifier *Base) {\n  // ...\n  if (auto *BaseCtor = SMOR.getMethod()) {\n    // Note that we do not check access along this path; other than that,\n    // this is the same as shouldDeleteForSubobjectCall(Base, BaseCtor, false);\n    // FIXME: Check that the base has a usable destructor! Sink this into\n    // shouldDeleteForClassSubobject.\n    if (BaseCtor->isDeleted() && Diagnose) {\n      S.Diag(Base->getBeginLoc(), diag::note_deleted_special_member_class_subobject) << getEffectiveCSM() << MD->getParent() << /*IsField*/ false << Base->getType() << /*Deleted*/ 1 << /*IsDtorCallInCtor*/ false << /*IsObjCPtr*/ false;"}},
		[m]={
			["clang/test/CXX/class.derived/class.abstract/p16.cpp"]={"clang/test/CXX/class.derived/class.abstract/p16.cpp:34:12: note: destructor of \'E\' is implicitly deleted because base class \'D\' has an inaccessible destructor","clang/test/CXX/class.derived/class.abstract/p16.cpp:34:12: note: copy assignment operator of \'E\' is implicitly deleted because base class \'D\' has an inaccessible copy assignment operator","clang/test/CXX/class.derived/class.abstract/p16.cpp:40:12: note: destructor of \'G\' is implicitly deleted because base class \'D\' has an inaccessible destructor","clang/test/CXX/class.derived/class.abstract/p16.cpp:40:12: note: move assignment operator of \'G\' is implicitly deleted because base class \'D\' has an inaccessible move assignment operator","clang/test/CXX/class.derived/class.abstract/p16.cpp:45:12: note: move assignment operator of \'H\' is implicitly deleted because base class \'D\' has an inaccessible move assignment operator","clang/test/CXX/class.derived/class.abstract/p16.cpp:45:12: note: move assignment operator of \'H\' is implicitly deleted because base class \'D\' has an inaccessible move assignment operator"}
		}
	},
	["note_deleted_type_mismatch"]={
		[b]={{nil,s,"note_deleted_type_mismatch"}},
		[c]={{nil,s,"function is implicitly deleted because its declared type does not match the type of an implicit %select{default constructor|copy constructor|move constructor|copy assignment operator|move assignment operator|destructor}0"}},
		[e]={{nil,s,{"function is implicitly deleted because its declared type does not match the type of an implicit ",{"default constructor","copy constructor","move constructor","copy assignment operator","move assignment operator",lc}}}},
		[g]=f,
		[h]="function is implicitly deleted because its declared type does not match the type of an implicit (?:default constructor|copy constructor|move constructor|copy assignment operator|move assignment operator|destructor)",
		[i]=a,
		[j]={{nil,s,p}},
		[k]={"9b2c5e7c44fd",1538097403,"[cxx2a] P0641R2: (Some) type mismatches on defaulted functions only","[cxx2a] P0641R2: (Some) type mismatches on defaulted functions only\nrender the function deleted instead of rendering the program ill-formed.\n\nThis change also adds an enabled-by-default warning for the case where\nan explicitly-defaulted special member function of a non-template class\nis implicitly deleted by the type checking rules. (This fires either due\nto this language change or due to pre-C++20 reasons for the member being\nimplicitly deleted). I\'ve tested this on a large codebase and found only\nbugs (where the program means something that\'s clearly different from\nwhat the programmer intended), so this is enabled by default, but we\nshould revisit this if there are problems with this being enabled by\ndefault.\n\nllvm-svn: 343285"},
		[d]={{t,7774,"bool Sema::CheckExplicitlyDefaultedSpecialMember(CXXMethodDecl *MD, CXXSpecialMember CSM, SourceLocation DefaultLoc) {\n  // ...\n  if (ShouldDeleteForTypeMismatch || ShouldDeleteSpecialMember(MD, CSM)) {\n    if (First) {\n      // ...\n      if (!inTemplateInstantiation() && !HadError) {\n        // ...\n        if (ShouldDeleteForTypeMismatch) {\n          Diag(MD->getLocation(), diag::note_deleted_type_mismatch) << CSM;"}},
		[m]={
			["clang/test/CXX/dcl.decl/dcl.fct.def/dcl.fct.def.default/p1.cpp"]={"clang/test/CXX/dcl.decl/dcl.fct.def/dcl.fct.def.default/p1.cpp:30:3: note: function is implicitly deleted because its declared type does not match the type of an implicit default constructor","clang/test/CXX/dcl.decl/dcl.fct.def/dcl.fct.def.default/p1.cpp:31:3: note: function is implicitly deleted because its declared type does not match the type of an implicit copy constructor","clang/test/CXX/dcl.decl/dcl.fct.def/dcl.fct.def.default/p1.cpp:32:6: note: function is implicitly deleted because its declared type does not match the type of an implicit copy assignment operator","clang/test/CXX/dcl.decl/dcl.fct.def/dcl.fct.def.default/p1.cpp:72:3: note: function is implicitly deleted because its declared type does not match the type of an implicit copy constructor","clang/test/CXX/dcl.decl/dcl.fct.def/dcl.fct.def.default/p1.cpp:73:6: note: function is implicitly deleted because its declared type does not match the type of an implicit copy assignment operator"}
		}
	},
	["note_dependent_function_template_spec_discard_reason"]={
		[b]={{nil,F,"note_dependent_function_template_spec_discard_reason"}},
		[c]={{nil,F,"candidate ignored: %select{not a function template|not a member of the enclosing namespace; did you mean to explicitly qualify the specialization?}0"}},
		[e]={{nil,F,{"candidate ignored: ",{"not a function template","not a member of the enclosing namespace; did you mean to explicitly qualify the specialization?"}}}},
		[g]=f,
		[h]="candidate ignored\\: (?:not a function template|not a member of the enclosing namespace; did you mean to explicitly qualify the specialization\\?)",
		[i]=a,
		[j]={{nil,F,p}},
		[k]={"0b75dc5fa2e0",1532032820,"[Sema] Diagnose an invalid dependent function template specialization","[Sema] Diagnose an invalid dependent function template specialization\n\nPreviously, clang marked the specialization as invalid without emitting a\ndiagnostic. This lead to an assert in CodeGen.\n\nrdar://41806724\n\nDifferential revision: https://reviews.llvm.org/D49085\n\nllvm-svn: 337497"},
		[d]={{vb,9357,"/// Perform semantic analysis for the given dependent function\n/// template specialization.\n///\n/// The only possible way to get a dependent function template specialization\n/// is with a friend declaration, like so:\n///\n/// \\code\n///   template \\<class T> void foo(T);\n///   template \\<class T> class A {\n///     friend void foo<>(T);\n///   };\n/// \\endcode\n///\n/// There really isn\'t any useful analysis we can do here, so we\n/// just store the information.\nbool Sema::CheckDependentFunctionTemplateSpecialization(FunctionDecl *FD, const TemplateArgumentListInfo &ExplicitTemplateArgs, LookupResult &Previous) {\n  // ...\n  if (Previous.empty()) {\n    // ...\n    for (auto &P : DiscardedCandidates)\n      Diag(P.second->getLocation(), diag::note_dependent_function_template_spec_discard_reason) << P.first;"}},
		[m]={
			["clang/test/CXX/temp/temp.decls/temp.friend/p1.cpp"]={"clang/test/CXX/temp/temp.decls/temp.friend/p1.cpp:364:27: note: candidate ignored: not a function template","clang/test/CXX/temp/temp.decls/temp.friend/p1.cpp:372:25: note: candidate ignored: not a member of the enclosing namespace; did you mean to explicitly qualify the specialization?","clang/test/CXX/temp/temp.decls/temp.friend/p1.cpp:381:43: note: candidate ignored: not a function template","clang/test/CXX/temp/temp.decls/temp.friend/p1.cpp:382:22: note: candidate ignored: not a function template"}
		}
	},
	["note_dependent_member_use"]={
		[b]={{nil,u,"note_dependent_member_use"}},
		[c]={{nil,u,"must qualify identifier to find this declaration in dependent base class"}},
		[e]={{nil,u,"must qualify identifier to find this declaration in dependent base class"}},
		[g]=f,
		[h]="must qualify identifier to find this declaration in dependent base class",
		[i]=a,
		[j]={{nil,u,p}},
		[k]={Xb,1590001902,bc,dc},
		[d]={{z,2333,"/// Diagnose a lookup that found results in an enclosing class during error\n/// recovery. This usually indicates that the results were found in a dependent\n/// base class that could not be searched as part of a template definition.\n/// Always issues a diagnostic (though this may be only a warning in MS\n/// compatibility mode).\n///\n/// Return \\c true if the error is unrecoverable, or \\c false if the caller\n/// should attempt to recover using these lookup results.\nbool Sema::DiagnoseDependentMemberLookup(const LookupResult &R) {\n  // ...\n  if (R.getRepresentativeDecl()->getDeclContext()->Equals(R.getNamingClass())) {\n  // ...\n  } else if (getLangOpts().MSVCCompat) {\n    // ...\n    NoteID = diag::note_dependent_member_use;"}},
		[m]={
			["clang/test/CodeGenCXX/ms-lookup-template-base-classes.cpp"]={"clang/test/CodeGenCXX/ms-lookup-template-base-classes.cpp:5:8: note: must qualify identifier to find this declaration in dependent base class"}
		}
	},
	["note_dependent_non_type_default_arg_in_partial_spec"]={
		[b]="note_dependent_non_type_default_arg_in_partial_spec",
		[c]="template parameter is used in default argument declared here",
		[e]="template parameter is used in default argument declared here",
		[g]=f,
		[h]="template parameter is used in default argument declared here",
		[i]=a,
		[j]=p,
		[k]={"6056d5e91886",1391907283,"PR16519, PR18009: When checking a partial specialization for uses of its own","PR16519, PR18009: When checking a partial specialization for uses of its own\ntemplate parameters, don\'t look for parameters of outer templates. If a problem\nis found in a default template argument, point the diagnostic at the partial\nspecialization (with a note pointing at the default argument) instead of\npointing it at the default argument and leaving it unclear which partial\nspecialization os problematic.\n\nllvm-svn: 201031"},
		[d]={{vb,8549,"/// Subroutine of Sema::CheckTemplatePartialSpecializationArgs\n/// that checks non-type template partial specialization arguments.\nstatic bool CheckNonTypeTemplatePartialSpecializationArgs(Sema &S, SourceLocation TemplateNameLoc, NonTypeTemplateParmDecl *Param, const TemplateArgument *Args, unsigned NumArgs, bool IsDefaultArgument) {\n  for (unsigned I = 0; I != NumArgs; ++I) {\n    // ...\n    if (ParamUseRange.isValid()) {\n      if (IsDefaultArgument) {\n        // ...\n        S.Diag(ParamUseRange.getBegin(), diag::note_dependent_non_type_default_arg_in_partial_spec) << ParamUseRange;"}}
	},
	["note_deprecated_this_capture"]={
		[b]={{nil,F,"note_deprecated_this_capture"}},
		[c]={{nil,F,"add an explicit capture of \'this\' to capture \'*this\' by reference"}},
		[e]={{nil,F,"add an explicit capture of \'this\' to capture \'*this\' by reference"}},
		[g]=f,
		[h]="add an explicit capture of \'this\' to capture \'\\*this\' by reference",
		[i]=a,
		[j]={{nil,F,"Lambda Issue"}},
		[k]={"d82201e7c66b",1530943128,"P0806R2 Implicit capture of this with a capture-default of [=] is","P0806R2 Implicit capture of this with a capture-default of [=] is\ndeprecated.\n\nAdd a -Wdeprecated warning for this in C++2a onwards. (In C++17 and\nbefore, there isn\'t a reasonable alternative because [=,this] is\nill-formed.)\n\nllvm-svn: 336480"},
		[d]={{"clang/lib/Sema/SemaLambda.cpp",2038,"ExprResult Sema::BuildLambdaExpr(SourceLocation StartLoc, SourceLocation EndLoc, LambdaScopeInfo *LSI) {\n  // ...\n  {\n    // ...\n    for (unsigned I = 0, N = LSI->Captures.size(); I != N; ++I) {\n      // ...\n      // Map the capture to our AST representation.\n      LambdaCapture Capture = [&] {\n        if (From.isThisCapture()) {\n          // Capturing \'this\' implicitly with a default of \'[=]\' is deprecated,\n          // because it results in a reference capture. Don\'t warn prior to\n          // C++2a; there\'s nothing that can be done about it before then.\n          if (getLangOpts().CPlusPlus20 && IsImplicit && CaptureDefault == LCD_ByCopy) {\n            // ...\n            Diag(CaptureDefaultLoc, diag::note_deprecated_this_capture) << FixItHint::CreateInsertion(getLocForEndOfToken(CaptureDefaultLoc), \", this\");"}},
		[m]={
			["clang/test/SemaCXX/lambda-implicit-this-capture.cpp"]={"clang/test/SemaCXX/lambda-implicit-this-capture.cpp:10:13: note: add an explicit capture of \'this\' to capture \'*this\' by reference"}
		}
	},
	["note_designated_init_mixed"]={
		[b]={{nil,l,"note_designated_init_mixed"}},
		[c]={{nil,l,"first non-designated initializer is here"}},
		[e]={{nil,l,"first non-designated initializer is here"}},
		[g]=f,
		[h]="first non\\-designated initializer is here",
		[i]=a,
		[j]={{nil,l,p}},
		[k]={"5030928d60a1",1567205575,"[c++20] Implement semantic restrictions for C++20 designated","[c++20] Implement semantic restrictions for C++20 designated\ninitializers.\n\nThis has some interesting interactions with our existing extensions to\nsupport C99 designated initializers as an extension in C++. Those are\nresolved as follows:\n\n * We continue to permit the full breadth of C99 designated initializers\n   in C++, with the exception that we disallow a partial overwrite of an\n   initializer with a non-trivially-destructible type. (Full overwrite\n   is OK, because we won\'t run the first initializer at all.)\n\n * The C99 extensions are disallowed in SFINAE contexts and during\n   overload resolution, where they could change the meaning of valid\n   programs.\n\n * C++20 disallows reordering of initializers. We only check for that for\n   the simple cases that the C++20 rules permit (designators of the form\n   \'.field_name =\' and continue to allow reordering in other cases).\n   It would be nice to improve this behavior in future.\n\n * All C99 designated initializer extensions produce a warning by\n   default in C++20 mode. People are going to learn the C++ rules based\n   on what Clang diagnoses, so it\'s important we diagnose these properly\n   by default.\n\n * In C++ <= 17, we apply the C++20 rules rather than the C99 rules, and\n   so still diagnose C99 extensions as described above. We continue to\n   accept designated C++20-compatible initializers in C++ <= 17 silently\n   by default (but naturally still reject under -pedantic-errors).\n\nThis is not a complete implementation of P0329R4. In particular, that\npaper introduces new non-C99-compatible syntax { .field { init } }, and\nwe do not support that yet.\n\nThis is based on a previous patch by Don Hinton, though I\'ve made\nsubstantial changes when addressing the above interactions.\n\nDifferential Revision: https://reviews.llvm.org/D59754\n\nllvm-svn: 370544"},
		[d]={{z,7817,"ExprResult Sema::ActOnInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList, SourceLocation RBraceLoc) {\n  // ...\n  // Check that any designated initializers are syntactically valid in the\n  // current language mode.\n  for (unsigned I = 0, E = InitArgList.size(); I != E; ++I) {\n    if (auto *DIE = dyn_cast<DesignatedInitExpr>(InitArgList[I])) {\n      // ...\n      if (!DiagnosedMixedDesignator && !isa<DesignatedInitExpr>(InitArgList[0])) {\n        // ...\n        Diag(InitArgList[0]->getBeginLoc(), diag::note_designated_init_mixed) << InitArgList[0]->getSourceRange();"},{z,7830,"ExprResult Sema::ActOnInitList(SourceLocation LBraceLoc, MultiExprArg InitArgList, SourceLocation RBraceLoc) {\n  // ...\n  // Check that any designated initializers are syntactically valid in the\n  // current language mode.\n  for (unsigned I = 0, E = InitArgList.size(); I != E; ++I) {\n    if (auto *DIE = dyn_cast<DesignatedInitExpr>(InitArgList[I])) {\n    // ...\n    } else if (getLangOpts().CPlusPlus && !DiagnosedMixedDesignator && isa<DesignatedInitExpr>(InitArgList[0])) {\n      // ...\n      Diag(InitArgList[I]->getBeginLoc(), diag::note_designated_init_mixed) << InitArgList[I]->getSourceRange();"}},
		[m]={
			["clang/test/SemaCXX/designated-initializers-base-class.cpp"]={"clang/test/SemaCXX/designated-initializers-base-class.cpp:11:22: note: first non-designated initializer is here"}
		}
	},
	["note_destructor_nontype_here"]={
		[b]={{nil,r,"note_destructor_nontype_here"}},
		[c]={{nil,r,"non-type declaration found by destructor name lookup"}},
		[e]={{nil,r,"non-type declaration found by destructor name lookup"}},
		[g]=f,
		[h]="non\\-type declaration found by destructor name lookup",
		[i]=a,
		[j]={{nil,r,p}},
		[k]={"1228d42ddab8",1576809732,"[OpenMP][Part 2] Use reusable OpenMP context/traits handling","[OpenMP][Part 2] Use reusable OpenMP context/traits handling\n\nThis patch implements an almost complete handling of OpenMP\ncontexts/traits such that we can reuse most of the logic in Flang\nthrough the OMPContext.{h,cpp} in llvm/Frontend/OpenMP.\n\nAll but construct SIMD specifiers, e.g., inbranch, and the device ISA\nselector are define in `llvm/lib/Frontend/OpenMP/OMPKinds.def`. From\nthese definitions we generate the enum classes `TraitSet`,\n`TraitSelector`, and `TraitProperty` as well as conversion and helper\nfunctions in `llvm/lib/Frontend/OpenMP/OMPContext.{h,cpp}`.\n\nThe above enum classes are used in the parser, sema, and the AST\nattribute. The latter is not a collection of multiple primitive variant\narguments that contain encodings via numbers and strings but instead a\ntree that mirrors the `match` clause (see `struct OpenMPTraitInfo`).\n\nThe changes to the parser make it more forgiving when wrong syntax is\nread and they also resulted in more specialized diagnostics. The tests\nare updated and the core issues are detected as before. Here and\nelsewhere this patch tries to be generic, thus we do not distinguish\nwhat selector set, selector, or property is parsed except if they do\nbehave exceptionally, as for example `user={condition(EXPR)}` does.\n\nThe sema logic changed in two ways: First, the OMPDeclareVariantAttr\nrepresentation changed, as mentioned above, and the sema was adjusted to\nwork with the new `OpenMPTraitInfo`. Second, the matching and scoring\nlogic moved into `OMPContext.{h,cpp}`. It is implemented on a flat\nrepresentation of the `match` clause that is not tied to clang.\n`OpenMPTraitInfo` provides a method to generate this flat structure (see\n`struct VariantMatchInfo`) by computing integer score values and boolean\nuser conditions from the `clang::Expr` we keep for them.\n\nThe OpenMP context is now an explicit object (see `struct OMPContext`).\nThis is in anticipation of construct traits that need to be tracked. The\nOpenMP context, as well as the `VariantMatchInfo`, are basically made up\nof a set of active or respectively required traits, e.g., \'host\', and an\nordered container of constructs which allows duplication. Matching and\nscoring is kept as generic as possible to allow easy extension in the\nfuture.\n\n---\n\nTest changes:\n\nThe messages checked in `OpenMP/declare_variant_messages.{c,cpp}` have\nbeen auto generated to match the new warnings and notes of the parser.\nThe \"subset\" checks were reversed causing the wrong version to be\npicked. The tests have been adjusted to correct this.\nWe do not print scores if the user did not provide one.\nWe print spaces to make lists in the `match` clause more legible.\n\nReviewers: kiranchandramohan, ABataev, RaviNarayanaswamy, gtbercea, grokos, sdmitriev, JonChesterfield, hfinkel, fghanim\n\nSubscribers: merge_guards_bot, rampitec, mgorny, hiraditya, aheejin, fedor.sergeev, simoncook, bollu, guansong, dexonsmith, jfb, s.egerton, llvm-commits, cfe-commits\n\nTags: #clang, #llvm\n\nDifferential Revision: https://reviews.llvm.org/D71830"},
		[d]={{Z,236,"ParsedType Sema::getDestructorName(SourceLocation TildeLoc, IdentifierInfo &II, SourceLocation NameLoc, Scope *S, CXXScopeSpec &SS, ParsedType ObjectTypePtr, bool EnteringContext) {\n  // ...\n  auto CheckLookupResult = [&](LookupResult &Found) -> ParsedType {\n    // ...\n    // As an extension, attempt to \"fix\" an ambiguity by erasing all non-type\n    // results, and all non-matching results if we have a search type. It\'s not\n    // clear what the right behavior is if destructor lookup hits an ambiguity,\n    // but other compilers do generally accept at least some kinds of\n    // ambiguity.\n    if (Found.isAmbiguous() && NumAcceptableResults == 1) {\n      // ...\n      while (F.hasNext()) {\n        // ...\n        if (auto *TD = dyn_cast<TypeDecl>(D->getUnderlyingDecl()))\n        // ...\n        else\n          Diag(D->getLocation(), diag::note_destructor_nontype_here);"},{Z,462,"ParsedType Sema::getDestructorName(SourceLocation TildeLoc, IdentifierInfo &II, SourceLocation NameLoc, Scope *S, CXXScopeSpec &SS, ParsedType ObjectTypePtr, bool EnteringContext) {\n  // ...\n  for (NamedDecl *FoundD : FoundDecls) {\n    if (auto *TD = dyn_cast<TypeDecl>(FoundD->getUnderlyingDecl()))\n    // ...\n    else\n      Diag(FoundD->getLocation(), diag::note_destructor_nontype_here) << FoundD;"}},
		[m]={
			["clang/test/SemaCXX/GH59446.cpp"]={"clang/test/SemaCXX/GH59446.cpp:5:34: note: non-type declaration found by destructor name lookup"}
		}
	},
	["note_destructor_type_here"]={
		[b]="note_destructor_type_here",
		[c]={{nil,r,"type %0 found by destructor name lookup"},{l,nil,"type %0 is declared here"}},
		[e]={{nil,r,"type A found by destructor name lookup"},{l,nil,"type A is declared here"}},
		[g]=f,
		[h]="type (.*?) found by destructor name lookup",
		[i]=a,
		[j]=p,
		[k]={"4cf85a725af0",1299277928,"When clearing a LookupResult structure, clear out the naming class,","When clearing a LookupResult structure, clear out the naming class,\ntoo. Fixes PR7900.\n\nWhile I\'m in this area, improve the diagnostic when the type being\ndestroyed doesn\'t match either of the types we found.\n\nllvm-svn: 127041"},
		[d]={{Z,233,"ParsedType Sema::getDestructorName(SourceLocation TildeLoc, IdentifierInfo &II, SourceLocation NameLoc, Scope *S, CXXScopeSpec &SS, ParsedType ObjectTypePtr, bool EnteringContext) {\n  // ...\n  auto CheckLookupResult = [&](LookupResult &Found) -> ParsedType {\n    // ...\n    // As an extension, attempt to \"fix\" an ambiguity by erasing all non-type\n    // results, and all non-matching results if we have a search type. It\'s not\n    // clear what the right behavior is if destructor lookup hits an ambiguity,\n    // but other compilers do generally accept at least some kinds of\n    // ambiguity.\n    if (Found.isAmbiguous() && NumAcceptableResults == 1) {\n      // ...\n      while (F.hasNext()) {\n        // ...\n        if (auto *TD = dyn_cast<TypeDecl>(D->getUnderlyingDecl()))\n          Diag(D->getLocation(), diag::note_destructor_type_here) << Context.getTypeDeclType(TD);"},{Z,402,"ParsedType Sema::getDestructorName(SourceLocation TildeLoc, IdentifierInfo &II, SourceLocation NameLoc, Scope *S, CXXScopeSpec &SS, ParsedType ObjectTypePtr, bool EnteringContext) {\n  // ...\n  if (SS.isSet()) {\n    // ...\n    // For compatibility with other compilers and older versions of Clang,\n    //\n    //   nested-name-specifier type-name :: ~ type-name\n    //\n    // also looks for type-name in the scope. Unfortunately, we can\'t\n    // reasonably apply this fallback for dependent nested-name-specifiers.\n    if (SS.isValid() && SS.getScopeRep()->getPrefix()) {\n      if (ParsedType T = LookupInScope()) {\n        // ...\n        Diag(FoundDecls.back()->getLocation(), diag::note_destructor_type_here) << GetTypeFromParser(T);"},{Z,459,"ParsedType Sema::getDestructorName(SourceLocation TildeLoc, IdentifierInfo &II, SourceLocation NameLoc, Scope *S, CXXScopeSpec &SS, ParsedType ObjectTypePtr, bool EnteringContext) {\n  // ...\n  for (NamedDecl *FoundD : FoundDecls) {\n    if (auto *TD = dyn_cast<TypeDecl>(FoundD->getUnderlyingDecl()))\n      Diag(FoundD->getLocation(), diag::note_destructor_type_here) << Context.getTypeDeclType(TD);"}},
		[m]={
			["clang/test/SemaCXX/pseudo-destructors.cpp"]={"clang/test/SemaCXX/pseudo-destructors.cpp:5:13: note: type \'Bar\' (aka \'Foo\') found by destructor name lookup"}
		}
	},
	["note_direct_member_here"]={
		[b]={{nil,u,"note_direct_member_here"}},
		[c]={{nil,u,"direct member declared here"}},
		[e]={{nil,u,"direct member declared here"}},
		[g]=f,
		[h]="direct member declared here",
		[i]=a,
		[j]={{nil,u,p}},
		[k]={Xb,1590001902,bc,dc},
		[d]={{qb,3972,"static void DiagnoseCategoryDirectMembersProtocolConformance(Sema &S, ObjCProtocolDecl *PDecl, ObjCCategoryDecl *CDecl) {\n  // ...\n  if (!DirectMembers.empty()) {\n    // ...\n    for (const auto *MD : DirectMembers)\n      S.Diag(MD->getLocation(), diag::note_direct_member_here);"}},
		[m]={
			["clang/test/SemaObjC/category-direct-members-protocol-conformance.m"]={"clang/test/SemaObjC/category-direct-members-protocol-conformance.m:13:1: note: direct member declared here","clang/test/SemaObjC/category-direct-members-protocol-conformance.m:48:1: note: direct member declared here","clang/test/SemaObjC/category-direct-members-protocol-conformance.m:50:1: note: direct member declared here","clang/test/SemaObjC/category-direct-members-protocol-conformance.m:77:36: note: direct member declared here","clang/test/SemaObjC/category-direct-members-protocol-conformance.m:93:51: note: direct member declared here"}
		}
	},
	["note_direct_method_declared_at"]={
		[b]={{nil,l,"note_direct_method_declared_at"}},
		[c]={{nil,l,"direct method %0 declared here"}},
		[e]={{nil,l,"direct method A declared here"}},
		[g]=f,
		[h]="direct method (.*?) declared here",
		[i]=a,
		[j]={{nil,l,p}},
		[k]={"c094e7dc4b3f",1573050950,"[SYCL] Add sycl_kernel attribute for accelerated code outlining","[SYCL] Add sycl_kernel attribute for accelerated code outlining\n\nSYCL is single source offload programming model relying on compiler to\nseparate device code (i.e. offloaded to an accelerator) from the code\nexecuted on the host.\n\nHere is code example of the SYCL program to demonstrate compiler\noutlining work:\n\n```\nint foo(int x) { return ++x; }\nint bar(int x) { throw std::exception(\"CPU code only!\"); }\n...\nusing namespace cl::sycl;\nqueue Q;\nbuffer<int, 1> a(range<1>{1024});\nQ.submit([&](handler& cgh) {\n  auto A = a.get_access<access::mode::write>(cgh);\n  cgh.parallel_for<init_a>(range<1>{1024}, [=](id<1> index) {\n    A[index] = index[0] + foo(42);\n  });\n}\n...\n```\n\nSYCL device compiler must compile lambda expression passed to\ncl::sycl::handler::parallel_for method and function foo called from this\nlambda expression for an \"accelerator\". SYCL device compiler also must\nignore bar function as it\'s not required for offloaded code execution.\n\nThis patch adds the sycl_kernel attribute, which is used to mark code\npassed to cl::sycl::handler::parallel_for as \"accelerated code\".\n\nAttribute must be applied to function templates which parameters include\nat least \"kernel name\" and \"kernel function object\". These parameters\nwill be used to establish an ABI between the host application and\noffloaded part.\n\nReviewers: jlebar, keryell, Naghasan, ABataev, Anastasia, bader, aaron.ballman, rjmccall, rsmith\n\nReviewed By: keryell, bader\n\nSubscribers: mgorny, OlegM, ArturGainullin, agozillon, aaron.ballman, ebevhan, Anastasia, cfe-commits\n\nTags: #clang\n\nDifferential Revision: https://reviews.llvm.org/D60455\n\nSigned-off-by: Alexey Bader <alexey.bader@intel.com>"},
		[d]={{w,1326,"ExprResult Sema::ParseObjCSelectorExpression(Selector Sel, SourceLocation AtLoc, SourceLocation SelLoc, SourceLocation LParenLoc, SourceLocation RParenLoc, bool WarnMultipleSelectors) {\n  // ...\n  if (!Method) {\n  // ...\n  } else {\n    // ...\n    if (onlyDirect) {\n      // ...\n      Diag(Method->getLocation(), diag::note_direct_method_declared_at) << Method->getDeclName();"},{w,1336,"ExprResult Sema::ParseObjCSelectorExpression(Selector Sel, SourceLocation AtLoc, SourceLocation SelLoc, SourceLocation LParenLoc, SourceLocation RParenLoc, bool WarnMultipleSelectors) {\n  // ...\n  if (!Method) {\n  // ...\n  } else {\n    // ...\n    if (onlyDirect) {\n    // ...\n    } else if (anyDirect) {\n      // ...\n      if (LikelyTargetMethod && LikelyTargetMethod->isDirectMethod()) {\n        // ...\n        Diag(LikelyTargetMethod->getLocation(), diag::note_direct_method_declared_at) << LikelyTargetMethod->getDeclName();"},{w,1344,"ExprResult Sema::ParseObjCSelectorExpression(Selector Sel, SourceLocation AtLoc, SourceLocation SelLoc, SourceLocation LParenLoc, SourceLocation RParenLoc, bool WarnMultipleSelectors) {\n  // ...\n  if (!Method) {\n  // ...\n  } else {\n    // ...\n    if (onlyDirect) {\n    // ...\n    } else if (anyDirect) {\n      // ...\n      if (LikelyTargetMethod && LikelyTargetMethod->isDirectMethod()) {\n      // ...\n      } else if (!LikelyTargetMethod) {\n        // ...\n        Diag(GlobalDirectMethod->getLocation(), diag::note_direct_method_declared_at) << GlobalDirectMethod->getDeclName();"},{w,2708,"/// \\param ReceiverType The type of the object receiving the\n/// message. When \\p ReceiverTypeInfo is non-NULL, this is the same\n/// type as that refers to. For a superclass send, this is the type of\n/// the superclass.\n///\n/// \\param SuperLoc The location of the \"super\" keyword in a\n/// superclass message.\n///\n/// \\param Sel The selector to which the message is being sent.\n///\n/// \\param Method The method that this class message is invoking, if\n/// already known.\n///\n/// \\param LBracLoc The location of the opening square bracket \']\'.\n///\n/// \\param RBracLoc The location of the closing square bracket \']\'.\n///\n/// \\param ArgsIn The message arguments.\nExprResult Sema::BuildClassMessage(TypeSourceInfo *ReceiverTypeInfo, QualType ReceiverType, SourceLocation SuperLoc, Selector Sel, ObjCMethodDecl *Method, SourceLocation LBracLoc, ArrayRef<SourceLocation> SelectorLocs, SourceLocation RBracLoc, MultiExprArg ArgsIn, bool isImplicit) {\n  // ...\n  if (Method && Method->isDirectMethod() && SuperLoc.isValid()) {\n    // ...\n    Diag(Method->getLocation(), diag::note_direct_method_declared_at) << Method->getDeclName();"},{w,3144,"/// Build an Objective-C instance message expression.\n///\n/// This routine takes care of both normal instance messages and\n/// instance messages to the superclass instance.\n///\n/// \\param Receiver The expression that computes the object that will\n/// receive this message. This may be empty, in which case we are\n/// sending to the superclass instance and \\p SuperLoc must be a valid\n/// source location.\n///\n/// \\param ReceiverType The (static) type of the object receiving the\n/// message. When a \\p Receiver expression is provided, this is the\n/// same type as that expression. For a superclass instance send, this\n/// is a pointer to the type of the superclass.\n///\n/// \\param SuperLoc The location of the \"super\" keyword in a\n/// superclass instance message.\n///\n/// \\param Sel The selector to which the message is being sent.\n///\n/// \\param Method The method that this instance message is invoking, if\n/// already known.\n///\n/// \\param LBracLoc The location of the opening square bracket \']\'.\n///\n/// \\param RBracLoc The location of the closing square bracket \']\'.\n///\n/// \\param ArgsIn The message arguments.\nExprResult Sema::BuildInstanceMessage(Expr *Receiver, QualType ReceiverType, SourceLocation SuperLoc, Selector Sel, ObjCMethodDecl *Method, SourceLocation LBracLoc, ArrayRef<SourceLocation> SelectorLocs, SourceLocation RBracLoc, MultiExprArg ArgsIn, bool isImplicit) {\n  // ...\n  if (Method && Method->isDirectMethod()) {\n    if (ReceiverType->isObjCIdType() && !isImplicit) {\n      // ...\n      Diag(Method->getLocation(), diag::note_direct_method_declared_at) << Method->getDeclName();"},{w,3161,"/// Build an Objective-C instance message expression.\n///\n/// This routine takes care of both normal instance messages and\n/// instance messages to the superclass instance.\n///\n/// \\param Receiver The expression that computes the object that will\n/// receive this message. This may be empty, in which case we are\n/// sending to the superclass instance and \\p SuperLoc must be a valid\n/// source location.\n///\n/// \\param ReceiverType The (static) type of the object receiving the\n/// message. When a \\p Receiver expression is provided, this is the\n/// same type as that expression. For a superclass instance send, this\n/// is a pointer to the type of the superclass.\n///\n/// \\param SuperLoc The location of the \"super\" keyword in a\n/// superclass instance message.\n///\n/// \\param Sel The selector to which the message is being sent.\n///\n/// \\param Method The method that this instance message is invoking, if\n/// already known.\n///\n/// \\param LBracLoc The location of the opening square bracket \']\'.\n///\n/// \\param RBracLoc The location of the closing square bracket \']\'.\n///\n/// \\param ArgsIn The message arguments.\nExprResult Sema::BuildInstanceMessage(Expr *Receiver, QualType ReceiverType, SourceLocation SuperLoc, Selector Sel, ObjCMethodDecl *Method, SourceLocation LBracLoc, ArrayRef<SourceLocation> SelectorLocs, SourceLocation RBracLoc, MultiExprArg ArgsIn, bool isImplicit) {\n  // ...\n  if (Method && Method->isDirectMethod()) {\n    // ...\n    // Under ARC, self can\'t be assigned, and doing a direct call to `self`\n    // when it\'s a Class is hence safe.  For other cases, we can\'t trust `self`\n    // is what we think it is, so we reject it.\n    if (ReceiverType->isObjCClassType() && !isImplicit && !(Receiver->isObjCSelfExpr() && getLangOpts().ObjCAutoRefCount)) {\n      // ...\n      Diag(Method->getLocation(), diag::note_direct_method_declared_at) << Method->getDeclName();"},{w,3176,"/// Build an Objective-C instance message expression.\n///\n/// This routine takes care of both normal instance messages and\n/// instance messages to the superclass instance.\n///\n/// \\param Receiver The expression that computes the object that will\n/// receive this message. This may be empty, in which case we are\n/// sending to the superclass instance and \\p SuperLoc must be a valid\n/// source location.\n///\n/// \\param ReceiverType The (static) type of the object receiving the\n/// message. When a \\p Receiver expression is provided, this is the\n/// same type as that expression. For a superclass instance send, this\n/// is a pointer to the type of the superclass.\n///\n/// \\param SuperLoc The location of the \"super\" keyword in a\n/// superclass instance message.\n///\n/// \\param Sel The selector to which the message is being sent.\n///\n/// \\param Method The method that this instance message is invoking, if\n/// already known.\n///\n/// \\param LBracLoc The location of the opening square bracket \']\'.\n///\n/// \\param RBracLoc The location of the closing square bracket \']\'.\n///\n/// \\param ArgsIn The message arguments.\nExprResult Sema::BuildInstanceMessage(Expr *Receiver, QualType ReceiverType, SourceLocation SuperLoc, Selector Sel, ObjCMethodDecl *Method, SourceLocation LBracLoc, ArrayRef<SourceLocation> SelectorLocs, SourceLocation RBracLoc, MultiExprArg ArgsIn, bool isImplicit) {\n  // ...\n  if (Method && Method->isDirectMethod()) {\n    // ...\n    if (SuperLoc.isValid()) {\n      // ...\n      Diag(Method->getLocation(), diag::note_direct_method_declared_at) << Method->getDeclName();"}},
		[m]={
			["clang/test/SemaObjC/method-direct-arc.m"]={"clang/test/SemaObjC/method-direct-arc.m:8:1: note: direct method \'directMethod\' declared here"}
		}
	},
	["note_doc_block_command_previous"]={
		[b]="note_doc_block_command_previous",
		[c]="previous command \'%select{\\|@}0%1\' here",
		[e]={{nil,nil,{"previous command \'",{"\\","@"},"B\' here"}}},
		[g]=f,
		[h]="previous command \'(?:\\\\|@)(.*?)\' here",
		[i]=a,
		[j]=pb,
		[k]={"5ec0c7536a98",1344272907,"Comment diagnostics: warn on duplicate \\brief and \\return commands.","Comment diagnostics: warn on duplicate \\brief and \\return commands.\n\nDoxygen manual claims that multiple \\brief or \\returns commands will be merged\ntogether, but actual behavior is different (second \\brief command becomes a\npart of a discussion, second \\returns becomes a \"Returns: blah\" paragraph on\nits own).  Anyway, it seems to be a bad idea to use multiple \\brief or \\returns\ncommands in a single command.\n\nllvm-svn: 161325"},
		[d]={{Eb,628,"void Sema::checkBlockCommandDuplicate(const BlockCommandComment *Command) {\n  // ...\n  if (CommandName == PrevCommandName)\n    Diag(PrevCommand->getLocation(), diag::note_doc_block_command_previous) << PrevCommand->getCommandMarker() << PrevCommandName << PrevCommand->getSourceRange();"}},
		[m]={
			["clang/test/Sema/warn-documentation.cpp"]={"clang/test/Sema/warn-documentation.cpp:154:6: note: previous command \'\\brief\' here","clang/test/Sema/warn-documentation.cpp:162:6: note: previous command \'\\short\' here","clang/test/Sema/warn-documentation.cpp:731:6: note: previous command \'\\headerfile\' here"}
		}
	},
	["note_doc_block_command_previous_alias"]={
		[b]="note_doc_block_command_previous_alias",
		[c]="previous command \'%select{\\|@}0%1\' (an alias of \'\\%2\') here",
		[e]={{nil,nil,{"previous command \'",{"\\","@"},"B\' (an alias of \'\\C\') here"}}},
		[g]=f,
		[h]="previous command \'(?:\\\\|@)(.*?)\' \\(an alias of \'\\\\(.*?)\'\\) here",
		[i]=a,
		[j]=pb,
		[k]={"5ec0c7536a98",1344272907,"Comment diagnostics: warn on duplicate \\brief and \\return commands.","Comment diagnostics: warn on duplicate \\brief and \\return commands.\n\nDoxygen manual claims that multiple \\brief or \\returns commands will be merged\ntogether, but actual behavior is different (second \\brief command becomes a\npart of a discussion, second \\returns becomes a \"Returns: blah\" paragraph on\nits own).  Anyway, it seems to be a bad idea to use multiple \\brief or \\returns\ncommands in a single command.\n\nllvm-svn: 161325"},
		[d]={{Eb,634,"void Sema::checkBlockCommandDuplicate(const BlockCommandComment *Command) {\n  // ...\n  if (CommandName == PrevCommandName)\n  // ...\n  else\n    Diag(PrevCommand->getLocation(), diag::note_doc_block_command_previous_alias) << PrevCommand->getCommandMarker() << PrevCommandName << CommandName;"}},
		[m]={
			["clang/test/Sema/warn-documentation.cpp"]={"clang/test/Sema/warn-documentation.cpp:170:6: note: previous command \'\\short\' (an alias of \'\\brief\') here"}
		}
	},
	["note_doc_html_end_tag"]={
		[b]="note_doc_html_end_tag",
		[c]="end tag",
		[e]="end tag",
		[g]=f,
		[h]="end tag",
		[i]=a,
		[j]=pb,
		[k]={"e00ffc7bb836",1342140264,"Comment parsing: repaint the bikesched: rename \'HTML open tags\' to \'HTML start tags\' and \'HTML close...","Comment parsing: repaint the bikesched: rename \'HTML open tags\' to \'HTML start tags\' and \'HTML close tags\' to \'HTML end tags\' according to HTML spec.\n\nllvm-svn: 160153"},
		[d]={{Eb,510,"HTMLEndTagComment *Sema::actOnHTMLEndTag(SourceLocation LocBegin, SourceLocation LocEnd, StringRef TagName) {\n  // ...\n  while (!HTMLOpenTags.empty()) {\n    // ...\n    if (OpenLineInvalid || CloseLineInvalid || OpenLine == CloseLine) {\n    // ...\n    } else {\n      // ...\n      Diag(HET->getLocation(), diag::note_doc_html_end_tag) << HET->getSourceRange();"}}
	},
	["note_doc_html_tag_started_here"]={
		[b]="note_doc_html_tag_started_here",
		[c]="HTML tag started here",
		[e]="HTML tag started here",
		[g]=f,
		[h]="HTML tag started here",
		[i]=a,
		[j]=pb,
		[k]={"f26054f0fb53",1342042719,"Enable comment parsing and semantic analysis to emit diagnostics.  A few","Enable comment parsing and semantic analysis to emit diagnostics.  A few\ndiagnostics implemented -- see testcases.\n\nI created a new TableGen file for comment diagnostics,\nDiagnosticCommentKinds.td, because comment diagnostics don\'t logically\nfit into AST diagnostics file.  But I don\'t feel strongly about it.\n\nThis also implements support for self-closing HTML tags in comment\nlexer and parser (for example, <br />).\n\nIn order to issue precise diagnostics CommentSema needs to know the\ndeclaration the comment is attached to.  There is no easy way to find a decl by \ncomment, so we match comments and decls in lockstep: after parsing one\ndeclgroup we check if we have any new, not yet attached comments.  If we do --\nthen we do the usual comment-finding process.\n\nIt is interesting that this automatically handles trailing comments.\nWe pick up not only comments that precede the declaration, but also\ncomments that *follow* the declaration -- thanks to the lookahead in\nthe lexer: after parsing the declgroup we\'ve consumed the semicolon\nand looked ahead through comments.\n\nAdded -Wdocumentation-html flag for semantic HTML errors to allow the user to \ndisable only HTML warnings (but not HTML parse errors, which we emit as\nwarnings in -Wdocumentation).\n\nllvm-svn: 160078"},
		[d]={{"clang/lib/AST/CommentParser.cpp",521,"HTMLStartTagComment *Parser::parseHTMLStartTag() {\n  // ...\n  while (true) {\n    // ...\n    default:\n      // ...\n      if (StartLineInvalid || EndLineInvalid || StartLine == EndLine)\n      // ...\n      else {\n        // ...\n        Diag(HST->getLocation(), diag::note_doc_html_tag_started_here) << HST->getSourceRange();"}},
		[m]={
			["clang/test/Sema/warn-documentation.cpp"]={"clang/test/Sema/warn-documentation.cpp:50:13: note: HTML tag started here"}
		}
	},
	["note_doc_param_name_suggestion"]={
		[b]="note_doc_param_name_suggestion",
		[c]="did you mean \'%0\'?",
		[e]="did you mean \'A\'?",
		[g]=f,
		[h]="did you mean \'(.*?)\'\\?",
		[i]=a,
		[j]=pb,
		[k]={"f26054f0fb53",1342042719,"Enable comment parsing and semantic analysis to emit diagnostics.  A few","Enable comment parsing and semantic analysis to emit diagnostics.  A few\ndiagnostics implemented -- see testcases.\n\nI created a new TableGen file for comment diagnostics,\nDiagnosticCommentKinds.td, because comment diagnostics don\'t logically\nfit into AST diagnostics file.  But I don\'t feel strongly about it.\n\nThis also implements support for self-closing HTML tags in comment\nlexer and parser (for example, <br />).\n\nIn order to issue precise diagnostics CommentSema needs to know the\ndeclaration the comment is attached to.  There is no easy way to find a decl by \ncomment, so we match comments and decls in lockstep: after parsing one\ndeclgroup we check if we have any new, not yet attached comments.  If we do --\nthen we do the usual comment-finding process.\n\nIt is interesting that this automatically handles trailing comments.\nWe pick up not only comments that precede the declaration, but also\ncomments that *follow* the declaration -- thanks to the lookahead in\nthe lexer: after parsing the declgroup we\'ve consumed the semicolon\nand looked ahead through comments.\n\nAdded -Wdocumentation-html flag for semantic HTML errors to allow the user to \ndisable only HTML warnings (but not HTML parse errors, which we emit as\nwarnings in -Wdocumentation).\n\nllvm-svn: 160078"},
		[d]={{Eb,787,"void Sema::resolveParamCommandIndexes(const FullComment *FC) {\n  // ...\n  // Second pass over unresolved \\\\param commands: do typo correction.\n  // Suggest corrections from a set of parameter declarations that have no\n  // corresponding \\\\param.\n  for (unsigned i = 0, e = UnresolvedParamCommands.size(); i != e; ++i) {\n    // ...\n    if (CorrectedParamIndex != ParamCommandComment::InvalidParamIndex) {\n      // ...\n      if (const IdentifierInfo *CorrectedII = CorrectedPVD->getIdentifier())\n        Diag(ArgRange.getBegin(), diag::note_doc_param_name_suggestion) << CorrectedII->getName() << FixItHint::CreateReplacement(ArgRange, CorrectedII->getName());"}},
		[m]={
			["clang/test/Sema/warn-documentation-crlf.c"]={"clang/test/Sema/warn-documentation-crlf.c:10:11: note: did you mean \'qwerty\'?"}
		}
	},
	["note_doc_param_previous"]={
		[b]="note_doc_param_previous",
		[c]=Hb,
		[e]=Hb,
		[g]=f,
		[h]=Hb,
		[i]=a,
		[j]=pb,
		[k]={"8f0f1b0c41cd",1343166256,"Comment diagnostics: add warning for multiple \\param commands with duplicate","Comment diagnostics: add warning for multiple \\param commands with duplicate\nparameter names.\n\nllvm-svn: 160696"},
		[d]={{Eb,746,"void Sema::resolveParamCommandIndexes(const FullComment *FC) {\n  // ...\n  // First pass over all \\\\param commands: resolve all parameter names.\n  for (Comment::child_iterator I = FC->child_begin(), E = FC->child_end(); I != E; ++I) {\n    // ...\n    if (ParamVarDocs[ResolvedParamIndex]) {\n      // ...\n      Diag(PrevCommand->getLocation(), diag::note_doc_param_previous) << PrevCommand->getParamNameRange();"}},
		[m]={
			["clang/test/Sema/warn-documentation.cpp"]={"clang/test/Sema/warn-documentation.cpp:314:6: note: previous documentation","clang/test/Sema/warn-documentation.cpp:321:6: note: previous documentation","clang/test/Sema/warn-documentation.cpp:585:6: note: previous documentation"}
		}
	},
	["note_doc_tparam_name_suggestion"]={
		[b]="note_doc_tparam_name_suggestion",
		[c]="did you mean \'%0\'?",
		[e]="did you mean \'A\'?",
		[g]=f,
		[h]="did you mean \'(.*?)\'\\?",
		[i]=a,
		[j]=pb,
		[k]={"34df220410b3",1343774226,"Comment parsing: add support for \\tparam command on all levels.","Comment parsing: add support for \\tparam command on all levels.\n\nThe only caveat is renumbering CXCommentKind enum for aesthetic reasons -- this\nbreaks libclang binary compatibility, but should not be a problem since API is\nso new.\n\nThis also fixes PR13372 as a side-effect.\n\nllvm-svn: 161087"},
		[d]={{Eb,349,"void Sema::actOnTParamCommandParamNameArg(TParamCommandComment *Command, SourceLocation ArgLocBegin, SourceLocation ArgLocEnd, StringRef Arg) {\n  // ...\n  if (!CorrectedName.empty()) {\n    Diag(ArgLocBegin, diag::note_doc_tparam_name_suggestion) << CorrectedName << FixItHint::CreateReplacement(ArgRange, CorrectedName);"}}
	},
	["note_doc_tparam_previous"]={
		[b]="note_doc_tparam_previous",
		[c]=Hb,
		[e]=Hb,
		[g]=f,
		[h]=Hb,
		[i]=a,
		[j]=pb,
		[k]={"34df220410b3",1343774226,"Comment parsing: add support for \\tparam command on all levels.","Comment parsing: add support for \\tparam command on all levels.\n\nThe only caveat is renumbering CXCommentKind enum for aesthetic reasons -- this\nbreaks libclang binary compatibility, but should not be a problem since API is\nso new.\n\nThis also fixes PR13372 as a side-effect.\n\nllvm-svn: 161087"},
		[d]={{Eb,324,"void Sema::actOnTParamCommandParamNameArg(TParamCommandComment *Command, SourceLocation ArgLocBegin, SourceLocation ArgLocEnd, StringRef Arg) {\n  // ...\n  if (resolveTParamReference(Arg, TemplateParameters, &Position)) {\n    // ...\n    if (PrevCommand) {\n      // ...\n      Diag(PrevCommand->getLocation(), diag::note_doc_tparam_previous) << PrevCommand->getParamNameRange();"}}
	},
	["note_drv_address_sanitizer_debug_runtime"]={
		[b]="note_drv_address_sanitizer_debug_runtime",
		[c]="AddressSanitizer doesn\'t support linking with debug runtime libraries yet",
		[e]="AddressSanitizer doesn\'t support linking with debug runtime libraries yet",
		[g]=f,
		[h]="AddressSanitizer doesn\'t support linking with debug runtime libraries yet",
		[i]=a,
		[j]=o,
		[k]={"e0db196556f2",1413328544,"clang-cl: Diagnose the usage of ASAN with a debug runtime library","clang-cl: Diagnose the usage of ASAN with a debug runtime library\n\nSummary:\nAddressSanitizer currently doesn\'t support this configuration, and binaries\nbuilt with it will just get into an infinite loop during startup.\n\nTest Plan: Includes an automated test.\n\nReviewers: samsonov\n\nSubscribers: cfe-commits\n\nDifferential Revision: http://reviews.llvm.org/D5764\n\nllvm-svn: 219744"},
		[d]={{"clang/lib/Driver/SanitizerArgs.cpp",942,"SanitizerArgs::SanitizerArgs(const ToolChain &TC, const llvm::opt::ArgList &Args, bool DiagnoseErrors) {\n  // ...\n  if (AllAddedKinds & SanitizerKind::Address) {\n    // ...\n    if (Arg *WindowsDebugRTArg = Args.getLastArg(options::OPT__SLASH_MTd, options::OPT__SLASH_MT, options::OPT__SLASH_MDd, options::OPT__SLASH_MD, options::OPT__SLASH_LDd, options::OPT__SLASH_LD)) {\n      // ...\n      case options::OPT__SLASH_MTd:\n      case options::OPT__SLASH_MDd:\n      case options::OPT__SLASH_LDd:\n        if (DiagnoseErrors) {\n          // ...\n          D.Diag(clang::diag::note_drv_address_sanitizer_debug_runtime);"}}
	},
	["note_drv_available_multilibs"]={
		[b]="note_drv_available_multilibs",
		[c]="available multilibs are:%0",
		[e]="available multilibs are:A",
		[g]=f,
		[h]="available multilibs are\\:(.*?)",
		[i]=a,
		[j]=o,
		[k]={"028c1033b1ed",1687186972,"[Driver][BareMetal] Error if no matching multilib","[Driver][BareMetal] Error if no matching multilib\n\nPreviously if no matching multilib was found then the user would\ntypically see an error like \"fatal error: \'stdio.h\' file not found\"\nwhich gives no indication as to the underlying problem.\nWith this change the user will instead see an error like\n  clang: error: no multilib found matching flags: --target=thumbv7em-none-unknown-eabi -march=...\n  clang: note: available multilibs are:\n  --target=armv4t-none-unknown-eabi\n  --target=thumbv6m-none-unknown-eabi -mfpu=none\n  ...\n\nDifferential Revision: https://reviews.llvm.org/D153292"},
		[d]={{"clang/lib/Driver/ToolChains/BareMetal.cpp",194,"static void findMultilibsFromYAML(const ToolChain &TC, const Driver &D, StringRef MultilibPath, const ArgList &Args, DetectedMultilibs &Result) {\n  // ...\n  D.Diag(clang::diag::note_drv_available_multilibs) << ss.str();"}}
	},
	["note_drv_command_failed_diag_msg"]={
		[b]="note_drv_command_failed_diag_msg",
		[c]="diagnostic msg: %0",
		[e]="diagnostic msg: A",
		[g]=f,
		[h]="diagnostic msg\\: (.*?)",
		[i]=a,
		[j]=o,
		[k]={"e3805fc11821",1311193592,"When the compiler crashes, the compiler driver now produces diagnostic information ","When the compiler crashes, the compiler driver now produces diagnostic information \nincluding the fully preprocessed source file(s) and command line arguments.  The \ndeveloper is asked to attach this diagnostic information to a bug report.\n\nllvm-svn: 135614"},
		[d]={{L,1694,"// When clang crashes, produce diagnostic information including the fully\n// preprocessed source file(s).  Request that the developer attach the\n// diagnostic information to a bug report.\nvoid Driver::generateCompilationDiagnostics(Compilation &C, const Command &FailingCommand, StringRef AdditionalInformation, CompilationDiagnosticReport *Report) {\n  // ...\n  // If lld failed, rerun it again with --reproduce.\n  if (IsLLD) {\n    // ...\n    Diag(clang::diag::note_drv_command_failed_diag_msg) << BugReporMsg;"},{L,1695,"// When clang crashes, produce diagnostic information including the fully\n// preprocessed source file(s).  Request that the developer attach the\n// diagnostic information to a bug report.\nvoid Driver::generateCompilationDiagnostics(Compilation &C, const Command &FailingCommand, StringRef AdditionalInformation, CompilationDiagnosticReport *Report) {\n  // ...\n  // If lld failed, rerun it again with --reproduce.\n  if (IsLLD) {\n    // ...\n    Diag(clang::diag::note_drv_command_failed_diag_msg) << TmpName;"},{L,1696,"// When clang crashes, produce diagnostic information including the fully\n// preprocessed source file(s).  Request that the developer attach the\n// diagnostic information to a bug report.\nvoid Driver::generateCompilationDiagnostics(Compilation &C, const Command &FailingCommand, StringRef AdditionalInformation, CompilationDiagnosticReport *Report) {\n  // ...\n  // If lld failed, rerun it again with --reproduce.\n  if (IsLLD) {\n    // ...\n    Diag(clang::diag::note_drv_command_failed_diag_msg) << \"\\n\\n********************\";"},{L,1715,"// When clang crashes, produce diagnostic information including the fully\n// preprocessed source file(s).  Request that the developer attach the\n// diagnostic information to a bug report.\nvoid Driver::generateCompilationDiagnostics(Compilation &C, const Command &FailingCommand, StringRef AdditionalInformation, CompilationDiagnosticReport *Report) {\n  // ...\n  for (InputList::iterator it = Inputs.begin(), ie = Inputs.end(); it != ie;) {\n    // ...\n    // Ignore input from stdin or any inputs that cannot be preprocessed.\n    // Check type first as not all linker inputs have a value.\n    if (types::getPreprocessedType(it->first) == types::TY_INVALID) {\n    // ...\n    } else if (!strcmp(it->second->getValue(), \"-\")) {\n      Diag(clang::diag::note_drv_command_failed_diag_msg) << \"Error generating preprocessed source(s) - \""},{L,1730,"// When clang crashes, produce diagnostic information including the fully\n// preprocessed source file(s).  Request that the developer attach the\n// diagnostic information to a bug report.\nvoid Driver::generateCompilationDiagnostics(Compilation &C, const Command &FailingCommand, StringRef AdditionalInformation, CompilationDiagnosticReport *Report) {\n  // ...\n  if (Inputs.empty()) {\n    Diag(clang::diag::note_drv_command_failed_diag_msg) << \"Error generating preprocessed source(s) - \""},{L,1746,"// When clang crashes, produce diagnostic information including the fully\n// preprocessed source file(s).  Request that the developer attach the\n// diagnostic information to a bug report.\nvoid Driver::generateCompilationDiagnostics(Compilation &C, const Command &FailingCommand, StringRef AdditionalInformation, CompilationDiagnosticReport *Report) {\n  // ...\n  if (ArchNames.size() > 1) {\n    Diag(clang::diag::note_drv_command_failed_diag_msg) << \"Error generating preprocessed source(s) - cannot generate \""},{L,1764,"// When clang crashes, produce diagnostic information including the fully\n// preprocessed source file(s).  Request that the developer attach the\n// diagnostic information to a bug report.\nvoid Driver::generateCompilationDiagnostics(Compilation &C, const Command &FailingCommand, StringRef AdditionalInformation, CompilationDiagnosticReport *Report) {\n  // ...\n  // If there were errors building the compilation, quit now.\n  if (Trap.hasErrorOccurred()) {\n    Diag(clang::diag::note_drv_command_failed_diag_msg) << \"Error generating preprocessed source(s).\";"},{L,1775,"// When clang crashes, produce diagnostic information including the fully\n// preprocessed source file(s).  Request that the developer attach the\n// diagnostic information to a bug report.\nvoid Driver::generateCompilationDiagnostics(Compilation &C, const Command &FailingCommand, StringRef AdditionalInformation, CompilationDiagnosticReport *Report) {\n  // ...\n  // If any of the preprocessing commands failed, clean up and exit.\n  if (!FailingCommands.empty()) {\n    Diag(clang::diag::note_drv_command_failed_diag_msg) << \"Error generating preprocessed source(s).\";"},{L,1782,"// When clang crashes, produce diagnostic information including the fully\n// preprocessed source file(s).  Request that the developer attach the\n// diagnostic information to a bug report.\nvoid Driver::generateCompilationDiagnostics(Compilation &C, const Command &FailingCommand, StringRef AdditionalInformation, CompilationDiagnosticReport *Report) {\n  // ...\n  if (TempFiles.empty()) {\n    Diag(clang::diag::note_drv_command_failed_diag_msg) << \"Error generating preprocessed source(s).\";"},{L,1787,"// When clang crashes, produce diagnostic information including the fully\n// preprocessed source file(s).  Request that the developer attach the\n// diagnostic information to a bug report.\nvoid Driver::generateCompilationDiagnostics(Compilation &C, const Command &FailingCommand, StringRef AdditionalInformation, CompilationDiagnosticReport *Report) {\n  // ...\n  Diag(clang::diag::note_drv_command_failed_diag_msg) << BugReporMsg;"},{L,1792,"// When clang crashes, produce diagnostic information including the fully\n// preprocessed source file(s).  Request that the developer attach the\n// diagnostic information to a bug report.\nvoid Driver::generateCompilationDiagnostics(Compilation &C, const Command &FailingCommand, StringRef AdditionalInformation, CompilationDiagnosticReport *Report) {\n  // ...\n  for (const char *TempFile : TempFiles) {\n    Diag(clang::diag::note_drv_command_failed_diag_msg) << TempFile;"},{L,1820,"// When clang crashes, produce diagnostic information including the fully\n// preprocessed source file(s).  Request that the developer attach the\n// diagnostic information to a bug report.\nvoid Driver::generateCompilationDiagnostics(Compilation &C, const Command &FailingCommand, StringRef AdditionalInformation, CompilationDiagnosticReport *Report) {\n  // ...\n  if (EC) {\n    Diag(clang::diag::note_drv_command_failed_diag_msg) << \"Error generating run script: \" << Script << \" \" << EC.message();"},{L,1834,"// When clang crashes, produce diagnostic information including the fully\n// preprocessed source file(s).  Request that the developer attach the\n// diagnostic information to a bug report.\nvoid Driver::generateCompilationDiagnostics(Compilation &C, const Command &FailingCommand, StringRef AdditionalInformation, CompilationDiagnosticReport *Report) {\n  // ...\n  if (EC) {\n  // ...\n  } else {\n    // ...\n    Diag(clang::diag::note_drv_command_failed_diag_msg) << Script;"},{L,1841,"// When clang crashes, produce diagnostic information including the fully\n// preprocessed source file(s).  Request that the developer attach the\n// diagnostic information to a bug report.\nvoid Driver::generateCompilationDiagnostics(Compilation &C, const Command &FailingCommand, StringRef AdditionalInformation, CompilationDiagnosticReport *Report) {\n  // ...\n  // On darwin, provide information about the .crash diagnostic report.\n  if (llvm::Triple(llvm::sys::getProcessTriple()).isOSDarwin()) {\n    // ...\n    if (getCrashDiagnosticFile(ReproCrashFilename, CrashDiagDir)) {\n      Diag(clang::diag::note_drv_command_failed_diag_msg) << ReproCrashFilename.str();"},{L,1846,"// When clang crashes, produce diagnostic information including the fully\n// preprocessed source file(s).  Request that the developer attach the\n// diagnostic information to a bug report.\nvoid Driver::generateCompilationDiagnostics(Compilation &C, const Command &FailingCommand, StringRef AdditionalInformation, CompilationDiagnosticReport *Report) {\n  // ...\n  // On darwin, provide information about the .crash diagnostic report.\n  if (llvm::Triple(llvm::sys::getProcessTriple()).isOSDarwin()) {\n    // ...\n    if (getCrashDiagnosticFile(ReproCrashFilename, CrashDiagDir)) {\n    // ...\n    } else { // Suggest a directory for the user to look for .crash files.\n      // ...\n      Diag(clang::diag::note_drv_command_failed_diag_msg) << \"Crash backtrace is located in\";"},{L,1848,"// When clang crashes, produce diagnostic information including the fully\n// preprocessed source file(s).  Request that the developer attach the\n// diagnostic information to a bug report.\nvoid Driver::generateCompilationDiagnostics(Compilation &C, const Command &FailingCommand, StringRef AdditionalInformation, CompilationDiagnosticReport *Report) {\n  // ...\n  // On darwin, provide information about the .crash diagnostic report.\n  if (llvm::Triple(llvm::sys::getProcessTriple()).isOSDarwin()) {\n    // ...\n    if (getCrashDiagnosticFile(ReproCrashFilename, CrashDiagDir)) {\n    // ...\n    } else { // Suggest a directory for the user to look for .crash files.\n      // ...\n      Diag(clang::diag::note_drv_command_failed_diag_msg) << CrashDiagDir.str();"},{L,1850,"// When clang crashes, produce diagnostic information including the fully\n// preprocessed source file(s).  Request that the developer attach the\n// diagnostic information to a bug report.\nvoid Driver::generateCompilationDiagnostics(Compilation &C, const Command &FailingCommand, StringRef AdditionalInformation, CompilationDiagnosticReport *Report) {\n  // ...\n  // On darwin, provide information about the .crash diagnostic report.\n  if (llvm::Triple(llvm::sys::getProcessTriple()).isOSDarwin()) {\n    // ...\n    if (getCrashDiagnosticFile(ReproCrashFilename, CrashDiagDir)) {\n    // ...\n    } else { // Suggest a directory for the user to look for .crash files.\n      // ...\n      Diag(clang::diag::note_drv_command_failed_diag_msg) << \"(choose the .crash file that corresponds to your crash)\";"},{L,1855,"// When clang crashes, produce diagnostic information including the fully\n// preprocessed source file(s).  Request that the developer attach the\n// diagnostic information to a bug report.\nvoid Driver::generateCompilationDiagnostics(Compilation &C, const Command &FailingCommand, StringRef AdditionalInformation, CompilationDiagnosticReport *Report) {\n  // ...\n  Diag(clang::diag::note_drv_command_failed_diag_msg) << \"\\n\\n********************\";"}}
	},
	["note_drv_config_file_searched_in"]={
		[b]={{nil,E,"note_drv_config_file_searched_in"}},
		[c]={{nil,E,"was searched for in the directory: %0"}},
		[e]={{nil,E,"was searched for in the directory: A"}},
		[g]=f,
		[h]="was searched for in the directory\\: (.*?)",
		[i]=a,
		[j]={{nil,E,o}},
		[k]={"c92ca91472b9",1514656766,"Enable configuration files in clang","Enable configuration files in clang\n\nClang is inherently a cross compiler and can generate code for any target\nenabled during build. It however requires to specify many parameters in the\ninvocation, which could be hardcoded during configuration process in the\ncase of single-target compiler. The purpose of configuration files is to\nmake specifying clang arguments easier.\n\nA configuration file is a collection of driver options, which are inserted\ninto command line before other options specified in the clang invocation.\nIt groups related options together and allows specifying them in simpler,\nmore flexible and less error prone way than just listing the options\nsomewhere in build scripts. Configuration file may be thought as a \"macro\"\nthat names an option set and is expanded when the driver is called.\n\nUse of configuration files is described in `UserManual.rst`.\n\nDifferential Revision: https://reviews.llvm.org/D24933\n\nllvm-svn: 321587"},
		[d]={{L,1114,"bool Driver::loadConfigFiles() {\n  // ...\n  if (CLOptions) {\n    for (auto CfgFileName : CLOptions->getAllArgValues(options::OPT_config)) {\n      // If argument contains directory separator, treat it as a path to\n      // configuration file.\n      if (llvm::sys::path::has_parent_path(CfgFileName)) {\n      // ...\n      } else if (!ExpCtx.findConfigFile(CfgFileName, CfgFilePath)) {\n        // ...\n        for (const StringRef &SearchDir : CfgFileSearchDirs)\n          if (!SearchDir.empty())\n            Diag(diag::note_drv_config_file_searched_in) << SearchDir;"}}
	},
	["note_drv_t_option_is_global"]={
		[b]="note_drv_t_option_is_global",
		[c]={{nil,K,"the last \'/TC\' or \'/TP\' option takes precedence over earlier instances"},{A,nil,"The last /TC or /TP option takes precedence over earlier instances"}},
		[e]={{nil,K,"the last \'/TC\' or \'/TP\' option takes precedence over earlier instances"},{A,nil,"The last /TC or /TP option takes precedence over earlier instances"}},
		[g]=f,
		[h]="the last \'\\/TC\' or \'\\/TP\' option takes precedence over earlier instances",
		[i]=a,
		[j]=o,
		[k]={"0d0b19cbe1e3",1376332457,"clang-cl: Expand warning about /TC and /TP override, and expand test","clang-cl: Expand warning about /TC and /TP override, and expand test\n\nllvm-svn: 188190"},
		[d]={{L,2629,"// Construct a the list of inputs and their types.\nvoid Driver::BuildInputs(const ToolChain &TC, DerivedArgList &Args, InputList &Inputs) const {\n  // ...\n  // The last /TC or /TP option sets the input type to C or C++ globally.\n  if (Arg *TCTP = Args.getLastArgNoClaim(options::OPT__SLASH_TC, options::OPT__SLASH_TP)) {\n    // ...\n    if (ShowNote)\n      Diag(clang::diag::note_drv_t_option_is_global);"}}
	},
	["note_drv_use_standard"]={
		[b]={{nil,G,"note_drv_use_standard"}},
		[c]={{nil,G,"use \'%0\'%select{| or \'%3\'|, \'%3\', or \'%4\'|, \'%3\', \'%4\', or \'%5\'}2 for \'%1\' standard"}},
		[e]={{nil,G,{"use \'A\'",{a," or \'D\'",", \'D\', or \'E\'",", \'D\', \'E\', or \'F\'"}," for \'B\' standard"}}},
		[g]=f,
		[h]="use \'(.*?)\'(?:| or \'(.*?)\'|, \'(.*?)\', or \'(.*?)\'|, \'(.*?)\', \'(.*?)\', or \'(.*?)\') for \'(.*?)\' standard",
		[i]=a,
		[j]={{nil,G,o}},
		[k]={"c91daf1cf9a4",1487112260,"[Driver] Report available language standards on user error","[Driver] Report available language standards on user error\n\nIn case user did not provide valid standard name for -std option, available\nvalues (with short description) will be reported.\n\nPatch by Paweł Żukowski!\n\nllvm-svn: 295113"},
		[d]={{Vb,3568,"bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK, const llvm::Triple &T, std::vector<std::string> &Includes, DiagnosticsEngine &Diags) {\n  // ...\n  if (const Arg *A = Args.getLastArg(OPT_std_EQ)) {\n    // ...\n    if (LangStd == LangStandard::lang_unspecified) {\n      // ...\n      // Report supported standards with short description.\n      for (unsigned KindValue = 0; KindValue != LangStandard::lang_unspecified; ++KindValue) {\n        // ...\n        if (IsInputCompatibleWithStandard(IK, Std)) {\n          auto Diag = Diags.Report(diag::note_drv_use_standard);"}}
	},
	["note_drv_verify_prefix_spelling"]={
		[b]={{nil,E,"note_drv_verify_prefix_spelling"}},
		[c]={{nil,E,"-verify prefixes must start with a letter and contain only alphanumeric characters, hyphens, and underscores"}},
		[e]={{nil,E,"-verify prefixes must start with a letter and contain only alphanumeric characters, hyphens, and underscores"}},
		[g]=f,
		[h]="\\-verify prefixes must start with a letter and contain only alphanumeric characters, hyphens, and underscores",
		[i]=a,
		[j]={{nil,E,o}},
		[k]={"05e46484825f",1513391002,"[VerifyDiagnosticConsumer] support -verify=<prefixes>","[VerifyDiagnosticConsumer] support -verify=<prefixes>\n\nThis mimics FileCheck\'s --check-prefixes option.\n\nThe default prefix is \"expected\". That is, \"-verify\" is equivalent to\n\"-verify=expected\".\n\nThe goal is to permit exercising a single test suite source file with different\ncompiler options producing different sets of diagnostics.  While cpp can be\ncombined with the existing -verify to accomplish the same goal, source is often\neasier to maintain when it\'s not cluttered with preprocessor directives or\nduplicate passages of code. For example, this patch also rewrites some existing\nclang tests to demonstrate the benefit of this feature.\n\nPatch by Joel E. Denny, thanks!\n\nDifferential Revision: https://reviews.llvm.org/D39694\n\nllvm-svn: 320908"},
		[d]={{Vb,2217,"static bool checkVerifyPrefixes(const std::vector<std::string> &VerifyPrefixes, DiagnosticsEngine &Diags) {\n  // ...\n  for (const auto &Prefix : VerifyPrefixes) {\n    // ...\n    if (BadChar != Prefix.end() || !isLetter(Prefix[0])) {\n      // ...\n      Diags.Report(diag::note_drv_verify_prefix_spelling);"}}
	},
	["note_due_to_dllexported_class"]={
		[b]="note_due_to_dllexported_class",
		[c]={{nil,F,"due to %0 being dllexported%select{|; try compiling in C++11 mode}1"},{E,nil,"due to \'%0\' being dllexported%select{|; try compiling in C++11 mode}1"}},
		[e]={{nil,F,{"due to A being dllexported",{a,"; try compiling in C++11 mode"}}},{E,nil,{"due to \'A\' being dllexported",{a,"; try compiling in C++11 mode"}}}},
		[g]=f,
		[h]="due to (.*?) being dllexported(?:|; try compiling in C\\+\\+11 mode)",
		[i]=a,
		[j]=p,
		[k]={"5870373d1954",1424480844,"Improve diagnostic when failing to synthesize implicit member due to dllexport (PR22591)","Improve diagnostic when failing to synthesize implicit member due to dllexport (PR22591)\n\nThis is only a problem in C++03 mode targeting MS ABI (MinGW doesn\'t\nexport inline methods, and C++11 marks these methods implicitly\ndeleted).\n\nSince targeting the MS ABI in pre-C++11 mode is a rare configuration,\nthis will probably not get fixed, but we can at least have a better\nerror message.\n\nllvm-svn: 230115"},
		[d]={{U,1003,"/// Prints the current instantiation stack through a series of\n/// notes.\nvoid Sema::PrintInstantiationStack() {\n  // ...\n  for (SmallVectorImpl<CodeSynthesisContext>::reverse_iterator Active = CodeSynthesisContexts.rbegin(), ActiveEnd = CodeSynthesisContexts.rend(); Active != ActiveEnd; ++Active, ++InstantiationIdx) {\n    // ...\n    case CodeSynthesisContext::MarkingClassDllexported:\n      Diags.Report(Active->PointOfInstantiation, diag::note_due_to_dllexported_class) << cast<CXXRecordDecl>(Active->Entity) << !getLangOpts().CPlusPlus11;"}},
		[m]={
			["clang/test/SemaCXX/default-arg-closures.cpp"]={"clang/test/SemaCXX/default-arg-closures.cpp:13:12: note: due to \'ExportDefaultCtorClosure\' being dllexported"}
		}
	},
	["note_duplicate_asm_operand_name"]={
		[b]={{nil,q,"note_duplicate_asm_operand_name"}},
		[c]={{nil,q,"asm operand name \"%0\" first referenced here"}},
		[e]={{nil,q,"asm operand name \"A\" first referenced here"}},
		[g]=f,
		[h]="asm operand name \"(.*?)\" first referenced here",
		[i]=a,
		[j]={{nil,q,"Inline Assembly Issue"}},
		[k]={"954ec09aed4f",1559178346,"clang support gnu asm goto.","clang support gnu asm goto.\nSyntax:\n  asm [volatile] goto ( AssemblerTemplate\n                      :\n                      : InputOperands\n                      : Clobbers\n                      : GotoLabels)\n\nhttps://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html\n\nNew llvm IR is \"callbr\" for inline asm goto instead \"call\" for inline asm\nFor:\nasm goto(\"testl %0, %0; jne %l1;\" :: \"r\"(cond)::label_true, loop);\nIR:\ncallbr void asm sideeffect \"testl $0, $0; jne ${1:l};\", \"r,X,X,~{dirflag},~{fpsr},~{flags}\"(i32 %0, i8* blockaddress(@foo, %label_true), i8* blockaddress(@foo, %loop)) #1\n          to label %asm.fallthrough [label %label_true, label %loop], !srcloc !3\n\nasm.fallthrough:                                \n\nCompiler need to generate:\n1> a dummy constarint \'X\' for each label.\n2> an unique fallthrough label for each asm goto stmt \" asm.fallthrough%number\".\n\n\nDiagnostic \n1>	duplicate asm operand name are used in output, input and label.\n2>	goto out of scope.\n\nllvm-svn: 362045"},
		[d]={{Pb,738,"StmtResult Sema::ActOnGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, bool IsVolatile, unsigned NumOutputs, unsigned NumInputs, IdentifierInfo **Names, MultiExprArg constraints, MultiExprArg Exprs, Expr *asmString, MultiExprArg clobbers, unsigned NumLabels, SourceLocation RParenLoc) {\n  // ...\n  if (Found != NamedOperandList.end()) {\n    // ...\n    Diag(Found->second->getBeginLoc(), diag::note_duplicate_asm_operand_name) << Found->first;"}},
		[m]={
			["clang/test/Sema/asm.c"]={"clang/test/Sema/asm.c:300:24: note: asm operand name \"lab\" first referenced here","clang/test/Sema/asm.c:303:62: note: asm operand name \"lab\" first referenced here","clang/test/Sema/asm.c:309:25: note: asm operand name \"lab\" first referenced here","clang/test/Sema/asm.c:312:25: note: asm operand name \"lab\" first referenced here"}
		}
	},
	["note_duplicate_case_prev"]={
		[b]="note_duplicate_case_prev",
		[c]="previous case defined here",
		[e]="previous case defined here",
		[g]=f,
		[h]="previous case defined here",
		[i]=a,
		[j]=o,
		[k]={"b1c4d5507fad",1236199783,"The basic representation of diagnostics information in tablegen format, plus (uncommented and incomp...","The basic representation of diagnostics information in tablegen format, plus (uncommented and incomplete) test conversions of the existing def files to this format.\n\nllvm-svn: 66064"},
		[d]={{ib,1281,"StmtResult Sema::ActOnFinishSwitchStmt(SourceLocation SwitchLoc, Stmt *Switch, Stmt *BodyStmt) {\n  // ...\n  for (SwitchCase *SC = SS->getSwitchCaseList(); SC && !HasDependentValue; SC = SC->getNextSwitchCase()) {\n    if (DefaultStmt *DS = dyn_cast<DefaultStmt>(SC)) {\n      if (TheDefaultStmt) {\n        // ...\n        Diag(TheDefaultStmt->getDefaultLoc(), diag::note_duplicate_case_prev);"},{ib,1384,"StmtResult Sema::ActOnFinishSwitchStmt(SourceLocation SwitchLoc, Stmt *Switch, Stmt *BodyStmt) {\n  // ...\n  if (!HasDependentValue) {\n    // ...\n    if (!CaseVals.empty()) {\n      for (unsigned i = 0, e = CaseVals.size(); i != e; ++i) {\n        // ...\n        if (i != 0 && CaseVals[i].first == CaseVals[i - 1].first) {\n          // ...\n          Diag(CaseVals[i - 1].second->getLHS()->getBeginLoc(), diag::note_duplicate_case_prev);"},{ib,1477,"StmtResult Sema::ActOnFinishSwitchStmt(SourceLocation SwitchLoc, Stmt *Switch, Stmt *BodyStmt) {\n  // ...\n  if (!HasDependentValue) {\n    // ...\n    // Detect duplicate case ranges, which usually don\'t exist at all in\n    // the first place.\n    if (!CaseRanges.empty()) {\n      // ...\n      // Rescan the ranges, looking for overlap with singleton values and other\n      // ranges.  Since the range list is sorted, we only need to compare case\n      // ranges with their neighbors.\n      for (unsigned i = 0, e = CaseRanges.size(); i != e; ++i) {\n        // ...\n        if (OverlapStmt) {\n          // ...\n          Diag(OverlapStmt->getLHS()->getBeginLoc(), diag::note_duplicate_case_prev);"}},
		[m]={
			["clang/test/CXX/stmt.stmt/stmt.label/p1.cpp"]={"clang/test/CXX/stmt.stmt/stmt.label/p1.cpp:23:5: note: previous case defined here"}
		}
	}
};