Module:ClangDiags/DiagsLongData6
Jump to navigation
Jump to search
Documentation for this module may be created at Module:ClangDiags/DiagsLongData6/doc
local a=""; local b="message_hist"; local c="hierarchical_hist"; local d="(?:error|fatal error)\\: "; local e="regex1"; local f="regex2"; local g="regex3"; local h="commit"; local i="category_hist"; local j="id_hist"; local k="source"; local l="tests2"; local m="clang/lib/Sema/SemaOpenMP.cpp"; local n="OpenMP Issue"; local o="11.0"; local p="10.0"; local q="Semantic Issue"; local r="13.0"; local s="14.0"; local t="clang/lib/Parse/ParseOpenMP.cpp"; local u="Parse Issue"; local v="9.0"; local w="16.0"; local x="clang/lib/AST/ASTStructuralEquivalence.cpp"; local y="8.0"; local z="clang/lib/Sema/SemaDeclObjC.cpp"; local A="12.0"; local B="clang/lib/Parse/ParseObjc.cpp"; local C="None"; local D="Generics Issue"; local E="15.0"; local F="[WebAssembly] Improve clang diagnostics for wasm attributes\n\nThis patch addresses the review comments on r352930:\n\n - Removes redundant diagnostic checking code\n - Removes errnoneous use of diag::err_alias_is_definition, which\n turned out to be ineffective anyway since functions can be defined later\n in the translation unit and avoid detection.\n - Adds a test for various invalid cases for import_name and import_module.\n\nDifferential Revision: https://reviews.llvm.org/D59520"; local G="clang/lib/Sema/SemaObjCProperty.cpp"; local H="[WebAssembly] Improve clang diagnostics for wasm attributes"; local I="931fcd3ba011"; local J="clang/lib/Sema/SemaExprObjC.cpp"; local K="clang/lib/Sema/SemaType.cpp"; local L="6.0"; local M="clang/test/SemaObjC/parameterized_classes.m"; local N="clang/lib/Sema/SemaExpr.cpp"; local O="clang/lib/Sema/SemaPseudoObject.cpp"; local P="5.0"; local Q="The basic representation of diagnostics information in tablegen format, plus (uncommented and incomp..."; local R="b1c4d5507fad"; local S="The basic representation of diagnostics information in tablegen format, plus (uncommented and incomplete) test conversions of the existing def files to this format.\n\nllvm-svn: 66064"; local T="Fix declare target implementation to support enter."; local U="clang/test/OpenMP/declare_target_messages.cpp"; local V="Parsing, semantic analysis, and AST for Objective-C type parameters."; local W="Add clang support for new Objective-C literal syntax for NSDictionary, NSArray,"; local X="Add clang support for new Objective-C literal syntax for NSDictionary, NSArray,\nNSNumber, and boolean literals. This includes both Sema and Codegen support.\nIncluded is also support for new Objective-C container subscripting.\n\nMy apologies for the large patch. It was very difficult to break apart.\nThe patch introduces changes to the driver as well to cause clang to link\nin additional runtime support when needed to support the new language features.\n\nDocs are forthcoming to document the implementation and behavior of these features.\n\nllvm-svn: 152137"; local Y="85f3f9513dbc"; local Z="Parsing, semantic analysis, and AST for Objective-C type parameters.\n\nProduce type parameter declarations for Objective-C type parameters,\nand attach lists of type parameters to Objective-C classes,\ncategories, forward declarations, and extensions as\nappropriate. Perform semantic analysis of type bounds for type\nparameters, both in isolation and across classes/categories/extensions\nto ensure consistency.\n\nAlso handle (de-)serialization of Objective-C type parameter lists,\nalong with sundry other things one must do to add a new declaration to\nClang.\n\nNote that Objective-C type parameters are typedef name declarations,\nlike typedefs and C++11 type aliases, in support of type erasure.\n\nPart of rdar://problem/6294649.\n\nllvm-svn: 241541"; local ab="e65b086e07a6"; local bb="Handle Objective-C type arguments."; local cb="e9d95f1ecc98"; local db="Handle Objective-C type arguments.\n\nObjective-C type arguments can be provided in angle brackets following\nan Objective-C interface type. Syntactically, this is the same\nposition as one would provide protocol qualifiers (e.g.,\nid<NSCopying>), so parse both together and let Sema sort out the\nambiguous cases. This applies both when parsing types and when parsing\nthe superclass of an Objective-C class, which can now be a specialized\ntype (e.g., NSMutableArray<T> inherits from NSArray<T>).\n\nCheck Objective-C type arguments against the type parameters of the\ncorresponding class. Verify the length of the type argument list and\nthat each type argument satisfies the corresponding bound.\n\nSpecializations of parameterized Objective-C classes are represented\nin the type system as distinct types. Both specialized types (e.g.,\nNSArray<NSString *> *) and unspecialized types (NSArray *) are\nrepresented, separately.\n\nllvm-svn: 241542"; local eb="clang/lib/Sema/SemaDeclAttr.cpp"; local fb="clang/lib/Sema/SemaStmt.cpp"; local gb="Let clang atomic builtins fetch add/sub support floating point types"; local hb="61d065e21ff3"; local ib="f9c3310d32c6"; local jb="[OPENMP]Fix PR49366: crash on VLAs in task untied regions.\n\nWe need to capture the local variables into a record in task untied\nregions but clang does not support record with VLA data members.\n\nDifferential Revision: https://reviews.llvm.org/D99436"; local kb="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 lb="[OPENMP]Fix PR49366: crash on VLAs in task untied regions."; local mb="11.1"; local nb="clang/test/OpenMP/atomic_messages.c"; local ob="[OPENMP] Loop canonical form analysis (Sema)\n\nThis patch implements semantic analysis to make sure that the loop is in OpenMP canonical form.\nThis is the form required for \'omp simd\', \'omp for\' and other loop pragmas.\n\nDifferential revision: http://reviews.llvm.org/D3778\n\nllvm-svn: 210095"; local pb="a8e9d2eccc6e"; local qb="69350e569dc4"; local rb="[OPENMP] Loop canonical form analysis (Sema)"; local sb="[C++20][Modules][3/8] Initial handling for module partitions."; local tb="[C++20][Modules][3/8] Initial handling for module partitions.\n\nThis implements the parsing and recognition of module partition CMIs\nand removes the FIXMEs in the parser.\n\nModule partitions are recognised in the base computation of visibility,\nhowever additional amendments to visibility follow in subsequent patches.\n\nDifferential Revision: https://reviews.llvm.org/D118586"; local ub="clang/test/OpenMP/declare_variant_messages.c"; local vb="clang/test/OpenMP/declare_mapper_messages.cpp"; local wb="clang/test/OpenMP/interop_messages.cpp"; local xb="c094e7dc4b3f"; local yb="[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>"; local zb="clang/test/OpenMP/declare_variant_clauses_messages.cpp"; local Ab="98bfd7f976f1"; local Bb="clang/test/OpenMP/ordered_messages.cpp"; local Cb="[SYCL] Add sycl_kernel attribute for accelerated code outlining"; local Db="class"; local Eb="clang/test/OpenMP/task_affinity_messages.cpp"; local Fb="clang/test/OpenMP/declare_simd_messages.cpp"; local Gb="clang/test/OpenMP/unroll_messages.cpp"; local Hb="[OpenMP 5.0] Parsing/sema support for \"omp declare mapper\" directive.\n\nThis patch implements parsing and sema for \"omp declare mapper\"\ndirective. User defined mapper, i.e., declare mapper directive, is a new\nfeature in OpenMP 5.0. It is introduced to extend existing map clauses\nfor the purpose of simplifying the copy of complex data structures\nbetween host and device (i.e., deep copy). An example is shown below:\n\n struct S { int len; int *d; };\n #pragma omp declare mapper(struct S s) map(s, s.d[0:s.len]) // Memory region that d points to is also mapped using this mapper.\n\nContributed-by: Lingda Li <lildmh@gmail.com>\n\nDifferential Revision: https://reviews.llvm.org/D56326\n\nllvm-svn: 352906"; local Ib="clang/test/SemaObjC/objc-container-subscripting.m"; local Jb="251e1488e195"; local Kb="[OpenMP 5.0] Parsing/sema support for \"omp declare mapper\" directive."; local Lb="Nullability Issue"; return { ["err_nsobject_attribute"]={ [j]="err_nsobject_attribute", [b]="\'NSObject\' attribute is for pointer types only", [c]="\'NSObject\' attribute is for pointer types only", [e]=d, [f]="\'NSObject\' attribute is for pointer types only", [g]=a, [i]=q, [h]={R,1236199783,Q,S}, [k]={{eb,2994,"static void handleObjCNSObject(Sema &S, Decl *D, const ParsedAttr &AL) {\n if (const auto *TD = dyn_cast<TypedefNameDecl>(D)) {\n // ...\n if (!T->isCARCBridgableType()) {\n S.Diag(TD->getLocation(), diag::err_nsobject_attribute);"},{eb,3001,"static void handleObjCNSObject(Sema &S, Decl *D, const ParsedAttr &AL) {\n if (const auto *TD = dyn_cast<TypedefNameDecl>(D)) {\n // ...\n } else if (const auto *PD = dyn_cast<ObjCPropertyDecl>(D)) {\n // ...\n if (!T->isCARCBridgableType()) {\n S.Diag(PD->getLocation(), diag::err_nsobject_attribute);"}}, [l]={ ["clang/test/SemaObjC/nsobject-attribute.m"]={"clang/test/SemaObjC/nsobject-attribute.m:9:47: error: \'NSObject\' attribute is for pointer types only","clang/test/SemaObjC/nsobject-attribute.m:64:49: error: \'NSObject\' attribute is for pointer types only"} } }, ["err_nsreturns_retained_attribute_mismatch"]={ [j]="err_nsreturns_retained_attribute_mismatch", [b]="overriding method has mismatched ns_returns_%select{not_retained|retained}0 attributes", [c]={{nil,nil,{"overriding method has mismatched ns_returns_",{"not_retained","retained"}," attributes"}}}, [e]=d, [f]="overriding method has mismatched ns_returns_(?:not_retained|retained) attributes", [g]=a, [i]=q, [h]={"ac8dbf0fc70c",1317162936,"objcetive-c-arc: When overriding a method, its ns_consumed patameter","objcetive-c-arc: When overriding a method, its ns_consumed patameter\nattribute must match its overriden method. Same also for\nns_returns_retained/not_retained on the result type.\nThis is one half of // rdar://10187884\n\nllvm-svn: 140649"}, [k]={{z,189,"void Sema::CheckObjCMethodOverride(ObjCMethodDecl *NewMethod, const ObjCMethodDecl *Overridden) {\n // ...\n if ((NewMethod->hasAttr<NSReturnsRetainedAttr>() != Overridden->hasAttr<NSReturnsRetainedAttr>())) {\n Diag(NewMethod->getLocation(), getLangOpts().ObjCAutoRefCount ? diag::err_nsreturns_retained_attribute_mismatch : diag::warn_nsreturns_retained_attribute_mismatch) << 1;"},{z,198,"void Sema::CheckObjCMethodOverride(ObjCMethodDecl *NewMethod, const ObjCMethodDecl *Overridden) {\n // ...\n if ((NewMethod->hasAttr<NSReturnsNotRetainedAttr>() != Overridden->hasAttr<NSReturnsNotRetainedAttr>())) {\n Diag(NewMethod->getLocation(), getLangOpts().ObjCAutoRefCount ? diag::err_nsreturns_retained_attribute_mismatch : diag::warn_nsreturns_retained_attribute_mismatch) << 0;"}}, [l]={ ["clang/test/SemaObjC/arc-decls.m"]={"clang/test/SemaObjC/arc-decls.m:129:1: error: overriding method has mismatched ns_returns_not_retained attributes","clang/test/SemaObjC/arc-decls.m:130:1: error: overriding method has mismatched ns_returns_retained attributes"} } }, ["err_nullability_conflicting"]={ [j]="err_nullability_conflicting", [b]="nullability specifier %0 conflicts with existing specifier %1", [c]="nullability specifier A conflicts with existing specifier B", [e]=d, [f]="nullability specifier (.*?) conflicts with existing specifier (.*?)", [g]=a, [i]=Lb, [h]={"261a89b0f70b",1434736265,"Introduce type nullability specifiers for C/C++.","Introduce type nullability specifiers for C/C++.\n\nIntroduces the type specifiers __nonnull, __nullable, and\n__null_unspecified that describe the nullability of the pointer type\nto which the specifier appertains. Nullability type specifiers improve\non the existing nonnull attributes in a few ways:\n - They apply to types, so one can represent a pointer to a non-null\n pointer, use them in function pointer types, etc.\n - As type specifiers, they are syntactically more lightweight than\n __attribute__s or [[attribute]]s.\n - They can express both the notion of \'should never be null\' and\n also \'it makes sense for this to be null\', and therefore can more\n easily catch errors of omission where one forgot to annotate the\n nullability of a particular pointer (this will come in a subsequent\n patch).\n\nNullability type specifiers are maintained as type sugar, and\ntherefore have no effect on mangling, encoding, overloading,\netc. Nonetheless, they will be used for warnings about, e.g., passing\n\'null\' to a method that does not accept it.\n\nThis is the C/C++ part of rdar://problem/18868820.\n\nllvm-svn: 240146"}, [k]={{B,854,"/// Diagnose redundant or conflicting nullability information.\nstatic void diagnoseRedundantPropertyNullability(Parser &P, ObjCDeclSpec &DS, NullabilityKind nullability, SourceLocation nullabilityLoc) {\n // ...\n P.Diag(nullabilityLoc, diag::err_nullability_conflicting) << DiagNullabilityKind(nullability, true) << DiagNullabilityKind(DS.getNullability(), true) << SourceRange(DS.getNullabilityLoc());"},{z,4563,"/// Merge type nullability from for a redeclaration of the same entity,\n/// producing the updated type of the redeclared entity.\nstatic QualType mergeTypeNullabilityForRedecl(Sema &S, SourceLocation loc, QualType type, bool usesCSKeyword, SourceLocation prevLoc, QualType prevType, bool prevUsesCSKeyword) {\n // ...\n // Easy case: both have nullability.\n if (nullability.has_value() == prevNullability.has_value()) {\n // ...\n S.Diag(loc, diag::err_nullability_conflicting) << DiagNullabilityKind(*nullability, usesCSKeyword) << DiagNullabilityKind(*prevNullability, prevUsesCSKeyword);"},{K,7501,"/// Applies a nullability type specifier to the given type, if possible.\n///\n/// \\param state The type processing state.\n///\n/// \\param type The type to which the nullability specifier will be\n/// added. On success, this type will be updated appropriately.\n///\n/// \\param attr The attribute as written on the type.\n///\n/// \\param allowOnArrayType Whether to accept nullability specifiers on an\n/// array type (e.g., because it will decay to a pointer).\n///\n/// \\returns true if a problem has been diagnosed, false on success.\nstatic bool checkNullabilityTypeSpecifier(TypeProcessingState &state, QualType &type, ParsedAttr &attr, bool allowOnArrayType) {\n // ...\n while (auto attributed = dyn_cast<AttributedType>(desugared.getTypePtr())) {\n // Check whether there is already a null\n if (auto existingNullability = attributed->getImmediateNullability()) {\n // ...\n S.Diag(nullabilityLoc, diag::err_nullability_conflicting) << DiagNullabilityKind(nullability, isContextSensitive) << DiagNullabilityKind(*existingNullability, false);"},{K,7516,"/// Applies a nullability type specifier to the given type, if possible.\n///\n/// \\param state The type processing state.\n///\n/// \\param type The type to which the nullability specifier will be\n/// added. On success, this type will be updated appropriately.\n///\n/// \\param attr The attribute as written on the type.\n///\n/// \\param allowOnArrayType Whether to accept nullability specifiers on an\n/// array type (e.g., because it will decay to a pointer).\n///\n/// \\returns true if a problem has been diagnosed, false on success.\nstatic bool checkNullabilityTypeSpecifier(TypeProcessingState &state, QualType &type, ParsedAttr &attr, bool allowOnArrayType) {\n // ...\n // If there is already a different nullability specifier, complain.\n // This (unlike the code above) looks through typedefs that might\n // have nullability specifiers on them, which means we cannot\n // provide a useful Fix-It.\n if (auto existingNullability = desugared->getNullability()) {\n if (nullability != *existingNullability) {\n S.Diag(nullabilityLoc, diag::err_nullability_conflicting) << DiagNullabilityKind(nullability, isContextSensitive) << DiagNullabilityKind(*existingNullability, false);"}}, [l]={ ["clang/test/SemaObjC/nullability.m"]={"clang/test/SemaObjC/nullability.m:39:4: error: nullability specifier \'nonnull\' conflicts with existing specifier \'_Nullable\'","clang/test/SemaObjC/nullability.m:45:27: error: nullability specifier \'null_unspecified\' conflicts with existing specifier \'_Nullable\'","clang/test/SemaObjC/nullability.m:48:43: error: nullability specifier \'nullable\' conflicts with existing specifier \'null_unspecified\'","clang/test/SemaObjC/nullability.m:56:27: error: nullability specifier \'null_unspecified\' conflicts with existing specifier \'_Nullable\'","clang/test/SemaObjC/nullability.m:102:13: error: nullability specifier \'nullable\' conflicts with existing specifier \'nonnull\'","clang/test/SemaObjC/nullability.m:102:54: error: nullability specifier \'null_unspecified\' conflicts with existing specifier \'nonnull\'","clang/test/SemaObjC/nullability.m:168:4: error: nullability specifier \'nonnull\' conflicts with existing specifier \'_Nullable\'"} } }, ["err_nullability_cs_multilevel"]={ [j]="err_nullability_cs_multilevel", [b]="nullability keyword %0 cannot be applied to multi-level pointer type %1", [c]="nullability keyword A cannot be applied to multi-level pointer type B", [e]=d, [f]="nullability keyword (.*?) cannot be applied to multi\\-level pointer type (.*?)", [g]=a, [i]=Lb, [h]={"813a066f16df",1434737678,"Extend type nullability qualifiers for Objective-C.","Extend type nullability qualifiers for Objective-C.\n\nIntroduce context-sensitive, non-underscored nullability specifiers\n(nonnull, nullable, null_unspecified) for Objective-C method return\ntypes, method parameter types, and properties.\n\nIntroduce Objective-C-specific semantics, including computation of the\nnullability of the result of a message send, merging of nullability\ninformation from the @interface of a class into its @implementation,\netc .\n\nThis is the Objective-C part of rdar://problem/18868820.\n\nllvm-svn: 240154"}, [k]={{K,7558,"/// Applies a nullability type specifier to the given type, if possible.\n///\n/// \\param state The type processing state.\n///\n/// \\param type The type to which the nullability specifier will be\n/// added. On success, this type will be updated appropriately.\n///\n/// \\param attr The attribute as written on the type.\n///\n/// \\param allowOnArrayType Whether to accept nullability specifiers on an\n/// array type (e.g., because it will decay to a pointer).\n///\n/// \\returns true if a problem has been diagnosed, false on success.\nstatic bool checkNullabilityTypeSpecifier(TypeProcessingState &state, QualType &type, ParsedAttr &attr, bool allowOnArrayType) {\n // ...\n // For the context-sensitive keywords/Objective-C property\n // attributes, require that the type be a single-level pointer.\n if (isContextSensitive) {\n // ...\n if (pointeeType && (pointeeType->isAnyPointerType() || pointeeType->isObjCObjectPointerType() || pointeeType->isMemberPointerType())) {\n S.Diag(nullabilityLoc, diag::err_nullability_cs_multilevel) << DiagNullabilityKind(nullability, true) << type;"}}, [l]={ ["clang/test/SemaObjC/nullability.m"]={"clang/test/SemaObjC/nullability.m:37:4: error: nullability keyword \'nonnull\' cannot be applied to multi-level pointer type \'NSFoo **\'","clang/test/SemaObjC/nullability.m:43:19: error: nullability keyword \'nullable\' cannot be applied to multi-level pointer type \'NSFoo **\'","clang/test/SemaObjC/nullability.m:54:19: error: nullability keyword \'nullable\' cannot be applied to multi-level pointer type \'NSFoo **\'","clang/test/SemaObjC/nullability.m:283:22: error: nullability keyword \'nonnull\' cannot be applied to multi-level pointer type \'void * _Nullable[2]\'"} } }, ["err_nullability_nonpointer"]={ [j]="err_nullability_nonpointer", [b]="nullability specifier %0 cannot be applied to non-pointer type %1", [c]="nullability specifier A cannot be applied to non-pointer type B", [e]=d, [f]="nullability specifier (.*?) cannot be applied to non\\-pointer type (.*?)", [g]=a, [i]=Lb, [h]={"261a89b0f70b",1434736265,"Introduce type nullability specifiers for C/C++.","Introduce type nullability specifiers for C/C++.\n\nIntroduces the type specifiers __nonnull, __nullable, and\n__null_unspecified that describe the nullability of the pointer type\nto which the specifier appertains. Nullability type specifiers improve\non the existing nonnull attributes in a few ways:\n - They apply to types, so one can represent a pointer to a non-null\n pointer, use them in function pointer types, etc.\n - As type specifiers, they are syntactically more lightweight than\n __attribute__s or [[attribute]]s.\n - They can express both the notion of \'should never be null\' and\n also \'it makes sense for this to be null\', and therefore can more\n easily catch errors of omission where one forgot to annotate the\n nullability of a particular pointer (this will come in a subsequent\n patch).\n\nNullability type specifiers are maintained as type sugar, and\ntherefore have no effect on mangling, encoding, overloading,\netc. Nonetheless, they will be used for warnings about, e.g., passing\n\'null\' to a method that does not accept it.\n\nThis is the C/C++ part of rdar://problem/18868820.\n\nllvm-svn: 240146"}, [k]={{K,7540,"/// Applies a nullability type specifier to the given type, if possible.\n///\n/// \\param state The type processing state.\n///\n/// \\param type The type to which the nullability specifier will be\n/// added. On success, this type will be updated appropriately.\n///\n/// \\param attr The attribute as written on the type.\n///\n/// \\param allowOnArrayType Whether to accept nullability specifiers on an\n/// array type (e.g., because it will decay to a pointer).\n///\n/// \\returns true if a problem has been diagnosed, false on success.\nstatic bool checkNullabilityTypeSpecifier(TypeProcessingState &state, QualType &type, ParsedAttr &attr, bool allowOnArrayType) {\n // ...\n // If this definitely isn\'t a pointer type, reject the specifier.\n if (!desugared->canHaveNullability() && !(allowOnArrayType && desugared->isArrayType())) {\n S.Diag(nullabilityLoc, diag::err_nullability_nonpointer) << DiagNullabilityKind(nullability, isContextSensitive) << type;"}}, [l]={ ["clang/test/SemaObjC/block-omitted-return-type.m"]={"clang/test/SemaObjC/block-omitted-return-type.m:16:34: error: nullability specifier \'_Nonnull\' cannot be applied to non-pointer type \'void\'"} } }, ["err_nullptr_cast"]={ [j]={{nil,w,"err_nullptr_cast"}}, [b]={{nil,w,"cannot cast an object of type %select{\'nullptr_t\' to %1|%1 to \'nullptr_t\'}0"}}, [c]={{nil,w,{"cannot cast an object of type ",{"\'nullptr_t\' to B","B to \'nullptr_t\'"}}}}, [e]=d, [f]="cannot cast an object of type (?:\'nullptr_t\' to (.*?)|(.*?) to \'nullptr_t\')", [g]=a, [i]={{nil,w,q}}, [h]={"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"}, [k]={{"clang/lib/Sema/SemaCast.cpp",3075,"/// Check the semantics of a C-style cast operation, in C.\nvoid CastOperation::CheckCStyleCast() {\n // ...\n // C2x 6.5.4p4:\n // The type nullptr_t shall not be converted to any type other than void,\n // bool, or a pointer type. No type other than nullptr_t shall be converted\n // to nullptr_t.\n if (SrcType->isNullPtrType()) {\n // FIXME: 6.3.2.4p2 says that nullptr_t can be converted to itself, but\n // 6.5.4p4 is a constraint check and nullptr_t is not void, bool, or a\n // pointer type. We\'re not going to diagnose that as a constraint violation.\n if (!DestType->isVoidType() && !DestType->isBooleanType() && !DestType->isPointerType() && !DestType->isNullPtrType()) {\n Self.Diag(SrcExpr.get()->getExprLoc(), diag::err_nullptr_cast) << /*nullptr to type*/ 0 << DestType;"},{"clang/lib/Sema/SemaCast.cpp",3090,"/// Check the semantics of a C-style cast operation, in C.\nvoid CastOperation::CheckCStyleCast() {\n // ...\n if (DestType->isNullPtrType() && !SrcType->isNullPtrType()) {\n Self.Diag(SrcExpr.get()->getExprLoc(), diag::err_nullptr_cast) << /*type to nullptr*/ 1 << SrcType;"}}, [l]={ ["clang/test/C/C2x/n3042.c"]={"clang/test/C/C2x/n3042.c:80:14: error: cannot cast an object of type \'int\' to \'nullptr_t\'","clang/test/C/C2x/n3042.c:81:10: error: cannot cast an object of type \'nullptr_t\' to \'float\'","clang/test/C/C2x/n3042.c:82:10: error: cannot cast an object of type \'nullptr_t\' to \'float\'","clang/test/C/C2x/n3042.c:83:14: error: cannot cast an object of type \'int\' to \'nullptr_t\'","clang/test/C/C2x/n3042.c:84:14: error: cannot cast an object of type \'void *\' to \'nullptr_t\'","clang/test/C/C2x/n3042.c:85:14: error: cannot cast an object of type \'int *\' to \'nullptr_t\'"} } }, ["err_objc_array_of_interfaces"]={ [j]="err_objc_array_of_interfaces", [b]="array of interface %0 is invalid (probably should be an array of pointers)", [c]="array of interface A is invalid (probably should be an array of pointers)", [e]=d, [f]="array of interface (.*?) is invalid \\(probably should be an array of pointers\\)", [g]=a, [i]=q, [h]={"669e32f8c0d1",1240797356,"rdar://6827200 - [sema] reject statically allocated arrays of interface types","rdar://6827200 - [sema] reject statically allocated arrays of interface types\n\nUpgrade \"array of interface\" warning to an error. In addition to being a\nterrible idea, this crashes codegen.\n\nllvm-svn: 70178"}, [k]={{K,2542,"/// Build an array type.\n///\n/// \\param T The type of each element in the array.\n///\n/// \\param ASM C99 array size modifier (e.g., \'*\', \'static\').\n///\n/// \\param ArraySize Expression describing the size of the array.\n///\n/// \\param Brackets The range from the opening \'[\' to the closing \']\'.\n///\n/// \\param Entity The name of the entity that involves the array\n/// type, if known.\n///\n/// \\returns A suitable array type, if there are no errors. Otherwise,\n/// returns a NULL type.\nQualType Sema::BuildArrayType(QualType T, ArrayType::ArraySizeModifier ASM, Expr *ArraySize, unsigned Quals, SourceRange Brackets, DeclarationName Entity) {\n // ...\n if (const RecordType *EltTy = T->getAs<RecordType>()) {\n // ...\n } else if (T->isObjCObjectType()) {\n Diag(Loc, diag::err_objc_array_of_interfaces) << T;"}}, [l]={ ["clang/test/SemaObjC/interface-1.m"]={"clang/test/SemaObjC/interface-1.m:24:11: error: array of interface \'INT1\' is invalid (probably should be an array of pointers)"} } }, ["err_objc_attr_not_id"]={ [j]="err_objc_attr_not_id", [b]="parameter of %0 attribute must be a single name of an Objective-C %select{class|protocol}1", [c]={{nil,nil,{"parameter of A attribute must be a single name of an Objective-C ",{Db,"protocol"}}}}, [e]=d, [f]="parameter of (.*?) attribute must be a single name of an Objective\\-C (?:class|protocol)", [g]=a, [i]=q, [h]={"2d3379e394ee",1385018434,"Refactor some of handleObjCBridgeAttr to make it more concise and the diagnostic reusable.","Refactor some of handleObjCBridgeAttr to make it more concise and the diagnostic reusable.\n\nllvm-svn: 195322"}, [k]={{eb,6174,"static void handleObjCBridgeAttr(Sema &S, Decl *D, const ParsedAttr &AL) {\n // ...\n if (!Parm) {\n S.Diag(D->getBeginLoc(), diag::err_objc_attr_not_id) << AL << 0;"},{eb,6201,"static void handleObjCBridgeMutableAttr(Sema &S, Decl *D, const ParsedAttr &AL) {\n // ...\n if (!Parm) {\n S.Diag(D->getBeginLoc(), diag::err_objc_attr_not_id) << AL << 0;"},{eb,6214,"static void handleObjCBridgeRelatedAttr(Sema &S, Decl *D, const ParsedAttr &AL) {\n // ...\n if (!RelatedClass) {\n S.Diag(D->getBeginLoc(), diag::err_objc_attr_not_id) << AL << 0;"}}, [l]={ ["clang/test/SemaObjCXX/objcbridge-static-cast.mm"]={"clang/test/SemaObjCXX/objcbridge-static-cast.mm:8:9: error: parameter of \'objc_bridge\' attribute must be a single name of an Objective-C class"} } }, ["err_objc_attr_protocol_requires_definition"]={ [j]="err_objc_attr_protocol_requires_definition", [b]="attribute %0 can only be applied to @protocol definitions, not forward declarations", [c]="attribute A can only be applied to @protocol definitions, not forward declarations", [e]=d, [f]="attribute (.*?) can only be applied to @protocol definitions, not forward declarations", [g]=a, [i]=q, [h]={"27cfe10df899",1393022944,"Add requirement that attribute \'objc_protocol_requires_explicit_implementation\' can only be applied ...","Add requirement that attribute \'objc_protocol_requires_explicit_implementation\' can only be applied to protocol definitions.\n\nllvm-svn: 201899"}, [k]={{eb,2376,"static void handleObjCSuppresProtocolAttr(Sema &S, Decl *D, const ParsedAttr &AL) {\n if (!cast<ObjCProtocolDecl>(D)->isThisDeclarationADefinition()) {\n S.Diag(AL.getLoc(), diag::err_objc_attr_protocol_requires_definition) << AL << AL.getRange();"}}, [l]={ ["clang/test/SemaObjC/protocols-suppress-conformance.m"]={"clang/test/SemaObjC/protocols-suppress-conformance.m:170:16: error: attribute \'objc_protocol_requires_explicit_implementation\' can only be applied to @protocol definitions, not forward declarations"} } }, ["err_objc_attr_typedef_not_id"]={ [j]="err_objc_attr_typedef_not_id", [b]="parameter of %0 attribute must be \'id\' when used on a typedef", [c]="parameter of A attribute must be \'id\' when used on a typedef", [e]=d, [f]="parameter of (.*?) attribute must be \'id\' when used on a typedef", [g]=a, [i]=q, [h]={"2859258e2faf",1422830046,"Allow objc_bridge(id) to be used on typedefs of [cv] void*.","Allow objc_bridge(id) to be used on typedefs of [cv] void*.\n\nrdar://19678874\n\nllvm-svn: 227774"}, [k]={{eb,6181,"static void handleObjCBridgeAttr(Sema &S, Decl *D, const ParsedAttr &AL) {\n // ...\n // Typedefs only allow objc_bridge(id) and have some additional checking.\n if (const auto *TD = dyn_cast<TypedefNameDecl>(D)) {\n if (!Parm->Ident->isStr(\"id\")) {\n S.Diag(AL.getLoc(), diag::err_objc_attr_typedef_not_id) << AL;"}}, [l]={ ["clang/test/SemaObjC/objcbridge-attribute.m"]={"clang/test/SemaObjC/objcbridge-attribute.m:12:33: error: parameter of \'objc_bridge\' attribute must be \'id\' when used on a typedef","clang/test/SemaObjC/objcbridge-attribute.m:14:44: error: parameter of \'objc_bridge\' attribute must be \'id\' when used on a typedef","clang/test/SemaObjC/objcbridge-attribute.m:18:40: error: parameter of \'objc_bridge\' attribute must be \'id\' when used on a typedef","clang/test/SemaObjC/objcbridge-attribute.m:22:53: error: parameter of \'objc_bridge\' attribute must be \'id\' when used on a typedef","clang/test/SemaObjC/objcbridge-attribute.m:24:41: error: parameter of \'objc_bridge\' attribute must be \'id\' when used on a typedef","clang/test/SemaObjC/objcbridge-attribute.m:26:41: error: parameter of \'objc_bridge\' attribute must be \'id\' when used on a typedef"} } }, ["err_objc_attr_typedef_not_void_pointer"]={ [j]="err_objc_attr_typedef_not_void_pointer", [b]="\'objc_bridge(id)\' is only allowed on structs and typedefs of void pointers", [c]="\'objc_bridge(id)\' is only allowed on structs and typedefs of void pointers", [e]=d, [f]="\'objc_bridge\\(id\\)\' is only allowed on structs and typedefs of void pointers", [g]=a, [i]=q, [h]={"2859258e2faf",1422830046,"Allow objc_bridge(id) to be used on typedefs of [cv] void*.","Allow objc_bridge(id) to be used on typedefs of [cv] void*.\n\nrdar://19678874\n\nllvm-svn: 227774"}, [k]={{eb,6188,"static void handleObjCBridgeAttr(Sema &S, Decl *D, const ParsedAttr &AL) {\n // ...\n // Typedefs only allow objc_bridge(id) and have some additional checking.\n if (const auto *TD = dyn_cast<TypedefNameDecl>(D)) {\n // ...\n if (!T->isVoidPointerType()) {\n S.Diag(AL.getLoc(), diag::err_objc_attr_typedef_not_void_pointer);"}}, [l]={ ["clang/test/SemaObjC/objcbridge-attribute.m"]={"clang/test/SemaObjC/objcbridge-attribute.m:33:49: error: \'objc_bridge(id)\' is only allowed on structs and typedefs of void pointers"} } }, ["err_objc_bridged_related_invalid_class"]={ [j]="err_objc_bridged_related_invalid_class", [b]="could not find Objective-C class %0 to convert %1 to %2", [c]="could not find Objective-C class A to convert B to C", [e]=d, [f]="could not find Objective\\-C class (.*?) to convert (.*?) to (.*?)", [g]=a, [i]=q, [h]={"1f0b3bfd7502",1386376463,"ObjectiveC. Continuing implementation of objc_bridge_related","ObjectiveC. Continuing implementation of objc_bridge_related\nattribute in sema and issuing a variety of diagnostics lazily \nfor misuse of this attribute (and what to do) when converting \nfrom CF types to ObjectiveC types (and vice versa).\n// rdar://15499111\n\nllvm-svn: 196629"}, [k]={{J,4246,"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 Diag(Loc, diag::err_objc_bridged_related_invalid_class) << RCId << SrcType << DestType;"}}, [l]={ ["clang/test/SemaObjC/check-objcbridge-related-attribute-lookup.m"]={"clang/test/SemaObjC/check-objcbridge-related-attribute-lookup.m:29:30: error: could not find Objective-C class \'XNSColor\' to convert \'CGColorRef1\' (aka \'struct CGColor1 *\') to \'NSColor *\'","clang/test/SemaObjC/check-objcbridge-related-attribute-lookup.m:31:13: error: could not find Objective-C class \'XNSColor\' to convert \'NSColor *\' to \'CGColorRef1\' (aka \'struct CGColor1 *\')"} } }, ["err_objc_bridged_related_invalid_class_name"]={ [j]="err_objc_bridged_related_invalid_class_name", [b]="%0 must be name of an Objective-C class to be able to convert %1 to %2", [c]="A must be name of an Objective-C class to be able to convert B to C", [e]=d, [f]="(.*?) must be name of an Objective\\-C class to be able to convert (.*?) to (.*?)", [g]=a, [i]=q, [h]={"1f0b3bfd7502",1386376463,"ObjectiveC. Continuing implementation of objc_bridge_related","ObjectiveC. Continuing implementation of objc_bridge_related\nattribute in sema and issuing a variety of diagnostics lazily \nfor misuse of this attribute (and what to do) when converting \nfrom CF types to ObjectiveC types (and vice versa).\n// rdar://15499111\n\nllvm-svn: 196629"}, [k]={{J,4257,"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 Diag(Loc, diag::err_objc_bridged_related_invalid_class_name) << RCId << SrcType << DestType;"}}, [l]={ ["clang/test/SemaObjC/check-objcbridge-related-attribute-lookup.m"]={"clang/test/SemaObjC/check-objcbridge-related-attribute-lookup.m:36:30: error: \'PNsColor\' must be name of an Objective-C class to be able to convert \'CGColorRef2\' (aka \'struct CGColor2 *\') to \'NSColor *\'","clang/test/SemaObjC/check-objcbridge-related-attribute-lookup.m:38:13: error: \'PNsColor\' must be name of an Objective-C class to be able to convert \'NSColor *\' to \'CGColorRef2\' (aka \'struct CGColor2 *\')"} } }, ["err_objc_bridged_related_known_method"]={ [j]="err_objc_bridged_related_known_method", [b]="%0 must be explicitly converted to %1; use %select{%objcclass2|%objcinstance2}3 method for this conversion", [c]={{nil,nil,{"A must be explicitly converted to B; use ",{"C","C"}," method for this conversion"}}}, [e]=d, [f]="(.*?) must be explicitly converted to (.*?); use (?:(.*?)|(.*?)) method for this conversion", [g]=a, [i]=q, [h]={"1f0b3bfd7502",1386376463,"ObjectiveC. Continuing implementation of objc_bridge_related","ObjectiveC. Continuing implementation of objc_bridge_related\nattribute in sema and issuing a variety of diagnostics lazily \nfor misuse of this attribute (and what to do) when converting \nfrom CF types to ObjectiveC types (and vice versa).\n// rdar://15499111\n\nllvm-svn: 196629"}, [k]={{J,4272,"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 Diag(Loc, diag::err_objc_bridged_related_known_method) << SrcType << DestType << Sel << false;"},{J,4286,"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 Diag(Loc, diag::err_objc_bridged_related_known_method) << SrcType << DestType << Sel << true;"},{J,4327,"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(Loc, diag::err_objc_bridged_related_known_method) << SrcType << DestType << ClassMethod->getSelector() << false << FixItHint::CreateInsertion(SrcExpr->getBeginLoc(), ExpressionString) << FixItHint::CreateInsertion(SrcExprEndLoc, \"]\");"},{J,4360,"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 if (InstanceMethod->isPropertyAccessor())\n if (const ObjCPropertyDecl *PDecl = InstanceMethod->findPropertyDecl()) {\n // ...\n Diag(Loc, diag::err_objc_bridged_related_known_method) << SrcType << DestType << InstanceMethod->getSelector() << true << FixItHint::CreateInsertion(SrcExprEndLoc, ExpressionString);"},{J,4370,"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 if (ExpressionString.empty()) {\n // ...\n Diag(Loc, diag::err_objc_bridged_related_known_method) << SrcType << DestType << InstanceMethod->getSelector() << true << FixItHint::CreateInsertion(SrcExpr->getBeginLoc(), \"[\") << FixItHint::CreateInsertion(SrcExprEndLoc, ExpressionString);"}}, [l]={ ["clang/test/SemaObjC/objcbridge-related-attribute.m"]={"clang/test/SemaObjC/objcbridge-related-attribute.m:22:7: error: \'CGColorRef\' (aka \'struct CGColor *\') must be explicitly converted to \'NSColor *\'; use \'+colorWithCGColor:\' method for this conversion","clang/test/SemaObjC/objcbridge-related-attribute.m:23:31: error: \'CGColorRef\' (aka \'struct CGColor *\') must be explicitly converted to \'NSColor *\'; use \'+colorWithCGColor:\' method for this conversion","clang/test/SemaObjC/objcbridge-related-attribute.m:24:10: error: \'CGColorRef\' (aka \'struct CGColor *\') must be explicitly converted to \'NSColor *\'; use \'+colorWithCGColor:\' method for this conversion","clang/test/SemaObjC/objcbridge-related-attribute.m:34:14: error: \'NSColor *\' must be explicitly converted to \'CGColorRef\' (aka \'struct CGColor *\'); use \'-CGColor\' method for this conversion","clang/test/SemaObjC/objcbridge-related-attribute.m:35:10: error: \'NSColor *\' must be explicitly converted to \'CGColorRef\' (aka \'struct CGColor *\'); use \'-CGColor\' method for this conversion"} } }, ["err_objc_cf_bridged_not_interface"]={ [j]="err_objc_cf_bridged_not_interface", [b]="CF object of type %0 is bridged to %1, which is not an Objective-C class", [c]="CF object of type A is bridged to B, which is not an Objective-C class", [e]=d, [f]="CF object of type (.*?) is bridged to (.*?), which is not an Objective\\-C class", [g]=a, [i]=q, [h]={"8a0210e535c5",1384629392,"ObjectiveC ARC. Validate toll free bridge casting","ObjectiveC ARC. Validate toll free bridge casting\nof ObjectiveC objects to CF types when CF type\nhas the objc_bridge attribute.\n\nllvm-svn: 194930"}, [k]={{J,4053,"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 S.Diag(castExpr->getBeginLoc(), diag::err_objc_cf_bridged_not_interface) << castExpr->getType() << Parm;"}}, [l]={ ["clang/test/SemaObjCXX/objcbridge-static-cast.mm"]={"clang/test/SemaObjCXX/objcbridge-static-cast.mm:30:34: error: CF object of type \'CFTestingRef\' (aka \'__CFError *\') is bridged to \'NSTesting\', which is not an Objective-C class"} } }, ["err_objc_concat_string"]={ [j]="err_objc_concat_string", [b]="unexpected token after Objective-C string", [c]="unexpected token after Objective-C string", [e]=d, [f]="unexpected token after Objective\\-C string", [g]=a, [i]=u, [h]={R,1236199783,Q,S}, [k]={{B,3397,"ExprResult Parser::ParseObjCStringLiteral(SourceLocation AtLoc) {\n // ...\n while (Tok.is(tok::at)) {\n // ...\n // Invalid unless there is a string literal.\n if (!isTokenStringLiteral())\n return ExprError(Diag(Tok, diag::err_objc_concat_string));"}}, [l]={ ["clang/test/SemaObjC/string.m"]={"clang/test/SemaObjC/string.m:14:17: error: unexpected token after Objective-C string"} } }, ["err_objc_decls_may_only_appear_in_global_scope"]={ [j]="err_objc_decls_may_only_appear_in_global_scope", [b]="Objective-C declarations may only appear in global scope", [c]="Objective-C declarations may only appear in global scope", [e]=d, [f]="Objective\\-C declarations may only appear in global scope", [g]=a, [i]=q, [h]={R,1236199783,Q,S}, [k]={{z,5092,"bool Sema::CheckObjCDeclScope(Decl *D) {\n // ...\n Diag(D->getLocation(), diag::err_objc_decls_may_only_appear_in_global_scope);"}}, [l]={ ["clang/test/SemaObjC/invalid-code.m"]={"clang/test/SemaObjC/invalid-code.m:53:41: error: Objective-C declarations may only appear in global scope"} } }, ["err_objc_direct_duplicate_decl"]={ [j]={{nil,p,"err_objc_direct_duplicate_decl"}}, [b]={{nil,o,"%select{|direct }0%select{method|property}1 declaration conflicts with previous %select{|direct }2declaration of %select{method|property}1 %3"},{p,p,"%select{|direct }0method declaration conflicts with previous %select{|direct }1declaration of method %2"}}, [c]={{nil,o,{{a,"direct "},{"method","property"}," declaration conflicts with previous ",{a,"direct "},"declaration of ",{"method","property"}," D"}},{p,p,{{a,"direct "},"method declaration conflicts with previous ",{a,"direct "},"declaration of method C"}}}, [e]=d, [f]="(?:|direct )(?:method|property) declaration conflicts with previous (?:|direct )declaration of (?:method|property) (.*?)", [g]=a, [i]={{nil,p,q}}, [h]={"fe17b30a7957",1575504770,"[attributes][analyzer] Add annotations for handles.","[attributes][analyzer] Add annotations for handles.\n\nThese annotations will be used in an upcomming static analyzer check\nthat finds handle leaks, use after releases, and double releases.\n\nDifferential Revision: https://reviews.llvm.org/D70469"}, [k]={{z,4685,"static void checkObjCDirectMethodClashes(Sema &S, ObjCInterfaceDecl *IDecl, ObjCMethodDecl *Method, ObjCImplDecl *ImpDecl = nullptr) {\n // ...\n auto diagClash = [&](const ObjCMethodDecl *IMD) {\n // ...\n if (Method->isDirectMethod() || IMD->isDirectMethod()) {\n S.Diag(Method->getLocation(), diag::err_objc_direct_duplicate_decl) << Method->isDirectMethod() << /* method */ 0 << IMD->isDirectMethod() << Method->getDeclName();"},{G,2417,"/// 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 // synthesizing accessors must not result in a direct method that is not\n // monomorphic\n if (!GetterMethod) {\n if (const ObjCCategoryDecl *CatDecl = dyn_cast<ObjCCategoryDecl>(CD)) {\n // ...\n if (ExistingGetter) {\n if (ExistingGetter->isDirectMethod() || property->isDirectProperty()) {\n Diag(property->getLocation(), diag::err_objc_direct_duplicate_decl) << property->isDirectProperty() << 1 /* property */"},{G,2433,"/// 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 if (const ObjCCategoryDecl *CatDecl = dyn_cast<ObjCCategoryDecl>(CD)) {\n // ...\n if (ExistingSetter) {\n if (ExistingSetter->isDirectMethod() || property->isDirectProperty()) {\n Diag(property->getLocation(), diag::err_objc_direct_duplicate_decl) << property->isDirectProperty() << 1 /* property */"}}, [l]={ ["clang/test/SemaObjC/method-direct-one-definition.m"]={"clang/test/SemaObjC/method-direct-one-definition.m:51:1: error: direct method declaration conflicts with previous direct declaration of method \'B_implOnly\'","clang/test/SemaObjC/method-direct-one-definition.m:62:1: error: method declaration conflicts with previous direct declaration of method \'C1\'","clang/test/SemaObjC/method-direct-one-definition.m:63:1: error: direct method declaration conflicts with previous declaration of method \'C2\'"} } }, ["err_objc_direct_dynamic_property"]={ [j]={{nil,o,"err_objc_direct_dynamic_property"}}, [b]={{nil,o,"direct property cannot be @dynamic"}}, [c]={{nil,o,"direct property cannot be @dynamic"}}, [e]=d, [f]="direct property cannot be @dynamic", [g]=a, [i]={{nil,o,q}}, [h]={I,1576908663,H,F}, [k]={{G,1618,"/// 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 (PIDecl->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic && PIDecl->getPropertyDecl() && PIDecl->getPropertyDecl()->isDirectProperty()) {\n Diag(PropertyLoc, diag::err_objc_direct_dynamic_property);"}}, [l]={ ["clang/test/SemaObjC/dynamic-direct-properties.m"]={"clang/test/SemaObjC/dynamic-direct-properties.m:11:10: error: direct property cannot be @dynamic","clang/test/SemaObjC/dynamic-direct-properties.m:21:10: error: direct property cannot be @dynamic"} } }, ["err_objc_direct_impl_decl_mismatch"]={ [j]={{nil,p,"err_objc_direct_impl_decl_mismatch"}}, [b]={{nil,p,"direct method was declared in %select{the primary interface|an extension|a category}0 but is implemented in %select{the primary interface|a category|a different category}1"}}, [c]={{nil,p,{"direct method was declared in ",{"the primary interface","an extension","a category"}," but is implemented in ",{"the primary interface","a category","a different category"}}}}, [e]=d, [f]="direct method was declared in (?:the primary interface|an extension|a category) but is implemented in (?:the primary interface|a category|a different category)", [g]=a, [i]={{nil,p,q}}, [h]={"fe17b30a7957",1575504770,"[attributes][analyzer] Add annotations for handles.","[attributes][analyzer] Add annotations for handles.\n\nThese annotations will be used in an upcomming static analyzer check\nthat finds handle leaks, use after releases, and double releases.\n\nDifferential Revision: https://reviews.llvm.org/D70469"}, [k]={{z,4923,"Decl *Sema::ActOnMethodDeclaration(Scope *S, SourceLocation MethodLoc, SourceLocation EndLoc, tok::TokenKind MethodType, ObjCDeclSpec &ReturnQT, ParsedType ReturnType, ArrayRef<SourceLocation> SelectorLocs, Selector Sel,\n // ...\n if (ObjCImplDecl *ImpDecl = dyn_cast<ObjCImplDecl>(ClassDecl)) {\n // ...\n // Merge information from the @interface declaration into the\n // @implementation.\n if (ObjCInterfaceDecl *IDecl = ImpDecl->getClassInterface()) {\n if (auto *IMD = IDecl->lookupMethod(ObjCMethod->getSelector(), ObjCMethod->isInstanceMethod())) {\n // ...\n // The Idecl->lookupMethod() above will find declarations for ObjCMethod\n // in one of these places:\n //\n // (1) the canonical declaration in an @interface container paired\n // with the ImplDecl,\n // (2) non canonical declarations in @interface not paired with the\n // ImplDecl for the same Class,\n // (3) any superclass container.\n //\n // Direct methods only allow for canonical declarations in the matching\n // container (case 1).\n //\n // Direct methods overriding a superclass declaration (case 3) is\n // handled during overrides checks in CheckObjCMethodOverrides().\n //\n // We deal with same-class container mismatches (Case 2) here.\n if (IDecl == IMD->getClassInterface()) {\n auto diagContainerMismatch = [&] {\n // ...\n Diag(ObjCMethod->getLocation(), diag::err_objc_direct_impl_decl_mismatch) << decl << impl;"}}, [l]={ ["clang/test/SemaObjC/method-direct-one-definition.m"]={"clang/test/SemaObjC/method-direct-one-definition.m:12:1: error: direct method was declared in a category but is implemented in the primary interface","clang/test/SemaObjC/method-direct-one-definition.m:43:1: error: direct method was declared in the primary interface but is implemented in a category","clang/test/SemaObjC/method-direct-one-definition.m:45:1: error: direct method was declared in an extension but is implemented in a different category","clang/test/SemaObjC/method-direct-one-definition.m:49:1: error: direct method was declared in a category but is implemented in a different category"} } }, ["err_objc_direct_missing_on_decl"]={ [j]={{nil,p,"err_objc_direct_missing_on_decl"}}, [b]={{nil,p,"direct method implementation was previously declared not direct"}}, [c]={{nil,p,"direct method implementation was previously declared not direct"}}, [e]=d, [f]="direct method implementation was previously declared not direct", [g]=a, [i]={{nil,p,q}}, [h]={xb,1573050950,Cb,yb}, [k]={{z,4933,"Decl *Sema::ActOnMethodDeclaration(Scope *S, SourceLocation MethodLoc, SourceLocation EndLoc, tok::TokenKind MethodType, ObjCDeclSpec &ReturnQT, ParsedType ReturnType, ArrayRef<SourceLocation> SelectorLocs, Selector Sel,\n // ...\n if (ObjCImplDecl *ImpDecl = dyn_cast<ObjCImplDecl>(ClassDecl)) {\n // ...\n // Merge information from the @interface declaration into the\n // @implementation.\n if (ObjCInterfaceDecl *IDecl = ImpDecl->getClassInterface()) {\n if (auto *IMD = IDecl->lookupMethod(ObjCMethod->getSelector(), ObjCMethod->isInstanceMethod())) {\n // ...\n // The Idecl->lookupMethod() above will find declarations for ObjCMethod\n // in one of these places:\n //\n // (1) the canonical declaration in an @interface container paired\n // with the ImplDecl,\n // (2) non canonical declarations in @interface not paired with the\n // ImplDecl for the same Class,\n // (3) any superclass container.\n //\n // Direct methods only allow for canonical declarations in the matching\n // container (case 1).\n //\n // Direct methods overriding a superclass declaration (case 3) is\n // handled during overrides checks in CheckObjCMethodOverrides().\n //\n // We deal with same-class container mismatches (Case 2) here.\n if (IDecl == IMD->getClassInterface()) {\n // ...\n if (ObjCMethod->isDirectMethod()) {\n // ...\n if (ObjCMethod->getCanonicalDecl() != IMD) {\n // ...\n } else if (!IMD->isDirectMethod()) {\n Diag(attr->getLocation(), diag::err_objc_direct_missing_on_decl);"}}, [l]={ ["clang/test/SemaObjC/method-direct.m"]={"clang/test/SemaObjC/method-direct.m:117:41: error: direct method implementation was previously declared not direct","clang/test/SemaObjC/method-direct.m:120:46: error: direct method implementation was previously declared not direct"} } }, ["err_objc_direct_on_override"]={ [j]={{nil,p,"err_objc_direct_on_override"}}, [b]={{nil,p,"methods that %select{override superclass methods|implement protocol requirements}0 cannot be direct"}}, [c]={{nil,p,{"methods that ",{"override superclass methods","implement protocol requirements"}," cannot be direct"}}}, [e]=d, [f]="methods that (?:override superclass methods|implement protocol requirements) cannot be direct", [g]=a, [i]={{nil,p,q}}, [h]={xb,1573050950,Cb,yb}, [k]={{z,4433,"void Sema::CheckObjCMethodDirectOverrides(ObjCMethodDecl *method, ObjCMethodDecl *overridden) {\n if (overridden->isDirectMethod()) {\n // ...\n } else if (method->isDirectMethod()) {\n // ...\n Diag(attr->getLocation(), diag::err_objc_direct_on_override) << isa<ObjCProtocolDecl>(overridden->getDeclContext());"}}, [l]={ ["clang/test/SemaObjC/method-direct.m"]={"clang/test/SemaObjC/method-direct.m:62:36: error: methods that override superclass methods cannot be direct","clang/test/SemaObjC/method-direct.m:63:41: error: methods that override superclass methods cannot be direct","clang/test/SemaObjC/method-direct.m:64:36: error: methods that implement protocol requirements cannot be direct","clang/test/SemaObjC/method-direct.m:65:41: error: methods that implement protocol requirements cannot be direct","clang/test/SemaObjC/method-direct.m:66:45: error: methods that override superclass methods cannot be direct","clang/test/SemaObjC/method-direct.m:67:50: error: methods that override superclass methods cannot be direct","clang/test/SemaObjC/method-direct.m:68:44: error: methods that override superclass methods cannot be direct","clang/test/SemaObjC/method-direct.m:69:49: error: methods that override superclass methods cannot be direct"} } }, ["err_objc_direct_on_protocol"]={ [j]={{nil,p,"err_objc_direct_on_protocol"}}, [b]={{nil,p,"\'objc_direct\' attribute cannot be applied to %select{methods|properties}0 declared in an Objective-C protocol"}}, [c]={{nil,p,{"\'objc_direct\' attribute cannot be applied to ",{"methods","properties"}," declared in an Objective-C protocol"}}}, [e]=d, [f]="\'objc_direct\' attribute cannot be applied to (?:methods|properties) declared in an Objective\\-C protocol", [g]=a, [i]={{nil,p,q}}, [h]={xb,1573050950,Cb,yb}, [k]={{eb,2944,"static void handleObjCDirectAttr(Sema &S, Decl *D, const ParsedAttr &AL) {\n // objc_direct cannot be set on methods declared in the context of a protocol\n if (isa<ObjCProtocolDecl>(D->getDeclContext())) {\n S.Diag(AL.getLoc(), diag::err_objc_direct_on_protocol) << false;"},{z,4699,"static void checkObjCDirectMethodClashes(Sema &S, ObjCInterfaceDecl *IDecl, ObjCMethodDecl *Method, ObjCImplDecl *ImpDecl = nullptr) {\n // ...\n // diag::err_objc_direct_on_protocol has already been emitted"},{G,710,"ObjCPropertyDecl *Sema::CreatePropertyDecl(Scope *S, ObjCContainerDecl *CDecl, SourceLocation AtLoc, SourceLocation LParenLoc, FieldDeclarator &FD, Selector GetterSel, SourceLocation GetterNameLoc, Selector SetterSel, SourceLocation SetterNameLoc, const bool isReadWrite, const unsigned Attributes, const unsigned AttributesAsWritten, QualType T, TypeSourceInfo *TInfo, tok::ObjCKeywordKind MethodImplKind, DeclContext *lexicalDC) {\n // ...\n if ((Attributes & ObjCPropertyAttribute::kind_direct) || CDecl->hasAttr<ObjCDirectMembersAttr>()) {\n if (isa<ObjCProtocolDecl>(CDecl)) {\n Diag(PDecl->getLocation(), diag::err_objc_direct_on_protocol) << true;"}}, [l]={ ["clang/test/SemaObjC/method-direct-properties.m"]={"clang/test/SemaObjC/method-direct-properties.m:4:34: error: \'objc_direct\' attribute cannot be applied to properties declared in an Objective-C protocol"} } }, ["err_objc_direct_protocol_conformance"]={ [j]={{nil,A,"err_objc_direct_protocol_conformance"}}, [b]={{nil,A,"%select{category %1|class extension}0 cannot conform to protocol %2 because of direct members declared in interface %3"}}, [c]={{nil,A,{{"category B","class extension"}," cannot conform to protocol C because of direct members declared in interface D"}}}, [e]=d, [f]="(?:category (.*?)|class extension) cannot conform to protocol (.*?) because of direct members declared in interface (.*?)", [g]=a, [i]={{nil,A,q}}, [h]={hb,1590001902,gb,kb}, [k]={{z,3969,"static void DiagnoseCategoryDirectMembersProtocolConformance(Sema &S, ObjCProtocolDecl *PDecl, ObjCCategoryDecl *CDecl) {\n // ...\n if (!DirectMembers.empty()) {\n S.Diag(CDecl->getLocation(), diag::err_objc_direct_protocol_conformance) << CDecl->IsClassExtension() << CDecl << PDecl << IDecl;"}}, [l]={ ["clang/test/SemaObjC/category-direct-members-protocol-conformance.m"]={"clang/test/SemaObjC/category-direct-members-protocol-conformance.m:21:12: error: category \'Cat1\' cannot conform to protocol \'P\' because of direct members declared in interface \'I\'","clang/test/SemaObjC/category-direct-members-protocol-conformance.m:54:12: error: category \'CatExpDirect\' cannot conform to protocol \'P\' because of direct members declared in interface \'ExpDirect\'","clang/test/SemaObjC/category-direct-members-protocol-conformance.m:64:12: error: class extension cannot conform to protocol \'PRecursive1\' because of direct members declared in interface \'ExpDirect\'","clang/test/SemaObjC/category-direct-members-protocol-conformance.m:81:12: error: class extension cannot conform to protocol \'PProp\' because of direct members declared in interface \'IProp1\'","clang/test/SemaObjC/category-direct-members-protocol-conformance.m:97:12: error: class extension cannot conform to protocol \'PProp2\' because of direct members declared in interface \'IProp2\'"} } }, ["err_objc_directive_only_in_protocol"]={ [j]="err_objc_directive_only_in_protocol", [b]="directive may only be specified in protocols only", [c]="directive may only be specified in protocols only", [e]=d, [f]="directive may only be specified in protocols only", [g]=a, [i]=u, [h]={R,1236199783,Q,S}, [k]={{B,756,"/// objc-interface-decl-list:\n/// empty\n/// objc-interface-decl-list objc-property-decl [OBJC2]\n/// objc-interface-decl-list objc-method-requirement [OBJC2]\n/// objc-interface-decl-list objc-method-proto \';\'\n/// objc-interface-decl-list declaration\n/// objc-interface-decl-list \';\'\n///\n/// objc-method-requirement: [OBJC2]\n/// @required\n/// @optional\n///\nvoid Parser::ParseObjCInterfaceDeclList(tok::ObjCKeywordKind contextKey, Decl *CDecl) {\n // ...\n while (true) {\n // ...\n case tok::objc_required:\n case tok::objc_optional:\n // This is only valid on protocols.\n if (contextKey != tok::objc_protocol)\n Diag(AtLoc, diag::err_objc_directive_only_in_protocol);"}}, [l]={ ["clang/test/SemaObjC/protocols.m"]={"clang/test/SemaObjC/protocols.m:4:1: error: directive may only be specified in protocols only","clang/test/SemaObjC/protocols.m:8:1: error: directive may only be specified in protocols only"} } }, ["err_objc_exceptions_disabled"]={ [j]="err_objc_exceptions_disabled", [b]="cannot use \'%0\' with Objective-C exceptions disabled", [c]="cannot use \'A\' with Objective-C exceptions disabled", [e]=d, [f]="cannot use \'(.*?)\' with Objective\\-C exceptions disabled", [g]=a, [i]=q, [h]={"ce8dd3a5d474",1298159634,"Add a new ObjCExceptions member variable to LangOptions. This controls whether Objective-C exception...","Add a new ObjCExceptions member variable to LangOptions. This controls whether Objective-C exceptions are enabled or not (they are by default).\n\nllvm-svn: 126061"}, [k]={{fb,4239,"StmtResult Sema::ActOnObjCAtTryStmt(SourceLocation AtLoc, Stmt *Try, MultiStmtArg CatchStmts, Stmt *Finally) {\n if (!getLangOpts().ObjCExceptions)\n Diag(AtLoc, diag::err_objc_exceptions_disabled) << \"@try\";"},{fb,4283,"StmtResult Sema::ActOnObjCAtThrowStmt(SourceLocation AtLoc, Expr *Throw, Scope *CurScope) {\n if (!getLangOpts().ObjCExceptions)\n Diag(AtLoc, diag::err_objc_exceptions_disabled) << \"@throw\";"}}, [l]={ ["clang/test/SemaObjC/no-objc-exceptions.m"]={"clang/test/SemaObjC/no-objc-exceptions.m:4:3: error: cannot use \'@throw\' with Objective-C exceptions disabled","clang/test/SemaObjC/no-objc-exceptions.m:8:3: error: cannot use \'@try\' with Objective-C exceptions disabled"} } }, ["err_objc_expected_equal_for_getter"]={ [j]="err_objc_expected_equal_for_getter", [b]="expected \'=\' for Objective-C getter", [c]="expected \'=\' for Objective-C getter", [e]=d, [f]="expected \'\\=\' for Objective\\-C getter", [g]=a, [i]=u, [h]={"fe15a78ff24f",1286041521,"Use ParseObjCSelectorPiece for parsing getter and setter names in @property declarations. Fixes PR81...","Use ParseObjCSelectorPiece for parsing getter and setter names in @property declarations. Fixes PR8169.\n\nllvm-svn: 115411"}, [k]={{B,932,"/// Parse property attribute declarations.\n///\n/// property-attr-decl: \'(\' property-attrlist \')\'\n/// property-attrlist:\n/// property-attribute\n/// property-attrlist \',\' property-attribute\n/// property-attribute:\n/// getter \'=\' identifier\n/// setter \'=\' identifier \':\'\n/// direct\n/// readonly\n/// readwrite\n/// assign\n/// retain\n/// copy\n/// nonatomic\n/// atomic\n/// strong\n/// weak\n/// unsafe_unretained\n/// nonnull\n/// nullable\n/// null_unspecified\n/// null_resettable\n/// class\n///\nvoid Parser::ParseObjCPropertyAttribute(ObjCDeclSpec &DS) {\n // ...\n while (true) {\n // ...\n if (II->isStr(\"readonly\"))\n // ...\n else if (II->isStr(\"assign\"))\n // ...\n else if (II->isStr(\"unsafe_unretained\"))\n // ...\n else if (II->isStr(\"readwrite\"))\n // ...\n else if (II->isStr(\"retain\"))\n // ...\n else if (II->isStr(\"strong\"))\n // ...\n else if (II->isStr(\"copy\"))\n // ...\n else if (II->isStr(\"nonatomic\"))\n // ...\n else if (II->isStr(\"atomic\"))\n // ...\n else if (II->isStr(\"weak\"))\n // ...\n else if (II->isStr(\"getter\") || II->isStr(\"setter\")) {\n // ...\n unsigned DiagID = IsSetter ? diag::err_objc_expected_equal_for_setter : diag::err_objc_expected_equal_for_getter;"}} }, ["err_objc_expected_equal_for_setter"]={ [j]="err_objc_expected_equal_for_setter", [b]="expected \'=\' for Objective-C setter", [c]="expected \'=\' for Objective-C setter", [e]=d, [f]="expected \'\\=\' for Objective\\-C setter", [g]=a, [i]=u, [h]={"fe15a78ff24f",1286041521,"Use ParseObjCSelectorPiece for parsing getter and setter names in @property declarations. Fixes PR81...","Use ParseObjCSelectorPiece for parsing getter and setter names in @property declarations. Fixes PR8169.\n\nllvm-svn: 115411"}, [k]={{B,931,"/// Parse property attribute declarations.\n///\n/// property-attr-decl: \'(\' property-attrlist \')\'\n/// property-attrlist:\n/// property-attribute\n/// property-attrlist \',\' property-attribute\n/// property-attribute:\n/// getter \'=\' identifier\n/// setter \'=\' identifier \':\'\n/// direct\n/// readonly\n/// readwrite\n/// assign\n/// retain\n/// copy\n/// nonatomic\n/// atomic\n/// strong\n/// weak\n/// unsafe_unretained\n/// nonnull\n/// nullable\n/// null_unspecified\n/// null_resettable\n/// class\n///\nvoid Parser::ParseObjCPropertyAttribute(ObjCDeclSpec &DS) {\n // ...\n while (true) {\n // ...\n if (II->isStr(\"readonly\"))\n // ...\n else if (II->isStr(\"assign\"))\n // ...\n else if (II->isStr(\"unsafe_unretained\"))\n // ...\n else if (II->isStr(\"readwrite\"))\n // ...\n else if (II->isStr(\"retain\"))\n // ...\n else if (II->isStr(\"strong\"))\n // ...\n else if (II->isStr(\"copy\"))\n // ...\n else if (II->isStr(\"nonatomic\"))\n // ...\n else if (II->isStr(\"atomic\"))\n // ...\n else if (II->isStr(\"weak\"))\n // ...\n else if (II->isStr(\"getter\") || II->isStr(\"setter\")) {\n // ...\n unsigned DiagID = IsSetter ? diag::err_objc_expected_equal_for_setter : diag::err_objc_expected_equal_for_getter;"}} }, ["err_objc_expected_property_attr"]={ [j]="err_objc_expected_property_attr", [b]="unknown property attribute %0", [c]="unknown property attribute A", [e]=d, [f]="unknown property attribute (.*?)", [g]=a, [i]=u, [h]={R,1236199783,Q,S}, [k]={{B,1007,"/// Parse property attribute declarations.\n///\n/// property-attr-decl: \'(\' property-attrlist \')\'\n/// property-attrlist:\n/// property-attribute\n/// property-attrlist \',\' property-attribute\n/// property-attribute:\n/// getter \'=\' identifier\n/// setter \'=\' identifier \':\'\n/// direct\n/// readonly\n/// readwrite\n/// assign\n/// retain\n/// copy\n/// nonatomic\n/// atomic\n/// strong\n/// weak\n/// unsafe_unretained\n/// nonnull\n/// nullable\n/// null_unspecified\n/// null_resettable\n/// class\n///\nvoid Parser::ParseObjCPropertyAttribute(ObjCDeclSpec &DS) {\n // ...\n while (true) {\n // ...\n if (II->isStr(\"readonly\"))\n // ...\n else if (II->isStr(\"assign\"))\n // ...\n else if (II->isStr(\"unsafe_unretained\"))\n // ...\n else if (II->isStr(\"readwrite\"))\n // ...\n else if (II->isStr(\"retain\"))\n // ...\n else if (II->isStr(\"strong\"))\n // ...\n else if (II->isStr(\"copy\"))\n // ...\n else if (II->isStr(\"nonatomic\"))\n // ...\n else if (II->isStr(\"atomic\"))\n // ...\n else if (II->isStr(\"weak\"))\n // ...\n else if (II->isStr(\"getter\") || II->isStr(\"setter\")) {\n // ...\n } else if (II->isStr(\"nonnull\")) {\n // ...\n } else if (II->isStr(\"nullable\")) {\n // ...\n } else if (II->isStr(\"null_unspecified\")) {\n // ...\n } else if (II->isStr(\"null_resettable\")) {\n // ...\n } else if (II->isStr(\"class\")) {\n // ...\n } else if (II->isStr(\"direct\")) {\n // ...\n } else {\n Diag(AttrName, diag::err_objc_expected_property_attr) << II;"},{B,2437,"/// property-dynamic:\n/// @dynamic property-list\n///\n/// property-list:\n/// identifier\n/// property-list \',\' identifier\n///\nDecl *Parser::ParseObjCPropertyDynamic(SourceLocation atLoc) {\n // ...\n if (Tok.is(tok::l_paren)) {\n // ...\n if (!II) {\n Diag(Tok, diag::err_objc_expected_property_attr) << II;"},{B,2449,"/// property-dynamic:\n/// @dynamic property-list\n///\n/// property-list:\n/// identifier\n/// property-list \',\' identifier\n///\nDecl *Parser::ParseObjCPropertyDynamic(SourceLocation atLoc) {\n // ...\n if (Tok.is(tok::l_paren)) {\n // ...\n if (!II) {\n // ...\n } else {\n // ...\n if (II->isStr(\"class\")) {\n // ...\n } else {\n Diag(AttrName, diag::err_objc_expected_property_attr) << II;"}}, [l]={ ["clang/test/SemaObjC/property-9.m"]={"clang/test/SemaObjC/property-9.m:56:12: error: unknown property attribute \'readonlyx\'"} } }, ["err_objc_expected_selector_for_getter_setter"]={ [j]="err_objc_expected_selector_for_getter_setter", [b]="expected selector for Objective-C %select{setter|getter}0", [c]={{nil,nil,{"expected selector for Objective-C ",{"setter","getter"}}}}, [e]=d, [f]="expected selector for Objective\\-C (?:setter|getter)", [g]=a, [i]=u, [h]={"fe15a78ff24f",1286041521,"Use ParseObjCSelectorPiece for parsing getter and setter names in @property declarations. Fixes PR81...","Use ParseObjCSelectorPiece for parsing getter and setter names in @property declarations. Fixes PR8169.\n\nllvm-svn: 115411"}, [k]={{B,952,"/// Parse property attribute declarations.\n///\n/// property-attr-decl: \'(\' property-attrlist \')\'\n/// property-attrlist:\n/// property-attribute\n/// property-attrlist \',\' property-attribute\n/// property-attribute:\n/// getter \'=\' identifier\n/// setter \'=\' identifier \':\'\n/// direct\n/// readonly\n/// readwrite\n/// assign\n/// retain\n/// copy\n/// nonatomic\n/// atomic\n/// strong\n/// weak\n/// unsafe_unretained\n/// nonnull\n/// nullable\n/// null_unspecified\n/// null_resettable\n/// class\n///\nvoid Parser::ParseObjCPropertyAttribute(ObjCDeclSpec &DS) {\n // ...\n while (true) {\n // ...\n if (II->isStr(\"readonly\"))\n // ...\n else if (II->isStr(\"assign\"))\n // ...\n else if (II->isStr(\"unsafe_unretained\"))\n // ...\n else if (II->isStr(\"readwrite\"))\n // ...\n else if (II->isStr(\"retain\"))\n // ...\n else if (II->isStr(\"strong\"))\n // ...\n else if (II->isStr(\"copy\"))\n // ...\n else if (II->isStr(\"nonatomic\"))\n // ...\n else if (II->isStr(\"atomic\"))\n // ...\n else if (II->isStr(\"weak\"))\n // ...\n else if (II->isStr(\"getter\") || II->isStr(\"setter\")) {\n // ...\n if (!SelIdent) {\n Diag(Tok, diag::err_objc_expected_selector_for_getter_setter) << IsSetter;"}} }, ["err_objc_expected_type_parameter"]={ [j]="err_objc_expected_type_parameter", [b]="expected type parameter name", [c]="expected type parameter name", [e]=d, [f]="expected type parameter name", [g]=a, [i]=D, [h]={Y,1436241435,V,Z}, [k]={{B,518,"/// Parse an Objective-C type parameter list, if present, or capture\n/// the locations of the protocol identifiers for a list of protocol\n/// references.\n///\n/// objc-type-parameter-list:\n/// \'<\' objc-type-parameter (\',\' objc-type-parameter)* \'>\'\n///\n/// objc-type-parameter:\n/// objc-type-parameter-variance? identifier objc-type-parameter-bound[opt]\n///\n/// objc-type-parameter-bound:\n/// \':\' type-name\n///\n/// objc-type-parameter-variance:\n/// \'__covariant\'\n/// \'__contravariant\'\n///\n/// \\param lAngleLoc The location of the starting \'<\'.\n///\n/// \\param protocolIdents Will capture the list of identifiers, if the\n/// angle brackets contain a list of protocol references rather than a\n/// type parameter list.\n///\n/// \\param rAngleLoc The location of the ending \'>\'.\nObjCTypeParamList *Parser::parseObjCTypeParamListOrProtocolRefs(ObjCTypeParamListScope &Scope, SourceLocation &lAngleLoc, SmallVectorImpl<IdentifierLocPair> &protocolIdents, SourceLocation &rAngleLoc, bool mayBeProtocolList) {\n // ...\n do {\n // ...\n // Parse the identifier.\n if (!Tok.is(tok::identifier)) {\n // ...\n Diag(Tok, diag::err_objc_expected_type_parameter);"}}, [l]={ ["clang/test/SemaObjC/kindof.m"]={"clang/test/SemaObjC/kindof.m:465:19: error: expected type parameter name","clang/test/SemaObjC/kindof.m:471:25: error: expected type parameter name"} } }, ["err_objc_for_range_init_stmt"]={ [j]={{nil,y,"err_objc_for_range_init_stmt"}}, [b]={{nil,y,"initialization statement is not supported when iterating over Objective-C collection"}}, [c]={{nil,y,"initialization statement is not supported when iterating over Objective-C collection"}}, [e]=d, [f]="initialization statement is not supported when iterating over Objective\\-C collection", [g]=a, [i]={{nil,y,q}}, [h]={"8baa50013c86",1538160249,"[cxx2a] P0614R1: Support init-statements in range-based for loops.","[cxx2a] P0614R1: Support init-statements in range-based for loops.\n\nWe don\'t yet support this for the case where a range-based for loop is\nimplicitly rewritten to an ObjC for..in statement.\n\nllvm-svn: 343350"}, [k]={{fb,2495,"/// ActOnCXXForRangeStmt - Check and build a C++11 for-range statement.\n///\n/// C++11 [stmt.ranged]:\n/// A range-based for statement is equivalent to\n///\n/// {\n/// auto && __range = range-init;\n/// for ( auto __begin = begin-expr,\n/// __end = end-expr;\n/// __begin != __end;\n/// ++__begin ) {\n/// for-range-declaration = *__begin;\n/// statement\n/// }\n/// }\n///\n/// The body of the loop is not available yet, since it cannot be analysed until\n/// we have determined the type of the for-range-declaration.\nStmtResult Sema::ActOnCXXForRangeStmt(Scope *S, SourceLocation ForLoc, SourceLocation CoawaitLoc, Stmt *InitStmt, Stmt *First, SourceLocation ColonLoc, Expr *Range, SourceLocation RParenLoc, BuildForRangeKind Kind) {\n // ...\n if (Range && ObjCEnumerationCollection(Range)) {\n // FIXME: Support init-statements in Objective-C++20 ranged for statement.\n if (InitStmt)\n return Diag(InitStmt->getBeginLoc(), diag::err_objc_for_range_init_stmt) << InitStmt->getSourceRange();"}}, [l]={ ["clang/test/SemaObjCXX/foreach.mm"]={"clang/test/SemaObjCXX/foreach.mm:18:8: error: initialization statement is not supported when iterating over Objective-C collection","clang/test/SemaObjCXX/foreach.mm:21:8: error: initialization statement is not supported when iterating over Objective-C collection"} } }, ["err_objc_illegal_boxed_expression_type"]={ [j]="err_objc_illegal_boxed_expression_type", [b]="illegal type %0 used in a boxed expression", [c]="illegal type A used in a boxed expression", [e]=d, [f]="illegal type (.*?) used in a boxed expression", [g]=a, [i]=q, [h]={"0caa39474bfc",1334795112,"Implements boxed expressions for Objective-C. <rdar://problem/10194391>","Implements boxed expressions for Objective-C. <rdar://problem/10194391>\n\nllvm-svn: 155082"}, [k]={{J,732,"ExprResult Sema::BuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {\n // ...\n if (!BoxingMethod) {\n Diag(Loc, diag::err_objc_illegal_boxed_expression_type) << ValueType << ValueExpr->getSourceRange();"}}, [l]={ ["clang/test/SemaObjC/objc-literal-nsnumber.m"]={"clang/test/SemaObjC/objc-literal-nsnumber.m:16:13: error: illegal type \'int\' used in a boxed expression","clang/test/SemaObjC/objc-literal-nsnumber.m:26:13: error: illegal type \'int\' used in a boxed expression"} } }, ["err_objc_illegal_interface_qual"]={ [j]="err_objc_illegal_interface_qual", [b]="illegal interface qualifier", [c]="illegal interface qualifier", [e]=d, [f]="illegal interface qualifier", [g]=a, [i]=u, [h]={R,1236199783,Q,S}, [k]={{B,738,"/// objc-interface-decl-list:\n/// empty\n/// objc-interface-decl-list objc-property-decl [OBJC2]\n/// objc-interface-decl-list objc-method-requirement [OBJC2]\n/// objc-interface-decl-list objc-method-proto \';\'\n/// objc-interface-decl-list declaration\n/// objc-interface-decl-list \';\'\n///\n/// objc-method-requirement: [OBJC2]\n/// @required\n/// @optional\n///\nvoid Parser::ParseObjCInterfaceDeclList(tok::ObjCKeywordKind contextKey, Decl *CDecl) {\n // ...\n while (true) {\n // ...\n default:\n // ...\n Diag(AtLoc, diag::err_objc_illegal_interface_qual);"}}, [l]={ ["clang/test/Parser/missing-end-4.m"]={"clang/test/Parser/missing-end-4.m:41:1: error: illegal interface qualifier","clang/test/Parser/missing-end-4.m:42:1: error: illegal interface qualifier"} } }, ["err_objc_illegal_visibility_spec"]={ [j]="err_objc_illegal_visibility_spec", [b]="illegal visibility specification", [c]="illegal visibility specification", [e]=d, [f]="illegal visibility specification", [g]=a, [i]=u, [h]={R,1236199783,Q,S}, [k]={{B,1999,"/// objc-class-instance-variables:\n/// \'{\' objc-instance-variable-decl-list[opt] \'}\'\n///\n/// objc-instance-variable-decl-list:\n/// objc-visibility-spec\n/// objc-instance-variable-decl \';\'\n/// \';\'\n/// objc-instance-variable-decl-list objc-visibility-spec\n/// objc-instance-variable-decl-list objc-instance-variable-decl \';\'\n/// objc-instance-variable-decl-list static_assert-declaration\n/// objc-instance-variable-decl-list \';\'\n///\n/// objc-visibility-spec:\n/// @private\n/// @protected\n/// @public\n/// @package [OBJC2]\n///\n/// objc-instance-variable-decl:\n/// struct-declaration\n///\nvoid Parser::ParseObjCClassInstanceVariables(ObjCContainerDecl *interfaceDecl, tok::ObjCKeywordKind visibility, SourceLocation atLoc) {\n // ...\n // While we still have something to read, read the instance variables.\n while (Tok.isNot(tok::r_brace) && !isEofOrEom()) {\n // ...\n // Set the default visibility to private.\n if (TryConsumeToken(tok::at)) { // parse objc-visibility-spec\n // ...\n default:\n Diag(Tok, diag::err_objc_illegal_visibility_spec);"}} }, ["err_objc_incomplete_boxed_expression_type"]={ [j]="err_objc_incomplete_boxed_expression_type", [b]="incomplete type %0 used in a boxed expression", [c]="incomplete type A used in a boxed expression", [e]=d, [f]="incomplete type (.*?) used in a boxed expression", [g]=a, [i]=q, [h]={"8e6951d81b79",1337109464,"Allow objc @() syntax for enum types.","Allow objc @() syntax for enum types.\n\nPreviously we would reject it as illegal using a value of\nenum type and on ObjC++ it was illegal to use an enumerator\nas well.\n\nrdar://11454917\n\nllvm-svn: 156843"}, [k]={{J,640,"ExprResult Sema::BuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {\n // ...\n if (const PointerType *PT = ValueType->getAs<PointerType>()) {\n // ...\n } else if (ValueType->isBuiltinType()) {\n // ...\n } else if (const EnumType *ET = ValueType->getAs<EnumType>()) {\n if (!ET->getDecl()->isComplete()) {\n Diag(Loc, diag::err_objc_incomplete_boxed_expression_type) << ValueType << ValueExpr->getSourceRange();"}}, [l]={ ["clang/test/SemaObjCXX/boxing-illegal-types.mm"]={"clang/test/SemaObjCXX/boxing-illegal-types.mm:57:9: error: incomplete type \'enum ForwE\' used in a boxed expression"} } }, ["err_objc_index_incomplete_class_type"]={ [j]="err_objc_index_incomplete_class_type", [b]="Objective-C index expression has incomplete class type %0", [c]="Objective-C index expression has incomplete class type A", [e]=d, [f]="Objective\\-C index expression has incomplete class type (.*?)", [g]=a, [i]=q, [h]={ab,1331064356,W,X}, [k]={{O,1080,"/// CheckSubscriptingKind - This routine decide what type\n/// of indexing represented by \"FromE\" is being done.\nSema::ObjCSubscriptKind Sema::CheckSubscriptingKind(Expr *FromE) {\n // ...\n if (RequireCompleteType(FromE->getExprLoc(), T, diag::err_objc_index_incomplete_class_type, FromE))"}} }, ["err_objc_indexing_method_result_type"]={ [j]="err_objc_indexing_method_result_type", [b]="method for accessing %select{dictionary|array}1 element must have Objective-C object return type instead of %0", [c]={{nil,nil,{"method for accessing ",{"dictionary","array"}," element must have Objective-C object return type instead of A"}}}, [e]=d, [f]="method for accessing (?:dictionary|array) element must have Objective\\-C object return type instead of (.*?)", [g]=a, [i]=q, [h]={ab,1331064356,W,X}, [k]={{O,1238,"bool ObjCSubscriptOpBuilder::findAtIndexGetter() {\n // ...\n if (AtIndexGetter) {\n // ...\n if (!R->isObjCObjectPointerType()) {\n S.Diag(RefExpr->getKeyExpr()->getExprLoc(), diag::err_objc_indexing_method_result_type) << R << arrayRef;"}}, [l]={ ["clang/test/SemaObjC/objc-container-subscripting-3.m"]={"clang/test/SemaObjC/objc-container-subscripting-3.m:16:18: error: method for accessing array element must have Objective-C object return type instead of \'int\'","clang/test/SemaObjC/objc-container-subscripting-3.m:21:15: error: method for accessing dictionary element must have Objective-C object return type instead of \'int\'"} } }, ["err_objc_kindof_nonobject"]={ [j]="err_objc_kindof_nonobject", [b]="\'__kindof\' specifier cannot be applied to non-object type %0", [c]="\'__kindof\' specifier cannot be applied to non-object type A", [e]=d, [f]="\'__kindof\' specifier cannot be applied to non\\-object type (.*?)", [g]=a, [i]=q, [h]={"ab209d83be5d",1436241522,"Implement the Objective-C __kindof type qualifier.","Implement the Objective-C __kindof type qualifier.\n\nThe __kindof type qualifier can be applied to Objective-C object\n(pointer) types to indicate id-like behavior, which includes implicit\n\"downcasting\" of __kindof types to subclasses and id-like message-send\nbehavior. __kindof types provide better type bounds for substitutions\ninto unspecified generic types, which preserves more type information.\n\nllvm-svn: 241548"}, [k]={{K,7597,"/// Check the application of the Objective-C \'__kindof\' qualifier to\n/// the given type.\nstatic bool checkObjCKindOfType(TypeProcessingState &state, QualType &type, ParsedAttr &attr) {\n // ...\n // If not, we can\'t apply __kindof.\n if (!objType) {\n // ...\n S.Diag(attr.getLoc(), diag::err_objc_kindof_nonobject) << type;"}}, [l]={ ["clang/test/SemaObjC/kindof.m"]={"clang/test/SemaObjC/kindof.m:64:9: error: \'__kindof\' specifier cannot be applied to non-object type \'int\'","clang/test/SemaObjC/kindof.m:66:9: error: \'__kindof\' specifier cannot be applied to non-object type \'NSObject_ptr_ptr\' (aka \'NSObject **\')"} } }, ["err_objc_kindof_wrong_position"]={ [j]="err_objc_kindof_wrong_position", [b]="\'__kindof\' type specifier must precede the declarator", [c]="\'__kindof\' type specifier must precede the declarator", [e]=d, [f]="\'__kindof\' type specifier must precede the declarator", [g]=a, [i]=q, [h]={"ab209d83be5d",1436241522,"Implement the Objective-C __kindof type qualifier.","Implement the Objective-C __kindof type qualifier.\n\nThe __kindof type qualifier can be applied to Objective-C object\n(pointer) types to indicate id-like behavior, which includes implicit\n\"downcasting\" of __kindof types to subclasses and id-like message-send\nbehavior. __kindof types provide better type bounds for substitutions\ninto unspecified generic types, which preserves more type information.\n\nllvm-svn: 241548"}, [k]={{K,8729,"static void processTypeAttrs(TypeProcessingState &state, QualType &type, TypeAttrLocation TAL, const ParsedAttributesView &attrs) {\n // ...\n for (ParsedAttr &attr : AttrsCopy) {\n // ...\n case ParsedAttr::AT_ObjCKindOf:\n // ...\n case TAL_DeclChunk:\n case TAL_DeclName:\n state.getSema().Diag(attr.getLoc(), diag::err_objc_kindof_wrong_position) << FixItHint::CreateRemoval(attr.getLoc()) << FixItHint::CreateInsertion(state.getDeclarator().getDeclSpec().getBeginLoc(), \"__kindof \");"}}, [l]={ ["clang/test/SemaObjC/kindof.m"]={"clang/test/SemaObjC/kindof.m:69:20: error: \'__kindof\' type specifier must precede the declarator"} } }, ["err_objc_literal_method_sig"]={ [j]="err_objc_literal_method_sig", [b]="literal construction method %0 has incompatible signature", [c]="literal construction method A has incompatible signature", [e]=d, [f]="literal construction method (.*?) has incompatible signature", [g]=a, [i]=q, [h]={ab,1331064356,W,X}, [k]={{J,161,"/// Emits an error if the given method does not exist, or if the return\n/// type is not an Objective-C object.\nstatic bool validateBoxingMethod(Sema &S, SourceLocation Loc, const ObjCInterfaceDecl *Class, Selector Sel, const ObjCMethodDecl *Method) {\n // ...\n if (!ReturnType->isObjCObjectPointerType()) {\n S.Diag(Loc, diag::err_objc_literal_method_sig) << Sel;"},{J,849,"ExprResult Sema::BuildObjCArrayLiteral(SourceRange SR, MultiExprArg Elements) {\n // ...\n if (!ArrayWithObjectsMethod) {\n // ...\n if (!PtrT || !Context.hasSameUnqualifiedType(PtrT->getPointeeType(), IdT)) {\n Diag(SR.getBegin(), diag::err_objc_literal_method_sig) << Sel;"},{J,860,"ExprResult Sema::BuildObjCArrayLiteral(SourceRange SR, MultiExprArg Elements) {\n // ...\n if (!ArrayWithObjectsMethod) {\n // ...\n // Check that the \'count\' parameter is integral.\n if (!Method->parameters()[1]->getType()->isIntegerType()) {\n Diag(SR.getBegin(), diag::err_objc_literal_method_sig) << Sel;"},{J,1020,"ExprResult Sema::BuildObjCDictionaryLiteral(SourceRange SR, MutableArrayRef<ObjCDictionaryElement> Elements) {\n // ...\n if (!DictionaryWithObjectsMethod) {\n // ...\n if (!PtrValue || !Context.hasSameUnqualifiedType(PtrValue->getPointeeType(), IdT)) {\n Diag(SR.getBegin(), diag::err_objc_literal_method_sig) << Sel;"},{J,1054,"ExprResult Sema::BuildObjCDictionaryLiteral(SourceRange SR, MutableArrayRef<ObjCDictionaryElement> Elements) {\n // ...\n if (!DictionaryWithObjectsMethod) {\n // ...\n if (!PtrKey || !Context.hasSameUnqualifiedType(PtrKey->getPointeeType(), IdT)) {\n // ...\n if (err) {\n Diag(SR.getBegin(), diag::err_objc_literal_method_sig) << Sel;"},{J,1067,"ExprResult Sema::BuildObjCDictionaryLiteral(SourceRange SR, MutableArrayRef<ObjCDictionaryElement> Elements) {\n // ...\n if (!DictionaryWithObjectsMethod) {\n // ...\n if (!CountType->isIntegerType()) {\n Diag(SR.getBegin(), diag::err_objc_literal_method_sig) << Sel;"}}, [l]={ ["clang/test/SemaObjC/objc-literal-sig.m"]={"clang/test/SemaObjC/objc-literal-sig.m:45:9: error: literal construction method \'numberWithBool:\' has incompatible signature","clang/test/SemaObjC/objc-literal-sig.m:46:9: error: literal construction method \'numberWithBool:\' has incompatible signature","clang/test/SemaObjC/objc-literal-sig.m:47:14: error: literal construction method \'arrayWithObjects:count:\' has incompatible signature","clang/test/SemaObjC/objc-literal-sig.m:48:15: error: literal construction method \'arrayWithObjects:count:\' has incompatible signature","clang/test/SemaObjC/objc-literal-sig.m:49:13: error: literal construction method \'dictionaryWithObjects:forKeys:count:\' has incompatible signature","clang/test/SemaObjC/objc-literal-sig.m:50:14: error: literal construction method \'dictionaryWithObjects:forKeys:count:\' has incompatible signature","clang/test/SemaObjC/objc-literal-sig.m:51:12: error: literal construction method \'stringWithUTF8String:\' has incompatible signature","clang/test/SemaObjC/objc-literal-sig.m:52:13: error: literal construction method \'stringWithUTF8String:\' has incompatible signature"} } }, ["err_objc_method_unsupported_param_ret_type"]={ [j]={{nil,P,"err_objc_method_unsupported_param_ret_type"}}, [b]={{nil,P,"%0 %select{parameter|return}1 type is unsupported; support for vector types for this target is introduced in %2"}}, [c]={{nil,P,{"A ",{"parameter","return"}," type is unsupported; support for vector types for this target is introduced in C"}}}, [e]=d, [f]="(.*?) (?:parameter|return) type is unsupported; support for vector types for this target is introduced in (.*?)", [g]=a, [i]={{nil,P,q}}, [h]={"a8a372d85e09",1493289828,"[ObjC] Disallow vector parameters and return values in Objective-C methods","[ObjC] Disallow vector parameters and return values in Objective-C methods\nfor iOS < 9 and OS X < 10.11 X86 targets\n\nThis commit adds a new error that disallows methods that have parameters/return\nvalues with a vector type for some older X86 targets. This diagnostic is\nneeded because objc_msgSend doesn\'t support SIMD vector registers/return values\non X86 in iOS < 9 and OS X < 10.11. Note that we don\'t necessarily know if the\nvector argument/return value will use a SIMD register, so instead we chose to\nbe conservative and prohibit all vector types.\n\nrdar://21662309\n\nDifferential Revision: https://reviews.llvm.org/D28670\n\nllvm-svn: 301532"}, [k]={{z,4660,"/// Verify that the method parameters/return value have types that are supported\n/// by the x86 target.\nstatic void checkObjCMethodX86VectorTypes(Sema &SemaRef, const ObjCMethodDecl *Method) {\n // ...\n SemaRef.Diag(Loc, diag::err_objc_method_unsupported_param_ret_type) << T << (Method->getReturnType()->isVectorType() ? /*return value*/ 1 : /*parameter*/ 0) << (Triple.isMacOSX() ? \"macOS 10.11\" : \"iOS 9\");"}}, [l]={ ["clang/test/SemaObjC/x86-method-vector-values.m"]={"clang/test/SemaObjC/x86-method-vector-values.m:40:20: error: \'float3\' (vector of 3 \'float\' values) parameter type is unsupported; support for vector types for this target is introduced in iOS 9","clang/test/SemaObjC/x86-method-vector-values.m:48:3: error: \'float3\' (vector of 3 \'float\' values) return type is unsupported; support for vector types for this target is introduced in iOS 9","clang/test/SemaObjC/x86-method-vector-values.m:51:21: error: \'float3\' (vector of 3 \'float\' values) parameter type is unsupported; support for vector types for this target is introduced in iOS 9","clang/test/SemaObjC/x86-method-vector-values.m:54:21: error: \'float3\' (vector of 3 \'float\' values) parameter type is unsupported; support for vector types for this target is introduced in iOS 9","clang/test/SemaObjC/x86-method-vector-values.m:57:21: error: \'float3\' (vector of 3 \'float\' values) parameter type is unsupported; support for vector types for this target is introduced in iOS 9","clang/test/SemaObjC/x86-method-vector-values.m:60:21: error: \'float3\' (vector of 3 \'float\' values) parameter type is unsupported; support for vector types for this target is introduced in iOS 9","clang/test/SemaObjC/x86-method-vector-values.m:63:4: error: \'__m128\' (vector of 4 \'float\' values) return type is unsupported; support for vector types for this target is introduced in iOS 9","clang/test/SemaObjC/x86-method-vector-values.m:66:19: error: \'__m128\' (vector of 4 \'float\' values) parameter type is unsupported; support for vector types for this target is introduced in iOS 9"} } }, ["err_objc_missing_end"]={ [j]="err_objc_missing_end", [b]="missing \'@end\'", [c]="missing \'@end\'", [e]=d, [f]="missing \'@end\'", [g]=a, [i]=u, [h]={R,1236199783,Q,S}, [k]={{B,201,"void Parser::CheckNestedObjCContexts(SourceLocation AtLoc) {\n // ...\n Diag(AtLoc, diag::err_objc_missing_end) << FixItHint::CreateInsertion(AtLoc, \"@end\\n\");"},{B,745,"/// objc-interface-decl-list:\n/// empty\n/// objc-interface-decl-list objc-property-decl [OBJC2]\n/// objc-interface-decl-list objc-method-requirement [OBJC2]\n/// objc-interface-decl-list objc-method-proto \';\'\n/// objc-interface-decl-list declaration\n/// objc-interface-decl-list \';\'\n///\n/// objc-method-requirement: [OBJC2]\n/// @required\n/// @optional\n///\nvoid Parser::ParseObjCInterfaceDeclList(tok::ObjCKeywordKind contextKey, Decl *CDecl) {\n // ...\n while (true) {\n // ...\n case tok::objc_implementation:\n case tok::objc_interface:\n Diag(AtLoc, diag::err_objc_missing_end) << FixItHint::CreateInsertion(AtLoc, \"@end\\n\");"},{B,829,"/// objc-interface-decl-list:\n/// empty\n/// objc-interface-decl-list objc-property-decl [OBJC2]\n/// objc-interface-decl-list objc-method-requirement [OBJC2]\n/// objc-interface-decl-list objc-method-proto \';\'\n/// objc-interface-decl-list declaration\n/// objc-interface-decl-list \';\'\n///\n/// objc-method-requirement: [OBJC2]\n/// @required\n/// @optional\n///\nvoid Parser::ParseObjCInterfaceDeclList(tok::ObjCKeywordKind contextKey, Decl *CDecl) {\n // ...\n // We break out of the big loop in two cases: when we see @end or when we see\n // EOF. In the former case, eat the @end. In the later case, emit an error.\n if (Tok.is(tok::code_completion)) {\n // ...\n } else if (Tok.isObjCAtKeyword(tok::objc_end)) {\n // ...\n } else {\n Diag(Tok, diag::err_objc_missing_end) << FixItHint::CreateInsertion(Tok.getLocation(), \"\\n@end\\n\");"},{B,2307,"Parser::ObjCImplParsingDataRAII::~ObjCImplParsingDataRAII() {\n if (!Finished) {\n // ...\n if (P.isEofOrEom()) {\n P.Diag(P.Tok, diag::err_objc_missing_end) << FixItHint::CreateInsertion(P.Tok.getLocation(), \"\\n@end\\n\");"}}, [l]={ ["clang/test/SemaObjC/missing-atend-metadata.m"]={"clang/test/SemaObjC/missing-atend-metadata.m:9:1: error: missing \'@end\'","clang/test/SemaObjC/missing-atend-metadata.m:15:1: error: missing \'@end\'","clang/test/SemaObjC/missing-atend-metadata.m:22:1: error: missing \'@end\'","clang/test/SemaObjC/missing-atend-metadata.m:22:110: error: missing \'@end\'"} } }, ["err_objc_multiple_subscript_type_conversion"]={ [j]="err_objc_multiple_subscript_type_conversion", [b]="indexing expression is invalid because subscript type %0 has multiple type conversion functions", [c]="indexing expression is invalid because subscript type A has multiple type conversion functions", [e]=d, [f]="indexing expression is invalid because subscript type (.*?) has multiple type conversion functions", [g]=a, [i]=q, [h]={ab,1331064356,W,X}, [k]={{O,1113,"/// CheckSubscriptingKind - This routine decide what type\n/// of indexing represented by \"FromE\" is being done.\nSema::ObjCSubscriptKind Sema::CheckSubscriptingKind(Expr *FromE) {\n // ...\n Diag(FromE->getExprLoc(), diag::err_objc_multiple_subscript_type_conversion) << FromE->getType();"}}, [l]={ ["clang/test/SemaObjCXX/objc-container-subscripting.mm"]={"clang/test/SemaObjCXX/objc-container-subscripting.mm:136:16: error: indexing expression is invalid because subscript type \'WeirdIndex\' has multiple type conversion functions"} } }, ["err_objc_non_runtime_protocol_in_protocol_expr"]={ [j]={{nil,A,"err_objc_non_runtime_protocol_in_protocol_expr"}}, [b]={{nil,A,"cannot use a protocol declared \'objc_non_runtime_protocol\' in a @protocol expression"}}, [c]={{nil,A,"cannot use a protocol declared \'objc_non_runtime_protocol\' in a @protocol expression"}}, [e]=d, [f]="cannot use a protocol declared \'objc_non_runtime_protocol\' in a @protocol expression", [g]=a, [i]={{nil,A,q}}, [h]={"14f6bfcb52e7",1582847864,"[clang] Implement objc_non_runtime_protocol to remove protocol metadata","[clang] Implement objc_non_runtime_protocol to remove protocol metadata\n\nSummary:\nMotivated by the new objc_direct attribute, this change adds a new\nattribute that remotes metadata from Protocols that the programmer knows\nisn\'t going to be used at runtime. We simply have the frontend skip\ngenerating any protocol metadata entries (e.g. OBJC_CLASS_NAME,\n_OBJC_$_PROTOCOL_INSTANCE_METHDOS, _OBJC_PROTOCOL, etc) for a protocol\nmarked with `__attribute__((objc_non_runtime_protocol))`.\n\nThere are a few APIs used to retrieve a protocol at runtime.\n`@protocol(SomeProtocol)` will now error out of the requested protocol\nis marked with attribute. `objc_getProtocol` will return `NULL` which\nis consistent with the behavior of a non-existing protocol.\n\nSubscribers: cfe-commits\n\nTags: #clang\n\nDifferential Revision: https://reviews.llvm.org/D75574"}, [k]={{J,1397,"ExprResult Sema::ParseObjCProtocolExpression(IdentifierInfo *ProtocolId, SourceLocation AtLoc, SourceLocation ProtoLoc, SourceLocation LParenLoc, SourceLocation ProtoIdLoc, SourceLocation RParenLoc) {\n // ...\n if (PDecl->isNonRuntimeProtocol())\n Diag(ProtoLoc, diag::err_objc_non_runtime_protocol_in_protocol_expr) << PDecl;"}} }, ["err_objc_non_trivially_copyable_boxed_expression_type"]={ [j]="err_objc_non_trivially_copyable_boxed_expression_type", [b]="non-trivially copyable type %0 cannot be used in a boxed expression", [c]="non-trivially copyable type A cannot be used in a boxed expression", [e]=d, [f]="non\\-trivially copyable type (.*?) cannot be used in a boxed expression", [g]=a, [i]=q, [h]={"fde64956f95c",1435296516,"[ObjC] Add NSValue support for objc_boxed_expressions","[ObjC] Add NSValue support for objc_boxed_expressions\n\nPatch extends ObjCBoxedExpr to accept records (structs and unions):\n\ntypedef struct __attribute__((objc_boxable)) _Color {\n int r, g, b;\n} Color;\n\nColor color;\nNSValue *boxedColor = @(color); // [NSValue valueWithBytes:&color objCType:@encode(Color)];\n\nllvm-svn: 240761"}, [k]={{J,722,"ExprResult Sema::BuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {\n // ...\n if (const PointerType *PT = ValueType->getAs<PointerType>()) {\n // ...\n } else if (ValueType->isBuiltinType()) {\n // ...\n } else if (const EnumType *ET = ValueType->getAs<EnumType>()) {\n // ...\n } else if (ValueType->isObjCBoxableRecordType()) {\n // ...\n if (!ValueType.isTriviallyCopyableType(Context)) {\n Diag(Loc, diag::err_objc_non_trivially_copyable_boxed_expression_type) << ValueType << ValueExpr->getSourceRange();"}}, [l]={ ["clang/test/SemaObjCXX/objc-boxed-expressions-nsvalue.mm"]={"clang/test/SemaObjCXX/objc-boxed-expressions-nsvalue.mm:87:15: error: non-trivially copyable type \'NonTriviallyCopyable\' cannot be used in a boxed expression","clang/test/SemaObjCXX/objc-boxed-expressions-nsvalue.mm:112:68: error: non-trivially copyable type \'NonTriviallyCopyable\' cannot be used in a boxed expression","clang/test/SemaObjCXX/objc-boxed-expressions-nsvalue.mm:105:45: error: non-trivially copyable type \'NonTriviallyCopyable\' cannot be used in a boxed expression"} } }, ["err_objc_ns_bridged_invalid_cfobject"]={ [j]="err_objc_ns_bridged_invalid_cfobject", [b]="ObjectiveC object of type %0 is bridged to %1, which is not valid CF object", [c]="ObjectiveC object of type A is bridged to B, which is not valid CF object", [e]=d, [f]="ObjectiveC object of type (.*?) is bridged to (.*?), which is not valid CF object", [g]=a, [i]=q, [h]={"8a0210e535c5",1384629392,"ObjectiveC ARC. Validate toll free bridge casting","ObjectiveC ARC. Validate toll free bridge casting\nof ObjectiveC objects to CF types when CF type\nhas the objc_bridge attribute.\n\nllvm-svn: 194930"}, [k]={{J,4121,"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(castExpr->getBeginLoc(), diag::err_objc_ns_bridged_invalid_cfobject) << castExpr->getType() << castType;"}} }, ["err_objc_object_assignment"]={ [j]="err_objc_object_assignment", [b]="cannot assign to class object (%0 invalid)", [c]="cannot assign to class object (A invalid)", [e]=d, [f]="cannot assign to class object \\((.*?) invalid\\)", [g]=a, [i]=q, [h]={"3c4225a8581f",1327428345,"objc: issue error if assigning objects in fragile-abi too.","objc: issue error if assigning objects in fragile-abi too.\n// rdar://10731065\n\nllvm-svn: 148823"}, [k]={{N,14499,"// C99 6.5.16.1\nQualType Sema::CheckAssignmentOperands(Expr *LHSExpr, ExprResult &RHS, SourceLocation Loc, QualType CompoundType, BinaryOperatorKind Opc) {\n // ...\n if (CompoundType.isNull()) {\n // ...\n if (ConvTy == Compatible && LHSType->isObjCObjectType())\n Diag(Loc, diag::err_objc_object_assignment) << LHSType;"}}, [l]={ ["clang/test/SemaObjCXX/fragile-abi-object-assign.m"]={"clang/test/SemaObjCXX/fragile-abi-object-assign.m:10:23: error: cannot assign to class object (\'MyView\' invalid)"} } }, ["err_objc_object_catch"]={ [j]="err_objc_object_catch", [b]="cannot catch an Objective-C object by value", [c]="cannot catch an Objective-C object by value", [e]=d, [f]="cannot catch an Objective\\-C object by value", [g]=a, [i]=q, [h]={"2ca705eb134f",1279931843,"Support catching Objective C pointers in C++ under the non-fragile NeXT runtime.","Support catching Objective C pointers in C++ under the non-fragile NeXT runtime.\nDiagnose attempts to do this under the GNU or fragile NeXT runtimes.\n\nllvm-svn: 109298"}, [k]={{"clang/lib/Sema/SemaDeclCXX.cpp",16673,"/// Perform semantic analysis for the variable declaration that\n/// occurs within a C++ catch clause, returning the newly-created\n/// variable.\nVarDecl *Sema::BuildExceptionDeclaration(Scope *S, TypeSourceInfo *TInfo, SourceLocation StartLoc, SourceLocation Loc, IdentifierInfo *Name) {\n // ...\n // Only the non-fragile NeXT runtime currently supports C++ catches\n // of ObjC types, and no runtime supports catching ObjC types by value.\n if (!Invalid && getLangOpts().ObjC) {\n // ...\n if (T->isObjCObjectType()) {\n Diag(Loc, diag::err_objc_object_catch);"}}, [l]={ ["clang/test/SemaObjCXX/exceptions.mm"]={"clang/test/SemaObjCXX/exceptions.mm:8:26: error: cannot catch an Objective-C object by value"} } }, ["err_objc_override_direct_method"]={ [j]={{nil,p,"err_objc_override_direct_method"}}, [b]={{nil,p,"cannot override a method that is declared direct by a superclass"}}, [c]={{nil,p,"cannot override a method that is declared direct by a superclass"}}, [e]=d, [f]="cannot override a method that is declared direct by a superclass", [g]=a, [i]={{nil,p,q}}, [h]={xb,1573050950,Cb,yb}, [k]={{z,4429,"void Sema::CheckObjCMethodDirectOverrides(ObjCMethodDecl *method, ObjCMethodDecl *overridden) {\n if (overridden->isDirectMethod()) {\n // ...\n Diag(method->getLocation(), diag::err_objc_override_direct_method);"}}, [l]={ ["clang/test/SemaObjC/method-direct-properties.m"]={"clang/test/SemaObjC/method-direct-properties.m:64:1: error: cannot override a method that is declared direct by a superclass","clang/test/SemaObjC/method-direct-properties.m:65:1: error: cannot override a method that is declared direct by a superclass","clang/test/SemaObjC/method-direct-properties.m:66:1: error: cannot override a method that is declared direct by a superclass","clang/test/SemaObjC/method-direct-properties.m:67:1: error: cannot override a method that is declared direct by a superclass","clang/test/SemaObjC/method-direct-properties.m:69:1: error: cannot override a method that is declared direct by a superclass","clang/test/SemaObjC/method-direct-properties.m:71:1: error: cannot override a method that is declared direct by a superclass","clang/test/SemaObjC/method-direct-properties.m:72:1: error: cannot override a method that is declared direct by a superclass","clang/test/SemaObjC/method-direct-properties.m:73:1: error: cannot override a method that is declared direct by a superclass","clang/test/SemaObjC/method-direct-properties.m:74:1: error: cannot override a method that is declared direct by a superclass","clang/test/SemaObjC/method-direct-properties.m:77:1: error: cannot override a method that is declared direct by a superclass","clang/test/SemaObjC/method-direct-properties.m:79:1: error: cannot override a method that is declared direct by a superclass","clang/test/SemaObjC/method-direct-properties.m:120:1: error: cannot override a method that is declared direct by a superclass","clang/test/SemaObjC/method-direct-properties.m:123:1: error: cannot override a method that is declared direct by a superclass"} } }, ["err_objc_parameterized_category_nonclass"]={ [j]="err_objc_parameterized_category_nonclass", [b]="%select{extension|category}0 of non-parameterized class %1 cannot have type parameters", [c]={{nil,nil,{{"extension","category"}," of non-parameterized class B cannot have type parameters"}}}, [e]=d, [f]="(?:extension|category) of non\\-parameterized class (.*?) cannot have type parameters", [g]=a, [i]=D, [h]={Y,1436241435,V,Z}, [k]={{z,1877,"ObjCCategoryDecl *Sema::ActOnStartCategoryInterface(SourceLocation AtInterfaceLoc, IdentifierInfo *ClassName, SourceLocation ClassLoc, ObjCTypeParamList *typeParamList, IdentifierInfo *CategoryName, SourceLocation CategoryLoc, Decl *const *ProtoRefs, unsigned NumProtoRefs, const SourceLocation *ProtoLocs, SourceLocation EndProtoLoc, const ParsedAttributesView &AttrList) {\n // ...\n // If we have a type parameter list, check it.\n if (typeParamList) {\n if (auto prevTypeParamList = IDecl->getTypeParamList()) {\n // ...\n } else {\n Diag(typeParamList->getLAngleLoc(), diag::err_objc_parameterized_category_nonclass) << (CategoryName != nullptr) << ClassName << typeParamList->getSourceRange();"}}, [l]={ [M]={"clang/test/SemaObjC/parameterized_classes.m:156:20: error: category of non-parameterized class \'NSObject\' cannot have type parameters","clang/test/SemaObjC/parameterized_classes.m:159:20: error: extension of non-parameterized class \'NSObject\' cannot have type parameters"} } }, ["err_objc_parameterized_forward_class"]={ [j]="err_objc_parameterized_forward_class", [b]="forward declaration of non-parameterized class %0 cannot have type parameters", [c]="forward declaration of non-parameterized class A cannot have type parameters", [e]=d, [f]="forward declaration of non\\-parameterized class (.*?) cannot have type parameters", [g]=a, [i]=D, [h]={Y,1436241435,V,Z}, [k]={{z,3132,"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(IdentLocs[i], diag::err_objc_parameterized_forward_class) << ClassName << TypeParams->getSourceRange();"}}, [l]={ [M]={"clang/test/SemaObjC/parameterized_classes.m:106:8: error: forward declaration of non-parameterized class \'NSObject\' cannot have type parameters"} } }, ["err_objc_parameterized_forward_class_first"]={ [j]="err_objc_parameterized_forward_class_first", [b]="class %0 previously declared with type parameters", [c]="class A previously declared with type parameters", [e]=d, [f]="class (.*?) previously declared with type parameters", [g]=a, [i]=D, [h]={Y,1436241435,V,Z}, [k]={{z,1026,"ObjCInterfaceDecl *Sema::ActOnStartClassInterface(Scope *S, SourceLocation AtInterfaceLoc, IdentifierInfo *ClassName, SourceLocation ClassLoc, ObjCTypeParamList *typeParamList, IdentifierInfo *SuperName, SourceLocation SuperLoc, ArrayRef<ParsedType> SuperTypeArgs, SourceRange SuperTypeArgsRange, Decl *const *ProtoRefs, unsigned NumProtoRefs, const SourceLocation *ProtoLocs, SourceLocation EndProtoLoc, const ParsedAttributesView &AttrList, SkipBodyInfo *SkipBody) {\n // ...\n // If there was a forward declaration with type parameters, check\n // for consistency.\n if (PrevIDecl) {\n if (ObjCTypeParamList *prevTypeParamList = PrevIDecl->getTypeParamList()) {\n if (typeParamList) {\n // ...\n } else {\n Diag(ClassLoc, diag::err_objc_parameterized_forward_class_first) << ClassName;"}}, [l]={ [M]={"clang/test/SemaObjC/parameterized_classes.m:112:12: error: class \'NSNumber\' previously declared with type parameters"} } }, ["err_objc_parameterized_implementation"]={ [j]="err_objc_parameterized_implementation", [b]="@implementation cannot have type parameters", [c]="@implementation cannot have type parameters", [e]=d, [f]="@implementation cannot have type parameters", [g]=a, [i]=D, [h]={Y,1436241435,V,Z}, [k]={{B,2192,"/// objc-implementation:\n/// objc-class-implementation-prologue\n/// objc-category-implementation-prologue\n///\n/// objc-class-implementation-prologue:\n/// @implementation identifier objc-superclass[opt]\n/// objc-class-instance-variables[opt]\n///\n/// objc-category-implementation-prologue:\n/// @implementation identifier ( identifier )\nParser::DeclGroupPtrTy Parser::ParseObjCAtImplementationDeclaration(SourceLocation AtLoc, ParsedAttributes &Attrs) {\n // ...\n // Neither a type parameter list nor a list of protocol references is\n // permitted here. Parse and diagnose them.\n if (Tok.is(tok::less)) {\n // ...\n if (parseObjCTypeParamListOrProtocolRefs(typeParamScope, lAngleLoc, protocolIdents, rAngleLoc)) {\n Diag(diagLoc, diag::err_objc_parameterized_implementation) << SourceRange(diagLoc, PrevTokLocation);"}}, [l]={ [M]={"clang/test/SemaObjC/parameterized_classes.m:165:20: error: @implementation cannot have type parameters","clang/test/SemaObjC/parameterized_classes.m:171:20: error: @implementation cannot have type parameters","clang/test/SemaObjC/parameterized_classes.m:174:20: error: @implementation cannot have type parameters"} } }, ["err_objc_postfix_attribute"]={ [j]="err_objc_postfix_attribute", [b]="postfix attributes are not allowed on Objective-C directives", [c]="postfix attributes are not allowed on Objective-C directives", [e]=d, [f]="postfix attributes are not allowed on Objective\\-C directives", [g]=a, [i]=u, [h]={"04e213b6b6fb",1365010571,"Emit a nicer diagnostic for misplaced attributes on ObjC directives.","Emit a nicer diagnostic for misplaced attributes on ObjC directives.\n\nllvm-svn: 178670"}, [k]={{B,37,"/// Skips attributes after an Objective-C @ directive. Emits a diagnostic.\nvoid Parser::MaybeSkipAttributes(tok::ObjCKeywordKind Kind) {\n // ...\n if (Tok.is(tok::kw___attribute)) {\n if (Kind == tok::objc_interface || Kind == tok::objc_protocol)\n // ...\n else\n Diag(Tok, diag::err_objc_postfix_attribute);"}}, [l]={ ["clang/test/Parser/attributes.mm"]={"clang/test/Parser/attributes.mm:19:17: error: postfix attributes are not allowed on Objective-C directives","clang/test/Parser/attributes.mm:22:8: error: postfix attributes are not allowed on Objective-C directives"} } }, ["err_objc_postfix_attribute_hint"]={ [j]="err_objc_postfix_attribute_hint", [b]="postfix attributes are not allowed on Objective-C directives, place them in front of \'%select{@interface|@protocol}0\'", [c]={{nil,nil,{"postfix attributes are not allowed on Objective-C directives, place them in front of \'",{"@interface","@protocol"},"\'"}}}, [e]=d, [f]="postfix attributes are not allowed on Objective\\-C directives, place them in front of \'(?:@interface|@protocol)\'", [g]=a, [i]=u, [h]={"69a7914fec81",1365034510,"Make the ObjC attributes diagnostics a bit more informative.","Make the ObjC attributes diagnostics a bit more informative.\n\nllvm-svn: 178720"}, [k]={{B,34,"/// Skips attributes after an Objective-C @ directive. Emits a diagnostic.\nvoid Parser::MaybeSkipAttributes(tok::ObjCKeywordKind Kind) {\n // ...\n if (Tok.is(tok::kw___attribute)) {\n if (Kind == tok::objc_interface || Kind == tok::objc_protocol)\n Diag(Tok, diag::err_objc_postfix_attribute_hint) << (Kind == tok::objc_protocol);"}}, [l]={ ["clang/test/Parser/attributes.mm"]={"clang/test/Parser/attributes.mm:16:12: error: postfix attributes are not allowed on Objective-C directives, place them in front of \'@interface\'","clang/test/Parser/attributes.mm:25:11: error: postfix attributes are not allowed on Objective-C directives, place them in front of \'@protocol\'"} } }, ["err_objc_precise_lifetime_bad_type"]={ [j]="err_objc_precise_lifetime_bad_type", [b]="objc_precise_lifetime only applies to retainable types; type here is %0", [c]="objc_precise_lifetime only applies to retainable types; type here is A", [e]=d, [f]="objc_precise_lifetime only applies to retainable types; type here is (.*?)", [g]=a, [i]=q, [h]={"31168b077c36",1308178962,"Automatic Reference Counting.","Automatic Reference Counting.\n\nLanguage-design credit goes to a lot of people, but I particularly want\nto single out Blaine Garst and Patrick Beard for their contributions.\n\nCompiler implementation credit goes to Argyrios, Doug, Fariborz, and myself,\nin no particular order.\n\nllvm-svn: 133103"}, [k]={{eb,6301,"static void handleObjCPreciseLifetimeAttr(Sema &S, Decl *D, const ParsedAttr &AL) {\n // ...\n if (!QT->isDependentType() && !QT->isObjCLifetimeType()) {\n S.Diag(AL.getLoc(), diag::err_objc_precise_lifetime_bad_type) << QT;"}} }, ["err_objc_property_attr_mutually_exclusive"]={ [j]="err_objc_property_attr_mutually_exclusive", [b]="property attributes \'%0\' and \'%1\' are mutually exclusive", [c]="property attributes \'A\' and \'B\' are mutually exclusive", [e]=d, [f]="property attributes \'(.*?)\' and \'(.*?)\' are mutually exclusive", [g]=a, [i]=q, [h]={R,1236199783,Q,S}, [k]={{"clang/lib/ARCMigrate/TransGCAttrs.cpp",290,"static void checkAllAtProps(MigrationContext &MigrateCtx, SourceLocation AtLoc, IndivPropsTy &IndProps) {\n // ...\n for (unsigned i = 0, e = ATLs.size(); i != e; ++i) {\n // ...\n TA.clearDiagnostic(diag::err_objc_property_attr_mutually_exclusive, AtLoc);"},{G,2644,"void Sema::CheckObjCPropertyAttributes(Decl *PDecl, SourceLocation Loc, unsigned &Attributes, bool propertyInPrimaryClass) {\n // ...\n if ((Attributes & ObjCPropertyAttribute::kind_readonly) && (Attributes & ObjCPropertyAttribute::kind_readwrite))\n Diag(Loc, diag::err_objc_property_attr_mutually_exclusive) << \"readonly\""},{G,2681,"void Sema::CheckObjCPropertyAttributes(Decl *PDecl, SourceLocation Loc, unsigned &Attributes, bool propertyInPrimaryClass) {\n // ...\n // Check for more than one of { assign, copy, retain }.\n if (Attributes & ObjCPropertyAttribute::kind_assign) {\n if (Attributes & ObjCPropertyAttribute::kind_copy) {\n Diag(Loc, diag::err_objc_property_attr_mutually_exclusive) << \"assign\""},{G,2686,"void Sema::CheckObjCPropertyAttributes(Decl *PDecl, SourceLocation Loc, unsigned &Attributes, bool propertyInPrimaryClass) {\n // ...\n // Check for more than one of { assign, copy, retain }.\n if (Attributes & ObjCPropertyAttribute::kind_assign) {\n // ...\n if (Attributes & ObjCPropertyAttribute::kind_retain) {\n Diag(Loc, diag::err_objc_property_attr_mutually_exclusive) << \"assign\""},{G,2691,"void Sema::CheckObjCPropertyAttributes(Decl *PDecl, SourceLocation Loc, unsigned &Attributes, bool propertyInPrimaryClass) {\n // ...\n // Check for more than one of { assign, copy, retain }.\n if (Attributes & ObjCPropertyAttribute::kind_assign) {\n // ...\n if (Attributes & ObjCPropertyAttribute::kind_strong) {\n Diag(Loc, diag::err_objc_property_attr_mutually_exclusive) << \"assign\""},{G,2697,"void Sema::CheckObjCPropertyAttributes(Decl *PDecl, SourceLocation Loc, unsigned &Attributes, bool propertyInPrimaryClass) {\n // ...\n // Check for more than one of { assign, copy, retain }.\n if (Attributes & ObjCPropertyAttribute::kind_assign) {\n // ...\n if (getLangOpts().ObjCAutoRefCount && (Attributes & ObjCPropertyAttribute::kind_weak)) {\n Diag(Loc, diag::err_objc_property_attr_mutually_exclusive) << \"assign\""},{G,2705,"void Sema::CheckObjCPropertyAttributes(Decl *PDecl, SourceLocation Loc, unsigned &Attributes, bool propertyInPrimaryClass) {\n // ...\n // Check for more than one of { assign, copy, retain }.\n if (Attributes & ObjCPropertyAttribute::kind_assign) {\n // ...\n } else if (Attributes & ObjCPropertyAttribute::kind_unsafe_unretained) {\n if (Attributes & ObjCPropertyAttribute::kind_copy) {\n Diag(Loc, diag::err_objc_property_attr_mutually_exclusive) << \"unsafe_unretained\""},{G,2710,"void Sema::CheckObjCPropertyAttributes(Decl *PDecl, SourceLocation Loc, unsigned &Attributes, bool propertyInPrimaryClass) {\n // ...\n // Check for more than one of { assign, copy, retain }.\n if (Attributes & ObjCPropertyAttribute::kind_assign) {\n // ...\n } else if (Attributes & ObjCPropertyAttribute::kind_unsafe_unretained) {\n // ...\n if (Attributes & ObjCPropertyAttribute::kind_retain) {\n Diag(Loc, diag::err_objc_property_attr_mutually_exclusive) << \"unsafe_unretained\""},{G,2715,"void Sema::CheckObjCPropertyAttributes(Decl *PDecl, SourceLocation Loc, unsigned &Attributes, bool propertyInPrimaryClass) {\n // ...\n // Check for more than one of { assign, copy, retain }.\n if (Attributes & ObjCPropertyAttribute::kind_assign) {\n // ...\n } else if (Attributes & ObjCPropertyAttribute::kind_unsafe_unretained) {\n // ...\n if (Attributes & ObjCPropertyAttribute::kind_strong) {\n Diag(Loc, diag::err_objc_property_attr_mutually_exclusive) << \"unsafe_unretained\""},{G,2721,"void Sema::CheckObjCPropertyAttributes(Decl *PDecl, SourceLocation Loc, unsigned &Attributes, bool propertyInPrimaryClass) {\n // ...\n // Check for more than one of { assign, copy, retain }.\n if (Attributes & ObjCPropertyAttribute::kind_assign) {\n // ...\n } else if (Attributes & ObjCPropertyAttribute::kind_unsafe_unretained) {\n // ...\n if (getLangOpts().ObjCAutoRefCount && (Attributes & ObjCPropertyAttribute::kind_weak)) {\n Diag(Loc, diag::err_objc_property_attr_mutually_exclusive) << \"unsafe_unretained\""},{G,2727,"void Sema::CheckObjCPropertyAttributes(Decl *PDecl, SourceLocation Loc, unsigned &Attributes, bool propertyInPrimaryClass) {\n // ...\n // Check for more than one of { assign, copy, retain }.\n if (Attributes & ObjCPropertyAttribute::kind_assign) {\n // ...\n } else if (Attributes & ObjCPropertyAttribute::kind_unsafe_unretained) {\n // ...\n } else if (Attributes & ObjCPropertyAttribute::kind_copy) {\n if (Attributes & ObjCPropertyAttribute::kind_retain) {\n Diag(Loc, diag::err_objc_property_attr_mutually_exclusive) << \"copy\""},{G,2732,"void Sema::CheckObjCPropertyAttributes(Decl *PDecl, SourceLocation Loc, unsigned &Attributes, bool propertyInPrimaryClass) {\n // ...\n // Check for more than one of { assign, copy, retain }.\n if (Attributes & ObjCPropertyAttribute::kind_assign) {\n // ...\n } else if (Attributes & ObjCPropertyAttribute::kind_unsafe_unretained) {\n // ...\n } else if (Attributes & ObjCPropertyAttribute::kind_copy) {\n // ...\n if (Attributes & ObjCPropertyAttribute::kind_strong) {\n Diag(Loc, diag::err_objc_property_attr_mutually_exclusive) << \"copy\""},{G,2737,"void Sema::CheckObjCPropertyAttributes(Decl *PDecl, SourceLocation Loc, unsigned &Attributes, bool propertyInPrimaryClass) {\n // ...\n // Check for more than one of { assign, copy, retain }.\n if (Attributes & ObjCPropertyAttribute::kind_assign) {\n // ...\n } else if (Attributes & ObjCPropertyAttribute::kind_unsafe_unretained) {\n // ...\n } else if (Attributes & ObjCPropertyAttribute::kind_copy) {\n // ...\n if (Attributes & ObjCPropertyAttribute::kind_weak) {\n Diag(Loc, diag::err_objc_property_attr_mutually_exclusive) << \"copy\""},{G,2743,"void Sema::CheckObjCPropertyAttributes(Decl *PDecl, SourceLocation Loc, unsigned &Attributes, bool propertyInPrimaryClass) {\n // ...\n // Check for more than one of { assign, copy, retain }.\n if (Attributes & ObjCPropertyAttribute::kind_assign) {\n // ...\n } else if (Attributes & ObjCPropertyAttribute::kind_unsafe_unretained) {\n // ...\n } else if (Attributes & ObjCPropertyAttribute::kind_copy) {\n // ...\n } else if ((Attributes & ObjCPropertyAttribute::kind_retain) && (Attributes & ObjCPropertyAttribute::kind_weak)) {\n Diag(Loc, diag::err_objc_property_attr_mutually_exclusive) << \"retain\""},{G,2748,"void Sema::CheckObjCPropertyAttributes(Decl *PDecl, SourceLocation Loc, unsigned &Attributes, bool propertyInPrimaryClass) {\n // ...\n // Check for more than one of { assign, copy, retain }.\n if (Attributes & ObjCPropertyAttribute::kind_assign) {\n // ...\n } else if (Attributes & ObjCPropertyAttribute::kind_unsafe_unretained) {\n // ...\n } else if (Attributes & ObjCPropertyAttribute::kind_copy) {\n // ...\n } else if ((Attributes & ObjCPropertyAttribute::kind_retain) && (Attributes & ObjCPropertyAttribute::kind_weak)) {\n // ...\n } else if ((Attributes & ObjCPropertyAttribute::kind_strong) && (Attributes & ObjCPropertyAttribute::kind_weak)) {\n Diag(Loc, diag::err_objc_property_attr_mutually_exclusive) << \"strong\""},{G,2757,"void Sema::CheckObjCPropertyAttributes(Decl *PDecl, SourceLocation Loc, unsigned &Attributes, bool propertyInPrimaryClass) {\n // ...\n if (Attributes & ObjCPropertyAttribute::kind_weak) {\n // \'weak\' and \'nonnull\' are mutually exclusive.\n if (auto nullability = PropertyTy->getNullability()) {\n if (*nullability == NullabilityKind::NonNull)\n Diag(Loc, diag::err_objc_property_attr_mutually_exclusive) << \"nonnull\""},{G,2764,"void Sema::CheckObjCPropertyAttributes(Decl *PDecl, SourceLocation Loc, unsigned &Attributes, bool propertyInPrimaryClass) {\n // ...\n if ((Attributes & ObjCPropertyAttribute::kind_atomic) && (Attributes & ObjCPropertyAttribute::kind_nonatomic)) {\n Diag(Loc, diag::err_objc_property_attr_mutually_exclusive) << \"atomic\""}}, [l]={ ["clang/test/SemaObjC/weak-property.m"]={"clang/test/SemaObjC/weak-property.m:13:1: error: property attributes \'assign\' and \'weak\' are mutually exclusive","clang/test/SemaObjC/weak-property.m:14:1: error: property attributes \'copy\' and \'weak\' are mutually exclusive","clang/test/SemaObjC/weak-property.m:15:1: error: property attributes \'retain\' and \'weak\' are mutually exclusive","clang/test/SemaObjC/weak-property.m:16:1: error: property attributes \'assign\' and \'weak\' are mutually exclusive"} } }, ["err_objc_property_bitfield"]={ [j]="err_objc_property_bitfield", [b]="property name cannot be a bit-field", [c]="property name cannot be a bit-field", [e]=d, [f]="property name cannot be a bit\\-field", [g]=a, [i]=u, [h]={R,1236199783,Q,S}, [k]={{B,778,"/// objc-interface-decl-list:\n/// empty\n/// objc-interface-decl-list objc-property-decl [OBJC2]\n/// objc-interface-decl-list objc-method-requirement [OBJC2]\n/// objc-interface-decl-list objc-method-proto \';\'\n/// objc-interface-decl-list declaration\n/// objc-interface-decl-list \';\'\n///\n/// objc-method-requirement: [OBJC2]\n/// @required\n/// @optional\n///\nvoid Parser::ParseObjCInterfaceDeclList(tok::ObjCKeywordKind contextKey, Decl *CDecl) {\n // ...\n while (true) {\n // ...\n case tok::objc_property:\n // ...\n auto ObjCPropertyCallback = [&](ParsingFieldDeclarator &FD) {\n // ...\n if (FD.BitfieldSize) {\n Diag(AtLoc, diag::err_objc_property_bitfield) << FD.D.getSourceRange();"}}, [l]={ ["clang/test/Parser/objc-property-syntax.m"]={"clang/test/Parser/objc-property-syntax.m:7:1: error: property name cannot be a bit-field"} } }, ["err_objc_property_requires_field_name"]={ [j]="err_objc_property_requires_field_name", [b]="property requires fields to be named", [c]="property requires fields to be named", [e]=d, [f]="property requires fields to be named", [g]=a, [i]=u, [h]={R,1236199783,Q,S}, [k]={{B,773,"/// objc-interface-decl-list:\n/// empty\n/// objc-interface-decl-list objc-property-decl [OBJC2]\n/// objc-interface-decl-list objc-method-requirement [OBJC2]\n/// objc-interface-decl-list objc-method-proto \';\'\n/// objc-interface-decl-list declaration\n/// objc-interface-decl-list \';\'\n///\n/// objc-method-requirement: [OBJC2]\n/// @required\n/// @optional\n///\nvoid Parser::ParseObjCInterfaceDeclList(tok::ObjCKeywordKind contextKey, Decl *CDecl) {\n // ...\n while (true) {\n // ...\n case tok::objc_property:\n // ...\n auto ObjCPropertyCallback = [&](ParsingFieldDeclarator &FD) {\n if (FD.D.getIdentifier() == nullptr) {\n Diag(AtLoc, diag::err_objc_property_requires_field_name) << FD.D.getSourceRange();"}}, [l]={ ["clang/test/SemaObjC/property-9.m"]={"clang/test/SemaObjC/property-9.m:48:1: error: property requires fields to be named"} } }, ["err_objc_property_requires_object"]={ [j]="err_objc_property_requires_object", [b]="property with \'%0\' attribute must be of object type", [c]="property with \'A\' attribute must be of object type", [e]=d, [f]="property with \'(.*?)\' attribute must be of object type", [g]=a, [i]=q, [h]={R,1236199783,Q,S}, [k]={{G,2657,"void Sema::CheckObjCPropertyAttributes(Decl *PDecl, SourceLocation Loc, unsigned &Attributes, bool propertyInPrimaryClass) {\n // ...\n // Check for copy or retain on non-object types.\n if ((Attributes & (ObjCPropertyAttribute::kind_weak | ObjCPropertyAttribute::kind_copy | ObjCPropertyAttribute::kind_retain | ObjCPropertyAttribute::kind_strong)) && !PropertyTy->isObjCRetainableType() && !PropertyDecl->hasAttr<ObjCNSObjectAttr>()) {\n Diag(Loc, diag::err_objc_property_requires_object) << (Attributes & ObjCPropertyAttribute::kind_weak ? \"weak\" : Attributes & ObjCPropertyAttribute::kind_copy ? \"copy\" : \"retain (or strong)\");"}}, [l]={ ["clang/test/SemaObjC/property-10.m"]={"clang/test/SemaObjC/property-10.m:8:1: error: property with \'retain (or strong)\' attribute must be of object type","clang/test/SemaObjC/property-10.m:9:1: error: property with \'retain (or strong)\' attribute must be of object type","clang/test/SemaObjC/property-10.m:11:1: error: property with \'copy\' attribute must be of object type","clang/test/SemaObjC/property-10.m:30:1: error: property with \'copy\' attribute must be of object type","clang/test/SemaObjC/property-10.m:35:1: error: property with \'retain (or strong)\' attribute must be of object type","clang/test/SemaObjC/property-10.m:36:1: error: property with \'retain (or strong)\' attribute must be of object type","clang/test/SemaObjC/property-10.m:37:1: error: property with \'copy\' attribute must be of object type","clang/test/SemaObjC/property-10.m:38:1: error: property with \'weak\' attribute must be of object type"} } }, ["err_objc_root_class_subclass"]={ [j]="err_objc_root_class_subclass", [b]="objc_root_class attribute may only be specified on a root class declaration", [c]="objc_root_class attribute may only be specified on a root class declaration", [e]=d, [f]="objc_root_class attribute may only be specified on a root class declaration", [g]=a, [i]=q, [h]={"acfbe9e1f228",1333735942,"Added a new attribute, objc_root_class, which informs the compiler when a root class is intentionall...","Added a new attribute, objc_root_class, which informs the compiler when a root class is intentionally declared.\nThe warning this inhibits, -Wobjc-root-class, is opt-in for now. However, all clang unit tests that would trigger\nthe warning have been updated to use -Wno-objc-root-class. <rdar://problem/7446698>\n\nllvm-svn: 154187"}, [k]={{z,4155,"// 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 (IDecl->getSuperClass() == nullptr) {\n // ...\n } else if (HasRootClassAttr) {\n // ...\n Diag(IDecl->getLocation(), diag::err_objc_root_class_subclass);"}}, [l]={ ["clang/test/SemaObjC/attr-root-class.m"]={"clang/test/SemaObjC/attr-root-class.m:9:12: error: objc_root_class attribute may only be specified on a root class declaration"} } }, ["err_objc_runtime_visible_category"]={ [j]="err_objc_runtime_visible_category", [b]="cannot implement a category for class %0 that is only visible via the Objective-C runtime", [c]="cannot implement a category for class A that is only visible via the Objective-C runtime", [e]=d, [f]="cannot implement a category for class (.*?) that is only visible via the Objective\\-C runtime", [g]=a, [i]=q, [h]={"24ae22c04796",1459553032,"[Objective-C] Introduce objc_runtime_visible attribute.","[Objective-C] Introduce objc_runtime_visible attribute.\n\nThe objc_runtime_visible attribute deals with an odd corner case where\na particular Objective-C class is known to the Objective-C runtime\n(and, therefore, accessible by name) but its symbol has been hidden\nfor some reason. For such classes, teach CodeGen to use\nobjc_lookUpClass to retrieve the Class object, rather than referencing\nthe class symbol directly.\n\nClasses annotated with objc_runtime_visible have two major limitations\nthat fall out from places where Objective-C metadata needs to refer to\nthe class (or metaclass) symbol directly:\n\n* One cannot implement a subclass of an objc_runtime_visible class.\n* One cannot implement a category on an objc_runtime_visible class.\n\nImplements rdar://problem/25494092.\n\nllvm-svn: 265201"}, [k]={{z,1957,"/// ActOnStartCategoryImplementation - Perform semantic checks on the\n/// category implementation declaration and build an ObjCCategoryImplDecl\n/// object.\nObjCCategoryImplDecl *Sema::ActOnStartCategoryImplementation(SourceLocation AtCatImplLoc, IdentifierInfo *ClassName, SourceLocation ClassLoc, IdentifierInfo *CatName, SourceLocation CatLoc, const ParsedAttributesView &Attrs) {\n // ...\n // If the interface has the objc_runtime_visible attribute, we\n // cannot implement a category for it.\n if (IDecl && IDecl->hasAttr<ObjCRuntimeVisibleAttr>()) {\n Diag(ClassLoc, diag::err_objc_runtime_visible_category) << IDecl->getDeclName();"}}, [l]={ ["clang/test/SemaObjC/attr-objc-runtime-visible.m"]={"clang/test/SemaObjC/attr-objc-runtime-visible.m:10:17: error: cannot implement a category for class \'A\' that is only visible via the Objective-C runtime"} } }, ["err_objc_runtime_visible_subclass"]={ [j]="err_objc_runtime_visible_subclass", [b]="cannot implement subclass %0 of a superclass %1 that is only visible via the Objective-C runtime", [c]="cannot implement subclass A of a superclass B that is only visible via the Objective-C runtime", [e]=d, [f]="cannot implement subclass (.*?) of a superclass (.*?) that is only visible via the Objective\\-C runtime", [g]=a, [i]=q, [h]={"24ae22c04796",1459553032,"[Objective-C] Introduce objc_runtime_visible attribute.","[Objective-C] Introduce objc_runtime_visible attribute.\n\nThe objc_runtime_visible attribute deals with an odd corner case where\na particular Objective-C class is known to the Objective-C runtime\n(and, therefore, accessible by name) but its symbol has been hidden\nfor some reason. For such classes, teach CodeGen to use\nobjc_lookUpClass to retrieve the Class object, rather than referencing\nthe class symbol directly.\n\nClasses annotated with objc_runtime_visible have two major limitations\nthat fall out from places where Objective-C metadata needs to refer to\nthe class (or metaclass) symbol directly:\n\n* One cannot implement a subclass of an objc_runtime_visible class.\n* One cannot implement a category on an objc_runtime_visible class.\n\nImplements rdar://problem/25494092.\n\nllvm-svn: 265201"}, [k]={{z,2107,"ObjCImplementationDecl *Sema::ActOnStartClassImplementation(SourceLocation AtClassImplLoc, IdentifierInfo *ClassName, SourceLocation ClassLoc, IdentifierInfo *SuperClassname, SourceLocation SuperClassLoc, const ParsedAttributesView &Attrs) {\n // ...\n // If the superclass has the objc_runtime_visible attribute, we\n // cannot implement a subclass of it.\n if (IDecl->getSuperClass() && IDecl->getSuperClass()->hasAttr<ObjCRuntimeVisibleAttr>()) {\n Diag(ClassLoc, diag::err_objc_runtime_visible_subclass) << IDecl->getDeclName() << IDecl->getSuperClass()->getDeclName();"}}, [l]={ ["clang/test/SemaObjC/attr-objc-runtime-visible.m"]={"clang/test/SemaObjC/attr-objc-runtime-visible.m:16:17: error: cannot implement subclass \'B\' of a superclass \'A\' that is only visible via the Objective-C runtime"} } }, ["err_objc_subscript_base_type"]={ [j]="err_objc_subscript_base_type", [b]="%select{dictionary|array}1 subscript base type %0 is not an Objective-C object", [c]={{nil,nil,{{"dictionary","array"}," subscript base type A is not an Objective-C object"}}}, [e]=d, [f]="(?:dictionary|array) subscript base type (.*?) is not an Objective\\-C object", [g]=a, [i]=q, [h]={ab,1331064356,W,X}, [k]={{O,1166,"bool ObjCSubscriptOpBuilder::findAtIndexGetter() {\n // ...\n if (ResultType.isNull()) {\n S.Diag(BaseExpr->getExprLoc(), diag::err_objc_subscript_base_type) << BaseExpr->getType() << arrayRef;"},{O,1270,"bool ObjCSubscriptOpBuilder::findAtIndexSetter() {\n // ...\n if (ResultType.isNull()) {\n S.Diag(BaseExpr->getExprLoc(), diag::err_objc_subscript_base_type) << BaseExpr->getType() << arrayRef;"}} }, ["err_objc_subscript_dic_object_type"]={ [j]="err_objc_subscript_dic_object_type", [b]="method object parameter type %0 is not object type", [c]="method object parameter type A is not object type", [e]=d, [f]="method object parameter type (.*?) is not object type", [g]=a, [i]=q, [h]={ab,1331064356,W,X}, [k]={{O,1369,"bool ObjCSubscriptOpBuilder::findAtIndexSetter() {\n // ...\n if (AtIndexSetter && arrayRef) {\n // ...\n } else if (AtIndexSetter && !arrayRef)\n for (unsigned i = 0; i < 2; i++) {\n // ...\n if (!T->isObjCObjectPointerType()) {\n if (i == 1)\n // ...\n else\n S.Diag(RefExpr->getBaseExpr()->getExprLoc(), diag::err_objc_subscript_dic_object_type) << T;"}}, [l]={ [Ib]={"clang/test/SemaObjC/objc-container-subscripting.m:40:3: error: method object parameter type \'void *\' is not object type"} } }, ["err_objc_subscript_index_type"]={ [j]="err_objc_subscript_index_type", [b]="method index parameter type %0 is not integral type", [c]="method index parameter type A is not integral type", [e]=d, [f]="method index parameter type (.*?) is not integral type", [g]=a, [i]=q, [h]={ab,1331064356,W,X}, [k]={{O,1229,"bool ObjCSubscriptOpBuilder::findAtIndexGetter() {\n // ...\n if (AtIndexGetter) {\n // ...\n if ((arrayRef && !T->isIntegralOrEnumerationType()) || (!arrayRef && !T->isObjCObjectPointerType())) {\n S.Diag(RefExpr->getKeyExpr()->getExprLoc(), arrayRef ? diag::err_objc_subscript_index_type : diag::err_objc_subscript_key_type) << T;"},{O,1346,"bool ObjCSubscriptOpBuilder::findAtIndexSetter() {\n // ...\n if (AtIndexSetter && arrayRef) {\n // ...\n if (!T->isIntegralOrEnumerationType()) {\n S.Diag(RefExpr->getKeyExpr()->getExprLoc(), diag::err_objc_subscript_index_type) << T;"}}, [l]={ [Ib]={"clang/test/SemaObjC/objc-container-subscripting.m:15:25: error: method index parameter type \'double\' is not integral type","clang/test/SemaObjC/objc-container-subscripting.m:16:9: error: method index parameter type \'void *\' is not integral type"} } }, ["err_objc_subscript_key_type"]={ [j]="err_objc_subscript_key_type", [b]="method key parameter type %0 is not object type", [c]="method key parameter type A is not object type", [e]=d, [f]="method key parameter type (.*?) is not object type", [g]=a, [i]=q, [h]={ab,1331064356,W,X}, [k]={{O,1230,"bool ObjCSubscriptOpBuilder::findAtIndexGetter() {\n // ...\n if (AtIndexGetter) {\n // ...\n if ((arrayRef && !T->isIntegralOrEnumerationType()) || (!arrayRef && !T->isObjCObjectPointerType())) {\n S.Diag(RefExpr->getKeyExpr()->getExprLoc(), arrayRef ? diag::err_objc_subscript_index_type : diag::err_objc_subscript_key_type) << T;"},{O,1366,"bool ObjCSubscriptOpBuilder::findAtIndexSetter() {\n // ...\n if (AtIndexSetter && arrayRef) {\n // ...\n } else if (AtIndexSetter && !arrayRef)\n for (unsigned i = 0; i < 2; i++) {\n // ...\n if (!T->isObjCObjectPointerType()) {\n if (i == 1)\n S.Diag(RefExpr->getKeyExpr()->getExprLoc(), diag::err_objc_subscript_key_type) << T;"}}, [l]={ [Ib]={"clang/test/SemaObjC/objc-container-subscripting.m:39:26: error: method key parameter type \'id *\' is not object type","clang/test/SemaObjC/objc-container-subscripting.m:40:14: error: method key parameter type \'id *\' is not object type"} } }, ["err_objc_subscript_method_not_found"]={ [j]="err_objc_subscript_method_not_found", [b]="expected method to %select{read|write}1 %select{dictionary|array}2 element not found on object of type %0", [c]={{nil,nil,{"expected method to ",{"read","write"}," ",{"dictionary","array"}," element not found on object of type A"}}}, [e]=d, [f]="expected method to (?:read|write) (?:dictionary|array) element not found on object of type (.*?)", [g]=a, [i]=q, [h]={ab,1331064356,W,X}, [k]={{O,1214,"bool ObjCSubscriptOpBuilder::findAtIndexGetter() {\n // ...\n if (!AtIndexGetter) {\n if (!BaseT->isObjCIdType()) {\n S.Diag(BaseExpr->getExprLoc(), diag::err_objc_subscript_method_not_found) << BaseExpr->getType() << 0 << arrayRef;"},{O,1331,"bool ObjCSubscriptOpBuilder::findAtIndexSetter() {\n // ...\n if (!AtIndexSetter) {\n if (!BaseT->isObjCIdType()) {\n S.Diag(BaseExpr->getExprLoc(), diag::err_objc_subscript_method_not_found) << BaseExpr->getType() << 1 << arrayRef;"}}, [l]={ [Ib]={"clang/test/SemaObjC/objc-container-subscripting.m:20:3: error: expected method to write array element not found on object of type \'I *\'","clang/test/SemaObjC/objc-container-subscripting.m:21:10: error: expected method to read array element not found on object of type \'I *\'"} } }, ["err_objc_subscript_object_type"]={ [j]="err_objc_subscript_object_type", [b]="cannot assign to this %select{dictionary|array}1 because assigning method\'s 2nd parameter of type %0 is not an Objective-C pointer type", [c]={{nil,nil,{"cannot assign to this ",{"dictionary","array"}," because assigning method\'s 2nd parameter of type A is not an Objective-C pointer type"}}}, [e]=d, [f]="cannot assign to this (?:dictionary|array) because assigning method\'s 2nd parameter of type (.*?) is not an Objective\\-C pointer type", [g]=a, [i]=q, [h]={ab,1331064356,W,X}, [k]={{O,1354,"bool ObjCSubscriptOpBuilder::findAtIndexSetter() {\n // ...\n if (AtIndexSetter && arrayRef) {\n // ...\n if (!T->isObjCObjectPointerType()) {\n S.Diag(RefExpr->getBaseExpr()->getExprLoc(), diag::err_objc_subscript_object_type) << T << arrayRef;"}}, [l]={ [Ib]={"clang/test/SemaObjC/objc-container-subscripting.m:16:3: error: cannot assign to this array because assigning method\'s 2nd parameter of type \'id *\' is not an Objective-C pointer type"} } }, ["err_objc_subscript_pointer"]={ [j]="err_objc_subscript_pointer", [b]="indexing expression is invalid because subscript type %0 is not an Objective-C pointer", [c]="indexing expression is invalid because subscript type A is not an Objective-C pointer", [e]=d, [f]="indexing expression is invalid because subscript type (.*?) is not an Objective\\-C pointer", [g]=a, [i]=q, [h]={"ba0afde486f5",1332957409,"objective-c: Improve diagnostics and","objective-c: Improve diagnostics and\nprovide \'fixit\' hint when dictionary index \nis not of proper type. // rdar://11062080\n\nllvm-svn: 153584"}, [k]={{O,1070,"/// CheckSubscriptingKind - This routine decide what type\n/// of indexing represented by \"FromE\" is being done.\nSema::ObjCSubscriptKind Sema::CheckSubscriptingKind(Expr *FromE) {\n // ...\n if (!getLangOpts().CPlusPlus || !RecordTy || RecordTy->isIncompleteType()) {\n // ...\n if (isa<StringLiteral>(IndexExpr))\n Diag(FromE->getExprLoc(), diag::err_objc_subscript_pointer) << T << FixItHint::CreateInsertion(FromE->getExprLoc(), \"@\");"}}, [l]={ ["clang/test/SemaObjC/objc-dictionary-literal.m"]={"clang/test/SemaObjC/objc-dictionary-literal.m:50:14: error: indexing expression is invalid because subscript type \'char *\' is not an Objective-C pointer"} } }, ["err_objc_subscript_type_conversion"]={ [j]="err_objc_subscript_type_conversion", [b]="indexing expression is invalid because subscript type %0 is not an integral or Objective-C pointer type", [c]="indexing expression is invalid because subscript type A is not an integral or Objective-C pointer type", [e]=d, [f]="indexing expression is invalid because subscript type (.*?) is not an integral or Objective\\-C pointer type", [g]=a, [i]=q, [h]={ab,1331064356,W,X}, [k]={{O,1073,"/// CheckSubscriptingKind - This routine decide what type\n/// of indexing represented by \"FromE\" is being done.\nSema::ObjCSubscriptKind Sema::CheckSubscriptingKind(Expr *FromE) {\n // ...\n if (!getLangOpts().CPlusPlus || !RecordTy || RecordTy->isIncompleteType()) {\n // ...\n if (isa<StringLiteral>(IndexExpr))\n // ...\n else\n Diag(FromE->getExprLoc(), diag::err_objc_subscript_type_conversion) << T;"},{O,1109,"/// CheckSubscriptingKind - This routine decide what type\n/// of indexing represented by \"FromE\" is being done.\nSema::ObjCSubscriptKind Sema::CheckSubscriptingKind(Expr *FromE) {\n // ...\n if (NoIntegrals == 0 && NoObjCIdPointers == 0) {\n // ...\n Diag(FromE->getExprLoc(), diag::err_objc_subscript_type_conversion) << FromE->getType();"}}, [l]={ ["clang/test/SemaObjC/objc-container-subscripting-2.m"]={"clang/test/SemaObjC/objc-container-subscripting-2.m:19:9: error: indexing expression is invalid because subscript type \'float\' is not an integral or Objective-C pointer type","clang/test/SemaObjC/objc-container-subscripting-2.m:20:16: error: indexing expression is invalid because subscript type \'double\' is not an integral or Objective-C pointer type"} } }, ["err_objc_synchronized_expects_object"]={ [j]="err_objc_synchronized_expects_object", [b]="@synchronized requires an Objective-C object type (%0 invalid)", [c]="@synchronized requires an Objective-C object type (A invalid)", [e]=d, [f]="@synchronized requires an Objective\\-C object type \\((.*?) invalid\\)", [g]=a, [i]=q, [h]={"f881267db9a9",1480718311,"Mass-rename the handful of error_* diagnostics to err_*.","Mass-rename the handful of error_* diagnostics to err_*.\n\nllvm-svn: 288545"}, [k]={{fb,4313,"ExprResult Sema::ActOnObjCAtSynchronizedOperand(SourceLocation atLoc, Expr *operand) {\n // ...\n if (!type->isDependentType() && !type->isObjCObjectPointerType()) {\n // ...\n if (!pointerType || !pointerType->getPointeeType()->isVoidType()) {\n if (getLangOpts().CPlusPlus) {\n if (RequireCompleteType(atLoc, type, diag::err_incomplete_receiver_type))\n return Diag(atLoc, diag::err_objc_synchronized_expects_object) << type << operand->getSourceRange();"},{fb,4320,"ExprResult Sema::ActOnObjCAtSynchronizedOperand(SourceLocation atLoc, Expr *operand) {\n // ...\n if (!type->isDependentType() && !type->isObjCObjectPointerType()) {\n // ...\n if (!pointerType || !pointerType->getPointeeType()->isVoidType()) {\n if (getLangOpts().CPlusPlus) {\n // ...\n if (!result.isUsable())\n return Diag(atLoc, diag::err_objc_synchronized_expects_object) << type << operand->getSourceRange();"},{fb,4325,"ExprResult Sema::ActOnObjCAtSynchronizedOperand(SourceLocation atLoc, Expr *operand) {\n // ...\n if (!type->isDependentType() && !type->isObjCObjectPointerType()) {\n // ...\n if (!pointerType || !pointerType->getPointeeType()->isVoidType()) {\n if (getLangOpts().CPlusPlus) {\n // ...\n } else {\n return Diag(atLoc, diag::err_objc_synchronized_expects_object) << type << operand->getSourceRange();"}}, [l]={ ["clang/test/SemaObjCXX/synchronized.mm"]={"clang/test/SemaObjCXX/synchronized.mm:18:3: error: @synchronized requires an Objective-C object type (\'struct y\' invalid)"} } }, ["err_objc_throw_expects_object"]={ [j]="err_objc_throw_expects_object", [b]="@throw requires an Objective-C object type (%0 invalid)", [c]="@throw requires an Objective-C object type (A invalid)", [e]=d, [f]="@throw requires an Objective\\-C object type \\((.*?) invalid\\)", [g]=a, [i]=q, [h]={"f881267db9a9",1480718311,"Mass-rename the handful of error_* diagnostics to err_*.","Mass-rename the handful of error_* diagnostics to err_*.\n\nllvm-svn: 288545"}, [k]={{fb,4271,"StmtResult Sema::BuildObjCAtThrowStmt(SourceLocation AtLoc, Expr *Throw) {\n if (Throw) {\n // ...\n // Make sure the expression type is an ObjC pointer or \"void *\".\n if (!ThrowType->isDependentType() && !ThrowType->isObjCObjectPointerType()) {\n // ...\n if (!PT || !PT->getPointeeType()->isVoidType())\n return StmtError(Diag(AtLoc, diag::err_objc_throw_expects_object) << Throw->getType() << Throw->getSourceRange());"}}, [l]={ ["clang/test/SemaObjC/try-catch.m"]={"clang/test/SemaObjC/try-catch.m:48:3: error: @throw requires an Objective-C object type (\'int\' invalid)","clang/test/SemaObjC/try-catch.m:49:3: error: @throw requires an Objective-C object type (\'struct s\' invalid)","clang/test/SemaObjC/try-catch.m:50:3: error: @throw requires an Objective-C object type (\'struct s *\' invalid)"} } }, ["err_objc_type_arg_does_not_match_bound"]={ [j]="err_objc_type_arg_does_not_match_bound", [b]="type argument %0 does not satisfy the bound (%1) of type parameter %2", [c]="type argument A does not satisfy the bound (B) of type parameter C", [e]=d, [f]="type argument (.*?) does not satisfy the bound \\((.*?)\\) of type parameter (.*?)", [g]=a, [i]=C, [h]={cb,1436241455,bb,db}, [k]={{K,969,"/// Apply Objective-C type arguments to the given type.\nstatic QualType applyObjCTypeArgs(Sema &S, SourceLocation loc, QualType type, ArrayRef<TypeSourceInfo *> typeArgs, SourceRange typeArgsRange, bool failOnError, bool rebuilding) {\n // ...\n for (unsigned i = 0, n = typeArgs.size(); i != n; ++i) {\n // ...\n // Objective-C object pointer types must be substitutable for the bounds.\n if (const auto *typeArgObjC = typeArg->getAs<ObjCObjectPointerType>()) {\n // ...\n S.Diag(typeArgInfo->getTypeLoc().getBeginLoc(), diag::err_objc_type_arg_does_not_match_bound) << typeArg << bound << typeParam->getDeclName();"},{K,997,"/// Apply Objective-C type arguments to the given type.\nstatic QualType applyObjCTypeArgs(Sema &S, SourceLocation loc, QualType type, ArrayRef<TypeSourceInfo *> typeArgs, SourceRange typeArgsRange, bool failOnError, bool rebuilding) {\n // ...\n for (unsigned i = 0, n = typeArgs.size(); i != n; ++i) {\n // ...\n // Block pointer types are permitted for unqualified \'id\' bounds.\n if (typeArg->isBlockPointerType()) {\n // ...\n S.Diag(typeArgInfo->getTypeLoc().getBeginLoc(), diag::err_objc_type_arg_does_not_match_bound) << typeArg << bound << typeParam->getDeclName();"}}, [l]={ [M]={"clang/test/SemaObjC/parameterized_classes.m:272:14: error: type argument \'NSObject *\' does not satisfy the bound (\'id<NSCopying>\') of type parameter \'V\'","clang/test/SemaObjC/parameterized_classes.m:275:14: error: type argument \'id\' does not satisfy the bound (\'NSObject *\') of type parameter \'U\'","clang/test/SemaObjC/parameterized_classes.m:279:14: error: type argument \'id\' does not satisfy the bound (\'id<NSCopying>\') of type parameter \'V\'","clang/test/SemaObjC/parameterized_classes.m:323:29: error: type argument \'T\' (aka \'id\') does not satisfy the bound (\'NSObject *\') of type parameter \'U\'"} } }, ["err_objc_type_arg_explicit_nullability"]={ [j]="err_objc_type_arg_explicit_nullability", [b]="type argument %0 cannot explicitly specify nullability", [c]="type argument A cannot explicitly specify nullability", [e]=d, [f]="type argument (.*?) cannot explicitly specify nullability", [g]=a, [i]=Lb, [h]={"6997525eaa8f",1443046461,"Forbid qualifiers on ObjC generic parameters and arguments, but","Forbid qualifiers on ObjC generic parameters and arguments, but\nsilently ignore them on arguments when they\'re provided indirectly\n(.e.g behind a template argument or typedef).\n\nThis is mostly just good language design --- specifying that a\ngeneric argument is __weak doesn\'t actually do anything --- but\nit also prevents assertions when trying to apply a different\nownership qualifier.\n\nrdar://21612439\n\nllvm-svn: 248436"}, [k]={{K,897,"/// Apply Objective-C type arguments to the given type.\nstatic QualType applyObjCTypeArgs(Sema &S, SourceLocation loc, QualType type, ArrayRef<TypeSourceInfo *> typeArgs, SourceRange typeArgsRange, bool failOnError, bool rebuilding) {\n // ...\n for (unsigned i = 0, n = typeArgs.size(); i != n; ++i) {\n // ...\n // Type arguments cannot have explicit qualifiers or nullability.\n // We ignore indirect sources of these, e.g. behind typedefs or\n // template arguments.\n if (TypeLoc qual = typeArgInfo->getTypeLoc().findExplicitQualifierLoc()) {\n // ...\n if (auto attr = qual.getAs<AttributedTypeLoc>()) {\n // ...\n if (attr.getTypePtr()->getImmediateNullability()) {\n // ...\n S.Diag(attr.getBeginLoc(), diag::err_objc_type_arg_explicit_nullability) << typeArg << FixItHint::CreateRemoval(rangeToRemove);"}}, [l]={ ["clang/test/SemaObjC/parameterized_classes_subst.m"]={"clang/test/SemaObjC/parameterized_classes_subst.m:140:18: error: type argument \'NSControl *\' cannot explicitly specify nullability"} } }, ["err_objc_type_arg_missing"]={ [j]="err_objc_type_arg_missing", [b]="no type or protocol named %0", [c]="no type or protocol named A", [e]=d, [f]="no type or protocol named (.*?)", [g]=a, [i]=D, [h]={cb,1436241455,bb,db}, [k]={{z,1744,"void Sema::actOnObjCTypeArgsOrProtocolQualifiers(Scope *S, ParsedType baseType, SourceLocation lAngleLoc, ArrayRef<IdentifierInfo *> identifiers, ArrayRef<SourceLocation> identifierLocs, SourceLocation rAngleLoc, SourceLocation &typeArgsLAngleLoc, SmallVectorImpl<ParsedType> &typeArgs, SourceLocation &typeArgsRAngleLoc, SourceLocation &protocolLAngleLoc, SmallVectorImpl<Decl *> &protocols, SourceLocation &protocolRAngleLoc, bool warnOnIncompleteProtocols) {\n // ...\n for (unsigned i = 0, n = identifiers.size(); i != n; ++i) {\n // ...\n Diag(identifierLocs[i], (lookupKind == LookupAnyName ? diag::err_objc_type_arg_missing : lookupKind == LookupObjCProtocolName ? diag::err_undeclared_protocol : diag::err_unknown_typename)) << identifiers[i];"}}, [l]={ ["clang/test/SemaObjC/interface-1.m"]={"clang/test/SemaObjC/interface-1.m:6:2: error: no type or protocol named \'NSCopying\'"} } }, ["err_objc_type_arg_missing_star"]={ [j]="err_objc_type_arg_missing_star", [b]="type argument %0 must be a pointer (requires a \'*\')", [c]="type argument A must be a pointer (requires a \'*\')", [e]=d, [f]="type argument (.*?) must be a pointer \\(requires a \'\\*\'\\)", [g]=a, [i]=D, [h]={cb,1436241455,bb,db}, [k]={{z,1621,"void Sema::actOnObjCTypeArgsOrProtocolQualifiers(Scope *S, ParsedType baseType, SourceLocation lAngleLoc, ArrayRef<IdentifierInfo *> identifiers, ArrayRef<SourceLocation> identifierLocs, SourceLocation rAngleLoc, SourceLocation &typeArgsLAngleLoc, SmallVectorImpl<ParsedType> &typeArgs, SourceLocation &typeArgsRAngleLoc, SourceLocation &protocolLAngleLoc, SmallVectorImpl<Decl *> &protocols, SourceLocation &protocolRAngleLoc, bool warnOnIncompleteProtocols) {\n // ...\n // Local function that forms a reference to the given type or\n // Objective-C class declaration.\n auto resolveTypeReference = [&](TypeOrClassDecl typeDecl, SourceLocation loc) -> TypeResult {\n // ...\n // If we have a typedef of an Objective-C class type that is missing a \'*\',\n // add the \'*\'.\n if (type->getAs<ObjCInterfaceType>()) {\n // ...\n Diag(loc, diag::err_objc_type_arg_missing_star) << type << FixItHint::CreateInsertion(starLoc, \" *\");"}}, [l]={ [M]={"clang/test/SemaObjC/parameterized_classes.m:211:13: error: type argument \'NSObject\' must be a pointer (requires a \'*\')","clang/test/SemaObjC/parameterized_classes.m:224:17: error: type argument \'NSObject\' must be a pointer (requires a \'*\')","clang/test/SemaObjC/parameterized_classes.m:230:21: error: type argument \'NSObject\' must be a pointer (requires a \'*\')","clang/test/SemaObjC/parameterized_classes.m:237:13: error: type argument \'NSObject\' must be a pointer (requires a \'*\')","clang/test/SemaObjC/parameterized_classes.m:237:23: error: type argument \'NSObject\' must be a pointer (requires a \'*\')"} } }, ["err_objc_type_arg_not_id_compatible"]={ [j]="err_objc_type_arg_not_id_compatible", [b]="type argument %0 is neither an Objective-C object nor a block type", [c]="type argument A is neither an Objective-C object nor a block type", [e]=d, [f]="type argument (.*?) is neither an Objective\\-C object nor a block type", [g]=a, [i]=C, [h]={cb,1436241455,bb,db}, [k]={{K,1015,"/// Apply Objective-C type arguments to the given type.\nstatic QualType applyObjCTypeArgs(Sema &S, SourceLocation loc, QualType type, ArrayRef<TypeSourceInfo *> typeArgs, SourceRange typeArgsRange, bool failOnError, bool rebuilding) {\n // ...\n for (unsigned i = 0, n = typeArgs.size(); i != n; ++i) {\n // ...\n S.Diag(typeArgInfo->getTypeLoc().getBeginLoc(), diag::err_objc_type_arg_not_id_compatible) << typeArg << typeArgInfo->getTypeLoc().getSourceRange();"}} }, ["err_objc_type_arg_qualified"]={ [j]="err_objc_type_arg_qualified", [b]="type argument %0 cannot be qualified with \'%1\'", [c]="type argument A cannot be qualified with \'B\'", [e]=d, [f]="type argument (.*?) cannot be qualified with \'(.*?)\'", [g]=a, [i]=D, [h]={"6997525eaa8f",1443046461,"Forbid qualifiers on ObjC generic parameters and arguments, but","Forbid qualifiers on ObjC generic parameters and arguments, but\nsilently ignore them on arguments when they\'re provided indirectly\n(.e.g behind a template argument or typedef).\n\nThis is mostly just good language design --- specifying that a\ngeneric argument is __weak doesn\'t actually do anything --- but\nit also prevents assertions when trying to apply a different\nownership qualifier.\n\nrdar://21612439\n\nllvm-svn: 248436"}, [k]={{K,906,"/// Apply Objective-C type arguments to the given type.\nstatic QualType applyObjCTypeArgs(Sema &S, SourceLocation loc, QualType type, ArrayRef<TypeSourceInfo *> typeArgs, SourceRange typeArgsRange, bool failOnError, bool rebuilding) {\n // ...\n for (unsigned i = 0, n = typeArgs.size(); i != n; ++i) {\n // ...\n // Type arguments cannot have explicit qualifiers or nullability.\n // We ignore indirect sources of these, e.g. behind typedefs or\n // template arguments.\n if (TypeLoc qual = typeArgInfo->getTypeLoc().findExplicitQualifierLoc()) {\n // ...\n // When rebuilding, qualifiers might have gotten here through a\n // final substitution.\n if (!rebuilding && !diagnosed) {\n S.Diag(qual.getBeginLoc(), diag::err_objc_type_arg_qualified) << typeArg << typeArg.getQualifiers().getAsString() << FixItHint::CreateRemoval(rangeToRemove);"}}, [l]={ ["clang/test/SemaObjC/parameterized_classes_arc.m"]={"clang/test/SemaObjC/parameterized_classes_arc.m:19:24: error: type argument \'__weak id\' cannot be qualified with \'__weak\'","clang/test/SemaObjC/parameterized_classes_arc.m:24:26: error: type argument \'__strong id\' cannot be qualified with \'__strong\'","clang/test/SemaObjC/parameterized_classes_arc.m:35:24: error: type argument \'Forward *__weak\' cannot be qualified with \'__weak\'","clang/test/SemaObjC/parameterized_classes_arc.m:40:26: error: type argument \'Forward *__strong\' cannot be qualified with \'__strong\'","clang/test/SemaObjC/parameterized_classes_arc.m:64:23: error: type argument \'const id\' cannot be qualified with \'const\'","clang/test/SemaObjC/parameterized_classes_arc.m:69:26: error: type argument \'volatile id\' cannot be qualified with \'volatile\'","clang/test/SemaObjC/parameterized_classes_arc.m:74:53: error: type argument \'__attribute__((address_space(256))) id\' cannot be qualified with \'__attribute__((address_space(256)))\'"} } }, ["err_objc_type_args_after_protocols"]={ [j]="err_objc_type_args_after_protocols", [b]="protocol qualifiers must precede type arguments", [c]="protocol qualifiers must precede type arguments", [e]=d, [f]="protocol qualifiers must precede type arguments", [g]=a, [i]=D, [h]={cb,1436241455,bb,db}, [k]={{B,1858,"void Parser::parseObjCTypeArgsAndProtocolQualifiers(ParsedType baseType, SourceLocation &typeArgsLAngleLoc, SmallVectorImpl<ParsedType> &typeArgs, SourceLocation &typeArgsRAngleLoc, SourceLocation &protocolLAngleLoc, SmallVectorImpl<Decl *> &protocols, SmallVectorImpl<SourceLocation> &protocolLocs, SourceLocation &protocolRAngleLoc, bool consumeLastToken) {\n // ...\n // An Objective-C object pointer followed by type arguments\n // can then be followed again by a set of protocol references, e.g.,\n // \\c NSArray<NSView><NSTextDelegate>\n if ((consumeLastToken && Tok.is(tok::less)) || (!consumeLastToken && NextToken().is(tok::less))) {\n // ...\n if (!protocols.empty()) {\n // ...\n Diag(Tok, diag::err_objc_type_args_after_protocols) << SourceRange(protocolLAngleLoc, protocolRAngleLoc);"}}, [l]={ [M]={"clang/test/SemaObjC/parameterized_classes.m:221:33: error: protocol qualifiers must precede type arguments"} } }, ["err_objc_type_args_and_protocols"]={ [j]="err_objc_type_args_and_protocols", [b]="angle brackets contain both a %select{type|protocol}0 (%1) and a %select{protocol|type}0 (%2)", [c]={{nil,nil,{"angle brackets contain both a ",{"type","protocol"}," (B) and a ",{"protocol","type"}," (C)"}}}, [e]=d, [f]="angle brackets contain both a (?:type|protocol) \\((.*?)\\) and a (?:protocol|type) \\((.*?)\\)", [g]=a, [i]=D, [h]={cb,1436241455,bb,db}, [k]={{z,1422,"void Sema::DiagnoseTypeArgsAndProtocols(IdentifierInfo *ProtocolId, SourceLocation ProtocolLoc, IdentifierInfo *TypeArgId, SourceLocation TypeArgLoc, bool SelectProtocolFirst) { Diag(TypeArgLoc, diag::err_objc_type_args_and_protocols) << SelectProtocolFirst << TypeArgId << ProtocolId << SourceRange(ProtocolLoc); }"}}, [l]={ [M]={"clang/test/SemaObjC/parameterized_classes.m:242:24: error: angle brackets contain both a type (\'ObjCStringRef\') and a protocol (\'NSCopying\')","clang/test/SemaObjC/parameterized_classes.m:243:24: error: angle brackets contain both a type (\'NSString\') and a protocol (\'NSCopying\')","clang/test/SemaObjC/parameterized_classes.m:244:37: error: angle brackets contain both a type (\'NSString\') and a protocol (\'NSCopying\')","clang/test/SemaObjC/parameterized_classes.m:246:13: error: angle brackets contain both a type (\'NSString\') and a protocol (\'NSCopying\')"} } }, ["err_objc_type_args_non_class"]={ [j]="err_objc_type_args_non_class", [b]="type arguments cannot be applied to non-class type %0", [c]="type arguments cannot be applied to non-class type A", [e]=d, [f]="type arguments cannot be applied to non\\-class type (.*?)", [g]=a, [i]=D, [h]={cb,1436241455,bb,db}, [k]={{K,843,"/// Apply Objective-C type arguments to the given type.\nstatic QualType applyObjCTypeArgs(Sema &S, SourceLocation loc, QualType type, ArrayRef<TypeSourceInfo *> typeArgs, SourceRange typeArgsRange, bool failOnError, bool rebuilding) {\n // ...\n if (!objcObjectType || !objcObjectType->getInterface()) {\n S.Diag(loc, diag::err_objc_type_args_non_class) << type << typeArgsRange;"}}, [l]={ [M]={"clang/test/SemaObjC/parameterized_classes.m:289:9: error: type arguments cannot be applied to non-class type \'id\'"} } }, ["err_objc_type_args_non_parameterized_class"]={ [j]="err_objc_type_args_non_parameterized_class", [b]="type arguments cannot be applied to non-parameterized class %0", [c]="type arguments cannot be applied to non-parameterized class A", [e]=d, [f]="type arguments cannot be applied to non\\-parameterized class (.*?)", [g]=a, [i]=D, [h]={cb,1436241455,bb,db}, [k]={{K,856,"/// Apply Objective-C type arguments to the given type.\nstatic QualType applyObjCTypeArgs(Sema &S, SourceLocation loc, QualType type, ArrayRef<TypeSourceInfo *> typeArgs, SourceRange typeArgsRange, bool failOnError, bool rebuilding) {\n // ...\n if (!typeParams) {\n S.Diag(loc, diag::err_objc_type_args_non_parameterized_class) << objcClass->getDeclName() << FixItHint::CreateRemoval(typeArgsRange);"}}, [l]={ [M]={"clang/test/SemaObjC/parameterized_classes.m:287:9: error: type arguments cannot be applied to non-parameterized class \'NSObject\'"} } }, ["err_objc_type_args_specialized_class"]={ [j]="err_objc_type_args_specialized_class", [b]="type arguments cannot be applied to already-specialized class type %0", [c]="type arguments cannot be applied to already-specialized class type A", [e]=d, [f]="type arguments cannot be applied to already\\-specialized class type (.*?)", [g]=a, [i]=D, [h]={cb,1436241455,bb,db}, [k]={{K,868,"/// Apply Objective-C type arguments to the given type.\nstatic QualType applyObjCTypeArgs(Sema &S, SourceLocation loc, QualType type, ArrayRef<TypeSourceInfo *> typeArgs, SourceRange typeArgsRange, bool failOnError, bool rebuilding) {\n // ...\n // The type must not already be specialized.\n if (objcObjectType->isSpecialized()) {\n S.Diag(loc, diag::err_objc_type_args_specialized_class) << type << FixItHint::CreateRemoval(typeArgsRange);"}}, [l]={ [M]={"clang/test/SemaObjC/parameterized_classes.m:297:9: error: type arguments cannot be applied to already-specialized class type \'typeArgs15\' (aka \'PC1<NSObject *,NSString *>\')"} } }, ["err_objc_type_args_wrong_arity"]={ [j]="err_objc_type_args_wrong_arity", [b]="too %select{many|few}0 type arguments for class %1 (have %2, expected %3)", [c]={{nil,nil,{"too ",{"many","few"}," type arguments for class B (have C, expected D)"}}}, [e]=d, [f]="too (?:many|few) type arguments for class (.*?) \\(have (.*?), expected (.*?)\\)", [g]=a, [i]=D, [h]={cb,1436241455,bb,db}, [k]={{K,927,"/// Apply Objective-C type arguments to the given type.\nstatic QualType applyObjCTypeArgs(Sema &S, SourceLocation loc, QualType type, ArrayRef<TypeSourceInfo *> typeArgs, SourceRange typeArgsRange, bool failOnError, bool rebuilding) {\n // ...\n for (unsigned i = 0, n = typeArgs.size(); i != n; ++i) {\n // ...\n if (!anyPackExpansions) {\n if (i < numTypeParams) {\n // ...\n } else {\n // ...\n S.Diag(loc, diag::err_objc_type_args_wrong_arity) << false << objcClass->getDeclName() << (unsigned)typeArgs.size() << numTypeParams;"},{K,1026,"/// Apply Objective-C type arguments to the given type.\nstatic QualType applyObjCTypeArgs(Sema &S, SourceLocation loc, QualType type, ArrayRef<TypeSourceInfo *> typeArgs, SourceRange typeArgsRange, bool failOnError, bool rebuilding) {\n // ...\n // Make sure we didn\'t have the wrong number of arguments.\n if (!anyPackExpansions && finalTypeArgs.size() != numTypeParams) {\n S.Diag(loc, diag::err_objc_type_args_wrong_arity) << (typeArgs.size() < typeParams->size()) << objcClass->getDeclName() << (unsigned)finalTypeArgs.size() << (unsigned)numTypeParams;"}}, [l]={ [M]={"clang/test/SemaObjC/parameterized_classes.m:261:9: error: too few type arguments for class \'PC4\' (have 1, expected 3)","clang/test/SemaObjC/parameterized_classes.m:263:9: error: too many type arguments for class \'PC4\' (have 4, expected 3)","clang/test/SemaObjC/parameterized_classes.m:317:35: error: too few type arguments for class \'PC1\' (have 1, expected 2)"} } }, ["err_objc_type_param_arity_mismatch"]={ [j]="err_objc_type_param_arity_mismatch", [b]="%select{forward class declaration|class definition|category|extension}0 has too %select{few|many}1 type parameters (expected %2, have %3)", [c]={{nil,nil,{{"forward class declaration","class definition","category","extension"}," has too ",{"few","many"}," type parameters (expected C, have D)"}}}, [e]=d, [f]="(?:forward class declaration|class definition|category|extension) has too (?:few|many) type parameters \\(expected (.*?), have (.*?)\\)", [g]=a, [i]=D, [h]={Y,1436241435,V,Z}, [k]={{z,842,"/// Check consistency between two Objective-C type parameter lists, e.g.,\n/// between a category/extension and an \\@interface or between an \\@class and an\n/// \\@interface.\nstatic bool checkTypeParamListConsistency(Sema &S, ObjCTypeParamList *prevTypeParams, ObjCTypeParamList *newTypeParams, TypeParamListContext newContext) {\n // If the sizes don\'t match, complain about that.\n if (prevTypeParams->size() != newTypeParams->size()) {\n // ...\n S.Diag(diagLoc, diag::err_objc_type_param_arity_mismatch) << static_cast<unsigned>(newContext) << (newTypeParams->size() > prevTypeParams->size()) << prevTypeParams->size() << newTypeParams->size();"}}, [l]={ [M]={"clang/test/SemaObjC/parameterized_classes.m:143:17: error: extension has too few type parameters (expected 2, have 1)","clang/test/SemaObjC/parameterized_classes.m:147:22: error: category has too many type parameters (expected 2, have 3)"} } }, ["err_objc_type_param_bound_conflict"]={ [j]="err_objc_type_param_bound_conflict", [b]="type bound %0 for type parameter %1 conflicts with %select{implicit|previous}2 bound %3%select{for type parameter %5|}4", [c]={{nil,nil,{"type bound A for type parameter B conflicts with ",{"implicit","previous"}," bound D",{"for type parameter F",a}}}}, [e]=d, [f]="type bound (.*?) for type parameter (.*?) conflicts with (?:implicit|previous) bound (.*?)(?:for type parameter (.*?)|)", [g]=a, [i]=D, [h]={Y,1436241435,V,Z}, [k]={{z,925,"/// Check consistency between two Objective-C type parameter lists, e.g.,\n/// between a category/extension and an \\@interface or between an \\@class and an\n/// \\@interface.\nstatic bool checkTypeParamListConsistency(Sema &S, ObjCTypeParamList *prevTypeParams, ObjCTypeParamList *newTypeParams, TypeParamListContext newContext) {\n // ...\n // Match up the type parameters.\n for (unsigned i = 0, n = prevTypeParams->size(); i != n; ++i) {\n // ...\n // If the new type parameter\'s bound was explicit, complain about it being\n // different from the original.\n if (newTypeParam->hasExplicitBound()) {\n // ...\n S.Diag(newBoundRange.getBegin(), diag::err_objc_type_param_bound_conflict) << newTypeParam->getUnderlyingType() << newTypeParam->getDeclName() << prevTypeParam->hasExplicitBound() << prevTypeParam->getUnderlyingType() << (newTypeParam->getDeclName() == prevTypeParam->getDeclName()) << prevTypeParam->getDeclName() << FixItHint::CreateReplacement(newBoundRange, prevTypeParam->getUnderlyingType().getAsString(S.Context.getPrintingPolicy()));"}}, [l]={ ["clang/test/SemaObjCXX/nullability-pragmas.mm"]={"clang/test/SemaObjCXX/Inputs/nullability-pragmas-generics-1.h:20:26: error: type bound \'C *\' for type parameter \'T\' conflicts with previous bound \'B *\'"} } }, ["err_objc_type_param_bound_explicit_nullability"]={ [j]="err_objc_type_param_bound_explicit_nullability", [b]="type parameter %0 bound %1 cannot explicitly specify nullability", [c]="type parameter A bound B cannot explicitly specify nullability", [e]=d, [f]="type parameter (.*?) bound (.*?) cannot explicitly specify nullability", [g]=a, [i]=Lb, [h]={"6997525eaa8f",1443046461,"Forbid qualifiers on ObjC generic parameters and arguments, but","Forbid qualifiers on ObjC generic parameters and arguments, but\nsilently ignore them on arguments when they\'re provided indirectly\n(.e.g behind a template argument or typedef).\n\nThis is mostly just good language design --- specifying that a\ngeneric argument is __weak doesn\'t actually do anything --- but\nit also prevents assertions when trying to apply a different\nownership qualifier.\n\nrdar://21612439\n\nllvm-svn: 248436"}, [k]={{z,728,"DeclResult Sema::actOnObjCTypeParam(Scope *S, ObjCTypeParamVariance variance, SourceLocation varianceLoc, unsigned index, IdentifierInfo *paramName, SourceLocation paramLoc, SourceLocation colonLoc, ParsedType parsedTypeBound) {\n // ...\n if (parsedTypeBound) {\n // ...\n // Type bounds cannot have qualifiers (even indirectly) or explicit\n // nullability.\n if (typeBoundInfo) {\n // ...\n if (qual || typeBound.hasQualifiers()) {\n // ...\n if (qual) {\n if (auto attr = qual.getAs<AttributedTypeLoc>()) {\n // ...\n if (attr.getTypePtr()->getImmediateNullability()) {\n Diag(attr.getBeginLoc(), diag::err_objc_type_param_bound_explicit_nullability) << paramName << typeBound << FixItHint::CreateRemoval(rangeToRemove);"}}, [l]={ ["clang/test/SemaObjC/parameterized_classes_subst.m"]={"clang/test/SemaObjC/parameterized_classes_subst.m:123:39: error: type parameter \'ViewType\' bound \'NSView * _Nullable\' cannot explicitly specify nullability"} } }, ["err_objc_type_param_bound_missing"]={ [j]="err_objc_type_param_bound_missing", [b]="missing type bound %0 for type parameter %1 in %select{@interface|@class}2", [c]={{nil,nil,{"missing type bound A for type parameter B in ",{"@interface","@class"}}}}, [e]=d, [f]="missing type bound (.*?) for type parameter (.*?) in (?:@interface|@class)", [g]=a, [i]=D, [h]={Y,1436241435,V,Z}, [k]={{z,958,"/// Check consistency between two Objective-C type parameter lists, e.g.,\n/// between a category/extension and an \\@interface or between an \\@class and an\n/// \\@interface.\nstatic bool checkTypeParamListConsistency(Sema &S, ObjCTypeParamList *prevTypeParams, ObjCTypeParamList *newTypeParams, TypeParamListContext newContext) {\n // ...\n // Match up the type parameters.\n for (unsigned i = 0, n = prevTypeParams->size(); i != n; ++i) {\n // ...\n // The new type parameter got the implicit bound of \'id\'. That\'s okay for\n // categories and extensions (overwrite it later), but not for forward\n // declarations and @interfaces, because those must be standalone.\n if (newContext == TypeParamListContext::ForwardDeclaration || newContext == TypeParamListContext::Definition) {\n // ...\n S.Diag(newTypeParam->getLocation(), diag::err_objc_type_param_bound_missing) << prevTypeParam->getUnderlyingType() << newTypeParam->getDeclName() << (newContext == TypeParamListContext::ForwardDeclaration) << FixItHint::CreateInsertion(insertionLoc, newCode);"}}, [l]={ [M]={"clang/test/SemaObjC/parameterized_classes.m:89:17: error: missing type bound \'NSObject *\' for type parameter \'T\' in @interface","clang/test/SemaObjC/parameterized_classes.m:100:13: error: missing type bound \'NSObject *\' for type parameter \'U\' in @class","clang/test/SemaObjC/parameterized_classes.m:103:13: error: missing type bound \'NSObject *\' for type parameter \'T\' in @class"} } }, ["err_objc_type_param_bound_missing_pointer"]={ [j]="err_objc_type_param_bound_missing_pointer", [b]="missing \'*\' in type bound %0 for type parameter %1", [c]="missing \'*\' in type bound A for type parameter B", [e]=d, [f]="missing \'\\*\' in type bound (.*?) for type parameter (.*?)", [g]=a, [i]=D, [h]={Y,1436241435,V,Z}, [k]={{z,688,"DeclResult Sema::actOnObjCTypeParam(Scope *S, ObjCTypeParamVariance variance, SourceLocation varianceLoc, unsigned index, IdentifierInfo *paramName, SourceLocation paramLoc, SourceLocation colonLoc, ParsedType parsedTypeBound) {\n // ...\n if (parsedTypeBound) {\n // ...\n if (typeBound->isObjCObjectPointerType()) {\n // ...\n } else if (typeBound->isObjCObjectType()) {\n // ...\n Diag(typeBoundInfo->getTypeLoc().getBeginLoc(), diag::err_objc_type_param_bound_missing_pointer) << typeBound << paramName << FixItHint::CreateInsertion(starLoc, \" *\");"}}, [l]={ [M]={"clang/test/SemaObjC/parameterized_classes.m:66:20: error: missing \'*\' in type bound \'NSString\' for type parameter \'U\'"} } }, ["err_objc_type_param_bound_nonobject"]={ [j]="err_objc_type_param_bound_nonobject", [b]="type bound %0 for type parameter %1 is not an Objective-C pointer type", [c]="type bound A for type parameter B is not an Objective-C pointer type", [e]=d, [f]="type bound (.*?) for type parameter (.*?) is not an Objective\\-C pointer type", [g]=a, [i]=D, [h]={Y,1436241435,V,Z}, [k]={{z,708,"DeclResult Sema::actOnObjCTypeParam(Scope *S, ObjCTypeParamVariance variance, SourceLocation varianceLoc, unsigned index, IdentifierInfo *paramName, SourceLocation paramLoc, SourceLocation colonLoc, ParsedType parsedTypeBound) {\n // ...\n if (parsedTypeBound) {\n // ...\n if (typeBound->isObjCObjectPointerType()) {\n // ...\n } else if (typeBound->isObjCObjectType()) {\n // ...\n } else {\n // ...\n Diag(typeBoundInfo->getTypeLoc().getBeginLoc(), diag::err_objc_type_param_bound_nonobject) << typeBound << paramName;"}}, [l]={ [M]={"clang/test/SemaObjC/parameterized_classes.m:65:20: error: type bound \'int\' for type parameter \'T\' is not an Objective-C pointer type"} } }, ["err_objc_type_param_bound_qualified"]={ [j]="err_objc_type_param_bound_qualified", [b]="type bound %1 for type parameter %0 cannot be qualified with \'%2\'", [c]="type bound B for type parameter A cannot be qualified with \'C\'", [e]=d, [f]="type bound (.*?) for type parameter (.*?) cannot be qualified with \'(.*?)\'", [g]=a, [i]=D, [h]={"6997525eaa8f",1443046461,"Forbid qualifiers on ObjC generic parameters and arguments, but","Forbid qualifiers on ObjC generic parameters and arguments, but\nsilently ignore them on arguments when they\'re provided indirectly\n(.e.g behind a template argument or typedef).\n\nThis is mostly just good language design --- specifying that a\ngeneric argument is __weak doesn\'t actually do anything --- but\nit also prevents assertions when trying to apply a different\nownership qualifier.\n\nrdar://21612439\n\nllvm-svn: 248436"}, [k]={{z,739,"DeclResult Sema::actOnObjCTypeParam(Scope *S, ObjCTypeParamVariance variance, SourceLocation varianceLoc, unsigned index, IdentifierInfo *paramName, SourceLocation paramLoc, SourceLocation colonLoc, ParsedType parsedTypeBound) {\n // ...\n if (parsedTypeBound) {\n // ...\n // Type bounds cannot have qualifiers (even indirectly) or explicit\n // nullability.\n if (typeBoundInfo) {\n // ...\n if (qual || typeBound.hasQualifiers()) {\n // ...\n if (!diagnosed) {\n Diag(qual ? qual.getBeginLoc() : typeBoundInfo->getTypeLoc().getBeginLoc(), diag::err_objc_type_param_bound_qualified) << paramName << typeBound << typeBound.getQualifiers().getAsString() << FixItHint::CreateRemoval(rangeToRemove);"}}, [l]={ ["clang/test/SemaObjC/parameterized_classes_arc.m"]={"clang/test/SemaObjC/parameterized_classes_arc.m:81:29: error: type bound \'__strong id\' for type parameter \'T\' cannot be qualified with \'__strong\'","clang/test/SemaObjC/parameterized_classes_arc.m:84:27: error: type bound \'__weak id\' for type parameter \'T\' cannot be qualified with \'__weak\'","clang/test/SemaObjC/parameterized_classes_arc.m:87:29: error: type bound \'Forward *__strong\' for type parameter \'T\' cannot be qualified with \'__strong\'","clang/test/SemaObjC/parameterized_classes_arc.m:90:27: error: type bound \'Forward *__weak\' for type parameter \'T\' cannot be qualified with \'__weak\'","clang/test/SemaObjC/parameterized_classes_arc.m:93:20: error: type bound \'StrongID\' (aka \'__strong id\') for type parameter \'T\' cannot be qualified with \'__strong\'","clang/test/SemaObjC/parameterized_classes_arc.m:96:20: error: type bound \'StrongForward\' (aka \'Forward *__strong\') for type parameter \'T\' cannot be qualified with \'__strong\'","clang/test/SemaObjC/parameterized_classes_arc.m:100:26: error: type bound \'const id\' for type parameter \'T\' cannot be qualified with \'const\'","clang/test/SemaObjC/parameterized_classes_arc.m:103:29: error: type bound \'volatile id\' for type parameter \'T\' cannot be qualified with \'volatile\'","clang/test/SemaObjC/parameterized_classes_arc.m:106:57: error: type bound \'__attribute__((address_space(256))) id\' for type parameter \'T\' cannot be qualified with \'__attribute__((address_space(256)))\'"} } }, ["err_objc_type_param_redecl"]={ [j]="err_objc_type_param_redecl", [b]="redeclaration of type parameter %0", [c]="redeclaration of type parameter A", [e]=d, [f]="redeclaration of type parameter (.*?)", [g]=a, [i]=D, [h]={Y,1436241435,V,Z}, [k]={{z,789,"ObjCTypeParamList *Sema::actOnObjCTypeParamList(Scope *S, SourceLocation lAngleLoc, ArrayRef<Decl *> typeParamsIn, SourceLocation rAngleLoc) {\n // ...\n for (auto *typeParam : typeParams) {\n // ...\n if (known != knownParams.end()) {\n Diag(typeParam->getLocation(), diag::err_objc_type_param_redecl) << typeParam->getIdentifier() << SourceRange(known->second->getLocation());"}}, [l]={ ["clang/test/SemaObjC/kindof.m"]={"clang/test/SemaObjC/kindof.m:471:22: error: redeclaration of type parameter \'T\'"} } }, ["err_objc_type_param_variance_conflict"]={ [j]="err_objc_type_param_variance_conflict", [b]="%select{in|co|contra}0variant type parameter %1 conflicts with previous %select{in|co|contra}2variant type parameter %3", [c]={{nil,nil,{{"in","co","contra"},"variant type parameter B conflicts with previous ",{"in","co","contra"},"variant type parameter D"}}}, [e]=d, [f]="(?:in|co|contra)variant type parameter (.*?) conflicts with previous (?:in|co|contra)variant type parameter (.*?)", [g]=a, [i]=D, [h]={"1ac1b63c9ca8",1436241534,"Implement variance for Objective-C type parameters.","Implement variance for Objective-C type parameters.\n\nIntroduce co- and contra-variance for Objective-C type parameters,\nwhich allows us to express that (for example) an NSArray is covariant\nin its type parameter. This means that NSArray<NSMutableString *> * is\na subtype of NSArray<NSString *> *, which is expected of the immutable\nFoundation collections.\n\nType parameters can be annotated with __covariant or __contravariant\nto make them co- or contra-variant, respectively. This feature can be\ndetected by __has_feature(objc_generics_variance). Implements\nrdar://problem/20217490.\n\nllvm-svn: 241549"}, [k]={{z,879,"/// Check consistency between two Objective-C type parameter lists, e.g.,\n/// between a category/extension and an \\@interface or between an \\@class and an\n/// \\@interface.\nstatic bool checkTypeParamListConsistency(Sema &S, ObjCTypeParamList *prevTypeParams, ObjCTypeParamList *newTypeParams, TypeParamListContext newContext) {\n // ...\n // Match up the type parameters.\n for (unsigned i = 0, n = prevTypeParams->size(); i != n; ++i) {\n // ...\n // Check for consistency of the variance.\n if (newTypeParam->getVariance() != prevTypeParam->getVariance()) {\n if (newTypeParam->getVariance() == ObjCTypeParamVariance::Invariant && newContext != TypeParamListContext::Definition) {\n // ...\n } else if (prevTypeParam->getVariance() == ObjCTypeParamVariance::Invariant && !(isa<ObjCInterfaceDecl>(prevTypeParam->getDeclContext()) && cast<ObjCInterfaceDecl>(prevTypeParam->getDeclContext())->getDefinition() == prevTypeParam->getDeclContext())) {\n // ...\n } else {\n {\n // ...\n auto diag = S.Diag(diagLoc, diag::err_objc_type_param_variance_conflict) << static_cast<unsigned>(newTypeParam->getVariance()) << newTypeParam->getDeclName() << static_cast<unsigned>(prevTypeParam->getVariance()) << prevTypeParam->getDeclName();"}}, [l]={ [M]={"clang/test/SemaObjC/parameterized_classes.m:355:22: error: contravariant type parameter \'X\' conflicts with previous covariant type parameter \'T\'","clang/test/SemaObjC/parameterized_classes.m:356:22: error: covariant type parameter \'Y\' conflicts with previous contravariant type parameter \'U\'","clang/test/SemaObjC/parameterized_classes.m:361:22: error: contravariant type parameter \'T\' conflicts with previous covariant type parameter \'T\'","clang/test/SemaObjC/parameterized_classes.m:362:22: error: invariant type parameter \'U\' conflicts with previous contravariant type parameter \'U\'"} } }, ["err_objc_unexpected_atend"]={ [j]="err_objc_unexpected_atend", [b]="\'@end\' appears where closing brace \'}\' is expected", [c]="\'@end\' appears where closing brace \'}\' is expected", [e]=d, [f]="\'@end\' appears where closing brace \'\\}\' is expected", [g]=a, [i]=u, [h]={"1c5d4c54a943",1363724860,"Objective-C [qoi]: Provide improved parse diagnostics when","Objective-C [qoi]: Provide improved parse diagnostics when\nclosing rbrace is missing in an ObjC class declaration.\nCan do beter than this, but it involves addition of\noverhead which will be present in correct code.\n// rdar://6854840\n\nllvm-svn: 177435"}, [k]={{B,1989,"/// objc-class-instance-variables:\n/// \'{\' objc-instance-variable-decl-list[opt] \'}\'\n///\n/// objc-instance-variable-decl-list:\n/// objc-visibility-spec\n/// objc-instance-variable-decl \';\'\n/// \';\'\n/// objc-instance-variable-decl-list objc-visibility-spec\n/// objc-instance-variable-decl-list objc-instance-variable-decl \';\'\n/// objc-instance-variable-decl-list static_assert-declaration\n/// objc-instance-variable-decl-list \';\'\n///\n/// objc-visibility-spec:\n/// @private\n/// @protected\n/// @public\n/// @package [OBJC2]\n///\n/// objc-instance-variable-decl:\n/// struct-declaration\n///\nvoid Parser::ParseObjCClassInstanceVariables(ObjCContainerDecl *interfaceDecl, tok::ObjCKeywordKind visibility, SourceLocation atLoc) {\n // ...\n // While we still have something to read, read the instance variables.\n while (Tok.isNot(tok::r_brace) && !isEofOrEom()) {\n // ...\n // Set the default visibility to private.\n if (TryConsumeToken(tok::at)) { // parse objc-visibility-spec\n // ...\n case tok::objc_end:\n Diag(Tok, diag::err_objc_unexpected_atend);"}}, [l]={ ["clang/test/Parser/missing-closing-rbrace.m"]={"clang/test/Parser/missing-closing-rbrace.m:3:16: error: \'@end\' appears where closing brace \'}\' is expected"} } }, ["err_objc_unexpected_attr"]={ [j]="err_objc_unexpected_attr", [b]={{nil,v,"prefix attribute must be followed by an interface, protocol, or implementation"},{y,nil,"prefix attribute must be followed by an interface or protocol"}}, [c]={{nil,v,"prefix attribute must be followed by an interface, protocol, or implementation"},{y,nil,"prefix attribute must be followed by an interface or protocol"}}, [e]=d, [f]="prefix attribute must be followed by an interface, protocol, or implementation", [g]=a, [i]=u, [h]={R,1236199783,Q,S}, [k]={{B,71,"/// ParseObjCAtDirectives - Handle parts of the external-declaration production:\n/// external-declaration: [C99 6.9]\n/// [OBJC] objc-class-definition\n/// [OBJC] objc-class-declaration\n/// [OBJC] objc-alias-declaration\n/// [OBJC] objc-protocol-definition\n/// [OBJC] objc-method-definition\n/// [OBJC] \'@\' \'end\'\nParser::DeclGroupPtrTy Parser::ParseObjCAtDirectives(ParsedAttributes &DeclAttrs, ParsedAttributes &DeclSpecAttrs) {\n // ...\n default:\n llvm::for_each(DeclAttrs, [this](const auto &Attr) {\n if (Attr.isGNUAttribute())\n Diag(Tok.getLocation(), diag::err_objc_unexpected_attr);"},{"clang/lib/Parse/Parser.cpp",1176,"/// Parse either a function-definition or a declaration. We can\'t tell which\n/// we have until we read up to the compound-statement in function-definition.\n/// TemplateParams, if non-NULL, provides the template parameters when we\'re\n/// parsing a C++ template-declaration.\n///\n/// function-definition: [C99 6.9.1]\n/// decl-specs declarator declaration-list[opt] compound-statement\n/// [C90] function-definition: [C99 6.7.1] - implicit int result\n/// [C90] decl-specs[opt] declarator declaration-list[opt] compound-statement\n///\n/// declaration: [C99 6.7]\n/// declaration-specifiers init-declarator-list[opt] \';\'\n/// [!C99] init-declarator-list \';\' [TODO: warn in c99 mode]\n/// [OMP] threadprivate-directive\n/// [OMP] allocate-directive [TODO]\n///\nParser::DeclGroupPtrTy Parser::ParseDeclOrFunctionDefInternal(ParsedAttributes &Attrs, ParsedAttributes &DeclSpecAttrs, ParsingDeclSpec &DS, AccessSpecifier AS) {\n // ...\n // ObjC2 allows prefix attributes on class interfaces and protocols.\n // FIXME: This still needs better diagnostics. We should only accept\n // attributes here, no types, etc.\n if (getLangOpts().ObjC && Tok.is(tok::at)) {\n // ...\n if (!Tok.isObjCAtKeyword(tok::objc_interface) && !Tok.isObjCAtKeyword(tok::objc_protocol) && !Tok.isObjCAtKeyword(tok::objc_implementation)) {\n Diag(Tok, diag::err_objc_unexpected_attr);"}}, [l]={ ["clang/test/Parser/objc-quirks.m"]={"clang/test/Parser/objc-quirks.m:4:6: error: prefix attribute must be followed by an interface, protocol, or implementation"} } }, ["err_objc_unknown_at"]={ [j]="err_objc_unknown_at", [b]="expected an Objective-C directive after \'@\'", [c]="expected an Objective-C directive after \'@\'", [e]=d, [f]="expected an Objective\\-C directive after \'@\'", [g]=a, [i]=u, [h]={"00a0cf70d9ee",1268719487,"Don\'t consume tokens past the end-of-file in an @interface. Fixes","Don\'t consume tokens past the end-of-file in an @interface. Fixes\n<rdar://problem/7735566>.\n\nllvm-svn: 98613"}, [k]={{B,724,"/// objc-interface-decl-list:\n/// empty\n/// objc-interface-decl-list objc-property-decl [OBJC2]\n/// objc-interface-decl-list objc-method-requirement [OBJC2]\n/// objc-interface-decl-list objc-method-proto \';\'\n/// objc-interface-decl-list declaration\n/// objc-interface-decl-list \';\'\n///\n/// objc-method-requirement: [OBJC2]\n/// @required\n/// @optional\n///\nvoid Parser::ParseObjCInterfaceDeclList(tok::ObjCKeywordKind contextKey, Decl *CDecl) {\n // ...\n while (true) {\n // ...\n if (DirectiveKind == tok::objc_end) { // @end -> terminate list\n // ...\n } else if (DirectiveKind == tok::objc_not_keyword) {\n Diag(Tok, diag::err_objc_unknown_at);"}}, [l]={ ["clang/test/Parser/missing-end.m"]={"clang/test/Parser/missing-end.m:6:3: error: expected an Objective-C directive after \'@\'"} } }, ["err_objc_var_decl_inclass"]={ [j]="err_objc_var_decl_inclass", [b]="cannot declare variable inside @interface or @protocol", [c]="cannot declare variable inside @interface or @protocol", [e]=d, [f]="cannot declare variable inside @interface or @protocol", [g]=a, [i]=q, [h]={"629aed932704",1237658805,"Issue error if variables are defined inside an objc class,","Issue error if variables are defined inside an objc class,\ncategory or protocol.\n\nllvm-svn: 67450"}, [k]={{z,4214,"// 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 (isInterfaceDeclKind) {\n // Reject invalid vardecls.\n for (unsigned i = 0, e = allTUVars.size(); i != e; i++) {\n // ...\n for (DeclGroupRef::iterator I = DG.begin(), E = DG.end(); I != E; ++I)\n if (VarDecl *VDecl = dyn_cast<VarDecl>(*I)) {\n if (!VDecl->hasExternalStorage())\n Diag(VDecl->getLocation(), diag::err_objc_var_decl_inclass);"}}, [l]={ ["clang/test/SemaObjC/interface-tu-variable.m"]={"clang/test/SemaObjC/interface-tu-variable.m:4:5: error: cannot declare variable inside @interface or @protocol","clang/test/SemaObjC/interface-tu-variable.m:5:5: error: cannot declare variable inside @interface or @protocol","clang/test/SemaObjC/interface-tu-variable.m:9:5: error: cannot declare variable inside @interface or @protocol","clang/test/SemaObjC/interface-tu-variable.m:13:10: error: cannot declare variable inside @interface or @protocol","clang/test/SemaObjC/interface-tu-variable.m:18:10: error: cannot declare variable inside @interface or @protocol"} } }, ["err_objc_variable_sized_type_not_at_end"]={ [j]={{nil,L,"err_objc_variable_sized_type_not_at_end"}}, [b]={{nil,L,"field %0 with variable sized type %1 is not at the end of class"}}, [c]={{nil,L,"field A with variable sized type B is not at the end of class"}}, [e]=d, [f]="field (.*?) with variable sized type (.*?) is not at the end of class", [g]=a, [i]={{nil,L,q}}, [h]={"30680e943735",1508796101,"[Sema] Add support for flexible array members in Obj-C.","[Sema] Add support for flexible array members in Obj-C.\n\nAllow Obj-C ivars with incomplete array type but only as the last ivar.\nAlso add a requirement for ivars that contain a flexible array member to\nbe at the end of class too. It is possible to add in a subclass another\nivar at the end but we\'ll emit a warning in this case. Also we\'ll emit a\nwarning if a variable sized ivar is declared in class extension or in\nimplementation because subclasses won\'t know they should avoid adding\nnew ivars.\n\nIn ARC incomplete array objects are treated as __unsafe_unretained so\nrequire them to be marked as such.\n\nProhibit synthesizing ivars with flexible array members because order of\nsynthesized ivars is not obvious and tricky to control. Spelling out\nivar explicitly gives control to developers and helps to avoid surprises\nwith unexpected ivar ordering.\n\nFor C and C++ changed diagnostic to tell explicitly a field is not the\nlast one and point to the next field. It is not as useful as in Obj-C\nbut it is an improvement and it is consistent with Obj-C. For C for\nunions emit more specific err_flexible_array_union instead of generic\nerr_field_incomplete.\n\nrdar://problem/21054495\n\nReviewers: rjmccall, theraven\n\nReviewed By: rjmccall\n\nSubscribers: cfe-commits\n\nDifferential Revision: https://reviews.llvm.org/D38773\n\nllvm-svn: 316381"}, [k]={{z,3894,"static void DiagnoseVariableSizedIvars(Sema &S, ObjCContainerDecl *OCD) {\n // ...\n // Check if variable sized ivar is followed by another ivar.\n for (ObjCIvarDecl *ivar = IntfDecl->all_declared_ivar_begin(); ivar; ivar = ivar->getNextIvar()) {\n // ...\n if (IvarTy->isIncompleteArrayType()) {\n // ...\n } else if (const RecordType *RecordTy = IvarTy->getAs<RecordType>()) {\n if (RecordTy->getDecl()->hasFlexibleArrayMember()) {\n S.Diag(ivar->getLocation(), diag::err_objc_variable_sized_type_not_at_end) << ivar->getDeclName() << IvarTy;"}}, [l]={ ["clang/test/SemaObjCXX/flexible-array.mm"]={"clang/test/SemaObjCXX/flexible-array.mm:16:21: error: field \'flexible\' with variable sized type \'VariableSizeUnion\' is not at the end of class","clang/test/SemaObjCXX/flexible-array.mm:34:21: error: field \'flexible\' with variable sized type \'VariableSizeClass\' is not at the end of class"} } }, ["err_objc_weak_unsupported"]={ [j]="err_objc_weak_unsupported", [b]="-fobjc-weak is not supported on the current deployment target", [c]="-fobjc-weak is not supported on the current deployment target", [e]=d, [f]="\\-fobjc\\-weak is not supported on the current deployment target", [g]=a, [i]=C, [h]={"460ce58fa6a1",1445539097,"Define weak and __weak to mean ARC-style weak references, even in MRC.","Define weak and __weak to mean ARC-style weak references, even in MRC.\n\nPreviously, __weak was silently accepted and ignored in MRC mode.\nThat makes this a potentially source-breaking change that we have to\nroll out cautiously. Accordingly, for the time being, actual support\nfor __weak references in MRC is experimental, and the compiler will\nreject attempts to actually form such references. The intent is to\neventually enable the feature by default in all non-GC modes.\n(It is, of course, incompatible with ObjC GC\'s interpretation of\n__weak.)\n\nIf you like, you can enable this feature with\n -Xclang -fobjc-weak\nbut like any -Xclang option, this option may be removed at any point,\ne.g. if/when it is eventually enabled by default.\n\nThis patch also enables the use of the ARC __unsafe_unretained qualifier\nin MRC. Unlike __weak, this is being enabled immediately. Since\nvariables are essentially __unsafe_unretained by default in MRC,\nthe only practical uses are (1) communication and (2) changing the\ndefault behavior of by-value block capture.\n\nAs an implementation matter, this means that the ObjC ownership\nqualifiers may appear in any ObjC language mode, and so this patch\nremoves a number of checks for getLangOpts().ObjCAutoRefCount\nthat were guarding the processing of these qualifiers. I don\'t\nexpect this to be a significant drain on performance; it may even\nbe faster to just check for these qualifiers directly on a type\n(since it\'s probably in a register anyway) than to do N dependent\nloads to grab the LangOptions.\n\nrdar://9674298\n\nllvm-svn: 251041"}, [k]={{"clang/lib/Driver/ToolChains/Clang.cpp",4039,"static void RenderObjCOptions(const ToolChain &TC, const Driver &D, const llvm::Triple &T, const ArgList &Args, ObjCRuntime &Runtime, bool InferCovariantReturns, const InputInfo &Input, ArgStringList &CmdArgs) {\n // ...\n // Pass down -fobjc-weak or -fno-objc-weak if present.\n if (types::isObjC(Input.getType())) {\n // ...\n if (!WeakArg) {\n // ...\n } else if (!Runtime.allowsWeak()) {\n if (WeakArg->getOption().matches(options::OPT_fobjc_weak))\n D.Diag(diag::err_objc_weak_unsupported);"},{"clang/lib/Frontend/CompilerInvocation.cpp",3685,"#include \"clang/Driver/Options.inc\"\n // ...\n if (Opts.ObjC) {\n // ...\n // ObjCWeak determines whether __weak is actually enabled.\n // Note that we allow -fno-objc-weak to disable this even in ARC mode.\n if (auto weakArg = Args.getLastArg(OPT_fobjc_weak, OPT_fno_objc_weak)) {\n if (!weakArg->getOption().matches(OPT_fobjc_weak)) {\n // ...\n } else if (Opts.getGC() != LangOptions::NonGC) {\n // ...\n } else if (!Opts.ObjCWeakRuntime) {\n Diags.Report(diag::err_objc_weak_unsupported);"}} }, ["err_objc_weak_with_gc"]={ [j]="err_objc_weak_with_gc", [b]="-fobjc-weak is not supported in Objective-C garbage collection", [c]="-fobjc-weak is not supported in Objective-C garbage collection", [e]=d, [f]="\\-fobjc\\-weak is not supported in Objective\\-C garbage collection", [g]=a, [i]=C, [h]={"460ce58fa6a1",1445539097,"Define weak and __weak to mean ARC-style weak references, even in MRC.","Define weak and __weak to mean ARC-style weak references, even in MRC.\n\nPreviously, __weak was silently accepted and ignored in MRC mode.\nThat makes this a potentially source-breaking change that we have to\nroll out cautiously. Accordingly, for the time being, actual support\nfor __weak references in MRC is experimental, and the compiler will\nreject attempts to actually form such references. The intent is to\neventually enable the feature by default in all non-GC modes.\n(It is, of course, incompatible with ObjC GC\'s interpretation of\n__weak.)\n\nIf you like, you can enable this feature with\n -Xclang -fobjc-weak\nbut like any -Xclang option, this option may be removed at any point,\ne.g. if/when it is eventually enabled by default.\n\nThis patch also enables the use of the ARC __unsafe_unretained qualifier\nin MRC. Unlike __weak, this is being enabled immediately. Since\nvariables are essentially __unsafe_unretained by default in MRC,\nthe only practical uses are (1) communication and (2) changing the\ndefault behavior of by-value block capture.\n\nAs an implementation matter, this means that the ObjC ownership\nqualifiers may appear in any ObjC language mode, and so this patch\nremoves a number of checks for getLangOpts().ObjCAutoRefCount\nthat were guarding the processing of these qualifiers. I don\'t\nexpect this to be a significant drain on performance; it may even\nbe faster to just check for these qualifiers directly on a type\n(since it\'s probably in a register anyway) than to do N dependent\nloads to grab the LangOptions.\n\nrdar://9674298\n\nllvm-svn: 251041"}, [k]={{"clang/lib/Frontend/CompilerInvocation.cpp",3683,"#include \"clang/Driver/Options.inc\"\n // ...\n if (Opts.ObjC) {\n // ...\n // ObjCWeak determines whether __weak is actually enabled.\n // Note that we allow -fno-objc-weak to disable this even in ARC mode.\n if (auto weakArg = Args.getLastArg(OPT_fobjc_weak, OPT_fno_objc_weak)) {\n if (!weakArg->getOption().matches(OPT_fobjc_weak)) {\n // ...\n } else if (Opts.getGC() != LangOptions::NonGC) {\n Diags.Report(diag::err_objc_weak_with_gc);"}} }, ["err_objcbridge_related_expected_related_class"]={ [j]="err_objcbridge_related_expected_related_class", [b]="expected a related ObjectiveC class name, e.g., \'NSColor\'", [c]="expected a related ObjectiveC class name, e.g., \'NSColor\'", [e]=d, [f]="expected a related ObjectiveC class name, e\\.g\\., \'NSColor\'", [g]=a, [i]=u, [h]={"1a2519a7e974",1386189170,"ObjectiveC - Introducing objc_bridge_related attribute ","ObjectiveC - Introducing objc_bridge_related attribute \nwhich specifies couple of (optional) method selectors\nfor bridging a CFobject to or from an ObjectiveC \nobject. This is wip. // rdsr://15499111\n\nllvm-svn: 196408"}, [k]={{"clang/lib/Parse/ParseDecl.cpp",1500,"/// Parse the contents of the \"objc_bridge_related\" attribute.\n/// objc_bridge_related \'(\' related_class \',\' opt-class_method \',\' opt-instance_method \')\'\n/// related_class:\n/// Identifier\n///\n/// opt-class_method:\n/// Identifier: | <empty>\n///\n/// opt-instance_method:\n/// Identifier | <empty>\n///\nvoid Parser::ParseObjCBridgeRelatedAttribute(IdentifierInfo &ObjCBridgeRelated, SourceLocation ObjCBridgeRelatedLoc, ParsedAttributes &Attrs, SourceLocation *EndLoc, IdentifierInfo *ScopeName, SourceLocation ScopeLoc, ParsedAttr::Form Form) {\n // ...\n // Parse the related class name.\n if (Tok.isNot(tok::identifier)) {\n Diag(Tok, diag::err_objcbridge_related_expected_related_class);"}}, [l]={ ["clang/test/Parser/objcbridge-related-attribute.m"]={"clang/test/Parser/objcbridge-related-attribute.m:9:51: error: expected a related ObjectiveC class name, e.g., \'NSColor\'","clang/test/Parser/objcbridge-related-attribute.m:12:51: error: expected a related ObjectiveC class name, e.g., \'NSColor\'"} } }, ["err_objcbridge_related_selector_name"]={ [j]="err_objcbridge_related_selector_name", [b]="expected a class method selector with single argument, e.g., \'colorWithCGColor:\'", [c]="expected a class method selector with single argument, e.g., \'colorWithCGColor:\'", [e]=d, [f]="expected a class method selector with single argument, e\\.g\\., \'colorWithCGColor\\:\'", [g]=a, [i]=u, [h]={"1a2519a7e974",1386189170,"ObjectiveC - Introducing objc_bridge_related attribute ","ObjectiveC - Introducing objc_bridge_related attribute \nwhich specifies couple of (optional) method selectors\nfor bridging a CFobject to or from an ObjectiveC \nobject. This is wip. // rdsr://15499111\n\nllvm-svn: 196408"}, [k]={{"clang/lib/Parse/ParseDecl.cpp",1517,"/// Parse the contents of the \"objc_bridge_related\" attribute.\n/// objc_bridge_related \'(\' related_class \',\' opt-class_method \',\' opt-instance_method \')\'\n/// related_class:\n/// Identifier\n///\n/// opt-class_method:\n/// Identifier: | <empty>\n///\n/// opt-instance_method:\n/// Identifier | <empty>\n///\nvoid Parser::ParseObjCBridgeRelatedAttribute(IdentifierInfo &ObjCBridgeRelated, SourceLocation ObjCBridgeRelatedLoc, ParsedAttributes &Attrs, SourceLocation *EndLoc, IdentifierInfo *ScopeName, SourceLocation ScopeLoc, ParsedAttr::Form Form) {\n // ...\n if (Tok.is(tok::identifier)) {\n // ...\n if (!TryConsumeToken(tok::colon)) {\n Diag(Tok, diag::err_objcbridge_related_selector_name);"},{"clang/lib/Parse/ParseDecl.cpp",1524,"/// Parse the contents of the \"objc_bridge_related\" attribute.\n/// objc_bridge_related \'(\' related_class \',\' opt-class_method \',\' opt-instance_method \')\'\n/// related_class:\n/// Identifier\n///\n/// opt-class_method:\n/// Identifier: | <empty>\n///\n/// opt-instance_method:\n/// Identifier | <empty>\n///\nvoid Parser::ParseObjCBridgeRelatedAttribute(IdentifierInfo &ObjCBridgeRelated, SourceLocation ObjCBridgeRelatedLoc, ParsedAttributes &Attrs, SourceLocation *EndLoc, IdentifierInfo *ScopeName, SourceLocation ScopeLoc, ParsedAttr::Form Form) {\n // ...\n if (!TryConsumeToken(tok::comma)) {\n if (Tok.is(tok::colon))\n Diag(Tok, diag::err_objcbridge_related_selector_name);"}}, [l]={ ["clang/test/Parser/objcbridge-related-attribute.m"]={"clang/test/Parser/objcbridge-related-attribute.m:10:75: error: expected a class method selector with single argument, e.g., \'colorWithCGColor:\'","clang/test/Parser/objcbridge-related-attribute.m:11:75: error: expected a class method selector with single argument, e.g., \'colorWithCGColor:\'"} } }, ["err_object_cannot_be_passed_returned_by_value"]={ [j]="err_object_cannot_be_passed_returned_by_value", [b]="interface type %1 cannot be %select{returned|passed}0 by value; did you forget * in %1?", [c]={{nil,nil,{"interface type B cannot be ",{"returned","passed"}," by value; did you forget * in B?"}}}, [e]=d, [f]="interface type (.*?) cannot be (?:returned|passed) by value; did you forget \\* in (.*?)\\?", [g]=a, [i]=q, [h]={"de5a53167743",1239476936,"Improve the \'cannot pass objc interface by value\' diagnostic:","Improve the \'cannot pass objc interface by value\' diagnostic:\n1) improve localizability by not passing english strings in.\n2) improve location for arguments.\n3) print the objc type being passed.\n\nBefore:\nmethod-bad-param.m:15:1: error: Objective-C type cannot be passed by value\n-(void) my_method:(foo) my_param\n^\n\nafter:\nmethod-bad-param.m:15:25: error: Objective-C interface type \'foo\' cannot be passed by value\n-(void) my_method:(foo) my_param\n ^\n\nllvm-svn: 68872"}, [k]={{"clang/lib/Sema/SemaDecl.cpp",14939,"ParmVarDecl *Sema::CheckParameter(DeclContext *DC, SourceLocation StartLoc, SourceLocation NameLoc, IdentifierInfo *Name, QualType T, TypeSourceInfo *TSInfo, StorageClass SC) {\n // ...\n // Parameter declarators cannot be interface types. All ObjC objects are\n // passed by reference.\n if (T->isObjCObjectType()) {\n // ...\n Diag(NameLoc, diag::err_object_cannot_be_passed_returned_by_value) << 1 << T << FixItHint::CreateInsertion(TypeEndLoc, \"*\");"},{K,2928,"bool Sema::CheckFunctionReturnType(QualType T, SourceLocation Loc) {\n // ...\n // Methods cannot return interface types. All ObjC objects are\n // passed by reference.\n if (T->isObjCObjectType()) {\n Diag(Loc, diag::err_object_cannot_be_passed_returned_by_value) << 0 << T << FixItHint::CreateInsertion(Loc, \"*\");"},{K,5332,"static TypeSourceInfo *GetFullTypeForDeclarator(TypeProcessingState &state, QualType declSpecType, TypeSourceInfo *TInfo) {\n // ...\n for (unsigned i = 0, e = D.getNumTypeObjects(); i != e; ++i) {\n // ...\n case DeclaratorChunk::Function: {\n // ...\n // Methods cannot return interface types. All ObjC objects are\n // passed by reference.\n if (T->isObjCObjectType()) {\n // ...\n S.Diag(DiagLoc, diag::err_object_cannot_be_passed_returned_by_value) << 0 << T << FixItHint::CreateInsertion(FixitLoc, \"*\");"}}, [l]={ ["clang/test/SemaObjCXX/parameters.mm"]={"clang/test/SemaObjCXX/parameters.mm:8:11: error: interface type \'A\' cannot be passed by value; did you forget * in \'A\'?"} } }, ["err_odr_different_num_template_parameters"]={ [j]="err_odr_different_num_template_parameters", [b]="template parameter lists have a different number of parameters (%0 vs %1)", [c]="template parameter lists have a different number of parameters (A vs B)", [e]=d, [f]="template parameter lists have a different number of parameters \\((.*?) vs (.*?)\\)", [g]=a, [i]=C, [h]={"a082a49d9e71",1291144490,"Implement basic AST importing and merging support for class template","Implement basic AST importing and merging support for class template\ndeclarations.\n\nllvm-svn: 120448"}, [k]={{x,1804,"static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, TemplateParameterList *Params1, TemplateParameterList *Params2) {\n if (Params1->size() != Params2->size()) {\n if (Context.Complain) {\n Context.Diag2(Params2->getTemplateLoc(), Context.getApplicableDiagnostic(diag::err_odr_different_num_template_parameters)) << Params1->size() << Params2->size();"},{x,2239,"unsigned StructuralEquivalenceContext::getApplicableDiagnostic(unsigned ErrorDiagnostic) {\n // ...\n case diag::err_odr_different_num_template_parameters:"}} }, ["err_odr_different_template_parameter_kind"]={ [j]="err_odr_different_template_parameter_kind", [b]="template parameter has different kinds in different translation units", [c]="template parameter has different kinds in different translation units", [e]=d, [f]="template parameter has different kinds in different translation units", [g]=a, [i]=C, [h]={"a082a49d9e71",1291144490,"Implement basic AST importing and merging support for class template","Implement basic AST importing and merging support for class template\ndeclarations.\n\nllvm-svn: 120448"}, [k]={{x,1817,"static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, TemplateParameterList *Params1, TemplateParameterList *Params2) {\n // ...\n for (unsigned I = 0, N = Params1->size(); I != N; ++I) {\n if (Params1->getParam(I)->getKind() != Params2->getParam(I)->getKind()) {\n if (Context.Complain) {\n Context.Diag2(Params2->getParam(I)->getLocation(), Context.getApplicableDiagnostic(diag::err_odr_different_template_parameter_kind));"},{x,2241,"unsigned StructuralEquivalenceContext::getApplicableDiagnostic(unsigned ErrorDiagnostic) {\n // ...\n case diag::err_odr_different_template_parameter_kind:"}} }, ["err_odr_field_type_inconsistent"]={ [j]="err_odr_field_type_inconsistent", [b]="field %0 declared with incompatible types in different translation units (%1 vs. %2)", [c]="field A declared with incompatible types in different translation units (B vs. C)", [e]=d, [f]="field (.*?) declared with incompatible types in different translation units \\((.*?) vs\\. (.*?)\\)", [g]=a, [i]=C, [h]={"03d1ed304b78",1318629282,"Teach the ASTImporter not to import redundant fields.","Teach the ASTImporter not to import redundant fields.\n\nllvm-svn: 142009"}, [k]={{x,2219,"unsigned StructuralEquivalenceContext::getApplicableDiagnostic(unsigned ErrorDiagnostic) {\n // ...\n case diag::err_odr_field_type_inconsistent:"}} }, ["err_odr_function_type_inconsistent"]={ [j]="err_odr_function_type_inconsistent", [b]="external function %0 declared with incompatible types in different translation units (%1 vs. %2)", [c]="external function A declared with incompatible types in different translation units (B vs. C)", [e]=d, [f]="external function (.*?) declared with incompatible types in different translation units \\((.*?) vs\\. (.*?)\\)", [g]=a, [i]=C, [h]={"bb7930c17e98",1265831671,"Implement basic support for merging function declarations across","Implement basic support for merging function declarations across\ntranslation units.\n\nllvm-svn: 95794"}, [k]={{x,2215,"unsigned StructuralEquivalenceContext::getApplicableDiagnostic(unsigned ErrorDiagnostic) {\n // ...\n case diag::err_odr_function_type_inconsistent:"}} }, ["err_odr_ivar_type_inconsistent"]={ [j]="err_odr_ivar_type_inconsistent", [b]="instance variable %0 declared with incompatible types in different translation units (%1 vs. %2)", [c]="instance variable A declared with incompatible types in different translation units (B vs. C)", [e]=d, [f]="instance variable (.*?) declared with incompatible types in different translation units \\((.*?) vs\\. (.*?)\\)", [g]=a, [i]=C, [h]={"7244b0bb860b",1266366870,"Implement AST importing of Objective-C instance variables. ","Implement AST importing of Objective-C instance variables. \nCheck superclasses when merging two Objective-C @interfaces.\n\nllvm-svn: 96420"}, [k]={{x,2221,"unsigned StructuralEquivalenceContext::getApplicableDiagnostic(unsigned ErrorDiagnostic) {\n // ...\n case diag::err_odr_ivar_type_inconsistent:"}} }, ["err_odr_non_type_parameter_type_inconsistent"]={ [j]="err_odr_non_type_parameter_type_inconsistent", [b]="non-type template parameter declared with incompatible types in different translation units (%0 vs. %1)", [c]="non-type template parameter declared with incompatible types in different translation units (A vs. B)", [e]=d, [f]="non\\-type template parameter declared with incompatible types in different translation units \\((.*?) vs\\. (.*?)\\)", [g]=a, [i]=C, [h]={"a082a49d9e71",1291144490,"Implement basic AST importing and merging support for class template","Implement basic AST importing and merging support for class template\ndeclarations.\n\nllvm-svn: 120448"}, [k]={{x,1870,"static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, NonTypeTemplateParmDecl *D1, NonTypeTemplateParmDecl *D2) {\n // ...\n // Check types.\n if (!IsStructurallyEquivalent(Context, D1->getType(), D2->getType())) {\n if (Context.Complain) {\n Context.Diag2(D2->getLocation(), Context.getApplicableDiagnostic(diag::err_odr_non_type_parameter_type_inconsistent)) << D2->getType() << D1->getType();"},{x,2245,"unsigned StructuralEquivalenceContext::getApplicableDiagnostic(unsigned ErrorDiagnostic) {\n // ...\n case diag::err_odr_non_type_parameter_type_inconsistent:"}} }, ["err_odr_objc_method_num_params_inconsistent"]={ [j]="err_odr_objc_method_num_params_inconsistent", [b]="%select{class|instance}0 method %1 has a different number of parameters in different translation units (%2 vs. %3)", [c]={{nil,nil,{{Db,"instance"}," method B has a different number of parameters in different translation units (C vs. D)"}}}, [e]=d, [f]="(?:class|instance) method (.*?) has a different number of parameters in different translation units \\((.*?) vs\\. (.*?)\\)", [g]=a, [i]=C, [h]={"43f54796ab42",1266372767,"Implement AST importing and checking for Objective-C method declarations.","Implement AST importing and checking for Objective-C method declarations.\n\nllvm-svn: 96442"}, [k]={{x,2227,"unsigned StructuralEquivalenceContext::getApplicableDiagnostic(unsigned ErrorDiagnostic) {\n // ...\n case diag::err_odr_objc_method_num_params_inconsistent:"}} }, ["err_odr_objc_method_param_type_inconsistent"]={ [j]="err_odr_objc_method_param_type_inconsistent", [b]="%select{class|instance}0 method %1 has a parameter with a different types in different translation units (%2 vs. %3)", [c]={{nil,nil,{{Db,"instance"}," method B has a parameter with a different types in different translation units (C vs. D)"}}}, [e]=d, [f]="(?:class|instance) method (.*?) has a parameter with a different types in different translation units \\((.*?) vs\\. (.*?)\\)", [g]=a, [i]=C, [h]={"43f54796ab42",1266372767,"Implement AST importing and checking for Objective-C method declarations.","Implement AST importing and checking for Objective-C method declarations.\n\nllvm-svn: 96442"}, [k]={{x,2229,"unsigned StructuralEquivalenceContext::getApplicableDiagnostic(unsigned ErrorDiagnostic) {\n // ...\n case diag::err_odr_objc_method_param_type_inconsistent:"}} }, ["err_odr_objc_method_result_type_inconsistent"]={ [j]="err_odr_objc_method_result_type_inconsistent", [b]="%select{class|instance}0 method %1 has incompatible result types in different translation units (%2 vs. %3)", [c]={{nil,nil,{{Db,"instance"}," method B has incompatible result types in different translation units (C vs. D)"}}}, [e]=d, [f]="(?:class|instance) method (.*?) has incompatible result types in different translation units \\((.*?) vs\\. (.*?)\\)", [g]=a, [i]=C, [h]={"43f54796ab42",1266372767,"Implement AST importing and checking for Objective-C method declarations.","Implement AST importing and checking for Objective-C method declarations.\n\nllvm-svn: 96442"}, [k]={{x,2225,"unsigned StructuralEquivalenceContext::getApplicableDiagnostic(unsigned ErrorDiagnostic) {\n // ...\n case diag::err_odr_objc_method_result_type_inconsistent:"}} }, ["err_odr_objc_method_variadic_inconsistent"]={ [j]="err_odr_objc_method_variadic_inconsistent", [b]="%select{class|instance}0 method %1 is variadic in one translation unit and not variadic in another", [c]={{nil,nil,{{Db,"instance"}," method B is variadic in one translation unit and not variadic in another"}}}, [e]=d, [f]="(?:class|instance) method (.*?) is variadic in one translation unit and not variadic in another", [g]=a, [i]=C, [h]={"43f54796ab42",1266372767,"Implement AST importing and checking for Objective-C method declarations.","Implement AST importing and checking for Objective-C method declarations.\n\nllvm-svn: 96442"}, [k]={{x,2231,"unsigned StructuralEquivalenceContext::getApplicableDiagnostic(unsigned ErrorDiagnostic) {\n // ...\n case diag::err_odr_objc_method_variadic_inconsistent:"}} }, ["err_odr_objc_property_impl_kind_inconsistent"]={ [j]="err_odr_objc_property_impl_kind_inconsistent", [b]="property %0 is implemented with %select{@synthesize|@dynamic}1 in one translation but %select{@dynamic|@synthesize}1 in another translation unit", [c]={{nil,nil,{"property A is implemented with ",{"@synthesize","@dynamic"}," in one translation but ",{"@dynamic","@synthesize"}," in another translation unit"}}}, [e]=d, [f]="property (.*?) is implemented with (?:@synthesize|@dynamic) in one translation but (?:@dynamic|@synthesize) in another translation unit", [g]=a, [i]=C, [h]={"14a49e2fbe1c",1291746723,"Implement AST import for Objective-C property implementations","Implement AST import for Objective-C property implementations\n(@synthesize and @dynamic).\n\nllvm-svn: 121159"}, [k]={{x,2235,"unsigned StructuralEquivalenceContext::getApplicableDiagnostic(unsigned ErrorDiagnostic) {\n // ...\n case diag::err_odr_objc_property_impl_kind_inconsistent:"}} }, ["err_odr_objc_property_type_inconsistent"]={ [j]="err_odr_objc_property_type_inconsistent", [b]="property %0 declared with incompatible types in different translation units (%1 vs. %2)", [c]="property A declared with incompatible types in different translation units (B vs. C)", [e]=d, [f]="property (.*?) declared with incompatible types in different translation units \\((.*?) vs\\. (.*?)\\)", [g]=a, [i]=C, [h]={"a11c45866eba",1266429730,"Implement AST merging for Objective-C properties.","Implement AST merging for Objective-C properties.\n\nllvm-svn: 96483"}, [k]={{x,2233,"unsigned StructuralEquivalenceContext::getApplicableDiagnostic(unsigned ErrorDiagnostic) {\n // ...\n case diag::err_odr_objc_property_type_inconsistent:"}} }, ["err_odr_objc_superclass_inconsistent"]={ [j]="err_odr_objc_superclass_inconsistent", [b]="class %0 has incompatible superclasses", [c]="class A has incompatible superclasses", [e]=d, [f]="class (.*?) has incompatible superclasses", [g]=a, [i]=C, [h]={"7244b0bb860b",1266366870,"Implement AST importing of Objective-C instance variables. ","Implement AST importing of Objective-C instance variables. \nCheck superclasses when merging two Objective-C @interfaces.\n\nllvm-svn: 96420"}, [k]={{x,2223,"unsigned StructuralEquivalenceContext::getApplicableDiagnostic(unsigned ErrorDiagnostic) {\n // ...\n case diag::err_odr_objc_superclass_inconsistent:"}} }, ["err_odr_objc_synthesize_ivar_inconsistent"]={ [j]="err_odr_objc_synthesize_ivar_inconsistent", [b]="property %0 is synthesized to different ivars in different translation units (%1 vs. %2)", [c]="property A is synthesized to different ivars in different translation units (B vs. C)", [e]=d, [f]="property (.*?) is synthesized to different ivars in different translation units \\((.*?) vs\\. (.*?)\\)", [g]=a, [i]=C, [h]={"14a49e2fbe1c",1291746723,"Implement AST import for Objective-C property implementations","Implement AST import for Objective-C property implementations\n(@synthesize and @dynamic).\n\nllvm-svn: 121159"}, [k]={{x,2237,"unsigned StructuralEquivalenceContext::getApplicableDiagnostic(unsigned ErrorDiagnostic) {\n // ...\n case diag::err_odr_objc_synthesize_ivar_inconsistent:"}} }, ["err_odr_parameter_pack_non_pack"]={ [j]="err_odr_parameter_pack_non_pack", [b]="parameter kind mismatch; parameter is %select{not a|a}0 parameter pack", [c]={{nil,nil,{"parameter kind mismatch; parameter is ",{"not a","a"}," parameter pack"}}}, [e]=d, [f]="parameter kind mismatch; parameter is (?:not a|a) parameter pack", [g]=a, [i]=C, [h]={"a082a49d9e71",1291144490,"Implement basic AST importing and merging support for class template","Implement basic AST importing and merging support for class template\ndeclarations.\n\nllvm-svn: 120448"}, [k]={{x,1839,"static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, TemplateTypeParmDecl *D1, TemplateTypeParmDecl *D2) {\n if (D1->isParameterPack() != D2->isParameterPack()) {\n if (Context.Complain) {\n Context.Diag2(D2->getLocation(), Context.getApplicableDiagnostic(diag::err_odr_parameter_pack_non_pack)) << D2->isParameterPack();"},{x,1857,"static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, NonTypeTemplateParmDecl *D1, NonTypeTemplateParmDecl *D2) {\n if (D1->isParameterPack() != D2->isParameterPack()) {\n if (Context.Complain) {\n Context.Diag2(D2->getLocation(), Context.getApplicableDiagnostic(diag::err_odr_parameter_pack_non_pack)) << D2->isParameterPack();"},{x,1888,"static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, TemplateTemplateParmDecl *D1, TemplateTemplateParmDecl *D2) {\n if (D1->isParameterPack() != D2->isParameterPack()) {\n if (Context.Complain) {\n Context.Diag2(D2->getLocation(), Context.getApplicableDiagnostic(diag::err_odr_parameter_pack_non_pack)) << D2->isParameterPack();"},{x,2243,"unsigned StructuralEquivalenceContext::getApplicableDiagnostic(unsigned ErrorDiagnostic) {\n // ...\n case diag::err_odr_parameter_pack_non_pack:"}} }, ["err_odr_tag_type_inconsistent"]={ [j]={{nil,P,"err_odr_tag_type_inconsistent"}}, [b]={{nil,P,"type %0 has incompatible definitions in different translation units"}}, [c]={{nil,P,"type A has incompatible definitions in different translation units"}}, [e]=d, [f]="type (.*?) has incompatible definitions in different translation units", [g]=a, [i]={{nil,P,C}}, [h]={"df0ee34bc252",1498867607,"[Modules] Implement ODR-like semantics for tag types in C/ObjC","[Modules] Implement ODR-like semantics for tag types in C/ObjC\n\nAllow ODR for ObjC/C in the sense that we won\'t keep more that\none definition around (merge them). However, ensure the decl\npass the structural compatibility check in C11 6.2.7/1, for that,\nreuse the structural equivalence checks used by the ASTImporter.\n\nFew other considerations:\n- Create error diagnostics for tag types mismatches and thread\nthem into the structural equivalence checks.\n- Note that by doing this we only support redefinition between types\nthat are considered \"compatible types\" by C.\n\nThis is mixed approach of the suggestions discussed in\nhttp://lists.llvm.org/pipermail/cfe-dev/2017-March/053257.html\n\nDifferential Revision: https://reviews.llvm.org/D31778\n\nrdar://problem/31909368\n\nllvm-svn: 306918"}, [k]={{x,1316,"static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, FieldDecl *Field1, FieldDecl *Field2, QualType Owner2Type) {\n // ...\n if (!::IsStructurallyEquivalent(Name1, Name2)) {\n if (Context.Complain) {\n Context.Diag2(Owner2->getLocation(), Context.getApplicableDiagnostic(diag::err_odr_tag_type_inconsistent)) << Owner2Type;"},{x,1331,"static bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, FieldDecl *Field1, FieldDecl *Field2, QualType Owner2Type) {\n // ...\n if (!IsStructurallyEquivalent(Context, Field1->getType(), Field2->getType())) {\n if (Context.Complain) {\n Context.Diag2(Owner2->getLocation(), Context.getApplicableDiagnostic(diag::err_odr_tag_type_inconsistent)) << Owner2Type;"},{x,1478,"/// Determine structural equivalence of two records.\nstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, RecordDecl *D1, RecordDecl *D2) {\n // ...\n if (D1->isUnion() != D2->isUnion()) {\n if (Context.Complain) {\n Context.Diag2(D2->getLocation(), Context.getApplicableDiagnostic(diag::err_odr_tag_type_inconsistent)) << Context.ToCtx.getTypeDeclType(D2);"},{x,1570,"/// Determine structural equivalence of two records.\nstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, RecordDecl *D1, RecordDecl *D2) {\n // ...\n if (auto *D1CXX = dyn_cast<CXXRecordDecl>(D1)) {\n if (auto *D2CXX = dyn_cast<CXXRecordDecl>(D2)) {\n // ...\n if (D1CXX->getNumBases() != D2CXX->getNumBases()) {\n if (Context.Complain) {\n Context.Diag2(D2->getLocation(), Context.getApplicableDiagnostic(diag::err_odr_tag_type_inconsistent)) << Context.ToCtx.getTypeDeclType(D2);"},{x,1590,"/// Determine structural equivalence of two records.\nstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, RecordDecl *D1, RecordDecl *D2) {\n // ...\n if (auto *D1CXX = dyn_cast<CXXRecordDecl>(D1)) {\n if (auto *D2CXX = dyn_cast<CXXRecordDecl>(D2)) {\n // ...\n // Check the base classes.\n for (CXXRecordDecl::base_class_iterator Base1 = D1CXX->bases_begin(), BaseEnd1 = D1CXX->bases_end(), Base2 = D2CXX->bases_begin(); Base1 != BaseEnd1; ++Base1, ++Base2) {\n if (!IsStructurallyEquivalent(Context, Base1->getType(), Base2->getType())) {\n if (Context.Complain) {\n Context.Diag2(D2->getLocation(), Context.getApplicableDiagnostic(diag::err_odr_tag_type_inconsistent)) << Context.ToCtx.getTypeDeclType(D2);"},{x,1605,"/// Determine structural equivalence of two records.\nstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, RecordDecl *D1, RecordDecl *D2) {\n // ...\n if (auto *D1CXX = dyn_cast<CXXRecordDecl>(D1)) {\n if (auto *D2CXX = dyn_cast<CXXRecordDecl>(D2)) {\n // ...\n // Check the base classes.\n for (CXXRecordDecl::base_class_iterator Base1 = D1CXX->bases_begin(), BaseEnd1 = D1CXX->bases_end(), Base2 = D2CXX->bases_begin(); Base1 != BaseEnd1; ++Base1, ++Base2) {\n // ...\n // Check virtual vs. non-virtual inheritance mismatch.\n if (Base1->isVirtual() != Base2->isVirtual()) {\n if (Context.Complain) {\n Context.Diag2(D2->getLocation(), Context.getApplicableDiagnostic(diag::err_odr_tag_type_inconsistent)) << Context.ToCtx.getTypeDeclType(D2);"},{x,1626,"/// Determine structural equivalence of two records.\nstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, RecordDecl *D1, RecordDecl *D2) {\n // ...\n if (auto *D1CXX = dyn_cast<CXXRecordDecl>(D1)) {\n if (auto *D2CXX = dyn_cast<CXXRecordDecl>(D2)) {\n // ...\n for (CXXRecordDecl::friend_iterator Friend1 = D1CXX->friend_begin(), Friend1End = D1CXX->friend_end(); Friend1 != Friend1End; ++Friend1, ++Friend2) {\n if (Friend2 == Friend2End) {\n if (Context.Complain) {\n Context.Diag2(D2->getLocation(), Context.getApplicableDiagnostic(diag::err_odr_tag_type_inconsistent)) << Context.ToCtx.getTypeDeclType(D2CXX);"},{x,1638,"/// Determine structural equivalence of two records.\nstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, RecordDecl *D1, RecordDecl *D2) {\n // ...\n if (auto *D1CXX = dyn_cast<CXXRecordDecl>(D1)) {\n if (auto *D2CXX = dyn_cast<CXXRecordDecl>(D2)) {\n // ...\n for (CXXRecordDecl::friend_iterator Friend1 = D1CXX->friend_begin(), Friend1End = D1CXX->friend_end(); Friend1 != Friend1End; ++Friend1, ++Friend2) {\n // ...\n if (!IsStructurallyEquivalent(Context, *Friend1, *Friend2)) {\n if (Context.Complain) {\n Context.Diag2(D2->getLocation(), Context.getApplicableDiagnostic(diag::err_odr_tag_type_inconsistent)) << Context.ToCtx.getTypeDeclType(D2CXX);"},{x,1651,"/// Determine structural equivalence of two records.\nstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, RecordDecl *D1, RecordDecl *D2) {\n // ...\n if (auto *D1CXX = dyn_cast<CXXRecordDecl>(D1)) {\n if (auto *D2CXX = dyn_cast<CXXRecordDecl>(D2)) {\n // ...\n if (Friend2 != Friend2End) {\n if (Context.Complain) {\n Context.Diag2(D2->getLocation(), Context.getApplicableDiagnostic(diag::err_odr_tag_type_inconsistent)) << Context.ToCtx.getTypeDeclType(D2);"},{x,1662,"/// Determine structural equivalence of two records.\nstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, RecordDecl *D1, RecordDecl *D2) {\n // ...\n if (auto *D1CXX = dyn_cast<CXXRecordDecl>(D1)) {\n if (auto *D2CXX = dyn_cast<CXXRecordDecl>(D2)) {\n // ...\n } else if (D1CXX->getNumBases() > 0) {\n if (Context.Complain) {\n Context.Diag2(D2->getLocation(), Context.getApplicableDiagnostic(diag::err_odr_tag_type_inconsistent)) << Context.ToCtx.getTypeDeclType(D2);"},{x,1684,"/// Determine structural equivalence of two records.\nstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, RecordDecl *D1, RecordDecl *D2) {\n // ...\n for (RecordDecl::field_iterator Field1 = D1->field_begin(), Field1End = D1->field_end(); Field1 != Field1End; ++Field1, ++Field2) {\n if (Field2 == Field2End) {\n if (Context.Complain) {\n Context.Diag2(D2->getLocation(), Context.getApplicableDiagnostic(diag::err_odr_tag_type_inconsistent)) << Context.ToCtx.getTypeDeclType(D2);"},{x,1700,"/// Determine structural equivalence of two records.\nstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, RecordDecl *D1, RecordDecl *D2) {\n // ...\n if (Field2 != Field2End) {\n if (Context.Complain) {\n Context.Diag2(D2->getLocation(), Context.getApplicableDiagnostic(diag::err_odr_tag_type_inconsistent)) << Context.ToCtx.getTypeDeclType(D2);"},{x,1755,"/// Determine structural equivalence of two enums.\nstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, EnumDecl *D1, EnumDecl *D2) {\n // ...\n for (EnumDecl::enumerator_iterator EC1 = D1->enumerator_begin(), EC1End = D1->enumerator_end(); EC1 != EC1End; ++EC1, ++EC2) {\n if (EC2 == EC2End) {\n if (Context.Complain) {\n Context.Diag2(D2->getLocation(), Context.getApplicableDiagnostic(diag::err_odr_tag_type_inconsistent)) << Context.ToCtx.getTypeDeclType(D2);"},{x,1771,"/// Determine structural equivalence of two enums.\nstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, EnumDecl *D1, EnumDecl *D2) {\n // ...\n for (EnumDecl::enumerator_iterator EC1 = D1->enumerator_begin(), EC1End = D1->enumerator_end(); EC1 != EC1End; ++EC1, ++EC2) {\n // ...\n if (!llvm::APSInt::isSameValue(Val1, Val2) || !IsStructurallyEquivalent(EC1->getIdentifier(), EC2->getIdentifier())) {\n if (Context.Complain) {\n Context.Diag2(D2->getLocation(), Context.getApplicableDiagnostic(diag::err_odr_tag_type_inconsistent)) << Context.ToCtx.getTypeDeclType(D2);"},{x,1785,"/// Determine structural equivalence of two enums.\nstatic bool IsStructurallyEquivalent(StructuralEquivalenceContext &Context, EnumDecl *D1, EnumDecl *D2) {\n // ...\n if (EC2 != EC2End) {\n if (Context.Complain) {\n Context.Diag2(D2->getLocation(), Context.getApplicableDiagnostic(diag::err_odr_tag_type_inconsistent)) << Context.ToCtx.getTypeDeclType(D2);"},{x,2217,"unsigned StructuralEquivalenceContext::getApplicableDiagnostic(unsigned ErrorDiagnostic) {\n // ...\n case diag::err_odr_tag_type_inconsistent:"}}, [l]={ ["clang/test/Modules/elaborated-type-specifier-from-hidden-module.m"]={"clang/test/Modules/elaborated-type-specifier-from-hidden-module.m:10:8: error: type \'struct S3\' has incompatible definitions in different translation units"} } }, ["err_odr_variable_multiple_def"]={ [j]="err_odr_variable_multiple_def", [b]="external variable %0 defined in multiple translation units", [c]="external variable A defined in multiple translation units", [e]=d, [f]="external variable (.*?) defined in multiple translation units", [g]=a, [i]=C, [h]={"3aed6cdd5e61",1265663379,"Implement basic importing and merging of variable declarations within","Implement basic importing and merging of variable declarations within\nthe AST importer. This doesn\'t actually do anything (yet), because we\ndon\'t have driver logic for merging ASTs.\n\nllvm-svn: 95570"}, [k]={{x,2213,"unsigned StructuralEquivalenceContext::getApplicableDiagnostic(unsigned ErrorDiagnostic) {\n // ...\n case diag::err_odr_variable_multiple_def:"}} }, ["err_odr_variable_type_inconsistent"]={ [j]="err_odr_variable_type_inconsistent", [b]="external variable %0 declared with incompatible types in different translation units (%1 vs. %2)", [c]="external variable A declared with incompatible types in different translation units (B vs. C)", [e]=d, [f]="external variable (.*?) declared with incompatible types in different translation units \\((.*?) vs\\. (.*?)\\)", [g]=a, [i]=C, [h]={"3aed6cdd5e61",1265663379,"Implement basic importing and merging of variable declarations within","Implement basic importing and merging of variable declarations within\nthe AST importer. This doesn\'t actually do anything (yet), because we\ndon\'t have driver logic for merging ASTs.\n\nllvm-svn: 95570"}, [k]={{x,2211,"unsigned StructuralEquivalenceContext::getApplicableDiagnostic(unsigned ErrorDiagnostic) {\n // ...\n case diag::err_odr_variable_type_inconsistent:"}} }, ["err_offsetof_array_type"]={ [j]="err_offsetof_array_type", [b]="offsetof requires array type, %0 invalid", [c]="offsetof requires array type, A invalid", [e]=d, [f]="offsetof requires array type, (.*?) invalid", [g]=a, [i]=q, [h]={"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"}, [k]={{N,16616,"ExprResult Sema::BuildBuiltinOffsetOf(SourceLocation BuiltinLoc, TypeSourceInfo *TInfo, ArrayRef<OffsetOfComponent> Components, SourceLocation RParenLoc) {\n // ...\n for (const OffsetOfComponent &OC : Components) {\n if (OC.isBrackets) {\n // Offset of an array sub-field. TODO: Should we allow vector elements?\n if (!CurrentType->isDependentType()) {\n // ...\n if (!AT)\n return ExprError(Diag(OC.LocEnd, diag::err_offsetof_array_type) << CurrentType);"}} }, ["err_offsetof_bitfield"]={ [j]="err_offsetof_bitfield", [b]="cannot compute offset of bit-field %0", [c]="cannot compute offset of bit-field A", [e]=d, [f]="cannot compute offset of bit\\-field (.*?)", [g]=a, [i]=q, [h]={"10982ea3f9e1",1272494166,"Diagnose __builtin_offsetof expressions that refer to bit-fields","Diagnose __builtin_offsetof expressions that refer to bit-fields\n\nllvm-svn: 102548"}, [k]={{N,16690,"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 Diag(OC.LocEnd, diag::err_offsetof_bitfield) << MemberDecl->getDeclName() << SourceRange(BuiltinLoc, RParenLoc);"}}, [l]={ ["clang/test/SemaCXX/offsetof.cpp"]={"clang/test/SemaCXX/offsetof.cpp:38:54: error: cannot compute offset of bit-field \'j\'"} } }, ["err_offsetof_field_of_virtual_base"]={ [j]="err_offsetof_field_of_virtual_base", [b]="invalid application of \'offsetof\' to a field of a virtual base", [c]="invalid application of \'offsetof\' to a field of a virtual base", [e]=d, [f]="invalid application of \'offsetof\' to a field of a virtual base", [g]=a, [i]=q, [h]={"ff17f8367311",1381818503,"Sema: Consider it an error to apply __builtin_offsetof to a member in a virtual base","Sema: Consider it an error to apply __builtin_offsetof to a member in a virtual base\n\nicc 13 and g++ 4.9 both reject this while we would crash.\n\nFixes PR17578.\n\nllvm-svn: 192674"}, [k]={{N,16766,"ExprResult Sema::BuildBuiltinOffsetOf(SourceLocation BuiltinLoc, TypeSourceInfo *TInfo, ArrayRef<OffsetOfComponent> Components, SourceLocation RParenLoc) {\n // ...\n for (const OffsetOfComponent &OC : Components) {\n // ...\n if (IsDerivedFrom(OC.LocStart, CurrentType, Context.getTypeDeclType(Parent), Paths)) {\n if (Paths.getDetectedVirtual()) {\n Diag(OC.LocEnd, diag::err_offsetof_field_of_virtual_base) << MemberDecl->getDeclName() << SourceRange(BuiltinLoc, RParenLoc);"}}, [l]={ ["clang/test/SemaCXX/offsetof.cpp"]={"clang/test/SemaCXX/offsetof.cpp:82:50: error: invalid application of \'offsetof\' to a field of a virtual base"} } }, ["err_offsetof_incomplete_type"]={ [j]="err_offsetof_incomplete_type", [b]="offsetof of incomplete type %0", [c]="offsetof of incomplete type A", [e]=d, [f]="offsetof of incomplete type (.*?)", [g]=a, [i]=q, [h]={"9eff4e60ae4c",1257303823,"Diagnose __builtin_offsetof on incomplete types. Fixes","Diagnose __builtin_offsetof on incomplete types. Fixes\nrdar://problem/7222956\n\nllvm-svn: 85999"}, [k]={{N,16600,"ExprResult Sema::BuildBuiltinOffsetOf(SourceLocation BuiltinLoc, TypeSourceInfo *TInfo, ArrayRef<OffsetOfComponent> Components, SourceLocation RParenLoc) {\n // ...\n if (!Dependent && RequireCompleteType(BuiltinLoc, ArgTy, diag::err_offsetof_incomplete_type, TypeRange))"},{N,16642,"ExprResult Sema::BuildBuiltinOffsetOf(SourceLocation BuiltinLoc, TypeSourceInfo *TInfo, ArrayRef<OffsetOfComponent> Components, SourceLocation RParenLoc) {\n // ...\n for (const OffsetOfComponent &OC : Components) {\n // ...\n if (RequireCompleteType(OC.LocStart, CurrentType, diag::err_offsetof_incomplete_type))"}}, [l]={ ["clang/test/Sema/offsetof.c"]={"clang/test/Sema/offsetof.c:57:11: error: offsetof of incomplete type \'struct incomplete\'"} } }, ["err_offsetof_record_type"]={ [j]="err_offsetof_record_type", [b]="offsetof requires struct, union, or class type, %0 invalid", [c]="offsetof requires struct, union, or class type, A invalid", [e]=d, [f]="offsetof requires struct, union, or class type, (.*?) invalid", [g]=a, [i]=q, [h]={"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"}, [k]={{N,16587,"ExprResult Sema::BuildBuiltinOffsetOf(SourceLocation BuiltinLoc, TypeSourceInfo *TInfo, ArrayRef<OffsetOfComponent> Components, SourceLocation RParenLoc) {\n // ...\n // We must have at least one component that refers to the type, and the first\n // one is known to be a field designator. Verify that the ArgTy represents\n // a struct/union/class.\n if (!Dependent && !ArgTy->isRecordType())\n return ExprError(Diag(BuiltinLoc, diag::err_offsetof_record_type) << ArgTy << TypeRange);"},{N,16656,"ExprResult Sema::BuildBuiltinOffsetOf(SourceLocation BuiltinLoc, TypeSourceInfo *TInfo, ArrayRef<OffsetOfComponent> Components, SourceLocation RParenLoc) {\n // ...\n for (const OffsetOfComponent &OC : Components) {\n // ...\n if (!RC)\n return ExprError(Diag(OC.LocEnd, diag::err_offsetof_record_type) << CurrentType);"}}, [l]={ ["clang/test/Sema/offsetof.c"]={"clang/test/Sema/offsetof.c:24:7: error: offsetof requires struct, union, or class type, \'int\' invalid"} } }, ["err_omp_adjust_arg_multiple_clauses"]={ [j]={{nil,s,"err_omp_adjust_arg_multiple_clauses"}}, [b]={{nil,s,"\'adjust_arg\' argument %0 used in multiple clauses"}}, [c]={{nil,s,"\'adjust_arg\' argument A used in multiple clauses"}}, [e]=d, [f]="\'adjust_arg\' argument (.*?) used in multiple clauses", [g]=a, [i]={{nil,s,n}}, [h]={"3dbcea8b957a",1615397021,"Reland [clang] Check unsupported types in expressions","Reland [clang] Check unsupported types in expressions\n\nThis was committed as ec6c847179fd, but then reverted after a failure\nin: https://lab.llvm.org/buildbot/#/builders/84/builds/13983\n\nI was not able to reproduce the problem, but I added an extra check\nfor a NULL QualType just in case.\n\nOriginal comit message:\n\nThe patch adds missing diagnostics for cases like:\n\n float F3 = ((__float128)F1 * (__float128)F2) / 2.0f;\n\nSema::checkDeviceDecl (renamed to checkTypeSupport) is changed to work\nwith a type without the corresponding ValueDecl. It is also refactored\nso that host diagnostics for unsupported types can be added here as\nwell.\n\nDifferential Revision: https://reviews.llvm.org/D109315"}, [k]={{m,7699,"void Sema::ActOnOpenMPDeclareVariantDirective(FunctionDecl *FD, Expr *VariantRef, OMPTraitInfo &TI, ArrayRef<Expr *> AdjustArgsNothing, ArrayRef<Expr *> AdjustArgsNeedDevicePtr, ArrayRef<OMPInteropInfo> AppendArgs, SourceLocation AdjustArgsLoc, SourceLocation AppendArgsLoc, SourceRange SR) {\n // ...\n for (Expr *E : AllAdjustArgs) {\n // ...\n if (const auto *DRE = dyn_cast<DeclRefExpr>(E)) {\n if (const auto *PVD = dyn_cast<ParmVarDecl>(DRE->getDecl())) {\n // ...\n if (FD->getNumParams() > PVD->getFunctionScopeIndex() && FD->getParamDecl(PVD->getFunctionScopeIndex())->getCanonicalDecl() == CanonPVD) {\n // It\'s a parameter of the function, check duplicates.\n if (!AdjustVars.insert(CanonPVD).second) {\n Diag(DRE->getLocation(), diag::err_omp_adjust_arg_multiple_clauses) << PVD;"}}, [l]={ [zb]={"clang/test/OpenMP/declare_variant_clauses_messages.cpp:115:32: error: \'adjust_arg\' argument \'AAA\' used in multiple clauses","clang/test/OpenMP/declare_variant_clauses_messages.cpp:110:69: error: \'adjust_arg\' argument \'AAA\' used in multiple clauses"} } }, ["err_omp_aligned_expected_array_or_ptr"]={ [j]="err_omp_aligned_expected_array_or_ptr", [b]="argument of aligned clause should be array%select{ or pointer|, pointer, reference to array or reference to pointer}1, not %0", [c]={{nil,nil,{"argument of aligned clause should be array",{" or pointer",", pointer, reference to array or reference to pointer"},", not A"}}}, [e]=d, [f]="argument of aligned clause should be array(?: or pointer|, pointer, reference to array or reference to pointer), not (.*?)", [g]=a, [i]=n, [h]={"f0d76e7dc3e5",1401374185,"Parsing/Sema for OMPAlignedClause.","Parsing/Sema for OMPAlignedClause.\n\nllvm-svn: 209816"}, [k]={{m,6920,"Sema::DeclGroupPtrTy Sema::ActOnOpenMPDeclareSimdDirective(DeclGroupPtrTy DG, OMPDeclareSimdDeclAttr::BranchStateTy BS, Expr *Simdlen, ArrayRef<Expr *> Uniforms, ArrayRef<Expr *> Aligneds, ArrayRef<Expr *> Alignments, ArrayRef<Expr *> Linears, ArrayRef<unsigned> LinModifiers, ArrayRef<Expr *> Steps, SourceRange SR) {\n // ...\n for (const Expr *E : Aligneds) {\n // ...\n if (const auto *DRE = dyn_cast<DeclRefExpr>(E))\n if (const auto *PVD = dyn_cast<ParmVarDecl>(DRE->getDecl())) {\n // ...\n if (FD->getNumParams() > PVD->getFunctionScopeIndex() && FD->getParamDecl(PVD->getFunctionScopeIndex())->getCanonicalDecl() == CanonPVD) {\n // ...\n if (!Ty || (!Ty->isArrayType() && !Ty->isPointerType())) {\n Diag(E->getExprLoc(), diag::err_omp_aligned_expected_array_or_ptr) << QTy << getLangOpts().CPlusPlus << E->getSourceRange();"},{m,20284,"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 Diag(ELoc, diag::err_omp_aligned_expected_array_or_ptr) << QType << getLangOpts().CPlusPlus << ERange;"}}, [l]={ ["clang/test/OpenMP/target_simd_aligned_messages.cpp"]={"clang/test/OpenMP/target_simd_aligned_messages.cpp:34:35: error: argument of aligned clause should be array, pointer, reference to array or reference to pointer, not \'B\'","clang/test/OpenMP/target_simd_aligned_messages.cpp:137:35: error: argument of aligned clause should be array, pointer, reference to array or reference to pointer, not \'S3\'","clang/test/OpenMP/target_simd_aligned_messages.cpp:140:35: error: argument of aligned clause should be array, pointer, reference to array or reference to pointer, not \'int\'","clang/test/OpenMP/target_simd_aligned_messages.cpp:182:36: error: argument of aligned clause should be array, pointer, reference to array or reference to pointer, not \'int\'","clang/test/OpenMP/target_simd_aligned_messages.cpp:187:36: error: argument of aligned clause should be array, pointer, reference to array or reference to pointer, not \'int\'","clang/test/OpenMP/target_simd_aligned_messages.cpp:193:36: error: argument of aligned clause should be array, pointer, reference to array or reference to pointer, not \'S1\'","clang/test/OpenMP/target_simd_aligned_messages.cpp:193:39: error: argument of aligned clause should be array, pointer, reference to array or reference to pointer, not \'S2\'","clang/test/OpenMP/target_simd_aligned_messages.cpp:198:35: error: argument of aligned clause should be array, pointer, reference to array or reference to pointer, not \'S3\'","clang/test/OpenMP/target_simd_aligned_messages.cpp:63:35: error: argument of aligned clause should be array, pointer, reference to array or reference to pointer, not \'int\'"} } }, ["err_omp_allocator_not_in_uses_allocators"]={ [j]={{nil,o,"err_omp_allocator_not_in_uses_allocators"}}, [b]={{nil,o,"allocator must be specified in the \'uses_allocators\' clause"}}, [c]={{nil,o,"allocator must be specified in the \'uses_allocators\' clause"}}, [e]=d, [f]="allocator must be specified in the \'uses_allocators\' clause", [g]=a, [i]={{nil,o,n}}, [h]={I,1576908663,H,F}, [k]={{m,5498,"static void checkAllocateClauses(Sema &S, DSAStackTy *Stack, ArrayRef<OMPClause *> Clauses) {\n // ...\n for (OMPClause *C : AllocateRange) {\n // ...\n if (S.getLangOpts().OpenMP >= 50 && !Stack->hasRequiresDeclWithClause<OMPDynamicAllocatorsClause>() && isOpenMPTargetExecutionDirective(Stack->getCurrentDirective()) && AC->getAllocator()) {\n // ...\n if (Checker.Visit(Allocator))\n S.Diag(Allocator->getExprLoc(), diag::err_omp_allocator_not_in_uses_allocators) << Allocator->getSourceRange();"}}, [l]={ ["clang/test/OpenMP/target_firstprivate_messages.cpp"]={"clang/test/OpenMP/target_firstprivate_messages.cpp:132:48: error: allocator must be specified in the \'uses_allocators\' clause"} } }, ["err_omp_allocator_used_in_clauses"]={ [j]={{nil,o,"err_omp_allocator_used_in_clauses"}}, [b]={{nil,o,"allocators used in \'uses_allocators\' clause cannot appear in other data-sharing or data-mapping attribute clauses"}}, [c]={{nil,o,"allocators used in \'uses_allocators\' clause cannot appear in other data-sharing or data-mapping attribute clauses"}}, [e]=d, [f]="allocators used in \'uses_allocators\' clause cannot appear in other data\\-sharing or data\\-mapping attribute clauses", [g]=a, [i]={{nil,o,n}}, [h]={I,1576908663,H,F}, [k]={{m,2957,"void Sema::EndOpenMPDSABlock(Stmt *CurDirective) {\n // OpenMP [2.14.3.5, Restrictions, C/C++, p.1]\n // A variable of class type (or array thereof) that appears in a lastprivate\n // clause requires an accessible, unambiguous default constructor for the\n // class type, unless the list item is also specified in a firstprivate\n // clause.\n if (const auto *D = dyn_cast_or_null<OMPExecutableDirective>(CurDirective)) {\n for (OMPClause *C : D->clauses()) {\n // ...\n if (auto *Clause = dyn_cast<OMPUsesAllocatorsClause>(C)) {\n for (unsigned I = 0, E = Clause->getNumberOfAllocators(); I < E; ++I) {\n // ...\n if (DVar.RefExpr || DSAStack->checkMappableExprComponentListsForDecl(VD, /*CurrentRegionOnly=*/true, [VD, &MapExpr](OMPClauseMappableExprCommon::MappableExprComponentListRef MapExprComponents, OpenMPClauseKind C) {\n // ...\n Diag(D.Allocator->getExprLoc(), diag::err_omp_allocator_used_in_clauses) << D.Allocator->getSourceRange();"}}, [l]={ ["clang/test/OpenMP/target_uses_allocators_messages.cpp"]={"clang/test/OpenMP/target_uses_allocators_messages.cpp:49:36: error: allocators used in \'uses_allocators\' clause cannot appear in other data-sharing or data-mapping attribute clauses","clang/test/OpenMP/target_uses_allocators_messages.cpp:51:58: error: allocators used in \'uses_allocators\' clause cannot appear in other data-sharing or data-mapping attribute clauses"} } }, ["err_omp_ambiguous_conversion"]={ [j]="err_omp_ambiguous_conversion", [b]="ambiguous conversion from type %0 to an integral or unscoped enumeration type", [c]="ambiguous conversion from type A to an integral or unscoped enumeration type", [e]=d, [f]="ambiguous conversion from type (.*?) to an integral or unscoped enumeration type", [g]=a, [i]=n, [h]={"568a833f68de",1394086519,"[OPENMP] Clause \'num_threads\'","[OPENMP] Clause \'num_threads\'\n\nllvm-svn: 203087"}, [k]={{m,16411,"ExprResult Sema::PerformOpenMPImplicitIntegerConversion(SourceLocation Loc, Expr *Op) {\n // ...\n class IntConvertDiagnoser : public ICEConvertDiagnoser {\n // ...\n SemaDiagnosticBuilder diagnoseAmbiguous(Sema &S, SourceLocation Loc, QualType T) override { return S.Diag(Loc, diag::err_omp_ambiguous_conversion) << T; }"}} }, ["err_omp_append_args_with_varargs"]={ [j]={{nil,s,"err_omp_append_args_with_varargs"}}, [b]={{nil,s,"\'append_args\' is not allowed with varargs functions"}}, [c]={{nil,s,"\'append_args\' is not allowed with varargs functions"}}, [e]=d, [f]="\'append_args\' is not allowed with varargs functions", [g]=a, [i]={{nil,s,n}}, [h]={ib,1616787805,lb,jb}, [k]={{m,7462,"std::optional<std::pair<FunctionDecl *, Expr *>> Sema::checkOpenMPDeclareVariantFunction(Sema::DeclGroupPtrTy DG, Expr *VariantRef, OMPTraitInfo &TI, unsigned NumAppendArgs, SourceRange SR) {\n // ...\n if (NumAppendArgs) {\n // ...\n if (PTy->isVariadic()) {\n Diag(FD->getLocation(), diag::err_omp_append_args_with_varargs) << SR;"}}, [l]={ [zb]={"clang/test/OpenMP/declare_variant_clauses_messages.cpp:100:6: error: \'append_args\' is not allowed with varargs functions"} } }, ["err_omp_argument_type_isdeviceptr"]={ [j]="err_omp_argument_type_isdeviceptr", [b]="expected pointer, array, reference to pointer, or reference to array in \'is_device_ptr clause\'", [c]="expected pointer, array, reference to pointer, or reference to array in \'is_device_ptr clause\'", [e]=d, [f]="expected pointer, array, reference to pointer, or reference to array in \'is_device_ptr clause\'", [g]=a, [i]=n, [h]={"70594e928259",1468430209,"[OpenMP] Initial implementation of parse+sema for OpenMP clause \'is_device_ptr\' of target","[OpenMP] Initial implementation of parse+sema for OpenMP clause \'is_device_ptr\' of target\n\nhttp://reviews.llvm.org/D22070\n\nllvm-svn: 275282"}, [k]={{m,23497,"OMPClause *Sema::ActOnOpenMPIsDevicePtrClause(ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs) {\n // ...\n for (Expr *RefExpr : VarList) {\n // ...\n // item should be a pointer or array or reference to pointer or array\n if (!Type.getNonReferenceType()->isPointerType() && !Type.getNonReferenceType()->isArrayType()) {\n Diag(ELoc, diag::err_omp_argument_type_isdeviceptr) << 0 << RefExpr->getSourceRange();"}}, [l]={ ["clang/test/OpenMP/target_simd_is_device_ptr_messages.cpp"]={"clang/test/OpenMP/target_simd_is_device_ptr_messages.cpp:35:39: error: expected pointer, array, reference to pointer, or reference to array in \'is_device_ptr clause\'","clang/test/OpenMP/target_simd_is_device_ptr_messages.cpp:38:39: error: expected pointer, array, reference to pointer, or reference to array in \'is_device_ptr clause\'","clang/test/OpenMP/target_simd_is_device_ptr_messages.cpp:41:39: error: expected pointer, array, reference to pointer, or reference to array in \'is_device_ptr clause\'","clang/test/OpenMP/target_simd_is_device_ptr_messages.cpp:56:39: error: expected pointer, array, reference to pointer, or reference to array in \'is_device_ptr clause\'","clang/test/OpenMP/target_simd_is_device_ptr_messages.cpp:65:41: error: expected pointer, array, reference to pointer, or reference to array in \'is_device_ptr clause\'","clang/test/OpenMP/target_simd_is_device_ptr_messages.cpp:65:43: error: expected pointer, array, reference to pointer, or reference to array in \'is_device_ptr clause\'","clang/test/OpenMP/target_simd_is_device_ptr_messages.cpp:68:39: error: expected pointer, array, reference to pointer, or reference to array in \'is_device_ptr clause\'","clang/test/OpenMP/target_simd_is_device_ptr_messages.cpp:198:39: error: expected pointer, array, reference to pointer, or reference to array in \'is_device_ptr clause\'","clang/test/OpenMP/target_simd_is_device_ptr_messages.cpp:201:39: error: expected pointer, array, reference to pointer, or reference to array in \'is_device_ptr clause\'","clang/test/OpenMP/target_simd_is_device_ptr_messages.cpp:247:39: error: expected pointer, array, reference to pointer, or reference to array in \'is_device_ptr clause\'","clang/test/OpenMP/target_simd_is_device_ptr_messages.cpp:250:39: error: expected pointer, array, reference to pointer, or reference to array in \'is_device_ptr clause\'","clang/test/OpenMP/target_simd_is_device_ptr_messages.cpp:253:39: error: expected pointer, array, reference to pointer, or reference to array in \'is_device_ptr clause\'","clang/test/OpenMP/target_simd_is_device_ptr_messages.cpp:268:39: error: expected pointer, array, reference to pointer, or reference to array in \'is_device_ptr clause\'","clang/test/OpenMP/target_simd_is_device_ptr_messages.cpp:271:39: error: expected pointer, array, reference to pointer, or reference to array in \'is_device_ptr clause\'","clang/test/OpenMP/target_simd_is_device_ptr_messages.cpp:280:41: error: expected pointer, array, reference to pointer, or reference to array in \'is_device_ptr clause\'","clang/test/OpenMP/target_simd_is_device_ptr_messages.cpp:280:43: error: expected pointer, array, reference to pointer, or reference to array in \'is_device_ptr clause\'","clang/test/OpenMP/target_simd_is_device_ptr_messages.cpp:283:39: error: expected pointer, array, reference to pointer, or reference to array in \'is_device_ptr clause\'","clang/test/OpenMP/target_simd_is_device_ptr_messages.cpp:177:39: error: expected pointer, array, reference to pointer, or reference to array in \'is_device_ptr clause\'","clang/test/OpenMP/target_simd_is_device_ptr_messages.cpp:180:39: error: expected pointer, array, reference to pointer, or reference to array in \'is_device_ptr clause\'","clang/test/OpenMP/target_simd_is_device_ptr_messages.cpp:183:39: error: expected pointer, array, reference to pointer, or reference to array in \'is_device_ptr clause\'","clang/test/OpenMP/target_simd_is_device_ptr_messages.cpp:210:41: error: expected pointer, array, reference to pointer, or reference to array in \'is_device_ptr clause\'","clang/test/OpenMP/target_simd_is_device_ptr_messages.cpp:210:43: error: expected pointer, array, reference to pointer, or reference to array in \'is_device_ptr clause\'","clang/test/OpenMP/target_simd_is_device_ptr_messages.cpp:213:39: error: expected pointer, array, reference to pointer, or reference to array in \'is_device_ptr clause\'"} } }, ["err_omp_array_section_use"]={ [j]="err_omp_array_section_use", [b]="OpenMP array section is not allowed here", [c]="OpenMP array section is not allowed here", [e]=d, [f]="OpenMP array section is not allowed here", [g]=a, [i]=n, [h]={"1a3320e4639c",1440512644,"[OPENMP 4.0] Initial support for array sections.","[OPENMP 4.0] Initial support for array sections.\n\nAdds parsing/sema analysis/serialization/deserialization for array sections in OpenMP constructs (introduced in OpenMP 4.0).\nCurrently it is allowed to use array sections only in OpenMP clauses that accepts list of expressions.\nDifferential Revision: http://reviews.llvm.org/D10732\n\nllvm-svn: 245937"}, [k]={{N,21639,"/// Check for operands with placeholder types and complain if found.\n/// Returns ExprError() if there was an error and no recovery was possible.\nExprResult Sema::CheckPlaceholderExpr(Expr *E) {\n // ...\n // Expressions of unknown type.\n case BuiltinType::OMPArraySection:\n Diag(E->getBeginLoc(), diag::err_omp_array_section_use);"}}, [l]={ ["clang/test/OpenMP/taskwait_depend_messages.cpp"]={"clang/test/OpenMP/taskwait_depend_messages.cpp:56:39: error: OpenMP array section is not allowed here"} } }, ["err_omp_array_shaping_use"]={ [j]={{nil,o,"err_omp_array_shaping_use"}}, [b]={{nil,o,"OpenMP array shaping operation is not allowed here"}}, [c]={{nil,o,"OpenMP array shaping operation is not allowed here"}}, [e]=d, [f]="OpenMP array shaping operation is not allowed here", [g]=a, [i]={{nil,o,n}}, [h]={I,1576908663,H,F}, [k]={{N,21642,"/// Check for operands with placeholder types and complain if found.\n/// Returns ExprError() if there was an error and no recovery was possible.\nExprResult Sema::CheckPlaceholderExpr(Expr *E) {\n // ...\n // Expressions of unknown type.\n case BuiltinType::OMPArrayShaping:\n return ExprError(Diag(E->getBeginLoc(), diag::err_omp_array_shaping_use));"}} }, ["err_omp_at_least_one_motion_clause_required"]={ [j]="err_omp_at_least_one_motion_clause_required", [b]="expected at least one \'to\' clause or \'from\' clause specified to \'#pragma omp target update\'", [c]="expected at least one \'to\' clause or \'from\' clause specified to \'#pragma omp target update\'", [e]=d, [f]="expected at least one \'to\' clause or \'from\' clause specified to \'\\#pragma omp target update\'", [g]=a, [i]=n, [h]={"686c70c3dc95",1464283850,"[OpenMP] Parsing and sema support for target update directive","[OpenMP] Parsing and sema support for target update directive\n\nSummary:\nThis patch is to add parsing and sema support for `target update` directive. Support for the `to` and `from` clauses will be added by a different patch. This patch also adds support for other clauses that are already implemented upstream and apply to `target update`, e.g. `device` and `if`.\n\nThis patch is based on the original post by Kelvin Li.\n\nReviewers: hfinkel, carlo.bertolli, kkwli0, arpith-jacob, ABataev\n\nSubscribers: caomhin, cfe-commits\n\nDifferential Revision: http://reviews.llvm.org/D15944\n\nllvm-svn: 270878"}, [k]={{m,13322,"StmtResult Sema::ActOnOpenMPTargetUpdateDirective(ArrayRef<OMPClause *> Clauses, SourceLocation StartLoc, SourceLocation EndLoc, Stmt *AStmt) {\n // ...\n if (!hasClauses(Clauses, OMPC_to, OMPC_from)) {\n Diag(StartLoc, diag::err_omp_at_least_one_motion_clause_required);"}}, [l]={ ["clang/test/OpenMP/target_update_nowait_messages.cpp"]={"clang/test/OpenMP/target_update_nowait_messages.cpp:11:3: error: expected at least one \'to\' clause or \'from\' clause specified to \'#pragma omp target update\'"} } }, ["err_omp_atomic_capture_not_compound_statement"]={ [j]="err_omp_atomic_capture_not_compound_statement", [b]={{nil,A,"the statement for \'atomic capture\' must be a compound statement of form \'{v = x; x binop= expr;}\', \'{x binop= expr; v = x;}\', \'{v = x; x = x binop expr;}\', \'{v = x; x = expr binop x;}\', \'{x = x binop expr; v = x;}\', \'{x = expr binop x; v = x;}\' or \'{v = x; x = expr;}\', \'{v = x; x++;}\', \'{v = x; ++x;}\', \'{++x; v = x;}\', \'{x++; v = x;}\', \'{v = x; x--;}\', \'{v = x; --x;}\', \'{--x; v = x;}\', \'{x--; v = x;}\' where x is an lvalue expression with scalar type"},{mb,nil,"the statement for \'atomic capture\' must be a compound statement of form \'{v = x; x binop= expr;}\', \'{x binop= expr; v = x;}\', \'{v = x; x = x binop expr;}\', \'{v = x; x = expr binop x;}\', \'{x = x binop expr; v = x;}\', \'{x = expr binop x; v = x;}\' or \'{v = x; x = expr;}\', \'{v = x; x++;}\', \'{v = x; ++x;}\', \'{++x; v = x;}\', \'{x++; v = x;}\', \'{v = x; x--;}\', \'{v = x; --x;}\', \'{--x; v = x;}\', \'{x--; v = x;}\' where x is an l-value expression with scalar type"}}, [c]={{nil,A,"the statement for \'atomic capture\' must be a compound statement of form \'{v = x; x binop= expr;}\', \'{x binop= expr; v = x;}\', \'{v = x; x = x binop expr;}\', \'{v = x; x = expr binop x;}\', \'{x = x binop expr; v = x;}\', \'{x = expr binop x; v = x;}\' or \'{v = x; x = expr;}\', \'{v = x; x++;}\', \'{v = x; ++x;}\', \'{++x; v = x;}\', \'{x++; v = x;}\', \'{v = x; x--;}\', \'{v = x; --x;}\', \'{--x; v = x;}\', \'{x--; v = x;}\' where x is an lvalue expression with scalar type"},{mb,nil,"the statement for \'atomic capture\' must be a compound statement of form \'{v = x; x binop= expr;}\', \'{x binop= expr; v = x;}\', \'{v = x; x = x binop expr;}\', \'{v = x; x = expr binop x;}\', \'{x = x binop expr; v = x;}\', \'{x = expr binop x; v = x;}\' or \'{v = x; x = expr;}\', \'{v = x; x++;}\', \'{v = x; ++x;}\', \'{++x; v = x;}\', \'{x++; v = x;}\', \'{v = x; x--;}\', \'{v = x; --x;}\', \'{--x; v = x;}\', \'{x--; v = x;}\' where x is an l-value expression with scalar type"}}, [e]=d, [f]="the statement for \'atomic capture\' must be a compound statement of form \'\\{v \\= x; x binop\\= expr;\\}\', \'\\{x binop\\= expr; v \\= x;\\}\', \'\\{v \\= x; x \\= x binop expr;\\}\', \'\\{v \\= x; x \\= expr binop x;\\}\', \'\\{x \\= x binop expr; v \\= x;\\}\', \'\\{x \\= expr binop x; v \\= x;\\}\' or \'\\{v \\= x; x \\= expr;\\}\', \'\\{v \\= x; x\\+\\+;\\}\', \'\\{v \\= x; \\+\\+x;\\}\', \'\\{\\+\\+x; v \\= x;\\}\', \'\\{x\\+\\+; v \\= x;\\}\', \'\\{v \\= x; x\\-\\-;\\}\', \'\\{v \\= x; \\-\\-x;\\}\', \'\\{\\-\\-x; v \\= x;\\}\', \'\\{x\\-\\-; v \\= x;\\}\' where x is an lvalue expression with scalar type", [g]=a, [i]=n, [h]={"459dec0ca2a7",1406184417,"[OPENMP] Initial parsing and sema analysis for clause \'capture\' in \'atomic\' directive.","[OPENMP] Initial parsing and sema analysis for clause \'capture\' in \'atomic\' directive.\n\nllvm-svn: 213842"}, [k]={{m,12954,"StmtResult Sema::ActOnOpenMPAtomicDirective(ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc) {\n // ...\n // OpenMP [2.12.6, atomic Construct]\n // In the next expressions:\n // * x and v (as applicable) are both l-value expressions with scalar type.\n // * During the execution of an atomic region, multiple syntactic\n // occurrences of x must designate the same storage location.\n // * Neither of v and expr (as applicable) may access the storage location\n // designated by x.\n // * Neither of x and expr (as applicable) may access the storage location\n // designated by v.\n // * expr is an expression with scalar type.\n // * binop is one of +, *, -, /, &, ^, |, <<, or >>.\n // * binop, binop=, ++, and -- are not overloaded operators.\n // * The expression x binop expr must be numerically equivalent to x binop\n // (expr). This requirement is satisfied if the operators in expr have\n // precedence greater than binop, or by using parentheses around expr or\n // subexpressions of expr.\n // * The expression expr binop x must be numerically equivalent to (expr)\n // binop x. This requirement is satisfied if the operators in expr have\n // precedence equal to or greater than binop, or by using parentheses around\n // expr or subexpressions of expr.\n // * For forms that allow multiple occurrences of x, the number of times\n // that x is evaluated is unspecified.\n if (AtomicKind == OMPC_read) {\n // ...\n } else if (AtomicKind == OMPC_write) {\n // ...\n } else if (AtomicKind == OMPC_update || AtomicKind == OMPC_unknown) {\n // ...\n } else if (AtomicKind == OMPC_capture) {\n // ...\n if (ErrorFound != NoError) {\n Diag(ErrorLoc, diag::err_omp_atomic_capture_not_compound_statement) << ErrorRange;"}}, [l]={ [nb]={"clang/test/OpenMP/atomic_messages.c:214:3: error: the statement for \'atomic capture\' must be a compound statement of form \'{v = x; x binop= expr;}\', \'{x binop= expr; v = x;}\', \'{v = x; x = x binop expr;}\', \'{v = x; x = expr binop x;}\', \'{x = x binop expr; v = x;}\', \'{x = expr binop x; v = x;}\' or \'{v = x; x = expr;}\', \'{v = x; x++;}\', \'{v = x; ++x;}\', \'{++x; v = x;}\', \'{x++; v = x;}\', \'{v = x; x--;}\', \'{v = x; --x;}\', \'{--x; v = x;}\', \'{x--; v = x;}\' where x is an lvalue expression with scalar type","clang/test/OpenMP/atomic_messages.c:246:3: error: the statement for \'atomic capture\' must be a compound statement of form \'{v = x; x binop= expr;}\', \'{x binop= expr; v = x;}\', \'{v = x; x = x binop expr;}\', \'{v = x; x = expr binop x;}\', \'{x = x binop expr; v = x;}\', \'{x = expr binop x; v = x;}\' or \'{v = x; x = expr;}\', \'{v = x; x++;}\', \'{v = x; ++x;}\', \'{++x; v = x;}\', \'{x++; v = x;}\', \'{v = x; x--;}\', \'{v = x; --x;}\', \'{--x; v = x;}\', \'{x--; v = x;}\' where x is an lvalue expression with scalar type","clang/test/OpenMP/atomic_messages.c:250:3: error: the statement for \'atomic capture\' must be a compound statement of form \'{v = x; x binop= expr;}\', \'{x binop= expr; v = x;}\', \'{v = x; x = x binop expr;}\', \'{v = x; x = expr binop x;}\', \'{x = x binop expr; v = x;}\', \'{x = expr binop x; v = x;}\' or \'{v = x; x = expr;}\', \'{v = x; x++;}\', \'{v = x; ++x;}\', \'{++x; v = x;}\', \'{x++; v = x;}\', \'{v = x; x--;}\', \'{v = x; --x;}\', \'{--x; v = x;}\', \'{x--; v = x;}\' where x is an lvalue expression with scalar type","clang/test/OpenMP/atomic_messages.c:254:6: error: the statement for \'atomic capture\' must be a compound statement of form \'{v = x; x binop= expr;}\', \'{x binop= expr; v = x;}\', \'{v = x; x = x binop expr;}\', \'{v = x; x = expr binop x;}\', \'{x = x binop expr; v = x;}\', \'{x = expr binop x; v = x;}\' or \'{v = x; x = expr;}\', \'{v = x; x++;}\', \'{v = x; ++x;}\', \'{++x; v = x;}\', \'{x++; v = x;}\', \'{v = x; x--;}\', \'{v = x; --x;}\', \'{--x; v = x;}\', \'{x--; v = x;}\' where x is an lvalue expression with scalar type","clang/test/OpenMP/atomic_messages.c:258:6: error: the statement for \'atomic capture\' must be a compound statement of form \'{v = x; x binop= expr;}\', \'{x binop= expr; v = x;}\', \'{v = x; x = x binop expr;}\', \'{v = x; x = expr binop x;}\', \'{x = x binop expr; v = x;}\', \'{x = expr binop x; v = x;}\' or \'{v = x; x = expr;}\', \'{v = x; x++;}\', \'{v = x; ++x;}\', \'{++x; v = x;}\', \'{x++; v = x;}\', \'{v = x; x--;}\', \'{v = x; --x;}\', \'{--x; v = x;}\', \'{x--; v = x;}\' where x is an lvalue expression with scalar type"} } }, ["err_omp_atomic_capture_not_expression_statement"]={ [j]="err_omp_atomic_capture_not_expression_statement", [b]={{nil,A,"the statement for \'atomic capture\' must be an expression statement of form \'v = ++x;\', \'v = --x;\', \'v = x++;\', \'v = x--;\', \'v = x binop= expr;\', \'v = x = x binop expr\' or \'v = x = expr binop x\', where x and v are both lvalue expressions with scalar type"},{mb,nil,"the statement for \'atomic capture\' must be an expression statement of form \'v = ++x;\', \'v = --x;\', \'v = x++;\', \'v = x--;\', \'v = x binop= expr;\', \'v = x = x binop expr\' or \'v = x = expr binop x\', where x and v are both l-value expressions with scalar type"}}, [c]={{nil,A,"the statement for \'atomic capture\' must be an expression statement of form \'v = ++x;\', \'v = --x;\', \'v = x++;\', \'v = x--;\', \'v = x binop= expr;\', \'v = x = x binop expr\' or \'v = x = expr binop x\', where x and v are both lvalue expressions with scalar type"},{mb,nil,"the statement for \'atomic capture\' must be an expression statement of form \'v = ++x;\', \'v = --x;\', \'v = x++;\', \'v = x--;\', \'v = x binop= expr;\', \'v = x = x binop expr\' or \'v = x = expr binop x\', where x and v are both l-value expressions with scalar type"}}, [e]=d, [f]="the statement for \'atomic capture\' must be an expression statement of form \'v \\= \\+\\+x;\', \'v \\= \\-\\-x;\', \'v \\= x\\+\\+;\', \'v \\= x\\-\\-;\', \'v \\= x binop\\= expr;\', \'v \\= x \\= x binop expr\' or \'v \\= x \\= expr binop x\', where x and v are both lvalue expressions with scalar type", [g]=a, [i]=n, [h]={"459dec0ca2a7",1406184417,"[OPENMP] Initial parsing and sema analysis for clause \'capture\' in \'atomic\' directive.","[OPENMP] Initial parsing and sema analysis for clause \'capture\' in \'atomic\' directive.\n\nllvm-svn: 213842"}, [k]={{m,12773,"StmtResult Sema::ActOnOpenMPAtomicDirective(ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc) {\n // ...\n // OpenMP [2.12.6, atomic Construct]\n // In the next expressions:\n // * x and v (as applicable) are both l-value expressions with scalar type.\n // * During the execution of an atomic region, multiple syntactic\n // occurrences of x must designate the same storage location.\n // * Neither of v and expr (as applicable) may access the storage location\n // designated by x.\n // * Neither of x and expr (as applicable) may access the storage location\n // designated by v.\n // * expr is an expression with scalar type.\n // * binop is one of +, *, -, /, &, ^, |, <<, or >>.\n // * binop, binop=, ++, and -- are not overloaded operators.\n // * The expression x binop expr must be numerically equivalent to x binop\n // (expr). This requirement is satisfied if the operators in expr have\n // precedence greater than binop, or by using parentheses around expr or\n // subexpressions of expr.\n // * The expression expr binop x must be numerically equivalent to (expr)\n // binop x. This requirement is satisfied if the operators in expr have\n // precedence equal to or greater than binop, or by using parentheses around\n // expr or subexpressions of expr.\n // * For forms that allow multiple occurrences of x, the number of times\n // that x is evaluated is unspecified.\n if (AtomicKind == OMPC_read) {\n // ...\n } else if (AtomicKind == OMPC_write) {\n // ...\n } else if (AtomicKind == OMPC_update || AtomicKind == OMPC_unknown) {\n // ...\n } else if (AtomicKind == OMPC_capture) {\n // ...\n if (const auto *AtomicBody = dyn_cast<Expr>(Body)) {\n // ...\n if (AtomicBinOp && AtomicBinOp->getOpcode() == BO_Assign) {\n // ...\n if (Checker.checkStatement(Body, diag::err_omp_atomic_capture_not_expression_statement, diag::note_omp_atomic_update))"},{m,12791,"StmtResult Sema::ActOnOpenMPAtomicDirective(ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc) {\n // ...\n // OpenMP [2.12.6, atomic Construct]\n // In the next expressions:\n // * x and v (as applicable) are both l-value expressions with scalar type.\n // * During the execution of an atomic region, multiple syntactic\n // occurrences of x must designate the same storage location.\n // * Neither of v and expr (as applicable) may access the storage location\n // designated by x.\n // * Neither of x and expr (as applicable) may access the storage location\n // designated by v.\n // * expr is an expression with scalar type.\n // * binop is one of +, *, -, /, &, ^, |, <<, or >>.\n // * binop, binop=, ++, and -- are not overloaded operators.\n // * The expression x binop expr must be numerically equivalent to x binop\n // (expr). This requirement is satisfied if the operators in expr have\n // precedence greater than binop, or by using parentheses around expr or\n // subexpressions of expr.\n // * The expression expr binop x must be numerically equivalent to (expr)\n // binop x. This requirement is satisfied if the operators in expr have\n // precedence equal to or greater than binop, or by using parentheses around\n // expr or subexpressions of expr.\n // * For forms that allow multiple occurrences of x, the number of times\n // that x is evaluated is unspecified.\n if (AtomicKind == OMPC_read) {\n // ...\n } else if (AtomicKind == OMPC_write) {\n // ...\n } else if (AtomicKind == OMPC_update || AtomicKind == OMPC_unknown) {\n // ...\n } else if (AtomicKind == OMPC_capture) {\n // ...\n if (const auto *AtomicBody = dyn_cast<Expr>(Body)) {\n // ...\n if (ErrorFound != NoError) {\n Diag(ErrorLoc, diag::err_omp_atomic_capture_not_expression_statement) << ErrorRange;"}}, [l]={ [nb]={"clang/test/OpenMP/atomic_messages.c:218:3: error: the statement for \'atomic capture\' must be an expression statement of form \'v = ++x;\', \'v = --x;\', \'v = x++;\', \'v = x--;\', \'v = x binop= expr;\', \'v = x = x binop expr\' or \'v = x = expr binop x\', where x and v are both lvalue expressions with scalar type","clang/test/OpenMP/atomic_messages.c:222:7: error: the statement for \'atomic capture\' must be an expression statement of form \'v = ++x;\', \'v = --x;\', \'v = x++;\', \'v = x--;\', \'v = x binop= expr;\', \'v = x = x binop expr\' or \'v = x = expr binop x\', where x and v are both lvalue expressions with scalar type","clang/test/OpenMP/atomic_messages.c:226:9: error: the statement for \'atomic capture\' must be an expression statement of form \'v = ++x;\', \'v = --x;\', \'v = x++;\', \'v = x--;\', \'v = x binop= expr;\', \'v = x = x binop expr\' or \'v = x = expr binop x\', where x and v are both lvalue expressions with scalar type","clang/test/OpenMP/atomic_messages.c:230:13: error: the statement for \'atomic capture\' must be an expression statement of form \'v = ++x;\', \'v = --x;\', \'v = x++;\', \'v = x--;\', \'v = x binop= expr;\', \'v = x = x binop expr\' or \'v = x = expr binop x\', where x and v are both lvalue expressions with scalar type","clang/test/OpenMP/atomic_messages.c:234:16: error: the statement for \'atomic capture\' must be an expression statement of form \'v = ++x;\', \'v = --x;\', \'v = x++;\', \'v = x--;\', \'v = x binop= expr;\', \'v = x = x binop expr\' or \'v = x = expr binop x\', where x and v are both lvalue expressions with scalar type","clang/test/OpenMP/atomic_messages.c:238:9: error: the statement for \'atomic capture\' must be an expression statement of form \'v = ++x;\', \'v = --x;\', \'v = x++;\', \'v = x--;\', \'v = x binop= expr;\', \'v = x = x binop expr\' or \'v = x = expr binop x\', where x and v are both lvalue expressions with scalar type","clang/test/OpenMP/atomic_messages.c:242:9: error: the statement for \'atomic capture\' must be an expression statement of form \'v = ++x;\', \'v = --x;\', \'v = x++;\', \'v = x--;\', \'v = x binop= expr;\', \'v = x = x binop expr\' or \'v = x = expr binop x\', where x and v are both lvalue expressions with scalar type","clang/test/OpenMP/atomic_messages.c:264:20: error: the statement for \'atomic capture\' must be an expression statement of form \'v = ++x;\', \'v = --x;\', \'v = x++;\', \'v = x--;\', \'v = x binop= expr;\', \'v = x = x binop expr\' or \'v = x = expr binop x\', where x and v are both lvalue expressions with scalar type","clang/test/OpenMP/atomic_messages.c:268:13: error: the statement for \'atomic capture\' must be an expression statement of form \'v = ++x;\', \'v = --x;\', \'v = x++;\', \'v = x--;\', \'v = x binop= expr;\', \'v = x = x binop expr\' or \'v = x = expr binop x\', where x and v are both lvalue expressions with scalar type","clang/test/OpenMP/atomic_messages.c:272:13: error: the statement for \'atomic capture\' must be an expression statement of form \'v = ++x;\', \'v = --x;\', \'v = x++;\', \'v = x--;\', \'v = x binop= expr;\', \'v = x = x binop expr\' or \'v = x = expr binop x\', where x and v are both lvalue expressions with scalar type"} } }, ["err_omp_atomic_compare"]={ [j]={{nil,E,"err_omp_atomic_compare"}}, [b]={{nil,E,"the statement for \'atomic compare\' must be a compound statement of form \'{x = expr ordop x ? expr : x;}\', \'{x = x ordop expr? expr : x;}\', \'{x = x == e ? d : x;}\', \'{x = e == x ? d : x;}\', or \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', \'if(e == x) {x = d;}\' where \'x\' is an lvalue expression with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'."}}, [c]={{nil,E,"the statement for \'atomic compare\' must be a compound statement of form \'{x = expr ordop x ? expr : x;}\', \'{x = x ordop expr? expr : x;}\', \'{x = x == e ? d : x;}\', \'{x = e == x ? d : x;}\', or \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', \'if(e == x) {x = d;}\' where \'x\' is an lvalue expression with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'."}}, [e]=d, [f]="the statement for \'atomic compare\' must be a compound statement of form \'\\{x \\= expr ordop x \\? expr \\: x;\\}\', \'\\{x \\= x ordop expr\\? expr \\: x;\\}\', \'\\{x \\= x \\=\\= e \\? d \\: x;\\}\', \'\\{x \\= e \\=\\= x \\? d \\: x;\\}\', or \'if\\(expr ordop x\\) \\{x \\= expr;\\}\', \'if\\(x ordop expr\\) \\{x \\= expr;\\}\', \'if\\(x \\=\\= e\\) \\{x \\= d;\\}\', \'if\\(e \\=\\= x\\) \\{x \\= d;\\}\' where \'x\' is an lvalue expression with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'\\<\' or \'\\>\'\\.", [g]=a, [i]={{nil,E,n}}, [h]={ib,1616787805,lb,jb}, [k]={{m,12986,"StmtResult Sema::ActOnOpenMPAtomicDirective(ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc) {\n // ...\n // OpenMP [2.12.6, atomic Construct]\n // In the next expressions:\n // * x and v (as applicable) are both l-value expressions with scalar type.\n // * During the execution of an atomic region, multiple syntactic\n // occurrences of x must designate the same storage location.\n // * Neither of v and expr (as applicable) may access the storage location\n // designated by x.\n // * Neither of x and expr (as applicable) may access the storage location\n // designated by v.\n // * expr is an expression with scalar type.\n // * binop is one of +, *, -, /, &, ^, |, <<, or >>.\n // * binop, binop=, ++, and -- are not overloaded operators.\n // * The expression x binop expr must be numerically equivalent to x binop\n // (expr). This requirement is satisfied if the operators in expr have\n // precedence greater than binop, or by using parentheses around expr or\n // subexpressions of expr.\n // * The expression expr binop x must be numerically equivalent to (expr)\n // binop x. This requirement is satisfied if the operators in expr have\n // precedence equal to or greater than binop, or by using parentheses around\n // expr or subexpressions of expr.\n // * For forms that allow multiple occurrences of x, the number of times\n // that x is evaluated is unspecified.\n if (AtomicKind == OMPC_read) {\n // ...\n } else if (AtomicKind == OMPC_write) {\n // ...\n } else if (AtomicKind == OMPC_update || AtomicKind == OMPC_unknown) {\n // ...\n } else if (AtomicKind == OMPC_capture) {\n // ...\n } else if (AtomicKind == OMPC_compare) {\n if (IsCompareCapture) {\n // ...\n } else {\n // ...\n if (!Checker.checkStmt(Body, ErrorInfo)) {\n Diag(ErrorInfo.ErrorLoc, diag::err_omp_atomic_compare) << ErrorInfo.ErrorRange;"}}, [l]={ [nb]={"clang/test/OpenMP/atomic_messages.c:411:3: error: the statement for \'atomic compare\' must be a compound statement of form \'{x = expr ordop x ? expr : x;}\', \'{x = x ordop expr? expr : x;}\', \'{x = x == e ? d : x;}\', \'{x = e == x ? d : x;}\', or \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', \'if(e == x) {x = d;}\' where \'x\' is an lvalue expression with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:415:3: error: the statement for \'atomic compare\' must be a compound statement of form \'{x = expr ordop x ? expr : x;}\', \'{x = x ordop expr? expr : x;}\', \'{x = x == e ? d : x;}\', \'{x = e == x ? d : x;}\', or \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', \'if(e == x) {x = d;}\' where \'x\' is an lvalue expression with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:422:7: error: the statement for \'atomic compare\' must be a compound statement of form \'{x = expr ordop x ? expr : x;}\', \'{x = x ordop expr? expr : x;}\', \'{x = x == e ? d : x;}\', \'{x = e == x ? d : x;}\', or \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', \'if(e == x) {x = d;}\' where \'x\' is an lvalue expression with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:426:5: error: the statement for \'atomic compare\' must be a compound statement of form \'{x = expr ordop x ? expr : x;}\', \'{x = x ordop expr? expr : x;}\', \'{x = x == e ? d : x;}\', \'{x = e == x ? d : x;}\', or \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', \'if(e == x) {x = d;}\' where \'x\' is an lvalue expression with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:430:9: error: the statement for \'atomic compare\' must be a compound statement of form \'{x = expr ordop x ? expr : x;}\', \'{x = x ordop expr? expr : x;}\', \'{x = x == e ? d : x;}\', \'{x = e == x ? d : x;}\', or \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', \'if(e == x) {x = d;}\' where \'x\' is an lvalue expression with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:434:9: error: the statement for \'atomic compare\' must be a compound statement of form \'{x = expr ordop x ? expr : x;}\', \'{x = x ordop expr? expr : x;}\', \'{x = x == e ? d : x;}\', \'{x = e == x ? d : x;}\', or \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', \'if(e == x) {x = d;}\' where \'x\' is an lvalue expression with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:438:11: error: the statement for \'atomic compare\' must be a compound statement of form \'{x = expr ordop x ? expr : x;}\', \'{x = x ordop expr? expr : x;}\', \'{x = x == e ? d : x;}\', \'{x = e == x ? d : x;}\', or \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', \'if(e == x) {x = d;}\' where \'x\' is an lvalue expression with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:442:11: error: the statement for \'atomic compare\' must be a compound statement of form \'{x = expr ordop x ? expr : x;}\', \'{x = x ordop expr? expr : x;}\', \'{x = x == e ? d : x;}\', \'{x = e == x ? d : x;}\', or \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', \'if(e == x) {x = d;}\' where \'x\' is an lvalue expression with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:446:21: error: the statement for \'atomic compare\' must be a compound statement of form \'{x = expr ordop x ? expr : x;}\', \'{x = x ordop expr? expr : x;}\', \'{x = x == e ? d : x;}\', \'{x = e == x ? d : x;}\', or \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', \'if(e == x) {x = d;}\' where \'x\' is an lvalue expression with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:451:9: error: the statement for \'atomic compare\' must be a compound statement of form \'{x = expr ordop x ? expr : x;}\', \'{x = x ordop expr? expr : x;}\', \'{x = x == e ? d : x;}\', \'{x = e == x ? d : x;}\', or \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', \'if(e == x) {x = d;}\' where \'x\' is an lvalue expression with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:458:11: error: the statement for \'atomic compare\' must be a compound statement of form \'{x = expr ordop x ? expr : x;}\', \'{x = x ordop expr? expr : x;}\', \'{x = x == e ? d : x;}\', \'{x = e == x ? d : x;}\', or \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', \'if(e == x) {x = d;}\' where \'x\' is an lvalue expression with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:465:11: error: the statement for \'atomic compare\' must be a compound statement of form \'{x = expr ordop x ? expr : x;}\', \'{x = x ordop expr? expr : x;}\', \'{x = x == e ? d : x;}\', \'{x = e == x ? d : x;}\', or \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', \'if(e == x) {x = d;}\' where \'x\' is an lvalue expression with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:471:3: error: the statement for \'atomic compare\' must be a compound statement of form \'{x = expr ordop x ? expr : x;}\', \'{x = x ordop expr? expr : x;}\', \'{x = x == e ? d : x;}\', \'{x = e == x ? d : x;}\', or \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', \'if(e == x) {x = d;}\' where \'x\' is an lvalue expression with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:483:7: error: the statement for \'atomic compare\' must be a compound statement of form \'{x = expr ordop x ? expr : x;}\', \'{x = x ordop expr? expr : x;}\', \'{x = x == e ? d : x;}\', \'{x = e == x ? d : x;}\', or \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', \'if(e == x) {x = d;}\' where \'x\' is an lvalue expression with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'."} } }, ["err_omp_atomic_compare_capture"]={ [j]={{nil,E,"err_omp_atomic_compare_capture"}}, [b]={{nil,E,"the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'."}}, [c]={{nil,E,"the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'."}}, [e]=d, [f]="the statement for \'atomic compare capture\' must be a compound statement of form \'\\{v \\= x; cond\\-up\\-stmt\\}\', \'\'\\{cond\\-up\\-stmt v \\= x;\\}\', \'\\{if\\(x \\=\\= e\\) \\{x \\= d;\\} else \\{v \\= x;\\}\\}\', \'\\{r \\= x \\=\\= e; if\\(r\\) \\{x \\= d;\\}\\}\', or \'\\{r \\= x \\=\\= e; if\\(r\\) \\{x \\= d;\\} else \\{v \\= x;\\}\\}\', where \'cond\\-update\\-stmt\' can have one of the following forms\\: \'if\\(expr ordop x\\) \\{x \\= expr;\\}\', \'if\\(x ordop expr\\) \\{x \\= expr;\\}\', \'if\\(x \\=\\= e\\) \\{x \\= d;\\}\', or \'if\\(e \\=\\= x\\) \\{x \\= d;\\}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'\\<\' or \'\\>\'\\.", [g]=a, [i]={{nil,E,n}}, [h]={ib,1616787805,lb,jb}, [k]={{m,12966,"StmtResult Sema::ActOnOpenMPAtomicDirective(ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc) {\n // ...\n // OpenMP [2.12.6, atomic Construct]\n // In the next expressions:\n // * x and v (as applicable) are both l-value expressions with scalar type.\n // * During the execution of an atomic region, multiple syntactic\n // occurrences of x must designate the same storage location.\n // * Neither of v and expr (as applicable) may access the storage location\n // designated by x.\n // * Neither of x and expr (as applicable) may access the storage location\n // designated by v.\n // * expr is an expression with scalar type.\n // * binop is one of +, *, -, /, &, ^, |, <<, or >>.\n // * binop, binop=, ++, and -- are not overloaded operators.\n // * The expression x binop expr must be numerically equivalent to x binop\n // (expr). This requirement is satisfied if the operators in expr have\n // precedence greater than binop, or by using parentheses around expr or\n // subexpressions of expr.\n // * The expression expr binop x must be numerically equivalent to (expr)\n // binop x. This requirement is satisfied if the operators in expr have\n // precedence equal to or greater than binop, or by using parentheses around\n // expr or subexpressions of expr.\n // * For forms that allow multiple occurrences of x, the number of times\n // that x is evaluated is unspecified.\n if (AtomicKind == OMPC_read) {\n // ...\n } else if (AtomicKind == OMPC_write) {\n // ...\n } else if (AtomicKind == OMPC_update || AtomicKind == OMPC_unknown) {\n // ...\n } else if (AtomicKind == OMPC_capture) {\n // ...\n } else if (AtomicKind == OMPC_compare) {\n if (IsCompareCapture) {\n // ...\n if (!Checker.checkStmt(Body, ErrorInfo)) {\n Diag(ErrorInfo.ErrorLoc, diag::err_omp_atomic_compare_capture) << ErrorInfo.ErrorRange;"}}, [l]={ [nb]={"clang/test/OpenMP/atomic_messages.c:497:15: error: the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:501:15: error: the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:509:5: error: the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:515:7: error: the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:520:7: error: the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:526:9: error: the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:532:9: error: the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:538:3: error: the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:546:10: error: the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:553:10: error: the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:563:5: error: the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:571:7: error: the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:579:9: error: the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:584:3: error: the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:588:3: error: the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:592:5: error: the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:596:23: error: the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:600:17: error: the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:604:28: error: the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:608:24: error: the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:614:12: error: the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:622:11: error: the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:626:11: error: the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:630:40: error: the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:638:12: error: the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:646:42: error: the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:650:44: error: the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:654:46: error: the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:658:7: error: the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:662:30: error: the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:666:9: error: the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:670:32: error: the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:674:12: error: the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'.","clang/test/OpenMP/atomic_messages.c:679:5: error: the statement for \'atomic compare capture\' must be a compound statement of form \'{v = x; cond-up-stmt}\', \'\'{cond-up-stmt v = x;}\', \'{if(x == e) {x = d;} else {v = x;}}\', \'{r = x == e; if(r) {x = d;}}\', or \'{r = x == e; if(r) {x = d;} else {v = x;}}\', where \'cond-update-stmt\' can have one of the following forms: \'if(expr ordop x) {x = expr;}\', \'if(x ordop expr) {x = expr;}\', \'if(x == e) {x = d;}\', or \'if(e == x) {x = d;}\' where \'x\', \'r\', and \'v\' are lvalue expressions with scalar type, \'expr\', \'e\', and \'d\' are expressions with scalar type, and \'ordop\' is one of \'<\' or \'>\'."} } }, ["err_omp_atomic_incompatible_mem_order_clause"]={ [j]={{nil,o,"err_omp_atomic_incompatible_mem_order_clause"}}, [b]={{nil,o,"directive \'#pragma omp atomic%select{ %0|}1\' cannot be used with \'%2\' clause"}}, [c]={{nil,o,{"directive \'#pragma omp atomic",{" A",a},"\' cannot be used with \'C\' clause"}}}, [e]=d, [f]="directive \'\\#pragma omp atomic(?: (.*?)|)\' cannot be used with \'(.*?)\' clause", [g]=a, [i]={{nil,o,n}}, [h]={"1228d42ddab8",1576809732,"[OpenMP][Part 2] Use reusable OpenMP context/traits handling","[OpenMP][Part 2] Use reusable OpenMP context/traits handling\n\nThis patch implements an almost complete handling of OpenMP\ncontexts/traits such that we can reuse most of the logic in Flang\nthrough the OMPContext.{h,cpp} in llvm/Frontend/OpenMP.\n\nAll but construct SIMD specifiers, e.g., inbranch, and the device ISA\nselector are define in `llvm/lib/Frontend/OpenMP/OMPKinds.def`. From\nthese definitions we generate the enum classes `TraitSet`,\n`TraitSelector`, and `TraitProperty` as well as conversion and helper\nfunctions in `llvm/lib/Frontend/OpenMP/OMPContext.{h,cpp}`.\n\nThe above enum classes are used in the parser, sema, and the AST\nattribute. The latter is not a collection of multiple primitive variant\narguments that contain encodings via numbers and strings but instead a\ntree that mirrors the `match` clause (see `struct OpenMPTraitInfo`).\n\nThe changes to the parser make it more forgiving when wrong syntax is\nread and they also resulted in more specialized diagnostics. The tests\nare updated and the core issues are detected as before. Here and\nelsewhere this patch tries to be generic, thus we do not distinguish\nwhat selector set, selector, or property is parsed except if they do\nbehave exceptionally, as for example `user={condition(EXPR)}` does.\n\nThe sema logic changed in two ways: First, the OMPDeclareVariantAttr\nrepresentation changed, as mentioned above, and the sema was adjusted to\nwork with the new `OpenMPTraitInfo`. Second, the matching and scoring\nlogic moved into `OMPContext.{h,cpp}`. It is implemented on a flat\nrepresentation of the `match` clause that is not tied to clang.\n`OpenMPTraitInfo` provides a method to generate this flat structure (see\n`struct VariantMatchInfo`) by computing integer score values and boolean\nuser conditions from the `clang::Expr` we keep for them.\n\nThe OpenMP context is now an explicit object (see `struct OMPContext`).\nThis is in anticipation of construct traits that need to be tracked. The\nOpenMP context, as well as the `VariantMatchInfo`, are basically made up\nof a set of active or respectively required traits, e.g., \'host\', and an\nordered container of constructs which allows duplication. Matching and\nscoring is kept as generic as possible to allow easy extension in the\nfuture.\n\n---\n\nTest changes:\n\nThe messages checked in `OpenMP/declare_variant_messages.{c,cpp}` have\nbeen auto generated to match the new warnings and notes of the parser.\nThe \"subset\" checks were reversed causing the wrong version to be\npicked. The tests have been adjusted to correct this.\nWe do not print scores if the user did not provide one.\nWe print spaces to make lists in the `match` clause more legible.\n\nReviewers: kiranchandramohan, ABataev, RaviNarayanaswamy, gtbercea, grokos, sdmitriev, JonChesterfield, hfinkel, fghanim\n\nSubscribers: merge_guards_bot, rampitec, mgorny, hiraditya, aheejin, fedor.sergeev, simoncook, bollu, guansong, dexonsmith, jfb, s.egerton, llvm-commits, cfe-commits\n\nTags: #clang, #llvm\n\nDifferential Revision: https://reviews.llvm.org/D71830"}, [k]={{m,12555,"StmtResult Sema::ActOnOpenMPAtomicDirective(ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc) {\n // ...\n // OpenMP 5.0, 2.17.7 atomic Construct, Restrictions\n // If atomic-clause is read then memory-order-clause must not be acq_rel or\n // release.\n // If atomic-clause is write then memory-order-clause must not be acq_rel or\n // acquire.\n // If atomic-clause is update or not present then memory-order-clause must not\n // be acq_rel or acquire.\n if ((AtomicKind == OMPC_read && (MemOrderKind == OMPC_acq_rel || MemOrderKind == OMPC_release)) || ((AtomicKind == OMPC_write || AtomicKind == OMPC_update || AtomicKind == OMPC_unknown) && (MemOrderKind == OMPC_acq_rel || MemOrderKind == OMPC_acquire))) {\n // ...\n Diag(Loc, diag::err_omp_atomic_incompatible_mem_order_clause) << getOpenMPClauseName(AtomicKind) << (AtomicKind == OMPC_unknown ? 1 : 0) << getOpenMPClauseName(MemOrderKind);"}}, [l]={ ["clang/test/OpenMP/atomic_messages.cpp"]={"clang/test/OpenMP/atomic_messages.cpp:734:1: error: directive \'#pragma omp atomic\' cannot be used with \'acq_rel\' clause","clang/test/OpenMP/atomic_messages.cpp:739:20: error: directive \'#pragma omp atomic read\' cannot be used with \'acq_rel\' clause","clang/test/OpenMP/atomic_messages.cpp:743:20: error: directive \'#pragma omp atomic update\' cannot be used with \'acq_rel\' clause","clang/test/OpenMP/atomic_messages.cpp:755:28: error: directive \'#pragma omp atomic write\' cannot be used with \'acq_rel\' clause","clang/test/OpenMP/atomic_messages.cpp:764:20: error: directive \'#pragma omp atomic update\' cannot be used with \'acq_rel\' clause","clang/test/OpenMP/atomic_messages.cpp:776:1: error: directive \'#pragma omp atomic\' cannot be used with \'acquire\' clause","clang/test/OpenMP/atomic_messages.cpp:781:1: error: directive \'#pragma omp atomic\' cannot be used with \'acquire\' clause","clang/test/OpenMP/atomic_messages.cpp:785:20: error: directive \'#pragma omp atomic update\' cannot be used with \'acquire\' clause","clang/test/OpenMP/atomic_messages.cpp:797:20: error: directive \'#pragma omp atomic write\' cannot be used with \'acquire\' clause","clang/test/OpenMP/atomic_messages.cpp:806:20: error: directive \'#pragma omp atomic update\' cannot be used with \'acquire\' clause","clang/test/OpenMP/atomic_messages.cpp:839:20: error: directive \'#pragma omp atomic read\' cannot be used with \'release\' clause","clang/test/OpenMP/atomic_messages.cpp:739:20: error: directive \'#pragma omp atomic read\' cannot be used with \'acq_rel\' clause","clang/test/OpenMP/atomic_messages.cpp:781:1: error: directive \'#pragma omp atomic\' cannot be used with \'acquire\' clause"} } }, ["err_omp_atomic_not_expression_statement"]={ [j]="err_omp_atomic_not_expression_statement", [b]={{nil,A,"the statement for \'atomic\' must be an expression statement of form \'++x;\', \'--x;\', \'x++;\', \'x--;\', \'x binop= expr;\', \'x = x binop expr\' or \'x = expr binop x\', where x is an lvalue expression with scalar type"},{mb,nil,"the statement for \'atomic\' must be an expression statement of form \'++x;\', \'--x;\', \'x++;\', \'x--;\', \'x binop= expr;\', \'x = x binop expr\' or \'x = expr binop x\', where x is an l-value expression with scalar type"}}, [c]={{nil,A,"the statement for \'atomic\' must be an expression statement of form \'++x;\', \'--x;\', \'x++;\', \'x--;\', \'x binop= expr;\', \'x = x binop expr\' or \'x = expr binop x\', where x is an lvalue expression with scalar type"},{mb,nil,"the statement for \'atomic\' must be an expression statement of form \'++x;\', \'--x;\', \'x++;\', \'x--;\', \'x binop= expr;\', \'x = x binop expr\' or \'x = expr binop x\', where x is an l-value expression with scalar type"}}, [e]=d, [f]="the statement for \'atomic\' must be an expression statement of form \'\\+\\+x;\', \'\\-\\-x;\', \'x\\+\\+;\', \'x\\-\\-;\', \'x binop\\= expr;\', \'x \\= x binop expr\' or \'x \\= expr binop x\', where x is an lvalue expression with scalar type", [g]=a, [i]=n, [h]={"1d160b1945c2",1426249651,"[OPENMP] Additional sema analysis for \'omp atomic[ update]\'.","[OPENMP] Additional sema analysis for \'omp atomic[ update]\'.\nAdds additional semantic analysis + generation of helper expressions for proper codegen.\n\nllvm-svn: 232164"}, [k]={{m,12738,"StmtResult Sema::ActOnOpenMPAtomicDirective(ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc) {\n // ...\n // OpenMP [2.12.6, atomic Construct]\n // In the next expressions:\n // * x and v (as applicable) are both l-value expressions with scalar type.\n // * During the execution of an atomic region, multiple syntactic\n // occurrences of x must designate the same storage location.\n // * Neither of v and expr (as applicable) may access the storage location\n // designated by x.\n // * Neither of x and expr (as applicable) may access the storage location\n // designated by v.\n // * expr is an expression with scalar type.\n // * binop is one of +, *, -, /, &, ^, |, <<, or >>.\n // * binop, binop=, ++, and -- are not overloaded operators.\n // * The expression x binop expr must be numerically equivalent to x binop\n // (expr). This requirement is satisfied if the operators in expr have\n // precedence greater than binop, or by using parentheses around expr or\n // subexpressions of expr.\n // * The expression expr binop x must be numerically equivalent to (expr)\n // binop x. This requirement is satisfied if the operators in expr have\n // precedence equal to or greater than binop, or by using parentheses around\n // expr or subexpressions of expr.\n // * For forms that allow multiple occurrences of x, the number of times\n // that x is evaluated is unspecified.\n if (AtomicKind == OMPC_read) {\n // ...\n } else if (AtomicKind == OMPC_write) {\n // ...\n } else if (AtomicKind == OMPC_update || AtomicKind == OMPC_unknown) {\n // ...\n if (Checker.checkStatement(Body, (AtomicKind == OMPC_update) ? diag::err_omp_atomic_update_not_expression_statement : diag::err_omp_atomic_not_expression_statement, diag::note_omp_atomic_update))"}}, [l]={ [nb]={"clang/test/OpenMP/atomic_messages.c:21:3: error: the statement for \'atomic\' must be an expression statement of form \'++x;\', \'--x;\', \'x++;\', \'x--;\', \'x binop= expr;\', \'x = x binop expr\' or \'x = expr binop x\', where x is an lvalue expression with scalar type","clang/test/OpenMP/atomic_messages.c:29:3: error: the statement for \'atomic\' must be an expression statement of form \'++x;\', \'--x;\', \'x++;\', \'x--;\', \'x binop= expr;\', \'x = x binop expr\' or \'x = expr binop x\', where x is an lvalue expression with scalar type","clang/test/OpenMP/atomic_messages.c:128:3: error: the statement for \'atomic\' must be an expression statement of form \'++x;\', \'--x;\', \'x++;\', \'x--;\', \'x binop= expr;\', \'x = x binop expr\' or \'x = expr binop x\', where x is an lvalue expression with scalar type","clang/test/OpenMP/atomic_messages.c:132:7: error: the statement for \'atomic\' must be an expression statement of form \'++x;\', \'--x;\', \'x++;\', \'x--;\', \'x binop= expr;\', \'x = x binop expr\' or \'x = expr binop x\', where x is an lvalue expression with scalar type","clang/test/OpenMP/atomic_messages.c:148:9: error: the statement for \'atomic\' must be an expression statement of form \'++x;\', \'--x;\', \'x++;\', \'x--;\', \'x binop= expr;\', \'x = x binop expr\' or \'x = expr binop x\', where x is an lvalue expression with scalar type","clang/test/OpenMP/atomic_messages.c:152:9: error: the statement for \'atomic\' must be an expression statement of form \'++x;\', \'--x;\', \'x++;\', \'x--;\', \'x binop= expr;\', \'x = x binop expr\' or \'x = expr binop x\', where x is an lvalue expression with scalar type"} } }, ["err_omp_atomic_read_not_expression_statement"]={ [j]="err_omp_atomic_read_not_expression_statement", [b]="the statement for \'atomic read\' must be an expression statement of form \'v = x;\', where v and x are both lvalue expressions with scalar type", [c]="the statement for \'atomic read\' must be an expression statement of form \'v = x;\', where v and x are both lvalue expressions with scalar type", [e]=d, [f]="the statement for \'atomic read\' must be an expression statement of form \'v \\= x;\', where v and x are both lvalue expressions with scalar type", [g]=a, [i]=n, [h]={"f98b00c33e83",1406082441,"[OPENMP] Initial parsing and sema analysis for \'read\' clause in \'atomic\' directive.","[OPENMP] Initial parsing and sema analysis for \'read\' clause in \'atomic\' directive.\n\nllvm-svn: 213717"}, [k]={{m,12654,"StmtResult Sema::ActOnOpenMPAtomicDirective(ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc) {\n // ...\n // OpenMP [2.12.6, atomic Construct]\n // In the next expressions:\n // * x and v (as applicable) are both l-value expressions with scalar type.\n // * During the execution of an atomic region, multiple syntactic\n // occurrences of x must designate the same storage location.\n // * Neither of v and expr (as applicable) may access the storage location\n // designated by x.\n // * Neither of x and expr (as applicable) may access the storage location\n // designated by v.\n // * expr is an expression with scalar type.\n // * binop is one of +, *, -, /, &, ^, |, <<, or >>.\n // * binop, binop=, ++, and -- are not overloaded operators.\n // * The expression x binop expr must be numerically equivalent to x binop\n // (expr). This requirement is satisfied if the operators in expr have\n // precedence greater than binop, or by using parentheses around expr or\n // subexpressions of expr.\n // * The expression expr binop x must be numerically equivalent to (expr)\n // binop x. This requirement is satisfied if the operators in expr have\n // precedence equal to or greater than binop, or by using parentheses around\n // expr or subexpressions of expr.\n // * For forms that allow multiple occurrences of x, the number of times\n // that x is evaluated is unspecified.\n if (AtomicKind == OMPC_read) {\n // ...\n if (ErrorFound != NoError) {\n Diag(ErrorLoc, diag::err_omp_atomic_read_not_expression_statement) << ErrorRange;"}}, [l]={ [nb]={"clang/test/OpenMP/atomic_messages.c:48:3: error: the statement for \'atomic read\' must be an expression statement of form \'v = x;\', where v and x are both lvalue expressions with scalar type","clang/test/OpenMP/atomic_messages.c:52:3: error: the statement for \'atomic read\' must be an expression statement of form \'v = x;\', where v and x are both lvalue expressions with scalar type","clang/test/OpenMP/atomic_messages.c:56:5: error: the statement for \'atomic read\' must be an expression statement of form \'v = x;\', where v and x are both lvalue expressions with scalar type","clang/test/OpenMP/atomic_messages.c:60:5: error: the statement for \'atomic read\' must be an expression statement of form \'v = x;\', where v and x are both lvalue expressions with scalar type","clang/test/OpenMP/atomic_messages.c:76:5: error: the statement for \'atomic read\' must be an expression statement of form \'v = x;\', where v and x are both lvalue expressions with scalar type"} } }, ["err_omp_atomic_several_clauses"]={ [j]="err_omp_atomic_several_clauses", [b]={{nil,s,"directive \'#pragma omp atomic\' cannot contain more than one \'read\', \'write\', \'update\', \'capture\', or \'compare\' clause"},{r,nil,"directive \'#pragma omp atomic\' cannot contain more than one \'read\', \'write\', \'update\' or \'capture\' clause"}}, [c]={{nil,s,"directive \'#pragma omp atomic\' cannot contain more than one \'read\', \'write\', \'update\', \'capture\', or \'compare\' clause"},{r,nil,"directive \'#pragma omp atomic\' cannot contain more than one \'read\', \'write\', \'update\' or \'capture\' clause"}}, [e]=d, [f]="directive \'\\#pragma omp atomic\' cannot contain more than one \'read\', \'write\', \'update\', \'capture\', or \'compare\' clause", [g]=a, [i]=n, [h]={"dea4761c06f9",1406101619,"[OPENMP] Initial parsing an sema analysis for \'write\' clause of \'atomic\' directive.","[OPENMP] Initial parsing an sema analysis for \'write\' clause of \'atomic\' directive.\n\nllvm-svn: 213728"}, [k]={{m,12494,"StmtResult Sema::ActOnOpenMPAtomicDirective(ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc) {\n // ...\n for (const OMPClause *C : Clauses) {\n // ...\n case OMPC_capture:\n case OMPC_compare: {\n if (AtomicKind != OMPC_unknown && MutexClauseEncountered) {\n Diag(C->getBeginLoc(), diag::err_omp_atomic_several_clauses) << SourceRange(C->getBeginLoc(), C->getEndLoc());"},{m,12502,"StmtResult Sema::ActOnOpenMPAtomicDirective(ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc) {\n // ...\n for (const OMPClause *C : Clauses) {\n // ...\n case OMPC_capture:\n case OMPC_compare: {\n if (AtomicKind != OMPC_unknown && MutexClauseEncountered) {\n // ...\n } else {\n // ...\n if (!EncounteredAtomicKinds.insert(C->getClauseKind()).second) {\n Diag(C->getBeginLoc(), diag::err_omp_atomic_several_clauses) << SourceRange(C->getBeginLoc(), C->getEndLoc());"}}, [l]={ ["clang/test/OpenMP/atomic_messages.cpp"]={"clang/test/OpenMP/atomic_messages.cpp:903:25: error: directive \'#pragma omp atomic\' cannot contain more than one \'read\', \'write\', \'update\', \'capture\', or \'compare\' clause","clang/test/OpenMP/atomic_messages.cpp:907:26: error: directive \'#pragma omp atomic\' cannot contain more than one \'read\', \'write\', \'update\', \'capture\', or \'compare\' clause","clang/test/OpenMP/atomic_messages.cpp:911:27: error: directive \'#pragma omp atomic\' cannot contain more than one \'read\', \'write\', \'update\', \'capture\', or \'compare\' clause","clang/test/OpenMP/atomic_messages.cpp:915:28: error: directive \'#pragma omp atomic\' cannot contain more than one \'read\', \'write\', \'update\', \'capture\', or \'compare\' clause","clang/test/OpenMP/atomic_messages.cpp:920:26: error: directive \'#pragma omp atomic\' cannot contain more than one \'read\', \'write\', \'update\', \'capture\', or \'compare\' clause","clang/test/OpenMP/atomic_messages.cpp:924:25: error: directive \'#pragma omp atomic\' cannot contain more than one \'read\', \'write\', \'update\', \'capture\', or \'compare\' clause","clang/test/OpenMP/atomic_messages.cpp:934:25: error: directive \'#pragma omp atomic\' cannot contain more than one \'read\', \'write\', \'update\', \'capture\', or \'compare\' clause","clang/test/OpenMP/atomic_messages.cpp:938:26: error: directive \'#pragma omp atomic\' cannot contain more than one \'read\', \'write\', \'update\', \'capture\', or \'compare\' clause","clang/test/OpenMP/atomic_messages.cpp:942:26: error: directive \'#pragma omp atomic\' cannot contain more than one \'read\', \'write\', \'update\', \'capture\', or \'compare\' clause","clang/test/OpenMP/atomic_messages.cpp:946:26: error: directive \'#pragma omp atomic\' cannot contain more than one \'read\', \'write\', \'update\', \'capture\', or \'compare\' clause","clang/test/OpenMP/atomic_messages.cpp:951:26: error: directive \'#pragma omp atomic\' cannot contain more than one \'read\', \'write\', \'update\', \'capture\', or \'compare\' clause","clang/test/OpenMP/atomic_messages.cpp:955:25: error: directive \'#pragma omp atomic\' cannot contain more than one \'read\', \'write\', \'update\', \'capture\', or \'compare\' clause","clang/test/OpenMP/atomic_messages.cpp:903:25: error: directive \'#pragma omp atomic\' cannot contain more than one \'read\', \'write\', \'update\', \'capture\', or \'compare\' clause","clang/test/OpenMP/atomic_messages.cpp:907:26: error: directive \'#pragma omp atomic\' cannot contain more than one \'read\', \'write\', \'update\', \'capture\', or \'compare\' clause","clang/test/OpenMP/atomic_messages.cpp:911:27: error: directive \'#pragma omp atomic\' cannot contain more than one \'read\', \'write\', \'update\', \'capture\', or \'compare\' clause","clang/test/OpenMP/atomic_messages.cpp:915:28: error: directive \'#pragma omp atomic\' cannot contain more than one \'read\', \'write\', \'update\', \'capture\', or \'compare\' clause","clang/test/OpenMP/atomic_messages.cpp:920:26: error: directive \'#pragma omp atomic\' cannot contain more than one \'read\', \'write\', \'update\', \'capture\', or \'compare\' clause","clang/test/OpenMP/atomic_messages.cpp:924:25: error: directive \'#pragma omp atomic\' cannot contain more than one \'read\', \'write\', \'update\', \'capture\', or \'compare\' clause"} } }, ["err_omp_atomic_update_not_expression_statement"]={ [j]="err_omp_atomic_update_not_expression_statement", [b]={{nil,A,"the statement for \'atomic update\' must be an expression statement of form \'++x;\', \'--x;\', \'x++;\', \'x--;\', \'x binop= expr;\', \'x = x binop expr\' or \'x = expr binop x\', where x is an lvalue expression with scalar type"},{mb,nil,"the statement for \'atomic update\' must be an expression statement of form \'++x;\', \'--x;\', \'x++;\', \'x--;\', \'x binop= expr;\', \'x = x binop expr\' or \'x = expr binop x\', where x is an l-value expression with scalar type"}}, [c]={{nil,A,"the statement for \'atomic update\' must be an expression statement of form \'++x;\', \'--x;\', \'x++;\', \'x--;\', \'x binop= expr;\', \'x = x binop expr\' or \'x = expr binop x\', where x is an lvalue expression with scalar type"},{mb,nil,"the statement for \'atomic update\' must be an expression statement of form \'++x;\', \'--x;\', \'x++;\', \'x--;\', \'x binop= expr;\', \'x = x binop expr\' or \'x = expr binop x\', where x is an l-value expression with scalar type"}}, [e]=d, [f]="the statement for \'atomic update\' must be an expression statement of form \'\\+\\+x;\', \'\\-\\-x;\', \'x\\+\\+;\', \'x\\-\\-;\', \'x binop\\= expr;\', \'x \\= x binop expr\' or \'x \\= expr binop x\', where x is an lvalue expression with scalar type", [g]=a, [i]=n, [h]={"67a4f22f12b0",1406111133,"[OPENMP] Initial parsing and sema analysis for \'update\' clause of \'atomic\' directive.","[OPENMP] Initial parsing and sema analysis for \'update\' clause of \'atomic\' directive.\n\nllvm-svn: 213735"}, [k]={{m,12737,"StmtResult Sema::ActOnOpenMPAtomicDirective(ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc) {\n // ...\n // OpenMP [2.12.6, atomic Construct]\n // In the next expressions:\n // * x and v (as applicable) are both l-value expressions with scalar type.\n // * During the execution of an atomic region, multiple syntactic\n // occurrences of x must designate the same storage location.\n // * Neither of v and expr (as applicable) may access the storage location\n // designated by x.\n // * Neither of x and expr (as applicable) may access the storage location\n // designated by v.\n // * expr is an expression with scalar type.\n // * binop is one of +, *, -, /, &, ^, |, <<, or >>.\n // * binop, binop=, ++, and -- are not overloaded operators.\n // * The expression x binop expr must be numerically equivalent to x binop\n // (expr). This requirement is satisfied if the operators in expr have\n // precedence greater than binop, or by using parentheses around expr or\n // subexpressions of expr.\n // * The expression expr binop x must be numerically equivalent to (expr)\n // binop x. This requirement is satisfied if the operators in expr have\n // precedence equal to or greater than binop, or by using parentheses around\n // expr or subexpressions of expr.\n // * For forms that allow multiple occurrences of x, the number of times\n // that x is evaluated is unspecified.\n if (AtomicKind == OMPC_read) {\n // ...\n } else if (AtomicKind == OMPC_write) {\n // ...\n } else if (AtomicKind == OMPC_update || AtomicKind == OMPC_unknown) {\n // ...\n if (Checker.checkStatement(Body, (AtomicKind == OMPC_update) ? diag::err_omp_atomic_update_not_expression_statement : diag::err_omp_atomic_not_expression_statement, diag::note_omp_atomic_update))"}}, [l]={ [nb]={"clang/test/OpenMP/atomic_messages.c:124:3: error: the statement for \'atomic update\' must be an expression statement of form \'++x;\', \'--x;\', \'x++;\', \'x--;\', \'x binop= expr;\', \'x = x binop expr\' or \'x = expr binop x\', where x is an lvalue expression with scalar type","clang/test/OpenMP/atomic_messages.c:136:9: error: the statement for \'atomic update\' must be an expression statement of form \'++x;\', \'--x;\', \'x++;\', \'x--;\', \'x binop= expr;\', \'x = x binop expr\' or \'x = expr binop x\', where x is an lvalue expression with scalar type","clang/test/OpenMP/atomic_messages.c:140:9: error: the statement for \'atomic update\' must be an expression statement of form \'++x;\', \'--x;\', \'x++;\', \'x--;\', \'x binop= expr;\', \'x = x binop expr\' or \'x = expr binop x\', where x is an lvalue expression with scalar type","clang/test/OpenMP/atomic_messages.c:144:16: error: the statement for \'atomic update\' must be an expression statement of form \'++x;\', \'--x;\', \'x++;\', \'x--;\', \'x binop= expr;\', \'x = x binop expr\' or \'x = expr binop x\', where x is an lvalue expression with scalar type"} } }, ["err_omp_atomic_write_not_expression_statement"]={ [j]="err_omp_atomic_write_not_expression_statement", [b]="the statement for \'atomic write\' must be an expression statement of form \'x = expr;\', where x is a lvalue expression with scalar type", [c]="the statement for \'atomic write\' must be an expression statement of form \'x = expr;\', where x is a lvalue expression with scalar type", [e]=d, [f]="the statement for \'atomic write\' must be an expression statement of form \'x \\= expr;\', where x is a lvalue expression with scalar type", [g]=a, [i]=n, [h]={"dea4761c06f9",1406101619,"[OPENMP] Initial parsing an sema analysis for \'write\' clause of \'atomic\' directive.","[OPENMP] Initial parsing an sema analysis for \'write\' clause of \'atomic\' directive.\n\nllvm-svn: 213728"}, [k]={{m,12716,"StmtResult Sema::ActOnOpenMPAtomicDirective(ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc) {\n // ...\n // OpenMP [2.12.6, atomic Construct]\n // In the next expressions:\n // * x and v (as applicable) are both l-value expressions with scalar type.\n // * During the execution of an atomic region, multiple syntactic\n // occurrences of x must designate the same storage location.\n // * Neither of v and expr (as applicable) may access the storage location\n // designated by x.\n // * Neither of x and expr (as applicable) may access the storage location\n // designated by v.\n // * expr is an expression with scalar type.\n // * binop is one of +, *, -, /, &, ^, |, <<, or >>.\n // * binop, binop=, ++, and -- are not overloaded operators.\n // * The expression x binop expr must be numerically equivalent to x binop\n // (expr). This requirement is satisfied if the operators in expr have\n // precedence greater than binop, or by using parentheses around expr or\n // subexpressions of expr.\n // * The expression expr binop x must be numerically equivalent to (expr)\n // binop x. This requirement is satisfied if the operators in expr have\n // precedence equal to or greater than binop, or by using parentheses around\n // expr or subexpressions of expr.\n // * For forms that allow multiple occurrences of x, the number of times\n // that x is evaluated is unspecified.\n if (AtomicKind == OMPC_read) {\n // ...\n } else if (AtomicKind == OMPC_write) {\n // ...\n if (ErrorFound != NoError) {\n Diag(ErrorLoc, diag::err_omp_atomic_write_not_expression_statement) << ErrorRange;"}}, [l]={ [nb]={"clang/test/OpenMP/atomic_messages.c:87:3: error: the statement for \'atomic write\' must be an expression statement of form \'x = expr;\', where x is a lvalue expression with scalar type","clang/test/OpenMP/atomic_messages.c:91:3: error: the statement for \'atomic write\' must be an expression statement of form \'x = expr;\', where x is a lvalue expression with scalar type","clang/test/OpenMP/atomic_messages.c:95:5: error: the statement for \'atomic write\' must be an expression statement of form \'x = expr;\', where x is a lvalue expression with scalar type","clang/test/OpenMP/atomic_messages.c:113:5: error: the statement for \'atomic write\' must be an expression statement of form \'x = expr;\', where x is a lvalue expression with scalar type"} } }, ["err_omp_begin_declare_target_unexpected_implicit_to_clause"]={ [j]={{nil,r,"err_omp_begin_declare_target_unexpected_implicit_to_clause"}}, [b]={{nil,r,"unexpected \'(\', only \'to\', \'link\' or \'device_type\' clauses expected for \'begin declare target\' directive"}}, [c]={{nil,r,"unexpected \'(\', only \'to\', \'link\' or \'device_type\' clauses expected for \'begin declare target\' directive"}}, [e]=d, [f]="unexpected \'\\(\', only \'to\', \'link\' or \'device_type\' clauses expected for \'begin declare target\' directive", [g]=a, [i]={{nil,r,u}}, [h]={qb,1612659633,sb,tb}, [k]={{t,1931,"void Parser::ParseOMPDeclareTargetClauses(Sema::DeclareTargetContextInfo &DTCI) {\n // ...\n while (Tok.isNot(tok::annot_pragma_openmp_end)) {\n // ...\n if (Tok.is(tok::l_paren)) {\n Diag(Tok, diag::err_omp_begin_declare_target_unexpected_implicit_to_clause);"}} }, ["err_omp_bit_fields_forbidden_in_clause"]={ [j]="err_omp_bit_fields_forbidden_in_clause", [b]="bit fields cannot be used to specify storage in a \'%0\' clause", [c]="bit fields cannot be used to specify storage in a \'A\' clause", [e]=d, [f]="bit fields cannot be used to specify storage in a \'(.*?)\' clause", [g]=a, [i]=n, [h]={"661c0904e144",1464284398,"[OpenMP] Parsing and sema support for the to clause","[OpenMP] Parsing and sema support for the to clause\n\nSummary:\nThe patch contains the parsing and sema support for the `to` clause. \n\nPatch based on the original post by Kelvin Li.\n\nReviewers: carlo.bertolli, hfinkel, kkwli0, arpith-jacob, ABataev\n\nSubscribers: caomhin, cfe-commits\n\nDifferential Revision: http://reviews.llvm.org/D18597\n\nllvm-svn: 270880"}, [k]={{m,21172,"class MapBaseChecker final : public StmtVisitor<MapBaseChecker, bool> {\n // ...\n bool VisitMemberExpr(MemberExpr *ME) {\n // ...\n // OpenMP 4.5 [2.15.5.1, map Clause, Restrictions, C/C++, p.3]\n // A bit-field cannot appear in a map clause.\n //\n if (FD->isBitField()) {\n if (!NoDiagnose) {\n SemaRef.Diag(ELoc, diag::err_omp_bit_fields_forbidden_in_clause) << ME->getSourceRange() << getOpenMPClauseName(CKind);"}}, [l]={ ["clang/test/OpenMP/target_update_from_messages.cpp"]={"clang/test/OpenMP/target_update_from_messages.cpp:134:38: error: bit fields cannot be used to specify storage in a \'from\' clause","clang/test/OpenMP/target_update_from_messages.cpp:190:38: error: bit fields cannot be used to specify storage in a \'from\' clause"} } }, ["err_omp_cannot_update_with_internal_linkage"]={ [j]={{nil,E,"err_omp_cannot_update_with_internal_linkage"}}, [b]={{nil,E,"the host cannot update a declare target variable that is not externally visible."}}, [c]={{nil,E,"the host cannot update a declare target variable that is not externally visible."}}, [e]=d, [f]="the host cannot update a declare target variable that is not externally visible\\.", [g]=a, [i]={{nil,E,n}}, [h]={"f60dc3caa673",1620118562,"[C++20][Modules] Adjust handling of exports of namespaces and using-decls.","[C++20][Modules] Adjust handling of exports of namespaces and using-decls.\n\nThis adjusts the handling for:\n\nexport module M;\n\nexport namespace {};\n\nexport namespace N {};\nexport using namespace N;\n\nIn the first case, we were allowing empty anonymous namespaces\nas part of an extension allowing empty top-level entities, but that seems\ninappropriate in this case, since the linkage would be internal for the\nanonymous namespace. We now report an error for this.\n\nThe second case was producing a warning diagnostic that this was\naccepted as an extension - however the C++20 standard does allow this\nas well-formed.\n\nIn the third case we keep the current practice that this is accepted with a\nwarning (as an extension). The C++20 standard says it\'s an error.\n\nWe also ensure that using decls are only applied to items with external linkage.\n\nThis adjusts error messages for exports involving redeclarations in modules to\nbe more specific about the reason that the decl has been rejected.\n\nDifferential Revision: https://reviews.llvm.org/D122119"}, [k]={{m,13327,"StmtResult Sema::ActOnOpenMPTargetUpdateDirective(ArrayRef<OMPClause *> Clauses, SourceLocation StartLoc, SourceLocation EndLoc, Stmt *AStmt) {\n // ...\n if (!isClauseMappable(Clauses)) {\n Diag(StartLoc, diag::err_omp_cannot_update_with_internal_linkage);"}}, [l]={ ["clang/test/OpenMP/target_update_messages.cpp"]={"clang/test/OpenMP/target_update_messages.cpp:21:1: error: the host cannot update a declare target variable that is not externally visible.","clang/test/OpenMP/target_update_messages.cpp:28:1: error: the host cannot update a declare target variable that is not externally visible."} } }, ["err_omp_clause_floating_type_arg"]={ [j]="err_omp_clause_floating_type_arg", [b]="arguments of OpenMP clause \'reduction\' with bitwise operators cannot be of floating type", [c]="arguments of OpenMP clause \'reduction\' with bitwise operators cannot be of floating type", [e]=d, [f]="arguments of OpenMP clause \'(.*?)\' with bitwise operators cannot be of floating type", [g]=a, [i]=n, [h]={"c5e025831ba7",1402902515,"[OPENMP] Initial support of \'reduction\' clause","[OPENMP] Initial support of \'reduction\' clause\n\nllvm-svn: 211007"}, [k]={{m,19460,"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 S.Diag(ELoc, diag::err_omp_clause_floating_type_arg) << getOpenMPClauseName(ClauseKind);"}} }, ["err_omp_clause_not_arithmetic_type_arg"]={ [j]="err_omp_clause_not_arithmetic_type_arg", [b]="arguments of OpenMP clause \'reduction\' for \'min\' or \'max\' must be of %select{scalar|arithmetic}0 type", [c]={{nil,P,{"arguments of OpenMP clause \'A\' for \'min\' or \'max\' must be of ",{"scalar","arithmetic"}," type"}},{nil,nil,{"arguments of OpenMP clause \'reduction\' for \'min\' or \'max\' must be of ",{"scalar","arithmetic"}," type"}}}, [e]=d, [f]="arguments of OpenMP clause \'(.*?)\' for \'min\' or \'max\' must be of (?:scalar|arithmetic) type", [g]=a, [i]=n, [h]={"c5e025831ba7",1402902515,"[OPENMP] Initial support of \'reduction\' clause","[OPENMP] Initial support of \'reduction\' clause\n\nllvm-svn: 211007"}, [k]={{m,19447,"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 S.Diag(ELoc, diag::err_omp_clause_not_arithmetic_type_arg) << getOpenMPClauseName(ClauseKind) << S.getLangOpts().CPlusPlus;"}}, [l]={ ["clang/test/OpenMP/taskloop_reduction_messages_attr.cpp"]={"clang/test/OpenMP/taskloop_reduction_messages_attr.cpp:248:48: error: arguments of OpenMP clause \'reduction\' for \'min\' or \'max\' must be of arithmetic type","clang/test/OpenMP/taskloop_reduction_messages_attr.cpp:248:51: error: arguments of OpenMP clause \'reduction\' for \'min\' or \'max\' must be of arithmetic type","clang/test/OpenMP/taskloop_reduction_messages_attr.cpp:146:48: error: arguments of OpenMP clause \'reduction\' for \'min\' or \'max\' must be of arithmetic type","clang/test/OpenMP/taskloop_reduction_messages_attr.cpp:146:51: error: arguments of OpenMP clause \'reduction\' for \'min\' or \'max\' must be of arithmetic type","clang/test/OpenMP/taskloop_reduction_messages_attr.cpp:146:48: error: arguments of OpenMP clause \'reduction\' for \'min\' or \'max\' must be of arithmetic type","clang/test/OpenMP/taskloop_reduction_messages_attr.cpp:146:51: error: arguments of OpenMP clause \'reduction\' for \'min\' or \'max\' must be of arithmetic type"} } }, ["err_omp_clause_requires_dispatch_construct"]={ [j]={{nil,s,"err_omp_clause_requires_dispatch_construct"}}, [b]={{nil,s,"\'%0\' clause requires \'dispatch\' context selector"}}, [c]={{nil,s,"\'A\' clause requires \'dispatch\' context selector"}}, [e]=d, [f]="\'(.*?)\' clause requires \'dispatch\' context selector", [g]=a, [i]={{nil,s,n}}, [h]={"3dbcea8b957a",1615397021,"Reland [clang] Check unsupported types in expressions","Reland [clang] Check unsupported types in expressions\n\nThis was committed as ec6c847179fd, but then reverted after a failure\nin: https://lab.llvm.org/buildbot/#/builders/84/builds/13983\n\nI was not able to reproduce the problem, but I added an extra check\nfor a NULL QualType just in case.\n\nOriginal comit message:\n\nThe patch adds missing diagnostics for cases like:\n\n float F3 = ((__float128)F1 * (__float128)F2) / 2.0f;\n\nSema::checkDeviceDecl (renamed to checkTypeSupport) is changed to work\nwith a type without the corresponding ValueDecl. It is also refactored\nso that host diagnostics for unsupported types can be added here as\nwell.\n\nDifferential Revision: https://reviews.llvm.org/D109315"}, [k]={{m,7675,"void Sema::ActOnOpenMPDeclareVariantDirective(FunctionDecl *FD, Expr *VariantRef, OMPTraitInfo &TI, ArrayRef<Expr *> AdjustArgsNothing, ArrayRef<Expr *> AdjustArgsNeedDevicePtr, ArrayRef<OMPInteropInfo> AppendArgs, SourceLocation AdjustArgsLoc, SourceLocation AppendArgsLoc, SourceRange SR) {\n // ...\n if (!AllAdjustArgs.empty() || !AppendArgs.empty()) {\n // ...\n if (!llvm::is_contained(VMI.ConstructTraits, llvm::omp::TraitProperty::construct_dispatch_dispatch)) {\n if (!AllAdjustArgs.empty())\n Diag(AdjustArgsLoc, diag::err_omp_clause_requires_dispatch_construct) << getOpenMPClauseName(OMPC_adjust_args);"},{m,7678,"void Sema::ActOnOpenMPDeclareVariantDirective(FunctionDecl *FD, Expr *VariantRef, OMPTraitInfo &TI, ArrayRef<Expr *> AdjustArgsNothing, ArrayRef<Expr *> AdjustArgsNeedDevicePtr, ArrayRef<OMPInteropInfo> AppendArgs, SourceLocation AdjustArgsLoc, SourceLocation AppendArgsLoc, SourceRange SR) {\n // ...\n if (!AllAdjustArgs.empty() || !AppendArgs.empty()) {\n // ...\n if (!llvm::is_contained(VMI.ConstructTraits, llvm::omp::TraitProperty::construct_dispatch_dispatch)) {\n // ...\n if (!AppendArgs.empty())\n Diag(AppendArgsLoc, diag::err_omp_clause_requires_dispatch_construct) << getOpenMPClauseName(OMPC_append_args);"}}, [l]={ [zb]={"clang/test/OpenMP/declare_variant_clauses_messages.cpp:156:47: error: \'append_args\' clause requires \'dispatch\' context selector","clang/test/OpenMP/declare_variant_clauses_messages.cpp:152:21: error: \'append_args\' clause requires \'dispatch\' context selector","clang/test/OpenMP/declare_variant_clauses_messages.cpp:133:4: error: \'adjust_args\' clause requires \'dispatch\' context selector","clang/test/OpenMP/declare_variant_clauses_messages.cpp:129:4: error: \'adjust_args\' clause requires \'dispatch\' context selector"} } }, ["err_omp_clauses_mutually_exclusive"]={ [j]={{nil,o,"err_omp_clauses_mutually_exclusive"}}, [b]={{nil,o,"\'%0\' and \'%1\' clause are mutually exclusive and may not appear on the same directive"}}, [c]={{nil,o,"\'A\' and \'B\' clause are mutually exclusive and may not appear on the same directive"}}, [e]=d, [f]="\'(.*?)\' and \'(.*?)\' clause are mutually exclusive and may not appear on the same directive", [g]=a, [i]={{nil,o,n}}, [h]={I,1576908663,H,F}, [k]={{m,11098,"/// Find and diagnose mutually exclusive clause kinds.\nstatic bool checkMutuallyExclusiveClauses(Sema &S, ArrayRef<OMPClause *> Clauses, ArrayRef<OpenMPClauseKind> MutuallyExclusiveClauses) {\n // ...\n for (const OMPClause *C : Clauses) {\n if (llvm::is_contained(MutuallyExclusiveClauses, C->getClauseKind())) {\n if (!PrevClause) {\n // ...\n } else if (PrevClause->getClauseKind() != C->getClauseKind()) {\n S.Diag(C->getBeginLoc(), diag::err_omp_clauses_mutually_exclusive) << getOpenMPClauseName(C->getClauseKind()) << getOpenMPClauseName(PrevClause->getClauseKind());"}}, [l]={ [Gb]={"clang/test/OpenMP/unroll_messages.cpp:75:30: error: \'full\' and \'partial\' clause are mutually exclusive and may not appear on the same directive","clang/test/OpenMP/unroll_messages.cpp:79:27: error: \'partial\' and \'full\' clause are mutually exclusive and may not appear on the same directive"} } }, ["err_omp_const_list_item"]={ [j]={{nil,y,"err_omp_const_list_item"}}, [b]={{nil,y,"const-qualified list item cannot be %0"}}, [c]={{nil,y,"const-qualified list item cannot be A"}}, [e]=d, [f]="const\\-qualified list item cannot be (.*?)", [g]=a, [i]={{nil,y,n}}, [h]={"d2649292ef26",1546639916,"[OpenMP] Refactor const restriction for reductions","[OpenMP] Refactor const restriction for reductions\n\nAs discussed in D56113, this patch refactors the implementation of the\nconst restriction for reductions to reuse a function introduced by\nD56113. A side effect is that diagnostics sometimes now say\n\"variable\" instead of \"list item\" when a list item is a variable.\n\nReviewed By: ABataev\n\nDifferential Revision: https://reviews.llvm.org/D56298\n\nllvm-svn: 350440"}, [k]={{m,1711,"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 unsigned Diag = ListItemNotVar ? diag::err_omp_const_list_item : IsClassType ? diag::err_omp_const_not_mutable_variable : diag::err_omp_const_variable;"}} }, ["err_omp_const_not_mutable_variable"]={ [j]={{nil,y,"err_omp_const_not_mutable_variable"}}, [b]={{nil,y,"const-qualified variable without mutable fields cannot be %0"}}, [c]={{nil,y,"const-qualified variable without mutable fields cannot be A"}}, [e]=d, [f]="const\\-qualified variable without mutable fields cannot be (.*?)", [g]=a, [i]={{nil,y,n}}, [h]={"e6234d142911",1546639891,"[OpenMP] Replace predetermined shared for const variable","[OpenMP] Replace predetermined shared for const variable\n\nThe following appears in OpenMP 3.1 sec. 2.9.1.1 as a predetermined\ndata-sharing attribute:\n\n> Variables with const-qualified type having no mutable member are\n> shared.\n\nIt does not appear in OpenmP 4.0, 4.5, or 5.0. This patch removes the\nimplementation of that attribute when the requested OpenMP version is\ngreater than 3.1.\n\nOne effect of that removal is that `default(none)` affects const\nvariables without mutable members.\n\nAlso, without this patch, if a const variable without mutable members\nwas explicitly lastprivate or private, it was an error because it was\npredetermined shared. Now, clang instead complains that it\'s const\nwithout mutable fields, which is a more intelligible diagnostic. That\nshould be fine for all of the above versions because they all have\nsomething like the following, which is quoted from OpenMP 5.0\nsec. 2.19.3:\n\n> A variable that is privatized must not have a const-qualified type\n> unless it is of class type with a mutable member. This restriction does\n> not apply to the firstprivate clause.\n\nreduction and linear clauses already have separate checks for const\nvariables. Future patches will merge the implementations.\n\nReviewed By: ABataev\n\nDifferential Revision: https://reviews.llvm.org/D56113\n\nllvm-svn: 350439"}, [k]={{m,1712,"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 unsigned Diag = ListItemNotVar ? diag::err_omp_const_list_item : IsClassType ? diag::err_omp_const_not_mutable_variable : diag::err_omp_const_variable;"}}, [l]={ ["clang/test/OpenMP/target_teams_private_messages.cpp"]={"clang/test/OpenMP/target_teams_private_messages.cpp:88:41: error: const-qualified variable without mutable fields cannot be private","clang/test/OpenMP/target_teams_private_messages.cpp:94:34: error: const-qualified variable without mutable fields cannot be private"} } }, ["err_omp_const_variable"]={ [j]="err_omp_const_variable", [b]="const-qualified variable cannot be %0", [c]="const-qualified variable cannot be A", [e]=d, [f]="const\\-qualified variable cannot be (.*?)", [g]=a, [i]=n, [h]={"8dba66412b0a",1398172182,"[OPENMP] parsing \'linear\' clause (for directive \'omp simd\')","[OPENMP] parsing \'linear\' clause (for directive \'omp simd\')\n\nDifferential Revision: http://reviews.llvm.org/D3272\n\nllvm-svn: 206891"}, [k]={{m,1713,"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 unsigned Diag = ListItemNotVar ? diag::err_omp_const_list_item : IsClassType ? diag::err_omp_const_not_mutable_variable : diag::err_omp_const_variable;"}}, [l]={ ["clang/test/OpenMP/target_teams_private_messages.cpp"]={"clang/test/OpenMP/target_teams_private_messages.cpp:88:44: error: const-qualified variable cannot be private","clang/test/OpenMP/target_teams_private_messages.cpp:88:47: error: const-qualified variable cannot be private","clang/test/OpenMP/target_teams_private_messages.cpp:96:34: error: const-qualified variable cannot be private"} } }, ["err_omp_critical_with_hint"]={ [j]="err_omp_critical_with_hint", [b]="constructs with the same name must have a \'hint\' clause with the same value", [c]="constructs with the same name must have a \'hint\' clause with the same value", [e]=d, [f]="constructs with the same name must have a \'hint\' clause with the same value", [g]=a, [i]=n, [h]={"28c75417b2c4",1450167564,"[OPENMP 4.5] Parsing/sema for \'hint\' clause of \'critical\' directive.","[OPENMP 4.5] Parsing/sema for \'hint\' clause of \'critical\' directive.\nOpenMP 4.5 adds \'hint\' clause to critical directive. Patch adds parsing/semantic analysis for this clause.\n\nllvm-svn: 255625"}, [k]={{m,10888,"StmtResult Sema::ActOnOpenMPCriticalDirective(const DeclarationNameInfo &DirName, ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc) {\n // ...\n if (Pair.first && DirName.getName() && !DependentHint) {\n if (llvm::APSInt::compareValues(Hint, Pair.second) != 0) {\n Diag(StartLoc, diag::err_omp_critical_with_hint);"}}, [l]={ ["clang/test/OpenMP/critical_messages.cpp"]={"clang/test/OpenMP/critical_messages.cpp:70:3: error: constructs with the same name must have a \'hint\' clause with the same value"} } }, ["err_omp_decl_in_declare_simd_variant"]={ [j]={{nil,p,"err_omp_decl_in_declare_simd_variant"}}, [b]={{nil,p,"function declaration is expected after \'declare %select{simd|variant}0\' directive"}}, [c]={{nil,p,{"function declaration is expected after \'declare ",{"simd","variant"},"\' directive"}}}, [e]=d, [f]="function declaration is expected after \'declare (?:simd|variant)\' directive", [g]=a, [i]={{nil,p,u}}, [h]={"d158cf64d64b",1568405897,"[OPENMP5.0]Add basic support for declare variant directive.","[OPENMP5.0]Add basic support for declare variant directive.\n\nAdded basic support for declare variant directive and its match clause\nwith user context selector.\n\nllvm-svn: 371892"}, [k]={{t,2320,"/// Parsing of declarative OpenMP directives.\n///\n/// threadprivate-directive:\n/// annot_pragma_openmp \'threadprivate\' simple-variable-list\n/// annot_pragma_openmp_end\n///\n/// allocate-directive:\n/// annot_pragma_openmp \'allocate\' simple-variable-list [<clause>]\n/// annot_pragma_openmp_end\n///\n/// declare-reduction-directive:\n/// annot_pragma_openmp \'declare\' \'reduction\' [...]\n/// annot_pragma_openmp_end\n///\n/// declare-mapper-directive:\n/// annot_pragma_openmp \'declare\' \'mapper\' \'(\' [<mapper-identifer> \':\']\n/// <type> <var> \')\' [<clause>[[,] <clause>] ... ]\n/// annot_pragma_openmp_end\n///\n/// declare-simd-directive:\n/// annot_pragma_openmp \'declare simd\' {<clause> [,]}\n/// annot_pragma_openmp_end\n/// <function declaration/definition>\n///\n/// requires directive:\n/// annot_pragma_openmp \'requires\' <clause> [[[,] <clause>] ... ]\n/// annot_pragma_openmp_end\n///\n/// assumes directive:\n/// annot_pragma_openmp \'assumes\' <clause> [[[,] <clause>] ... ]\n/// annot_pragma_openmp_end\n/// or\n/// annot_pragma_openmp \'begin assumes\' <clause> [[[,] <clause>] ... ]\n/// annot_pragma_openmp \'end assumes\'\n/// annot_pragma_openmp_end\n///\nParser::DeclGroupPtrTy Parser::ParseOpenMPDeclarativeDirectiveWithExtDecl(AccessSpecifier &AS, ParsedAttributes &Attrs, bool Delayed, DeclSpec::TST TagType, Decl *Tag) {\n // ...\n case OMPD_declare_variant:\n case OMPD_declare_simd: {\n // ...\n if (!Ptr) {\n Diag(Loc, diag::err_omp_decl_in_declare_simd_variant) << (DKind == OMPD_declare_simd ? 0 : 1);"}}, [l]={ [Fb]={"clang/test/OpenMP/declare_simd_messages.cpp:18:1: error: function declaration is expected after \'declare simd\' directive","clang/test/OpenMP/declare_simd_messages.cpp:24:1: error: function declaration is expected after \'declare simd\' directive","clang/test/OpenMP/declare_simd_messages.cpp:23:1: error: function declaration is expected after \'declare simd\' directive","clang/test/OpenMP/declare_simd_messages.cpp:31:1: error: function declaration is expected after \'declare simd\' directive","clang/test/OpenMP/declare_simd_messages.cpp:30:1: error: function declaration is expected after \'declare simd\' directive","clang/test/OpenMP/declare_simd_messages.cpp:37:3: error: function declaration is expected after \'declare simd\' directive","clang/test/OpenMP/declare_simd_messages.cpp:214:1: error: function declaration is expected after \'declare simd\' directive","clang/test/OpenMP/declare_simd_messages.cpp:236:3: error: function declaration is expected after \'declare simd\' directive","clang/test/OpenMP/declare_simd_messages.cpp:241:1: error: function declaration is expected after \'declare simd\' directive","clang/test/OpenMP/declare_simd_messages.cpp:239:1: error: function declaration is expected after \'declare simd\' directive"} } }, ["err_omp_declare_mapper_redefinition"]={ [j]={{nil,v,"err_omp_declare_mapper_redefinition"}}, [b]={{nil,v,"redefinition of user-defined mapper for type %0 with name %1"}}, [c]={{nil,v,"redefinition of user-defined mapper for type A with name B"}}, [e]=d, [f]="redefinition of user\\-defined mapper for type (.*?) with name (.*?)", [g]=a, [i]={{nil,v,n}}, [h]={Jb,1549052704,Kb,Hb}, [k]={{m,22543,"Sema::DeclGroupPtrTy Sema::ActOnOpenMPDeclareMapperDirective(Scope *S, DeclContext *DC, DeclarationName Name, QualType MapperType, SourceLocation StartLoc, DeclarationName VN, AccessSpecifier AS, Expr *MapperVarRef, ArrayRef<OMPClause *> Clauses, Decl *PrevDeclInScope) {\n // ...\n if (I != PreviousRedeclTypes.end()) {\n Diag(StartLoc, diag::err_omp_declare_mapper_redefinition) << MapperType << Name;"}}, [l]={ [vb]={"clang/test/OpenMP/declare_mapper_messages.cpp:33:28: error: redefinition of user-defined mapper for type \'vec\' with name \'default\'","clang/test/OpenMP/declare_mapper_messages.cpp:44:32: error: redefinition of user-defined mapper for type \'vec\' with name \'id\'","clang/test/OpenMP/declare_mapper_messages.cpp:56:32: error: redefinition of user-defined mapper for type \'vec\' with name \'id\'","clang/test/OpenMP/declare_mapper_messages.cpp:120:32: error: redefinition of user-defined mapper for type \'vec\' with name \'id\'"} } }, ["err_omp_declare_mapper_wrong_var"]={ [j]={{nil,v,"err_omp_declare_mapper_wrong_var"}}, [b]={{nil,v,"only variable %0 is allowed in map clauses of this \'omp declare mapper\' directive"}}, [c]={{nil,v,"only variable A is allowed in map clauses of this \'omp declare mapper\' directive"}}, [e]=d, [f]="only variable (.*?) is allowed in map clauses of this \'omp declare mapper\' directive", [g]=a, [i]={{nil,v,n}}, [h]={Jb,1549052704,Kb,Hb}, [k]={{N,359,"/// Determine whether the use of this declaration is valid, and\n/// emit any corresponding diagnostics.\n///\n/// This routine diagnoses various problems with referencing\n/// declarations that can occur when using a declaration. For example,\n/// it might warn if a deprecated or unavailable declaration is being\n/// used, or produce an error (and return true) if a C++0x deleted\n/// function is being used.\n///\n/// \\returns true if there was an error (this declaration cannot be\n/// referenced), false otherwise.\n///\nbool Sema::DiagnoseUseOfDecl(NamedDecl *D, ArrayRef<SourceLocation> Locs, const ObjCInterfaceDecl *UnknownObjCClass, bool ObjCPropertyAccess, bool AvoidPartialAvailabilityChecks, ObjCInterfaceDecl *ClassReceiver, bool SkipTrailingRequiresClause) {\n // ...\n // [OpenMP 5.0], 2.19.7.3. declare mapper Directive, Restrictions\n // List-items in map clauses on this construct may only refer to the declared\n // variable var and entities that could be referenced by a procedure defined\n // at the same location.\n // [OpenMP 5.2] Also allow iterator declared variables.\n if (LangOpts.OpenMP && isa<VarDecl>(D) && !isOpenMPDeclareMapperVarDeclAllowed(cast<VarDecl>(D))) {\n Diag(Loc, diag::err_omp_declare_mapper_wrong_var) << getOpenMPDeclareMapperVarName();"}}, [l]={ [vb]={"clang/test/OpenMP/declare_mapper_messages.cpp:31:51: error: only variable \'v\' is allowed in map clauses of this \'omp declare mapper\' directive"} } }, ["err_omp_declare_reduction_redefinition"]={ [j]="err_omp_declare_reduction_redefinition", [b]="redefinition of user-defined reduction for type %0", [c]="redefinition of user-defined reduction for type A", [e]=d, [f]="redefinition of user\\-defined reduction for type (.*?)", [g]=a, [i]=n, [h]={"94a4f0cb5f8a",1456982499,"[OPENMP 4.0] Initial support for \'omp declare reduction\' construct.","[OPENMP 4.0] Initial support for \'omp declare reduction\' construct.\n\nAdd parsing, sema analysis and serialization/deserialization for \'declare reduction\' construct.\nUser-defined reductions are defined as\n\n#pragma omp declare reduction( reduction-identifier : typename-list : combiner ) [initializer ( initializer-expr )]\nThese custom reductions may be used in \'reduction\' clauses of OpenMP constructs. The combiner specifies how partial results can be combined into a single value. The\ncombiner can use the special variable identifiers omp_in and omp_out that are of the type of the variables being reduced with this reduction-identifier. Each of them will\ndenote one of the values to be combined before executing the combiner. It is assumed that the special omp_out identifier will refer to the storage that holds the resulting\ncombined value after executing the combiner.\nAs the initializer-expr value of a user-defined reduction is not known a priori the initializer-clause can be used to specify one. Then the contents of the initializer-clause\nwill be used as the initializer for private copies of reduction list items where the omp_priv identifier will refer to the storage to be initialized. The special identifier\nomp_orig can also appear in the initializer-clause and it will refer to the storage of the original variable to be reduced.\nDifferential Revision: http://reviews.llvm.org/D11182\n\nllvm-svn: 262582"}, [k]={{m,22292,"Sema::DeclGroupPtrTy Sema::ActOnOpenMPDeclareReductionDirectiveStart(Scope *S, DeclContext *DC, DeclarationName Name, ArrayRef<std::pair<QualType, SourceLocation>> ReductionTypes, AccessSpecifier AS, Decl *PrevDeclInScope) {\n // ...\n for (const auto &TyData : ReductionTypes) {\n // ...\n if (I != PreviousRedeclTypes.end()) {\n Diag(TyData.second, diag::err_omp_declare_reduction_redefinition) << TyData.first;"}}, [l]={ ["clang/test/OpenMP/declare_reduction_messages.c"]={"clang/test/OpenMP/declare_reduction_messages.c:30:50: error: redefinition of user-defined reduction for type \'long\'","clang/test/OpenMP/declare_reduction_messages.c:41:38: error: redefinition of user-defined reduction for type \'long\'","clang/test/OpenMP/declare_reduction_messages.c:60:37: error: redefinition of user-defined reduction for type \'int\'"} } }, ["err_omp_declare_simd_inbranch_notinbranch"]={ [j]="err_omp_declare_simd_inbranch_notinbranch", [b]="unexpected \'%0\' clause, \'%1\' is specified already", [c]="unexpected \'A\' clause, \'B\' is specified already", [e]=d, [f]="unexpected \'(.*?)\' clause, \'(.*?)\' is specified already", [g]=a, [i]=u, [h]={"20dfd778264a",1459764735,"[OPENMP 4.0] Support for \'inbranch|noinbranch\' clauses in \'declare","[OPENMP 4.0] Support for \'inbranch|noinbranch\' clauses in \'declare\nsimd\'.\n\nAdded parsing/semantic analysis for \'inbranch|notinbranch\' clauses of\n\'#pragma omp declare simd\' construct.\n\nllvm-svn: 265287"}, [k]={{t,729,"/// Parses clauses for \'declare simd\' directive.\n/// clause:\n/// \'inbranch\' | \'notinbranch\'\n/// \'simdlen\' \'(\' <expr> \')\'\n/// { \'uniform\' \'(\' <argument_list> \')\' }\n/// { \'aligned \'(\' <argument_list> [ \':\' <alignment> ] \')\' }\n/// { \'linear \'(\' <argument_list> [ \':\' <step> ] \')\' }\nstatic bool parseDeclareSimdClauses(Parser &P, OMPDeclareSimdDeclAttr::BranchStateTy &BS, ExprResult &SimdLen, SmallVectorImpl<Expr *> &Uniforms, SmallVectorImpl<Expr *> &Aligneds, SmallVectorImpl<Expr *> &Alignments, SmallVectorImpl<Expr *> &Linears, SmallVectorImpl<unsigned> &LinModifiers, SmallVectorImpl<Expr *> &Steps) {\n // ...\n while (Tok.isNot(tok::annot_pragma_openmp_end)) {\n // ...\n // Parse \'inranch|notinbranch\' clauses.\n if (OMPDeclareSimdDeclAttr::ConvertStrToBranchStateTy(ClauseName, Out)) {\n if (BS != OMPDeclareSimdDeclAttr::BS_Undefined && BS != Out) {\n P.Diag(Tok, diag::err_omp_declare_simd_inbranch_notinbranch) << ClauseName << OMPDeclareSimdDeclAttr::ConvertBranchStateTyToStr(BS) << BSRange;"}}, [l]={ [Fb]={"clang/test/OpenMP/declare_simd_messages.cpp:64:50: error: unexpected \'inbranch\' clause, \'notinbranch\' is specified already","clang/test/OpenMP/declare_simd_messages.cpp:63:44: error: unexpected \'notinbranch\' clause, \'inbranch\' is specified already"} } }, ["err_omp_declare_target_indirect_device_type"]={ [j]={{nil,s,"err_omp_declare_target_indirect_device_type"}}, [b]={{nil,s,"only \'device_type(any)\' clause is allowed with indirect clause"}}, [c]={{nil,s,"only \'device_type(any)\' clause is allowed with indirect clause"}}, [e]=d, [f]="only \'device_type\\(any\\)\' clause is allowed with indirect clause", [g]=a, [i]={{nil,s,u}}, [h]={qb,1612659633,sb,tb}, [k]={{t,1948,"void Parser::ParseOMPDeclareTargetClauses(Sema::DeclareTargetContextInfo &DTCI) {\n // ...\n if (DTCI.Indirect && DTCI.DT != OMPDeclareTargetDeclAttr::DT_Any)\n Diag(DeviceTypeLoc, diag::err_omp_declare_target_indirect_device_type);"}}, [l]={ [U]={"clang/test/OpenMP/declare_target_messages.cpp:63:34: error: only \'device_type(any)\' clause is allowed with indirect clause"} } }, ["err_omp_declare_target_missing_enter_or_link_clause"]={ [j]={{nil,w,"err_omp_declare_target_missing_enter_or_link_clause"}}, [b]={{nil,w,"expected at least one %select{\'enter\' or \'link\'|\'enter\', \'link\' or \'indirect\'}0 clause"}}, [c]={{nil,w,{"expected at least one ",{"\'enter\' or \'link\'","\'enter\', \'link\' or \'indirect\'"}," clause"}}}, [e]=d, [f]="expected at least one (?:\'enter\' or \'link\'|\'enter\', \'link\' or \'indirect\') clause", [g]=a, [i]={{nil,w,u}}, [h]={Ab,1668641028,T,T}, [k]={{t,1955,"void Parser::ParseOMPDeclareTargetClauses(Sema::DeclareTargetContextInfo &DTCI) {\n // ...\n // For declare target require at least \'to\' or \'link\' to be present.\n if (DTCI.Kind == OMPD_declare_target && RequiresToOrLinkOrIndirectClause && !HasToOrLinkOrIndirectClause)\n Diag(DTCI.Loc, getLangOpts().OpenMP >= 52 ? diag::err_omp_declare_target_missing_enter_or_link_clause : diag::err_omp_declare_target_missing_to_or_link_clause) << (getLangOpts().OpenMP >= 51 ? 1 : 0);"}}, [l]={ [U]={"clang/test/OpenMP/declare_target_messages.cpp:28:21: error: expected at least one \'enter\', \'link\' or \'indirect\' clause","clang/test/OpenMP/declare_target_messages.cpp:30:21: error: expected at least one \'enter\', \'link\' or \'indirect\' clause","clang/test/OpenMP/declare_target_messages.cpp:34:21: error: expected at least one \'enter\', \'link\' or \'indirect\' clause","clang/test/OpenMP/declare_target_messages.cpp:37:21: error: expected at least one \'enter\', \'link\' or \'indirect\' clause","clang/test/OpenMP/declare_target_messages.cpp:202:21: error: expected at least one \'enter\', \'link\' or \'indirect\' clause","clang/test/OpenMP/declare_target_messages.cpp:206:21: error: expected at least one \'enter\', \'link\' or \'indirect\' clause","clang/test/OpenMP/declare_target_messages.cpp:208:21: error: expected at least one \'enter\', \'link\' or \'indirect\' clause","clang/test/OpenMP/declare_target_messages.cpp:211:21: error: expected at least one \'enter\', \'link\' or \'indirect\' clause","clang/test/OpenMP/declare_target_messages.cpp:213:21: error: expected at least one \'enter\', \'link\' or \'indirect\' clause","clang/test/OpenMP/declare_target_messages.cpp:215:21: error: expected at least one \'enter\', \'link\' or \'indirect\' clause","clang/test/OpenMP/declare_target_messages.cpp:217:21: error: expected at least one \'enter\', \'link\' or \'indirect\' clause","clang/test/OpenMP/declare_target_messages.cpp:232:21: error: expected at least one \'enter\', \'link\' or \'indirect\' clause","clang/test/OpenMP/declare_target_messages.cpp:233:21: error: expected at least one \'enter\', \'link\' or \'indirect\' clause","clang/test/OpenMP/declare_target_messages.cpp:234:21: error: expected at least one \'enter\', \'link\' or \'indirect\' clause"} } }, ["err_omp_declare_target_missing_to_or_link_clause"]={ [j]={{nil,r,"err_omp_declare_target_missing_to_or_link_clause"}}, [b]={{nil,s,"expected at least one %select{\'to\' or \'link\'|\'to\', \'link\' or \'indirect\'}0 clause"},{r,r,"expected at least one \'to\' or \'link\' clause"}}, [c]={{nil,s,{"expected at least one ",{"\'to\' or \'link\'","\'to\', \'link\' or \'indirect\'"}," clause"}},{r,r,"expected at least one \'to\' or \'link\' clause"}}, [e]=d, [f]="expected at least one (?:\'to\' or \'link\'|\'to\', \'link\' or \'indirect\') clause", [g]=a, [i]={{nil,r,u}}, [h]={qb,1612659633,sb,tb}, [k]={{t,1956,"void Parser::ParseOMPDeclareTargetClauses(Sema::DeclareTargetContextInfo &DTCI) {\n // ...\n // For declare target require at least \'to\' or \'link\' to be present.\n if (DTCI.Kind == OMPD_declare_target && RequiresToOrLinkOrIndirectClause && !HasToOrLinkOrIndirectClause)\n Diag(DTCI.Loc, getLangOpts().OpenMP >= 52 ? diag::err_omp_declare_target_missing_enter_or_link_clause : diag::err_omp_declare_target_missing_to_or_link_clause) << (getLangOpts().OpenMP >= 51 ? 1 : 0);"}}, [l]={ [U]={"clang/test/OpenMP/declare_target_messages.cpp:28:21: error: expected at least one \'to\' or \'link\' clause"} } }, ["err_omp_declare_target_multiple"]={ [j]="err_omp_declare_target_multiple", [b]="%0 appears multiple times in clauses on the same declare target directive", [c]="A appears multiple times in clauses on the same declare target directive", [e]=d, [f]="(.*?) appears multiple times in clauses on the same declare target directive", [g]=a, [i]={{nil,r,u},{A,nil,n}}, [h]={"d69b505e3c67",1462805953,"[OpenMP] Parse+Sema for \'#pragma omp declare target\' syntax version 4.5","[OpenMP] Parse+Sema for \'#pragma omp declare target\' syntax version 4.5\n\nSupport OpenMP version 4.5 syntax for #pragma omp declare target.\n\nSyntax:\n #pragma omp declare target (extended-list) new-line\nor\n #pragma omp declare target clause[ [,] clause ... ] new-line\n\nWhere clause is one of the following:\n to(extended-list)\n link(list)\n\nDifferential Revision: http://reviews.llvm.org/D20011\n\nllvm-svn: 268925"}, [k]={{t,1921,"void Parser::ParseOMPDeclareTargetClauses(Sema::DeclareTargetContextInfo &DTCI) {\n // ...\n while (Tok.isNot(tok::annot_pragma_openmp_end)) {\n // ...\n if (DTCI.Kind == OMPD_declare_target || HasIdentifier) {\n auto &&Callback = [this, MT, &DTCI](CXXScopeSpec &SS, DeclarationNameInfo NameInfo) {\n // ...\n if (!FirstMapping)\n Diag(NameInfo.getLoc(), diag::err_omp_declare_target_multiple) << NameInfo.getName();"}}, [l]={ [U]={"clang/test/OpenMP/declare_target_messages.cpp:201:32: error: \'x\' appears multiple times in clauses on the same declare target directive","clang/test/OpenMP/declare_target_messages.cpp:202:37: error: \'x\' appears multiple times in clauses on the same declare target directive"} } }, ["err_omp_declare_target_to_and_link"]={ [j]="err_omp_declare_target_to_and_link", [b]="%0 must not appear in both clauses \'to\' and \'link\'", [c]="A must not appear in both clauses \'to\' and \'link\'", [e]=d, [f]="(.*?) must not appear in both clauses \'to\' and \'link\'", [g]=a, [i]=n, [h]={"d69b505e3c67",1462805953,"[OpenMP] Parse+Sema for \'#pragma omp declare target\' syntax version 4.5","[OpenMP] Parse+Sema for \'#pragma omp declare target\' syntax version 4.5\n\nSupport OpenMP version 4.5 syntax for #pragma omp declare target.\n\nSyntax:\n #pragma omp declare target (extended-list) new-line\nor\n #pragma omp declare target clause[ [,] clause ... ] new-line\n\nWhere clause is one of the following:\n to(extended-list)\n link(list)\n\nDifferential Revision: http://reviews.llvm.org/D20011\n\nllvm-svn: 268925"}, [k]={{m,23083,"void Sema::ActOnOpenMPDeclareTargetName(NamedDecl *ND, SourceLocation Loc, OMPDeclareTargetDeclAttr::MapTypeTy MT, DeclareTargetContextInfo &DTCI) {\n // ...\n if (ActiveAttr && (*ActiveAttr)->getMapType() != MT && (*ActiveAttr)->getLevel() == Level) {\n Diag(Loc, diag::err_omp_declare_target_to_and_link) << ND;"}}, [l]={ [U]={"clang/test/OpenMP/declare_target_messages.cpp:203:33: error: \'x\' must not appear in both clauses \'to\' and \'link\'"} } }, ["err_omp_declare_target_unexpected_clause"]={ [j]="err_omp_declare_target_unexpected_clause", [b]={{nil,s,"unexpected \'%0\' clause, only %select{\'device_type\'|\'to\' or \'link\'|\'to\', \'link\' or \'device_type\'|\'device_type\', \'indirect\'|\'to\', \'link\', \'device_type\' or \'indirect\'}1 clauses expected"},{r,r,"unexpected \'%0\' clause, only %select{\'device_type\'|\'to\' or \'link\'|\'to\', \'link\' or \'device_type\'}1 clauses expected"},{A,p,"unexpected \'%0\' clause, only %select{\'to\' or \'link\'|\'to\', \'link\' or \'device_type\'}1 clauses expected"},{v,nil,"unexpected \'%0\' clause, only \'to\' or \'link\' clauses expected"}}, [c]={{nil,s,{"unexpected \'A\' clause, only ",{"\'device_type\'","\'to\' or \'link\'","\'to\', \'link\' or \'device_type\'","\'device_type\', \'indirect\'","\'to\', \'link\', \'device_type\' or \'indirect\'"}," clauses expected"}},{r,r,{"unexpected \'A\' clause, only ",{"\'device_type\'","\'to\' or \'link\'","\'to\', \'link\' or \'device_type\'"}," clauses expected"}},{A,p,{"unexpected \'A\' clause, only ",{"\'to\' or \'link\'","\'to\', \'link\' or \'device_type\'"}," clauses expected"}},{v,nil,"unexpected \'A\' clause, only \'to\' or \'link\' clauses expected"}}, [e]=d, [f]="unexpected \'(.*?)\' clause, only (?:\'device_type\'|\'to\' or \'link\'|\'to\', \'link\' or \'device_type\'|\'device_type\', \'indirect\'|\'to\', \'link\', \'device_type\' or \'indirect\') clauses expected", [g]=a, [i]=u, [h]={"d69b505e3c67",1462805953,"[OpenMP] Parse+Sema for \'#pragma omp declare target\' syntax version 4.5","[OpenMP] Parse+Sema for \'#pragma omp declare target\' syntax version 4.5\n\nSupport OpenMP version 4.5 syntax for #pragma omp declare target.\n\nSyntax:\n #pragma omp declare target (extended-list) new-line\nor\n #pragma omp declare target clause[ [,] clause ... ] new-line\n\nWhere clause is one of the following:\n to(extended-list)\n link(list)\n\nDifferential Revision: http://reviews.llvm.org/D20011\n\nllvm-svn: 268925"}, [k]={{t,1857,"void Parser::ParseOMPDeclareTargetClauses(Sema::DeclareTargetContextInfo &DTCI) {\n // ...\n while (Tok.isNot(tok::annot_pragma_openmp_end)) {\n // ...\n if (HasIdentifier) {\n // ...\n if (!IsDeviceTypeClause && !IsIndirectClause && DTCI.Kind == OMPD_begin_declare_target) {\n Diag(Tok, diag::err_omp_declare_target_unexpected_clause) << ClauseName << (getLangOpts().OpenMP >= 51 ? 3 : 0);"},{t,1864,"void Parser::ParseOMPDeclareTargetClauses(Sema::DeclareTargetContextInfo &DTCI) {\n // ...\n while (Tok.isNot(tok::annot_pragma_openmp_end)) {\n // ...\n if (HasIdentifier) {\n // ...\n if (!IsDeviceTypeClause && !IsToEnterOrLinkClause && !IsIndirectClause) {\n Diag(Tok, getLangOpts().OpenMP >= 52 ? diag::err_omp_declare_target_unexpected_clause_52 : diag::err_omp_declare_target_unexpected_clause) << ClauseName << (getLangOpts().OpenMP >= 51 ? 4 : getLangOpts().OpenMP >= 50 ? 2 : 1);"}}, [l]={ [U]={"clang/test/OpenMP/declare_target_messages.cpp:28:28: error: unexpected \'map\' clause, only \'to\', \'link\' or \'device_type\' clauses expected","clang/test/OpenMP/declare_target_messages.cpp:72:39: error: unexpected \'allocate\' clause, only \'to\', \'link\' or \'device_type\' clauses expected"} } }, ["err_omp_declare_target_unexpected_clause_52"]={ [j]={{nil,w,"err_omp_declare_target_unexpected_clause_52"}}, [b]={{nil,w,"unexpected \'%0\' clause, only %select{\'device_type\'|\'enter\' or \'link\'|\'enter\', \'link\' or \'device_type\'|\'device_type\', \'indirect\'|\'enter\', \'link\', \'device_type\' or \'indirect\'}1 clauses expected"}}, [c]={{nil,w,{"unexpected \'A\' clause, only ",{"\'device_type\'","\'enter\' or \'link\'","\'enter\', \'link\' or \'device_type\'","\'device_type\', \'indirect\'","\'enter\', \'link\', \'device_type\' or \'indirect\'"}," clauses expected"}}}, [e]=d, [f]="unexpected \'(.*?)\' clause, only (?:\'device_type\'|\'enter\' or \'link\'|\'enter\', \'link\' or \'device_type\'|\'device_type\', \'indirect\'|\'enter\', \'link\', \'device_type\' or \'indirect\') clauses expected", [g]=a, [i]={{nil,w,u}}, [h]={Ab,1668641028,T,T}, [k]={{t,1863,"void Parser::ParseOMPDeclareTargetClauses(Sema::DeclareTargetContextInfo &DTCI) {\n // ...\n while (Tok.isNot(tok::annot_pragma_openmp_end)) {\n // ...\n if (HasIdentifier) {\n // ...\n if (!IsDeviceTypeClause && !IsToEnterOrLinkClause && !IsIndirectClause) {\n Diag(Tok, getLangOpts().OpenMP >= 52 ? diag::err_omp_declare_target_unexpected_clause_52 : diag::err_omp_declare_target_unexpected_clause) << ClauseName << (getLangOpts().OpenMP >= 51 ? 4 : getLangOpts().OpenMP >= 50 ? 2 : 1);"}}, [l]={ [U]={"clang/test/OpenMP/declare_target_messages.cpp:28:28: error: unexpected \'map\' clause, only \'enter\', \'link\', \'device_type\' or \'indirect\' clauses expected","clang/test/OpenMP/declare_target_messages.cpp:72:39: error: unexpected \'allocate\' clause, only \'enter\', \'link\', \'device_type\' or \'indirect\' clauses expected"} } }, ["err_omp_declare_target_unexpected_enter_clause"]={ [j]={{nil,w,"err_omp_declare_target_unexpected_enter_clause"}}, [b]={{nil,w,"unexpected \'enter\' clause, use \'to\' instead"}}, [c]={{nil,w,"unexpected \'enter\' clause, use \'to\' instead"}}, [e]=d, [f]="unexpected \'enter\' clause, use \'to\' instead", [g]=a, [i]={{nil,w,u}}, [h]={Ab,1668641028,T,T}, [k]={{t,1851,"void Parser::ParseOMPDeclareTargetClauses(Sema::DeclareTargetContextInfo &DTCI) {\n // ...\n while (Tok.isNot(tok::annot_pragma_openmp_end)) {\n // ...\n if (HasIdentifier) {\n // ...\n if (getLangOpts().OpenMP <= 51 && ClauseName == \"enter\") {\n Diag(Tok, diag::err_omp_declare_target_unexpected_enter_clause);"}} }, ["err_omp_declare_target_unexpected_to_clause"]={ [j]={{nil,w,"err_omp_declare_target_unexpected_to_clause"}}, [b]={{nil,w,"unexpected \'to\' clause, use \'enter\' instead"}}, [c]={{nil,w,"unexpected \'to\' clause, use \'enter\' instead"}}, [e]=d, [f]="unexpected \'to\' clause, use \'enter\' instead", [g]=a, [i]={{nil,w,u}}, [h]={Ab,1668641028,T,T}, [k]={{t,1847,"void Parser::ParseOMPDeclareTargetClauses(Sema::DeclareTargetContextInfo &DTCI) {\n // ...\n while (Tok.isNot(tok::annot_pragma_openmp_end)) {\n // ...\n if (HasIdentifier) {\n // ...\n // Starting with OpenMP 5.2 the `to` clause has been replaced by the\n // `enter` clause.\n if (getLangOpts().OpenMP >= 52 && ClauseName == \"to\") {\n Diag(Tok, diag::err_omp_declare_target_unexpected_to_clause);"}}, [l]={ [U]={"clang/test/OpenMP/declare_target_messages.cpp:30:28: error: unexpected \'to\' clause, use \'enter\' instead","clang/test/OpenMP/declare_target_messages.cpp:34:28: error: unexpected \'to\' clause, use \'enter\' instead","clang/test/OpenMP/declare_target_messages.cpp:37:28: error: unexpected \'to\' clause, use \'enter\' instead","clang/test/OpenMP/declare_target_messages.cpp:202:28: error: unexpected \'to\' clause, use \'enter\' instead","clang/test/OpenMP/declare_target_messages.cpp:206:28: error: unexpected \'to\' clause, use \'enter\' instead","clang/test/OpenMP/declare_target_messages.cpp:208:28: error: unexpected \'to\' clause, use \'enter\' instead","clang/test/OpenMP/declare_target_messages.cpp:211:28: error: unexpected \'to\' clause, use \'enter\' instead","clang/test/OpenMP/declare_target_messages.cpp:213:28: error: unexpected \'to\' clause, use \'enter\' instead","clang/test/OpenMP/declare_target_messages.cpp:215:28: error: unexpected \'to\' clause, use \'enter\' instead","clang/test/OpenMP/declare_target_messages.cpp:217:28: error: unexpected \'to\' clause, use \'enter\' instead","clang/test/OpenMP/declare_target_messages.cpp:232:28: error: unexpected \'to\' clause, use \'enter\' instead","clang/test/OpenMP/declare_target_messages.cpp:233:28: error: unexpected \'to\' clause, use \'enter\' instead","clang/test/OpenMP/declare_target_messages.cpp:234:28: error: unexpected \'to\' clause, use \'enter\' instead"} } }, ["err_omp_declare_target_wrong_clause_after_implicit_enter"]={ [j]={{nil,w,"err_omp_declare_target_wrong_clause_after_implicit_enter"}}, [b]={{nil,w,"unexpected clause after an implicit \'enter\' clause"}}, [c]={{nil,w,"unexpected clause after an implicit \'enter\' clause"}}, [e]=d, [f]="unexpected clause after an implicit \'enter\' clause", [g]=a, [i]={{nil,w,u}}, [h]={Ab,1668641028,T,T}, [k]={{t,1937,"void Parser::ParseOMPDeclareTargetClauses(Sema::DeclareTargetContextInfo &DTCI) {\n // ...\n while (Tok.isNot(tok::annot_pragma_openmp_end)) {\n // ...\n if (!HasIdentifier && Tok.isNot(tok::annot_pragma_openmp_end)) {\n Diag(Tok, getLangOpts().OpenMP >= 52 ? diag::err_omp_declare_target_wrong_clause_after_implicit_enter : diag::err_omp_declare_target_wrong_clause_after_implicit_to);"}} }, ["err_omp_declare_target_wrong_clause_after_implicit_to"]={ [j]={{nil,w,"err_omp_declare_target_wrong_clause_after_implicit_to"}}, [b]={{nil,w,"unexpected clause after an implicit \'to\' clause"}}, [c]={{nil,w,"unexpected clause after an implicit \'to\' clause"}}, [e]=d, [f]="unexpected clause after an implicit \'to\' clause", [g]=a, [i]={{nil,w,u}}, [h]={Ab,1668641028,T,T}, [k]={{t,1938,"void Parser::ParseOMPDeclareTargetClauses(Sema::DeclareTargetContextInfo &DTCI) {\n // ...\n while (Tok.isNot(tok::annot_pragma_openmp_end)) {\n // ...\n if (!HasIdentifier && Tok.isNot(tok::annot_pragma_openmp_end)) {\n Diag(Tok, getLangOpts().OpenMP >= 52 ? diag::err_omp_declare_target_wrong_clause_after_implicit_enter : diag::err_omp_declare_target_wrong_clause_after_implicit_to);"}} }, ["err_omp_declare_variant_diff"]={ [j]={{nil,p,"err_omp_declare_variant_diff"}}, [b]={{nil,p,"function with \'#pragma omp declare variant\' has a different %select{calling convention|return type|constexpr specification|inline specification|storage class|linkage}0"}}, [c]={{nil,p,{"function with \'#pragma omp declare variant\' has a different ",{"calling convention","return type","constexpr specification","inline specification","storage class","linkage"}}}}, [e]=d, [f]="function with \'\\#pragma omp declare variant\' has a different (?:calling convention|return type|constexpr specification|inline specification|storage class|linkage)", [g]=a, [i]={{nil,p,n}}, [h]={"7c11da0cfd33",1567434909,"[clang] New __attribute__((__clang_arm_mve_alias)).","[clang] New __attribute__((__clang_arm_mve_alias)).\n\nThis allows you to declare a function with a name of your choice (say\n`foo`), but have clang treat it as if it were a builtin function (say\n`__builtin_foo`), by writing\n\n static __inline__ __attribute__((__clang_arm_mve_alias(__builtin_foo)))\n int foo(args);\n\nI\'m intending to use this for the ACLE intrinsics for MVE, which have\nto be polymorphic on their argument types and also need to be\nimplemented by builtins. To avoid having to implement the polymorphism\nwith several layers of nested _Generic and make error reporting\nhideous, I want to make all the user-facing intrinsics correspond\ndirectly to clang builtins, so that after clang resolves\n__attribute__((overloadable)) polymorphism it\'s already holding the\nright BuiltinID for the intrinsic it selected.\n\nHowever, this commit itself just introduces the new attribute, and\ndoesn\'t use it for anything.\n\nTo avoid unanticipated side effects if this attribute is used to make\naliases to other builtins, there\'s a restriction mechanism: only\n(BuiltinID, alias) pairs that are approved by the function\nArmMveAliasValid() will be permitted. At present, that function\ndoesn\'t permit anything, because the Tablegen that will generate its\nlist of valid pairs isn\'t yet implemented. So the only test of this\nfacility is one that checks that an unapproved builtin _can\'t_ be\naliased.\n\nReviewers: dmgreen, miyuki, ostannard\n\nSubscribers: cfe-commits\n\nTags: #clang\n\nDifferential Revision: https://reviews.llvm.org/D67159"}, [k]={{m,7644,"std::optional<std::pair<FunctionDecl *, Expr *>> Sema::checkOpenMPDeclareVariantFunction(Sema::DeclGroupPtrTy DG, Expr *VariantRef, OMPTraitInfo &TI, unsigned NumAppendArgs, SourceRange SR) {\n // ...\n if (areMultiversionVariantFunctionsCompatible(FD, NewFD, PartialDiagnostic::NullDiagnostic(), PartialDiagnosticAt(SourceLocation(), PartialDiagnostic::NullDiagnostic()), PartialDiagnosticAt(VariantRef->getExprLoc(), PDiag(diag::err_omp_declare_variant_doesnt_support)), PartialDiagnosticAt(VariantRef->getExprLoc(), PDiag(diag::err_omp_declare_variant_diff) << FD->getLocation()),"}}, [l]={ ["clang/test/OpenMP/declare_variant_messages.cpp"]={"clang/test/OpenMP/declare_variant_messages.cpp:224:29: error: function with \'#pragma omp declare variant\' has a different storage class","clang/test/OpenMP/declare_variant_messages.cpp:229:29: error: function with \'#pragma omp declare variant\' has a different storage class","clang/test/OpenMP/declare_variant_messages.cpp:234:29: error: function with \'#pragma omp declare variant\' has a different inline specification","clang/test/OpenMP/declare_variant_messages.cpp:239:29: error: function with \'#pragma omp declare variant\' has a different inline specification"} } }, ["err_omp_declare_variant_doesnt_support"]={ [j]={{nil,p,"err_omp_declare_variant_doesnt_support"}}, [b]={{nil,p,"\'#pragma omp declare variant\' does not support %select{function templates|virtual functions|deduced return types|constructors|destructors|deleted functions|defaulted functions|constexpr functions|consteval function}0"}}, [c]={{nil,p,{"\'#pragma omp declare variant\' does not support ",{"function templates","virtual functions","deduced return types","constructors","destructors","deleted functions","defaulted functions","constexpr functions","consteval function"}}}}, [e]=d, [f]="\'\\#pragma omp declare variant\' does not support (?:function templates|virtual functions|deduced return types|constructors|destructors|deleted functions|defaulted functions|constexpr functions|consteval function)", [g]=a, [i]={{nil,p,n}}, [h]={"7c11da0cfd33",1567434909,"[clang] New __attribute__((__clang_arm_mve_alias)).","[clang] New __attribute__((__clang_arm_mve_alias)).\n\nThis allows you to declare a function with a name of your choice (say\n`foo`), but have clang treat it as if it were a builtin function (say\n`__builtin_foo`), by writing\n\n static __inline__ __attribute__((__clang_arm_mve_alias(__builtin_foo)))\n int foo(args);\n\nI\'m intending to use this for the ACLE intrinsics for MVE, which have\nto be polymorphic on their argument types and also need to be\nimplemented by builtins. To avoid having to implement the polymorphism\nwith several layers of nested _Generic and make error reporting\nhideous, I want to make all the user-facing intrinsics correspond\ndirectly to clang builtins, so that after clang resolves\n__attribute__((overloadable)) polymorphism it\'s already holding the\nright BuiltinID for the intrinsic it selected.\n\nHowever, this commit itself just introduces the new attribute, and\ndoesn\'t use it for anything.\n\nTo avoid unanticipated side effects if this attribute is used to make\naliases to other builtins, there\'s a restriction mechanism: only\n(BuiltinID, alias) pairs that are approved by the function\nArmMveAliasValid() will be permitted. At present, that function\ndoesn\'t permit anything, because the Tablegen that will generate its\nlist of valid pairs isn\'t yet implemented. So the only test of this\nfacility is one that checks that an unapproved builtin _can\'t_ be\naliased.\n\nReviewers: dmgreen, miyuki, ostannard\n\nSubscribers: cfe-commits\n\nTags: #clang\n\nDifferential Revision: https://reviews.llvm.org/D67159"}, [k]={{m,7599,"std::optional<std::pair<FunctionDecl *, Expr *>> Sema::checkOpenMPDeclareVariantFunction(Sema::DeclGroupPtrTy DG, Expr *VariantRef, OMPTraitInfo &TI, unsigned NumAppendArgs, SourceRange SR) {\n // ...\n if (const auto *CXXFD = dyn_cast<CXXMethodDecl>(FD)) {\n if (CXXFD->isVirtual()) {\n Diag(FD->getLocation(), diag::err_omp_declare_variant_doesnt_support) << VirtFuncs;"},{m,7605,"std::optional<std::pair<FunctionDecl *, Expr *>> Sema::checkOpenMPDeclareVariantFunction(Sema::DeclGroupPtrTy DG, Expr *VariantRef, OMPTraitInfo &TI, unsigned NumAppendArgs, SourceRange SR) {\n // ...\n if (const auto *CXXFD = dyn_cast<CXXMethodDecl>(FD)) {\n // ...\n if (isa<CXXConstructorDecl>(FD)) {\n Diag(FD->getLocation(), diag::err_omp_declare_variant_doesnt_support) << Constructors;"},{m,7611,"std::optional<std::pair<FunctionDecl *, Expr *>> Sema::checkOpenMPDeclareVariantFunction(Sema::DeclGroupPtrTy DG, Expr *VariantRef, OMPTraitInfo &TI, unsigned NumAppendArgs, SourceRange SR) {\n // ...\n if (const auto *CXXFD = dyn_cast<CXXMethodDecl>(FD)) {\n // ...\n if (isa<CXXDestructorDecl>(FD)) {\n Diag(FD->getLocation(), diag::err_omp_declare_variant_doesnt_support) << Destructors;"},{m,7618,"std::optional<std::pair<FunctionDecl *, Expr *>> Sema::checkOpenMPDeclareVariantFunction(Sema::DeclGroupPtrTy DG, Expr *VariantRef, OMPTraitInfo &TI, unsigned NumAppendArgs, SourceRange SR) {\n // ...\n if (FD->isDeleted()) {\n Diag(FD->getLocation(), diag::err_omp_declare_variant_doesnt_support) << DeletedFuncs;"},{m,7624,"std::optional<std::pair<FunctionDecl *, Expr *>> Sema::checkOpenMPDeclareVariantFunction(Sema::DeclGroupPtrTy DG, Expr *VariantRef, OMPTraitInfo &TI, unsigned NumAppendArgs, SourceRange SR) {\n // ...\n if (FD->isDefaulted()) {\n Diag(FD->getLocation(), diag::err_omp_declare_variant_doesnt_support) << DefaultedFuncs;"},{m,7630,"std::optional<std::pair<FunctionDecl *, Expr *>> Sema::checkOpenMPDeclareVariantFunction(Sema::DeclGroupPtrTy DG, Expr *VariantRef, OMPTraitInfo &TI, unsigned NumAppendArgs, SourceRange SR) {\n // ...\n if (FD->isConstexpr()) {\n Diag(FD->getLocation(), diag::err_omp_declare_variant_doesnt_support) << (NewFD->isConsteval() ? ConstevalFuncs : ConstexprFuncs);"},{m,7642,"std::optional<std::pair<FunctionDecl *, Expr *>> Sema::checkOpenMPDeclareVariantFunction(Sema::DeclGroupPtrTy DG, Expr *VariantRef, OMPTraitInfo &TI, unsigned NumAppendArgs, SourceRange SR) {\n // ...\n if (areMultiversionVariantFunctionsCompatible(FD, NewFD, PartialDiagnostic::NullDiagnostic(), PartialDiagnosticAt(SourceLocation(), PartialDiagnostic::NullDiagnostic()), PartialDiagnosticAt(VariantRef->getExprLoc(), PDiag(diag::err_omp_declare_variant_doesnt_support)), PartialDiagnosticAt(VariantRef->getExprLoc(), PDiag(diag::err_omp_declare_variant_diff) << FD->getLocation()),"}}, [l]={ [zb]={"clang/test/OpenMP/declare_variant_clauses_messages.cpp:59:16: error: \'#pragma omp declare variant\' does not support virtual functions","clang/test/OpenMP/declare_variant_clauses_messages.cpp:72:16: error: \'#pragma omp declare variant\' does not support virtual functions"} } }, ["err_omp_declare_variant_duplicate_nested_trait"]={ [j]={{nil,A,"err_omp_declare_variant_duplicate_nested_trait"}}, [b]={{nil,A,"nested OpenMP context selector contains duplicated trait \'%0\' in selector \'%1\' and set \'%2\' with different score"}}, [c]={{nil,A,"nested OpenMP context selector contains duplicated trait \'A\' in selector \'B\' and set \'C\' with different score"}}, [e]=d, [f]="nested OpenMP context selector contains duplicated trait \'(.*?)\' in selector \'(.*?)\' and set \'(.*?)\' with different score", [g]=a, [i]={{nil,A,u}}, [h]={"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"}, [k]={{t,1607,"bool Parser::parseOMPDeclareVariantMatchClause(SourceLocation Loc, OMPTraitInfo &TI, OMPTraitInfo *ParentTI) {\n // ...\n // Merge the parent/outer trait info into the one we just parsed and diagnose\n // problems.\n // TODO: Keep some source location in the TI to provide better diagnostics.\n // TODO: Perform some kind of equivalence check on the condition and score\n // expressions.\n for (const OMPTraitSet &ParentSet : ParentTI->Sets) {\n // ...\n for (OMPTraitSet &Set : TI.Sets) {\n // ...\n for (const OMPTraitSelector &ParentSelector : ParentSet.Selectors) {\n // ...\n for (OMPTraitSelector &Selector : Set.Selectors) {\n // ...\n for (const OMPTraitProperty &ParentProperty : ParentSelector.Properties) {\n // ...\n for (OMPTraitProperty &Property : Selector.Properties) {\n // ...\n if (Selector.Kind == llvm::omp::TraitSelector::user_condition) {\n // ...\n } else if (Selector.ScoreOrCondition != ParentSelector.ScoreOrCondition) {\n Diag(Loc, diag::err_omp_declare_variant_duplicate_nested_trait) << getOpenMPContextTraitPropertyName(ParentProperty.Kind, ParentProperty.RawString) << getOpenMPContextTraitSelectorName(ParentSelector.Kind) << getOpenMPContextTraitSetName(ParentSet.Kind);"}}, [l]={ [ub]={"clang/test/OpenMP/declare_variant_messages.c:207:1: error: nested OpenMP context selector contains duplicated trait \'llvm\' in selector \'vendor\' and set \'implementation\' with different score"} } }, ["err_omp_declare_variant_incompat_attributes"]={ [j]={{nil,p,"err_omp_declare_variant_incompat_attributes"}}, [b]={{nil,p,"\'#pragma omp declare variant\' is not compatible with any target-specific attributes"}}, [c]={{nil,p,"\'#pragma omp declare variant\' is not compatible with any target-specific attributes"}}, [e]=d, [f]="\'\\#pragma omp declare variant\' is not compatible with any target\\-specific attributes", [g]=a, [i]={{nil,p,n}}, [h]={"7c11da0cfd33",1567434909,"[clang] New __attribute__((__clang_arm_mve_alias)).","[clang] New __attribute__((__clang_arm_mve_alias)).\n\nThis allows you to declare a function with a name of your choice (say\n`foo`), but have clang treat it as if it were a builtin function (say\n`__builtin_foo`), by writing\n\n static __inline__ __attribute__((__clang_arm_mve_alias(__builtin_foo)))\n int foo(args);\n\nI\'m intending to use this for the ACLE intrinsics for MVE, which have\nto be polymorphic on their argument types and also need to be\nimplemented by builtins. To avoid having to implement the polymorphism\nwith several layers of nested _Generic and make error reporting\nhideous, I want to make all the user-facing intrinsics correspond\ndirectly to clang builtins, so that after clang resolves\n__attribute__((overloadable)) polymorphism it\'s already holding the\nright BuiltinID for the intrinsic it selected.\n\nHowever, this commit itself just introduces the new attribute, and\ndoesn\'t use it for anything.\n\nTo avoid unanticipated side effects if this attribute is used to make\naliases to other builtins, there\'s a restriction mechanism: only\n(BuiltinID, alias) pairs that are approved by the function\nArmMveAliasValid() will be permitted. At present, that function\ndoesn\'t permit anything, because the Tablegen that will generate its\nlist of valid pairs isn\'t yet implemented. So the only test of this\nfacility is one that checks that an unapproved builtin _can\'t_ be\naliased.\n\nReviewers: dmgreen, miyuki, ostannard\n\nSubscribers: cfe-commits\n\nTags: #clang\n\nDifferential Revision: https://reviews.llvm.org/D67159"}, [k]={{m,7382,"std::optional<std::pair<FunctionDecl *, Expr *>> Sema::checkOpenMPDeclareVariantFunction(Sema::DeclGroupPtrTy DG, Expr *VariantRef, OMPTraitInfo &TI, unsigned NumAppendArgs, SourceRange SR) {\n // ...\n // OpenMP is not compatible with multiversion function attributes.\n if (HasMultiVersionAttributes(FD)) {\n Diag(FD->getLocation(), diag::err_omp_declare_variant_incompat_attributes) << SR;"}}, [l]={ [ub]={"clang/test/OpenMP/declare_variant_messages.c:150:45: error: \'#pragma omp declare variant\' is not compatible with any target-specific attributes","clang/test/OpenMP/declare_variant_messages.c:153:45: error: \'#pragma omp declare variant\' is not compatible with any target-specific attributes","clang/test/OpenMP/declare_variant_messages.c:157:37: error: \'#pragma omp declare variant\' is not compatible with any target-specific attributes","clang/test/OpenMP/declare_variant_messages.c:161:37: error: \'#pragma omp declare variant\' is not compatible with any target-specific attributes","clang/test/OpenMP/declare_variant_messages.c:165:41: error: \'#pragma omp declare variant\' is not compatible with any target-specific attributes","clang/test/OpenMP/declare_variant_messages.c:168:52: error: \'#pragma omp declare variant\' is not compatible with any target-specific attributes"} } }, ["err_omp_declare_variant_incompat_types"]={ [j]={{nil,p,"err_omp_declare_variant_incompat_types"}}, [b]={{nil,s,"variant in \'#pragma omp declare variant\' with type %0 is incompatible with type %1%select{| with appended arguments}2"},{r,p,"variant in \'#pragma omp declare variant\' with type %0 is incompatible with type %1"}}, [c]={{nil,s,{"variant in \'#pragma omp declare variant\' with type A is incompatible with type B",{a," with appended arguments"}}},{r,p,"variant in \'#pragma omp declare variant\' with type A is incompatible with type B"}}, [e]=d, [f]="variant in \'\\#pragma omp declare variant\' with type (.*?) is incompatible with type (.*?)(?:| with appended arguments)", [g]=a, [i]={{nil,p,n}}, [h]={"7c11da0cfd33",1567434909,"[clang] New __attribute__((__clang_arm_mve_alias)).","[clang] New __attribute__((__clang_arm_mve_alias)).\n\nThis allows you to declare a function with a name of your choice (say\n`foo`), but have clang treat it as if it were a builtin function (say\n`__builtin_foo`), by writing\n\n static __inline__ __attribute__((__clang_arm_mve_alias(__builtin_foo)))\n int foo(args);\n\nI\'m intending to use this for the ACLE intrinsics for MVE, which have\nto be polymorphic on their argument types and also need to be\nimplemented by builtins. To avoid having to implement the polymorphism\nwith several layers of nested _Generic and make error reporting\nhideous, I want to make all the user-facing intrinsics correspond\ndirectly to clang builtins, so that after clang resolves\n__attribute__((overloadable)) polymorphism it\'s already holding the\nright BuiltinID for the intrinsic it selected.\n\nHowever, this commit itself just introduces the new attribute, and\ndoesn\'t use it for anything.\n\nTo avoid unanticipated side effects if this attribute is used to make\naliases to other builtins, there\'s a restriction mechanism: only\n(BuiltinID, alias) pairs that are approved by the function\nArmMveAliasValid() will be permitted. At present, that function\ndoesn\'t permit anything, because the Tablegen that will generate its\nlist of valid pairs isn\'t yet implemented. So the only test of this\nfacility is one that checks that an unapproved builtin _can\'t_ be\naliased.\n\nReviewers: dmgreen, miyuki, ostannard\n\nSubscribers: cfe-commits\n\nTags: #clang\n\nDifferential Revision: https://reviews.llvm.org/D67159"}, [k]={{m,7509,"std::optional<std::pair<FunctionDecl *, Expr *>> Sema::checkOpenMPDeclareVariantFunction(Sema::DeclGroupPtrTy DG, Expr *VariantRef, OMPTraitInfo &TI, unsigned NumAppendArgs, SourceRange SR) {\n // ...\n if (LangOpts.CPlusPlus) {\n // ...\n if (VarianPtrType.getUnqualifiedType() != FnPtrType.getUnqualifiedType()) {\n // ...\n if (ICS.isFailure()) {\n Diag(VariantRef->getExprLoc(), diag::err_omp_declare_variant_incompat_types) << VariantRef->getType() << ((Method && !Method->isStatic()) ? FnPtrType : FD->getType()) << (NumAppendArgs ? 1 : 0) << VariantRef->getSourceRange();"},{m,7564,"std::optional<std::pair<FunctionDecl *, Expr *>> Sema::checkOpenMPDeclareVariantFunction(Sema::DeclGroupPtrTy DG, Expr *VariantRef, OMPTraitInfo &TI, unsigned NumAppendArgs, SourceRange SR) {\n // ...\n // Check if function types are compatible in C.\n if (!LangOpts.CPlusPlus) {\n // ...\n if (NewType.isNull()) {\n Diag(VariantRef->getExprLoc(), diag::err_omp_declare_variant_incompat_types) << NewFD->getType() << FD->getType() << (NumAppendArgs ? 1 : 0) << VariantRef->getSourceRange();"}}, [l]={ [ub]={"clang/test/OpenMP/declare_variant_messages.c:139:29: error: variant in \'#pragma omp declare variant\' with type \'int (void)\' is incompatible with type \'int (void) __attribute__((vectorcall))\'","clang/test/OpenMP/declare_variant_messages.c:144:29: error: variant in \'#pragma omp declare variant\' with type \'int (void)\' is incompatible with type \'void (void)\'"} } }, ["err_omp_declare_variant_nested_user_condition"]={ [j]={{nil,A,"err_omp_declare_variant_nested_user_condition"}}, [b]={{nil,A,"nested user conditions in OpenMP context selector not supported (yet)"}}, [c]={{nil,A,"nested user conditions in OpenMP context selector not supported (yet)"}}, [e]=d, [f]="nested user conditions in OpenMP context selector not supported \\(yet\\)", [g]=a, [i]={{nil,A,u}}, [h]={"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"}, [k]={{t,1604,"bool Parser::parseOMPDeclareVariantMatchClause(SourceLocation Loc, OMPTraitInfo &TI, OMPTraitInfo *ParentTI) {\n // ...\n // Merge the parent/outer trait info into the one we just parsed and diagnose\n // problems.\n // TODO: Keep some source location in the TI to provide better diagnostics.\n // TODO: Perform some kind of equivalence check on the condition and score\n // expressions.\n for (const OMPTraitSet &ParentSet : ParentTI->Sets) {\n // ...\n for (OMPTraitSet &Set : TI.Sets) {\n // ...\n for (const OMPTraitSelector &ParentSelector : ParentSet.Selectors) {\n // ...\n for (OMPTraitSelector &Selector : Set.Selectors) {\n // ...\n for (const OMPTraitProperty &ParentProperty : ParentSelector.Properties) {\n // ...\n for (OMPTraitProperty &Property : Selector.Properties) {\n // ...\n if (Selector.Kind == llvm::omp::TraitSelector::user_condition) {\n Diag(Loc, diag::err_omp_declare_variant_nested_user_condition);"}}, [l]={ [ub]={"clang/test/OpenMP/declare_variant_messages.c:214:1: error: nested user conditions in OpenMP context selector not supported (yet)"} } }, ["err_omp_declare_variant_prototype_required"]={ [j]={{nil,s,"err_omp_declare_variant_prototype_required"}}, [b]={{nil,s,"function with \'#pragma omp declare variant\' must have a prototype when \'append_args\' is used"}}, [c]={{nil,s,"function with \'#pragma omp declare variant\' must have a prototype when \'append_args\' is used"}}, [e]=d, [f]="function with \'\\#pragma omp declare variant\' must have a prototype when \'append_args\' is used", [g]=a, [i]={{nil,s,n}}, [h]={ib,1616787805,lb,jb}, [k]={{m,7443,"std::optional<std::pair<FunctionDecl *, Expr *>> Sema::checkOpenMPDeclareVariantFunction(Sema::DeclGroupPtrTy DG, Expr *VariantRef, OMPTraitInfo &TI, unsigned NumAppendArgs, SourceRange SR) {\n // ...\n if (NumAppendArgs) {\n // ...\n if (!PTy) {\n Diag(FD->getLocation(), diag::err_omp_declare_variant_prototype_required) << SR;"}}, [l]={ [zb]={"clang/test/OpenMP/declare_variant_clauses_messages.cpp:208:6: error: function with \'#pragma omp declare variant\' must have a prototype when \'append_args\' is used","clang/test/OpenMP/declare_variant_clauses_messages.cpp:214:13: error: function with \'#pragma omp declare variant\' must have a prototype when \'append_args\' is used"} } }, ["err_omp_declare_variant_same_base_function"]={ [j]={{nil,E,"err_omp_declare_variant_same_base_function"}}, [b]={{nil,E,"variant in \'#pragma omp declare variant\' is the same as the base function"}}, [c]={{nil,E,"variant in \'#pragma omp declare variant\' is the same as the base function"}}, [e]=d, [f]="variant in \'\\#pragma omp declare variant\' is the same as the base function", [g]=a, [i]={{nil,E,n}}, [h]={ib,1616787805,lb,jb}, [k]={{m,7553,"std::optional<std::pair<FunctionDecl *, Expr *>> Sema::checkOpenMPDeclareVariantFunction(Sema::DeclGroupPtrTy DG, Expr *VariantRef, OMPTraitInfo &TI, unsigned NumAppendArgs, SourceRange SR) {\n // ...\n if (FD->getCanonicalDecl() == NewFD->getCanonicalDecl()) {\n Diag(VariantRef->getExprLoc(), diag::err_omp_declare_variant_same_base_function) << VariantRef->getSourceRange();"}}, [l]={ [ub]={"clang/test/OpenMP/declare_variant_messages.c:118:30: error: variant in \'#pragma omp declare variant\' is the same as the base function"} } }, ["err_omp_declare_variant_user_condition_not_constant"]={ [j]={{nil,o,"err_omp_declare_variant_user_condition_not_constant"}}, [b]={{nil,o,"the user condition in the OpenMP context selector needs to be constant; %0 is not"}}, [c]={{nil,o,"the user condition in the OpenMP context selector needs to be constant; A is not"}}, [e]=d, [f]="the user condition in the OpenMP context selector needs to be constant; (.*?) is not", [g]=a, [i]={{nil,o,n}}, [h]={"1228d42ddab8",1576809732,"[OpenMP][Part 2] Use reusable OpenMP context/traits handling","[OpenMP][Part 2] Use reusable OpenMP context/traits handling\n\nThis patch implements an almost complete handling of OpenMP\ncontexts/traits such that we can reuse most of the logic in Flang\nthrough the OMPContext.{h,cpp} in llvm/Frontend/OpenMP.\n\nAll but construct SIMD specifiers, e.g., inbranch, and the device ISA\nselector are define in `llvm/lib/Frontend/OpenMP/OMPKinds.def`. From\nthese definitions we generate the enum classes `TraitSet`,\n`TraitSelector`, and `TraitProperty` as well as conversion and helper\nfunctions in `llvm/lib/Frontend/OpenMP/OMPContext.{h,cpp}`.\n\nThe above enum classes are used in the parser, sema, and the AST\nattribute. The latter is not a collection of multiple primitive variant\narguments that contain encodings via numbers and strings but instead a\ntree that mirrors the `match` clause (see `struct OpenMPTraitInfo`).\n\nThe changes to the parser make it more forgiving when wrong syntax is\nread and they also resulted in more specialized diagnostics. The tests\nare updated and the core issues are detected as before. Here and\nelsewhere this patch tries to be generic, thus we do not distinguish\nwhat selector set, selector, or property is parsed except if they do\nbehave exceptionally, as for example `user={condition(EXPR)}` does.\n\nThe sema logic changed in two ways: First, the OMPDeclareVariantAttr\nrepresentation changed, as mentioned above, and the sema was adjusted to\nwork with the new `OpenMPTraitInfo`. Second, the matching and scoring\nlogic moved into `OMPContext.{h,cpp}`. It is implemented on a flat\nrepresentation of the `match` clause that is not tied to clang.\n`OpenMPTraitInfo` provides a method to generate this flat structure (see\n`struct VariantMatchInfo`) by computing integer score values and boolean\nuser conditions from the `clang::Expr` we keep for them.\n\nThe OpenMP context is now an explicit object (see `struct OMPContext`).\nThis is in anticipation of construct traits that need to be tracked. The\nOpenMP context, as well as the `VariantMatchInfo`, are basically made up\nof a set of active or respectively required traits, e.g., \'host\', and an\nordered container of constructs which allows duplication. Matching and\nscoring is kept as generic as possible to allow easy extension in the\nfuture.\n\n---\n\nTest changes:\n\nThe messages checked in `OpenMP/declare_variant_messages.{c,cpp}` have\nbeen auto generated to match the new warnings and notes of the parser.\nThe \"subset\" checks were reversed causing the wrong version to be\npicked. The tests have been adjusted to correct this.\nWe do not print scores if the user did not provide one.\nWe print spaces to make lists in the `match` clause more legible.\n\nReviewers: kiranchandramohan, ABataev, RaviNarayanaswamy, gtbercea, grokos, sdmitriev, JonChesterfield, hfinkel, fghanim\n\nSubscribers: merge_guards_bot, rampitec, mgorny, hiraditya, aheejin, fedor.sergeev, simoncook, bollu, guansong, dexonsmith, jfb, s.egerton, llvm-commits, cfe-commits\n\nTags: #clang, #llvm\n\nDifferential Revision: https://reviews.llvm.org/D71830"}, [k]={{m,7431,"std::optional<std::pair<FunctionDecl *, Expr *>> Sema::checkOpenMPDeclareVariantFunction(Sema::DeclGroupPtrTy DG, Expr *VariantRef, OMPTraitInfo &TI, unsigned NumAppendArgs, SourceRange SR) {\n // ...\n // Deal with non-constant score and user condition expressions.\n auto HandleNonConstantScoresAndConditions = [this](Expr *&E, bool IsScore) -> bool {\n // ...\n if (IsScore) {\n // ...\n } else {\n // ...\n Diag(E->getExprLoc(), diag::err_omp_declare_variant_user_condition_not_constant) << E;"}}, [l]={ [ub]={"clang/test/OpenMP/declare_variant_messages.c:57:58: error: the user condition in the OpenMP context selector needs to be constant; foo() is not","clang/test/OpenMP/declare_variant_messages.c:56:58: error: the user condition in the OpenMP context selector needs to be constant; foo is not"} } }, ["err_omp_declare_variant_wrong_clause"]={ [j]={{nil,p,"err_omp_declare_variant_wrong_clause"}}, [b]={{nil,s,"expected %select{\'match\'|\'match\', \'adjust_args\', or \'append_args\'}0 clause on \'omp declare variant\' directive"},{r,p,"expected \'%0\' clause on \'omp declare variant\' directive"}}, [c]={{nil,s,{"expected ",{"\'match\'","\'match\', \'adjust_args\', or \'append_args\'"}," clause on \'omp declare variant\' directive"}},{r,p,"expected \'A\' clause on \'omp declare variant\' directive"}}, [e]=d, [f]="expected (?:\'match\'|\'match\', \'adjust_args\', or \'append_args\') clause on \'omp declare variant\' directive", [g]=a, [i]={{nil,p,u}}, [h]={"d158cf64d64b",1568405897,"[OPENMP5.0]Add basic support for declare variant directive.","[OPENMP5.0]Add basic support for declare variant directive.\n\nAdded basic support for declare variant directive and its match clause\nwith user context selector.\n\nllvm-svn: 371892"}, [k]={{t,1426,"/// Parse clauses for \'#pragma omp declare variant ( variant-func-id ) clause\'.\nvoid Parser::ParseOMPDeclareVariantClauses(Parser::DeclGroupPtrTy Ptr, CachedTokens &Toks, SourceLocation Loc) {\n // ...\n // At least one clause is required.\n if (Tok.is(tok::annot_pragma_openmp_end)) {\n Diag(Tok.getLocation(), diag::err_omp_declare_variant_wrong_clause) << (getLangOpts().OpenMP < 51 ? 0 : 1);"},{t,1437,"/// Parse clauses for \'#pragma omp declare variant ( variant-func-id ) clause\'.\nvoid Parser::ParseOMPDeclareVariantClauses(Parser::DeclGroupPtrTy Ptr, CachedTokens &Toks, SourceLocation Loc) {\n // ...\n while (Tok.isNot(tok::annot_pragma_openmp_end)) {\n // ...\n if (!isAllowedClauseForDirective(OMPD_declare_variant, CKind, getLangOpts().OpenMP)) {\n Diag(Tok.getLocation(), diag::err_omp_declare_variant_wrong_clause) << (getLangOpts().OpenMP < 51 ? 0 : 1);"},{t,1550,"bool Parser::parseOMPDeclareVariantMatchClause(SourceLocation Loc, OMPTraitInfo &TI, OMPTraitInfo *ParentTI) {\n // ...\n if (CKind != OMPC_match) {\n Diag(Tok.getLocation(), diag::err_omp_declare_variant_wrong_clause) << (getLangOpts().OpenMP < 51 ? 0 : 1);"}}, [l]={ [ub]={"clang/test/OpenMP/declare_variant_messages.c:29:51: error: expected \'match\' clause on \'omp declare variant\' directive","clang/test/OpenMP/declare_variant_messages.c:24:47: error: expected \'match\' clause on \'omp declare variant\' directive","clang/test/OpenMP/declare_variant_messages.c:17:34: error: expected \'match\' clause on \'omp declare variant\' directive","clang/test/OpenMP/declare_variant_messages.c:16:219: error: expected \'match\' clause on \'omp declare variant\' directive","clang/test/OpenMP/declare_variant_messages.c:15:219: error: expected \'match\' clause on \'omp declare variant\' directive","clang/test/OpenMP/declare_variant_messages.c:14:237: error: expected \'match\' clause on \'omp declare variant\' directive","clang/test/OpenMP/declare_variant_messages.c:13:286: error: expected \'match\' clause on \'omp declare variant\' directive","clang/test/OpenMP/declare_variant_messages.c:64:59: error: expected \'match\' clause on \'omp declare variant\' directive","clang/test/OpenMP/declare_variant_messages.c:63:63: error: expected \'match\' clause on \'omp declare variant\' directive","clang/test/OpenMP/declare_variant_messages.c:62:63: error: expected \'match\' clause on \'omp declare variant\' directive"} } }, ["err_omp_defaultmap_no_attr_for_variable"]={ [j]={{nil,p,"err_omp_defaultmap_no_attr_for_variable"}}, [b]={{nil,p,"variable %0 must have explicitly specified data sharing attributes, data mapping attributes, or in an is_device_ptr clause"}}, [c]={{nil,p,"variable A must have explicitly specified data sharing attributes, data mapping attributes, or in an is_device_ptr clause"}}, [e]=d, [f]="variable (.*?) must have explicitly specified data sharing attributes, data mapping attributes, or in an is_device_ptr clause", [g]=a, [i]={{nil,p,n}}, [h]={xb,1573050950,Cb,yb}, [k]={{m,6799,"StmtResult Sema::ActOnOpenMPExecutableDirective(OpenMPDirectiveKind Kind, const DeclarationNameInfo &DirName, OpenMPDirectiveKind CancelRegion, ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc) {\n // ...\n for (const auto &P : VarsWithInheritedDSA) {\n // ...\n if (DSAStack->getDefaultDSA() == DSA_none || DSAStack->getDefaultDSA() == DSA_private || DSAStack->getDefaultDSA() == DSA_firstprivate) {\n // ...\n } else if (getLangOpts().OpenMP >= 50) {\n Diag(P.second->getExprLoc(), diag::err_omp_defaultmap_no_attr_for_variable) << P.first << P.second->getSourceRange();"}}, [l]={ ["clang/test/OpenMP/target_defaultmap_messages.cpp"]={"clang/test/OpenMP/target_defaultmap_messages.cpp:121:3: error: variable \'g\' must have explicitly specified data sharing attributes, data mapping attributes, or in an is_device_ptr clause","clang/test/OpenMP/target_defaultmap_messages.cpp:123:11: error: variable \'g\' must have explicitly specified data sharing attributes, data mapping attributes, or in an is_device_ptr clause","clang/test/OpenMP/target_defaultmap_messages.cpp:125:3: error: variable \'argc\' must have explicitly specified data sharing attributes, data mapping attributes, or in an is_device_ptr clause","clang/test/OpenMP/target_defaultmap_messages.cpp:127:15: error: variable \'arr\' must have explicitly specified data sharing attributes, data mapping attributes, or in an is_device_ptr clause","clang/test/OpenMP/target_defaultmap_messages.cpp:129:3: error: variable \'bar\' must have explicitly specified data sharing attributes, data mapping attributes, or in an is_device_ptr clause","clang/test/OpenMP/target_defaultmap_messages.cpp:131:3: error: variable \'baz\' must have explicitly specified data sharing attributes, data mapping attributes, or in an is_device_ptr clause","clang/test/OpenMP/target_defaultmap_messages.cpp:134:3: error: variable \'vla\' must have explicitly specified data sharing attributes, data mapping attributes, or in an is_device_ptr clause","clang/test/OpenMP/target_defaultmap_messages.cpp:138:3: error: variable \'baz\' must have explicitly specified data sharing attributes, data mapping attributes, or in an is_device_ptr clause","clang/test/OpenMP/target_defaultmap_messages.cpp:61:3: error: variable \'g\' must have explicitly specified data sharing attributes, data mapping attributes, or in an is_device_ptr clause","clang/test/OpenMP/target_defaultmap_messages.cpp:63:11: error: variable \'g\' must have explicitly specified data sharing attributes, data mapping attributes, or in an is_device_ptr clause","clang/test/OpenMP/target_defaultmap_messages.cpp:65:3: error: variable \'argc\' must have explicitly specified data sharing attributes, data mapping attributes, or in an is_device_ptr clause","clang/test/OpenMP/target_defaultmap_messages.cpp:67:15: error: variable \'arr\' must have explicitly specified data sharing attributes, data mapping attributes, or in an is_device_ptr clause","clang/test/OpenMP/target_defaultmap_messages.cpp:69:15: error: variable \'arr\' must have explicitly specified data sharing attributes, data mapping attributes, or in an is_device_ptr clause","clang/test/OpenMP/target_defaultmap_messages.cpp:71:3: error: variable \'bar\' must have explicitly specified data sharing attributes, data mapping attributes, or in an is_device_ptr clause","clang/test/OpenMP/target_defaultmap_messages.cpp:73:3: error: variable \'baz\' must have explicitly specified data sharing attributes, data mapping attributes, or in an is_device_ptr clause","clang/test/OpenMP/target_defaultmap_messages.cpp:76:3: error: variable \'vla\' must have explicitly specified data sharing attributes, data mapping attributes, or in an is_device_ptr clause","clang/test/OpenMP/target_defaultmap_messages.cpp:80:3: error: variable \'baz\' must have explicitly specified data sharing attributes, data mapping attributes, or in an is_device_ptr clause"} } }, ["err_omp_depend_clause_thread_simd"]={ [j]="err_omp_depend_clause_thread_simd", [b]="\'%0\' clauses cannot be mixed with \'%1\' clause", [c]="\'A\' clauses cannot be mixed with \'B\' clause", [e]=d, [f]="\'(.*?)\' clauses cannot be mixed with \'(.*?)\' clause", [g]=a, [i]=n, [h]={"eb4823503331",1450415156,"[OPENMP 4.5] Parsing/sema analysis for \'depend(source)\' clause in \'ordered\' directive.","[OPENMP 4.5] Parsing/sema analysis for \'depend(source)\' clause in \'ordered\' directive.\nOpenMP 4.5 adds \'depend(source)\' clause for \'ordered\' directive to support cross-iteration dependence. Patch adds parsing and semantic analysis for this construct.\n\nllvm-svn: 255986"}, [k]={{m,11368,"StmtResult Sema::ActOnOpenMPOrderedDirective(ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc) {\n // ...\n if (!ErrorFound && !SC && isOpenMPSimdDirective(DSAStack->getParentDirective())) {\n // ...\n } else if ((DependFound || DoacrossFound) && (TC || SC)) {\n // ...\n Diag(Loc, diag::err_omp_depend_clause_thread_simd) << getOpenMPClauseName(DependFound ? OMPC_depend : OMPC_doacross) << getOpenMPClauseName(TC ? TC->getClauseKind() : SC->getClauseKind());"}}, [l]={ [Bb]={"clang/test/OpenMP/ordered_messages.cpp:203:21: error: \'depend\' clauses cannot be mixed with \'threads\' clause","clang/test/OpenMP/ordered_messages.cpp:204:26: error: \'depend\' clauses cannot be mixed with \'simd\' clause","clang/test/OpenMP/ordered_messages.cpp:382:21: error: \'depend\' clauses cannot be mixed with \'threads\' clause","clang/test/OpenMP/ordered_messages.cpp:383:26: error: \'depend\' clauses cannot be mixed with \'simd\' clause"} } }, ["err_omp_depend_modifier_not_iterator"]={ [j]={{nil,o,"err_omp_depend_modifier_not_iterator"}}, [b]={{nil,o,"expected iterator specification as depend modifier"}}, [c]={{nil,o,"expected iterator specification as depend modifier"}}, [e]=d, [f]="expected iterator specification as depend modifier", [g]=a, [i]={{nil,o,n}}, [h]={I,1576908663,H,F}, [k]={{m,20771,"OMPClause *Sema::ActOnOpenMPDependClause(const OMPDependClause::DependDataTy &Data, Expr *DepModifier, ArrayRef<Expr *> VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc) {\n // ...\n if (DepModifier && !DepModifier->getType()->isSpecificBuiltinType(BuiltinType::OMPIterator))\n Diag(DepModifier->getExprLoc(), diag::err_omp_depend_modifier_not_iterator);"}} }, ["err_omp_depend_sink_expected_loop_iteration"]={ [j]="err_omp_depend_sink_expected_loop_iteration", [b]="expected %0 loop iteration variable", [c]="expected A loop iteration variable", [e]=d, [f]="expected(?:| (.*?)) loop iteration variable", [g]=a, [i]=n, [h]={"ef4c5584d59d",1450786907,"[OPENMP 4.5] Parsing/sema for \'depend(sink:vec)\' clause in \'ordered\' directive.","[OPENMP 4.5] Parsing/sema for \'depend(sink:vec)\' clause in \'ordered\' directive.\nOpenMP 4.5 adds \'depend(sink:vec)\' in \'ordered\' directive for doacross loop synchronization. Patch adds parsing and semantic analysis for this clause.\n\nllvm-svn: 256238"}, [k]={{m,20700,"static DoacrossDataInfoTy ProcessOpenMPDoacrossClauseCommon(Sema &SemaRef, bool IsSource, ArrayRef<Expr *> VarList, DSAStackTy *Stack, SourceLocation EndLoc) {\n // ...\n for (Expr *RefExpr : VarList) {\n // ...\n if (!IsSource) {\n // ...\n if (!SemaRef.CurContext->isDependentContext() && Stack->getParentOrderedRegionParam().first && DepCounter != Stack->isParentLoopControlVariable(D).first) {\n // ...\n if (VD)\n SemaRef.Diag(ELoc, diag::err_omp_depend_sink_expected_loop_iteration) << 1 << VD;"},{m,20703,"static DoacrossDataInfoTy ProcessOpenMPDoacrossClauseCommon(Sema &SemaRef, bool IsSource, ArrayRef<Expr *> VarList, DSAStackTy *Stack, SourceLocation EndLoc) {\n // ...\n for (Expr *RefExpr : VarList) {\n // ...\n if (!IsSource) {\n // ...\n if (!SemaRef.CurContext->isDependentContext() && Stack->getParentOrderedRegionParam().first && DepCounter != Stack->isParentLoopControlVariable(D).first) {\n // ...\n if (VD)\n // ...\n else\n SemaRef.Diag(ELoc, diag::err_omp_depend_sink_expected_loop_iteration) << 0;"},{m,20715,"static DoacrossDataInfoTy ProcessOpenMPDoacrossClauseCommon(Sema &SemaRef, bool IsSource, ArrayRef<Expr *> VarList, DSAStackTy *Stack, SourceLocation EndLoc) {\n // ...\n if (!SemaRef.CurContext->isDependentContext() && !IsSource && TotalDepCount > VarList.size() && Stack->getParentOrderedRegionParam().first && Stack->getParentLoopControlVariable(VarList.size() + 1)) {\n SemaRef.Diag(EndLoc, diag::err_omp_depend_sink_expected_loop_iteration) << 1 << Stack->getParentLoopControlVariable(VarList.size() + 1);"}}, [l]={ [Bb]={"clang/test/OpenMP/ordered_messages.cpp:371:271: error: expected \'i\' loop iteration variable","clang/test/OpenMP/ordered_messages.cpp:372:200: error: expected \'i\' loop iteration variable","clang/test/OpenMP/ordered_messages.cpp:373:163: error: expected \'j\' loop iteration variable","clang/test/OpenMP/ordered_messages.cpp:374:36: error: expected \'j\' loop iteration variable","clang/test/OpenMP/ordered_messages.cpp:387:35: error: expected \'i\' loop iteration variable","clang/test/OpenMP/ordered_messages.cpp:387:38: error: expected \'j\' loop iteration variable","clang/test/OpenMP/ordered_messages.cpp:411:38: error: expected loop iteration variable","clang/test/OpenMP/ordered_messages.cpp:192:271: error: expected \'i\' loop iteration variable","clang/test/OpenMP/ordered_messages.cpp:193:200: error: expected \'i\' loop iteration variable","clang/test/OpenMP/ordered_messages.cpp:194:163: error: expected \'j\' loop iteration variable","clang/test/OpenMP/ordered_messages.cpp:195:36: error: expected \'j\' loop iteration variable","clang/test/OpenMP/ordered_messages.cpp:208:35: error: expected \'i\' loop iteration variable","clang/test/OpenMP/ordered_messages.cpp:208:38: error: expected \'j\' loop iteration variable"} } }, ["err_omp_depend_sink_expected_plus_minus"]={ [j]="err_omp_depend_sink_expected_plus_minus", [b]="expected \'+\' or \'-\' operation", [c]="expected \'+\' or \'-\' operation", [e]=d, [f]="expected \'\\+\' or \'\\-\' operation", [g]=a, [i]=n, [h]={"ef4c5584d59d",1450786907,"[OPENMP 4.5] Parsing/sema for \'depend(sink:vec)\' clause in \'ordered\' directive.","[OPENMP 4.5] Parsing/sema for \'depend(sink:vec)\' clause in \'ordered\' directive.\nOpenMP 4.5 adds \'depend(sink:vec)\' in \'ordered\' directive for doacross loop synchronization. Patch adds parsing and semantic analysis for this clause.\n\nllvm-svn: 256238"}, [k]={{m,20685,"static DoacrossDataInfoTy ProcessOpenMPDoacrossClauseCommon(Sema &SemaRef, bool IsSource, ArrayRef<Expr *> VarList, DSAStackTy *Stack, SourceLocation EndLoc) {\n // ...\n for (Expr *RefExpr : VarList) {\n // ...\n if (!IsSource) {\n // ...\n if (OOK != OO_Plus && OOK != OO_Minus && (RHS || OOK != OO_None)) {\n SemaRef.Diag(OOLoc, diag::err_omp_depend_sink_expected_plus_minus);"}}, [l]={ [Bb]={"clang/test/OpenMP/ordered_messages.cpp:389:45: error: expected \'+\' or \'-\' operation","clang/test/OpenMP/ordered_messages.cpp:393:36: error: expected \'+\' or \'-\' operation","clang/test/OpenMP/ordered_messages.cpp:210:45: error: expected \'+\' or \'-\' operation","clang/test/OpenMP/ordered_messages.cpp:214:36: error: expected \'+\' or \'-\' operation"} } }, ["err_omp_depend_sink_source_with_modifier"]={ [j]={{nil,o,"err_omp_depend_sink_source_with_modifier"}}, [b]={{nil,o,"depend modifier cannot be used with \'sink\' or \'source\' depend type"}}, [c]={{nil,o,"depend modifier cannot be used with \'sink\' or \'source\' depend type"}}, [e]=d, [f]="depend modifier cannot be used with \'sink\' or \'source\' depend type", [g]=a, [i]={{nil,o,n}}, [h]={I,1576908663,H,F}, [k]={{m,20766,"OMPClause *Sema::ActOnOpenMPDependClause(const OMPDependClause::DependDataTy &Data, Expr *DepModifier, ArrayRef<Expr *> VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc) {\n // ...\n if (DepModifier && (DepKind == OMPC_DEPEND_source || DepKind == OMPC_DEPEND_sink)) {\n Diag(DepModifier->getExprLoc(), diag::err_omp_depend_sink_source_with_modifier);"}} }, ["err_omp_depend_sink_unexpected_expr"]={ [j]="err_omp_depend_sink_unexpected_expr", [b]="unexpected expression: number of expressions is larger than the number of associated loops", [c]="unexpected expression: number of expressions is larger than the number of associated loops", [e]=d, [f]="unexpected expression\\: number of expressions is larger than the number of associated loops", [g]=a, [i]=n, [h]={"ef4c5584d59d",1450786907,"[OPENMP 4.5] Parsing/sema for \'depend(sink:vec)\' clause in \'ordered\' directive.","[OPENMP 4.5] Parsing/sema for \'depend(sink:vec)\' clause in \'ordered\' directive.\nOpenMP 4.5 adds \'depend(sink:vec)\' in \'ordered\' directive for doacross loop synchronization. Patch adds parsing and semantic analysis for this clause.\n\nllvm-svn: 256238"}, [k]={{m,20632,"static DoacrossDataInfoTy ProcessOpenMPDoacrossClauseCommon(Sema &SemaRef, bool IsSource, ArrayRef<Expr *> VarList, DSAStackTy *Stack, SourceLocation EndLoc) {\n // ...\n for (Expr *RefExpr : VarList) {\n // ...\n if (!IsSource) {\n if (Stack->getParentOrderedRegionParam().first && DepCounter >= TotalDepCount) {\n SemaRef.Diag(ELoc, diag::err_omp_depend_sink_unexpected_expr);"}}, [l]={ [Bb]={"clang/test/OpenMP/ordered_messages.cpp:209:41: error: unexpected expression: number of expressions is larger than the number of associated loops","clang/test/OpenMP/ordered_messages.cpp:388:41: error: unexpected expression: number of expressions is larger than the number of associated loops"} } }, ["err_omp_depend_zero_length_array_section_not_allowed"]={ [j]={{nil,p,"err_omp_depend_zero_length_array_section_not_allowed"}}, [b]={{nil,p,"zero-length array section is not allowed in \'depend\' clause"}}, [c]={{nil,p,"zero-length array section is not allowed in \'depend\' clause"}}, [e]=d, [f]="zero\\-length array section is not allowed in \'depend\' clause", [g]=a, [i]={{nil,p,n}}, [h]={"349636d2bfc3",1575555459,"Implement VectorType conditional operator GNU extension.","Implement VectorType conditional operator GNU extension.\n\nGCC supports the conditional operator on VectorTypes that acts as a\n\'select\' in C++ mode. This patch implements the support. Types are\nconverted as closely to GCC\'s behavior as possible, though in a few\nplaces consistency with our existing vector type support was preferred.\n\nNote that this implementation is different from the OpenCL version in a\nnumber of ways, so it unfortunately required a different implementation.\n\nFirst, the SEMA rules and promotion rules are significantly different.\n\nSecondly, GCC implements COND[i] != 0 ? LHS[i] : RHS[i] (where i is in\nthe range 0- VectorSize, for each element). In OpenCL, the condition is\nCOND[i] < 0 ? LHS[i]: RHS[i].\n\nIn the process of implementing this, it was also required to make the\nexpression COND ? LHS : RHS type dependent if COND is type dependent,\nsince the type is now dependent on the condition. For example:\n\n T ? 1 : 2;\n\nIs not typically type dependent, since the result can be deduced from\nthe operands. HOWEVER, if T is a VectorType now, it could change this\nto a \'select\' (basically a swizzle with a non-constant mask) with the 1\nand 2 being promoted to vectors themselves.\n\nWhile this is a change, it is NOT a standards incompatible change. Based\non my (and D. Gregor\'s, at the time of writing the code) reading of the\nstandard, the expression is supposed to be type dependent if ANY\nsub-expression is type dependent.\n\nDifferential Revision: https://reviews.llvm.org/D71463"}, [k]={{m,20838,"OMPClause *Sema::ActOnOpenMPDependClause(const OMPDependClause::DependDataTy &Data, Expr *DepModifier, ArrayRef<Expr *> VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc) {\n // ...\n if (DepKind == OMPC_DEPEND_sink || DepKind == OMPC_DEPEND_source) {\n // ...\n } else {\n for (Expr *RefExpr : VarList) {\n // ...\n if (DepKind != OMPC_DEPEND_sink && DepKind != OMPC_DEPEND_source) {\n // ...\n if (DepKind == OMPC_DEPEND_depobj) {\n // ...\n } else {\n // ...\n if (OASE) {\n // ...\n if (Length && !Length->isValueDependent() && Length->EvaluateAsInt(Result, Context) && Result.Val.getInt().isZero()) {\n Diag(ELoc, diag::err_omp_depend_zero_length_array_section_not_allowed) << SimpleExpr->getSourceRange();"}}, [l]={ ["clang/test/OpenMP/taskwait_depend_messages.cpp"]={"clang/test/OpenMP/taskwait_depend_messages.cpp:52:37: error: zero-length array section is not allowed in \'depend\' clause"} } }, ["err_omp_depobj_expected"]={ [j]={{nil,o,"err_omp_depobj_expected"}}, [b]={{nil,o,"expected depobj expression"}}, [c]={{nil,o,"expected depobj expression"}}, [e]=d, [f]="expected depobj expression", [g]=a, [i]={{nil,o,n}}, [h]={I,1576908663,H,F}, [k]={{m,11253,"StmtResult Sema::ActOnOpenMPDepobjDirective(ArrayRef<OMPClause *> Clauses, SourceLocation StartLoc, SourceLocation EndLoc) {\n if (Clauses.empty()) {\n Diag(StartLoc, diag::err_omp_depobj_expected);"},{m,11256,"StmtResult Sema::ActOnOpenMPDepobjDirective(ArrayRef<OMPClause *> Clauses, SourceLocation StartLoc, SourceLocation EndLoc) {\n if (Clauses.empty()) {\n // ...\n } else if (Clauses[0]->getClauseKind() != OMPC_depobj) {\n Diag(Clauses[0]->getBeginLoc(), diag::err_omp_depobj_expected);"}}, [l]={ ["clang/test/OpenMP/depobj_messages.cpp"]={"clang/test/OpenMP/depobj_messages.cpp:29:1: error: expected depobj expression","clang/test/OpenMP/depobj_messages.cpp:79:1: error: expected depobj expression","clang/test/OpenMP/depobj_messages.cpp:80:1: error: expected depobj expression","clang/test/OpenMP/depobj_messages.cpp:81:1: error: expected depobj expression","clang/test/OpenMP/depobj_messages.cpp:85:1: error: expected depobj expression","clang/test/OpenMP/depobj_messages.cpp:144:1: error: expected depobj expression","clang/test/OpenMP/depobj_messages.cpp:145:1: error: expected depobj expression","clang/test/OpenMP/depobj_messages.cpp:146:1: error: expected depobj expression","clang/test/OpenMP/depobj_messages.cpp:150:1: error: expected depobj expression","clang/test/OpenMP/depobj_messages.cpp:171:1: error: expected depobj expression","clang/test/OpenMP/depobj_messages.cpp:172:1: error: expected depobj expression","clang/test/OpenMP/depobj_messages.cpp:173:20: error: expected depobj expression"} } }, ["err_omp_depobj_single_clause_expected"]={ [j]={{nil,o,"err_omp_depobj_single_clause_expected"}}, [b]={{nil,o,"exactly one of \'depend\', \'destroy\', or \'update\' clauses is expected"}}, [c]={{nil,o,"exactly one of \'depend\', \'destroy\', or \'update\' clauses is expected"}}, [e]=d, [f]="exactly one of \'depend\', \'destroy\', or \'update\' clauses is expected", [g]=a, [i]={{nil,o,n}}, [h]={I,1576908663,H,F}, [k]={{m,11262,"StmtResult Sema::ActOnOpenMPDepobjDirective(ArrayRef<OMPClause *> Clauses, SourceLocation StartLoc, SourceLocation EndLoc) {\n // ...\n // Only depobj expression and another single clause is allowed.\n if (Clauses.size() > 2) {\n Diag(Clauses[2]->getBeginLoc(), diag::err_omp_depobj_single_clause_expected);"},{m,11265,"StmtResult Sema::ActOnOpenMPDepobjDirective(ArrayRef<OMPClause *> Clauses, SourceLocation StartLoc, SourceLocation EndLoc) {\n // ...\n // Only depobj expression and another single clause is allowed.\n if (Clauses.size() > 2) {\n // ...\n } else if (Clauses.size() < 1) {\n Diag(Clauses[0]->getEndLoc(), diag::err_omp_depobj_single_clause_expected);"}}, [l]={ ["clang/test/OpenMP/depobj_messages.cpp"]={"clang/test/OpenMP/depobj_messages.cpp:163:40: error: exactly one of \'depend\', \'destroy\', or \'update\' clauses is expected","clang/test/OpenMP/depobj_messages.cpp:167:40: error: exactly one of \'depend\', \'destroy\', or \'update\' clauses is expected"} } }, ["err_omp_device_ancestor_without_requires_reverse_offload"]={ [j]={{nil,E,"err_omp_device_ancestor_without_requires_reverse_offload"}}, [b]={{nil,E,"Device clause with ancestor device-modifier used without specifying \'requires reverse_offload\'"}}, [c]={{nil,E,"Device clause with ancestor device-modifier used without specifying \'requires reverse_offload\'"}}, [e]=d, [f]="Device clause with ancestor device\\-modifier used without specifying \'requires reverse_offload\'", [g]=a, [i]={{nil,E,n}}, [h]={ib,1616787805,lb,jb}, [k]={{m,20942,"OMPClause *Sema::ActOnOpenMPDeviceClause(OpenMPDeviceClauseModifier Modifier, Expr *Device, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation ModifierLoc, SourceLocation EndLoc) {\n // ...\n // OpenMP 5.0 [2.12.5, Restrictions]\n // In case of ancestor device-modifier, a requires directive with\n // the reverse_offload clause must be specified.\n if (Modifier == OMPC_DEVICE_ancestor) {\n if (!DSAStack->hasRequiresDeclWithClause<OMPReverseOffloadClause>()) {\n targetDiag(StartLoc, diag::err_omp_device_ancestor_without_requires_reverse_offload);"}}, [l]={ ["clang/test/OpenMP/target_device_ancestor_messages.cpp"]={"clang/test/OpenMP/target_device_ancestor_messages.cpp:5:20: error: Device clause with ancestor device-modifier used without specifying \'requires reverse_offload\'"} } }, ["err_omp_device_type_mismatch"]={ [j]={{nil,p,"err_omp_device_type_mismatch"}}, [b]={{nil,p,"\'device_type(%0)\' does not match previously specified \'device_type(%1)\' for the same declaration"}}, [c]={{nil,p,"\'device_type(A)\' does not match previously specified \'device_type(B)\' for the same declaration"}}, [e]=d, [f]="\'device_type\\((.*?)\\)\' does not match previously specified \'device_type\\((.*?)\\)\' for the same declaration", [g]=a, [i]={{nil,p,n}}, [h]={"729e242a7972",1566576674,"[OPENMP5.0]Add support for device_type clause in declare target","[OPENMP5.0]Add support for device_type clause in declare target\nconstruct.\n\nOpenMP 5.0 introduced new clause for declare target directive, device_type clause, which may accept values host, nohost, and any. Host means\nthat the function must be emitted only for the host, nohost - only for\nthe device, and any - for both, device and the host.\n\nllvm-svn: 369775"}, [k]={{m,23075,"void Sema::ActOnOpenMPDeclareTargetName(NamedDecl *ND, SourceLocation Loc, OMPDeclareTargetDeclAttr::MapTypeTy MT, DeclareTargetContextInfo &DTCI) {\n // ...\n if (ActiveAttr && (*ActiveAttr)->getDevType() != DTCI.DT && (*ActiveAttr)->getLevel() == Level) {\n Diag(Loc, diag::err_omp_device_type_mismatch) << OMPDeclareTargetDeclAttr::ConvertDevTypeTyToStr(DTCI.DT) << OMPDeclareTargetDeclAttr::ConvertDevTypeTyToStr((*ActiveAttr)->getDevType());"}}, [l]={ [U]={"clang/test/OpenMP/declare_target_messages.cpp:233:31: error: \'device_type(host)\' does not match previously specified \'device_type(any)\' for the same declaration","clang/test/OpenMP/declare_target_messages.cpp:234:31: error: \'device_type(nohost)\' does not match previously specified \'device_type(any)\' for the same declaration"} } }, ["err_omp_directive_before_requires"]={ [j]={{nil,o,"err_omp_directive_before_requires"}}, [b]={{nil,o,"\'%0\' region encountered before requires directive with \'%1\' clause"}}, [c]={{nil,o,"\'A\' region encountered before requires directive with \'B\' clause"}}, [e]=d, [f]="\'(.*?)\' region encountered before requires directive with \'(.*?)\' clause", [g]=a, [i]={{nil,o,n}}, [h]={"1228d42ddab8",1576809732,"[OpenMP][Part 2] Use reusable OpenMP context/traits handling","[OpenMP][Part 2] Use reusable OpenMP context/traits handling\n\nThis patch implements an almost complete handling of OpenMP\ncontexts/traits such that we can reuse most of the logic in Flang\nthrough the OMPContext.{h,cpp} in llvm/Frontend/OpenMP.\n\nAll but construct SIMD specifiers, e.g., inbranch, and the device ISA\nselector are define in `llvm/lib/Frontend/OpenMP/OMPKinds.def`. From\nthese definitions we generate the enum classes `TraitSet`,\n`TraitSelector`, and `TraitProperty` as well as conversion and helper\nfunctions in `llvm/lib/Frontend/OpenMP/OMPContext.{h,cpp}`.\n\nThe above enum classes are used in the parser, sema, and the AST\nattribute. The latter is not a collection of multiple primitive variant\narguments that contain encodings via numbers and strings but instead a\ntree that mirrors the `match` clause (see `struct OpenMPTraitInfo`).\n\nThe changes to the parser make it more forgiving when wrong syntax is\nread and they also resulted in more specialized diagnostics. The tests\nare updated and the core issues are detected as before. Here and\nelsewhere this patch tries to be generic, thus we do not distinguish\nwhat selector set, selector, or property is parsed except if they do\nbehave exceptionally, as for example `user={condition(EXPR)}` does.\n\nThe sema logic changed in two ways: First, the OMPDeclareVariantAttr\nrepresentation changed, as mentioned above, and the sema was adjusted to\nwork with the new `OpenMPTraitInfo`. Second, the matching and scoring\nlogic moved into `OMPContext.{h,cpp}`. It is implemented on a flat\nrepresentation of the `match` clause that is not tied to clang.\n`OpenMPTraitInfo` provides a method to generate this flat structure (see\n`struct VariantMatchInfo`) by computing integer score values and boolean\nuser conditions from the `clang::Expr` we keep for them.\n\nThe OpenMP context is now an explicit object (see `struct OMPContext`).\nThis is in anticipation of construct traits that need to be tracked. The\nOpenMP context, as well as the `VariantMatchInfo`, are basically made up\nof a set of active or respectively required traits, e.g., \'host\', and an\nordered container of constructs which allows duplication. Matching and\nscoring is kept as generic as possible to allow easy extension in the\nfuture.\n\n---\n\nTest changes:\n\nThe messages checked in `OpenMP/declare_variant_messages.{c,cpp}` have\nbeen auto generated to match the new warnings and notes of the parser.\nThe \"subset\" checks were reversed causing the wrong version to be\npicked. The tests have been adjusted to correct this.\nWe do not print scores if the user did not provide one.\nWe print spaces to make lists in the `match` clause more legible.\n\nReviewers: kiranchandramohan, ABataev, RaviNarayanaswamy, gtbercea, grokos, sdmitriev, JonChesterfield, hfinkel, fghanim\n\nSubscribers: merge_guards_bot, rampitec, mgorny, hiraditya, aheejin, fedor.sergeev, simoncook, bollu, guansong, dexonsmith, jfb, s.egerton, llvm-commits, cfe-commits\n\nTags: #clang, #llvm\n\nDifferential Revision: https://reviews.llvm.org/D71830"}, [k]={{m,3542,"OMPRequiresDecl *Sema::CheckOMPRequiresDecl(SourceLocation Loc, ArrayRef<OMPClause *> ClauseList) {\n // ...\n if (!TargetLocations.empty() || !AtomicLoc.isInvalid()) {\n for (const OMPClause *CNew : ClauseList) {\n // Check if any of the requires clauses affect target regions.\n if (isa<OMPUnifiedSharedMemoryClause>(CNew) || isa<OMPUnifiedAddressClause>(CNew) || isa<OMPReverseOffloadClause>(CNew) || isa<OMPDynamicAllocatorsClause>(CNew)) {\n Diag(Loc, diag::err_omp_directive_before_requires) << \"target\" << getOpenMPClauseName(CNew->getClauseKind());"},{m,3550,"OMPRequiresDecl *Sema::CheckOMPRequiresDecl(SourceLocation Loc, ArrayRef<OMPClause *> ClauseList) {\n // ...\n if (!TargetLocations.empty() || !AtomicLoc.isInvalid()) {\n for (const OMPClause *CNew : ClauseList) {\n // Check if any of the requires clauses affect target regions.\n if (isa<OMPUnifiedSharedMemoryClause>(CNew) || isa<OMPUnifiedAddressClause>(CNew) || isa<OMPReverseOffloadClause>(CNew) || isa<OMPDynamicAllocatorsClause>(CNew)) {\n // ...\n } else if (!AtomicLoc.isInvalid() && isa<OMPAtomicDefaultMemOrderClause>(CNew)) {\n Diag(Loc, diag::err_omp_directive_before_requires) << \"atomic\" << getOpenMPClauseName(CNew->getClauseKind());"}}, [l]={ ["clang/test/OpenMP/requires_default_atomic_mem_order_messages.cpp"]={"clang/test/OpenMP/requires_default_atomic_mem_order_messages.cpp:9:13: error: \'atomic\' region encountered before requires directive with \'atomic_default_mem_order\' clause","clang/test/OpenMP/requires_default_atomic_mem_order_messages.cpp:10:13: error: \'atomic\' region encountered before requires directive with \'atomic_default_mem_order\' clause","clang/test/OpenMP/requires_default_atomic_mem_order_messages.cpp:11:13: error: \'atomic\' region encountered before requires directive with \'atomic_default_mem_order\' clause"} } }, ["err_omp_dispatch_statement_call"]={ [j]={{nil,r,"err_omp_dispatch_statement_call"}}, [b]={{nil,r,"statement after \'#pragma omp dispatch\' must be a direct call to a target function or an assignment to one"}}, [c]={{nil,r,"statement after \'#pragma omp dispatch\' must be a direct call to a target function or an assignment to one"}}, [e]=d, [f]="statement after \'\\#pragma omp dispatch\' must be a direct call to a target function or an assignment to one", [g]=a, [i]={{nil,r,n}}, [h]={hb,1590001902,gb,kb}, [k]={{m,10518,"StmtResult Sema::ActOnOpenMPDispatchDirective(ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc) {\n // ...\n if (!CurContext->isDependentContext()) {\n // ...\n if (!E) {\n Diag(S->getBeginLoc(), diag::err_omp_dispatch_statement_call);"},{m,10535,"StmtResult Sema::ActOnOpenMPDispatchDirective(ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc) {\n // ...\n if (!CurContext->isDependentContext()) {\n // ...\n if (!TargetCall) {\n Diag(E->getBeginLoc(), diag::err_omp_dispatch_statement_call);"}}, [l]={ ["clang/test/OpenMP/dispatch_messages.cpp"]={"clang/test/OpenMP/dispatch_messages.cpp:78:3: error: statement after \'#pragma omp dispatch\' must be a direct call to a target function or an assignment to one","clang/test/OpenMP/dispatch_messages.cpp:82:3: error: statement after \'#pragma omp dispatch\' must be a direct call to a target function or an assignment to one","clang/test/OpenMP/dispatch_messages.cpp:88:3: error: statement after \'#pragma omp dispatch\' must be a direct call to a target function or an assignment to one","clang/test/OpenMP/dispatch_messages.cpp:92:3: error: statement after \'#pragma omp dispatch\' must be a direct call to a target function or an assignment to one","clang/test/OpenMP/dispatch_messages.cpp:99:3: error: statement after \'#pragma omp dispatch\' must be a direct call to a target function or an assignment to one","clang/test/OpenMP/dispatch_messages.cpp:103:3: error: statement after \'#pragma omp dispatch\' must be a direct call to a target function or an assignment to one","clang/test/OpenMP/dispatch_messages.cpp:107:3: error: statement after \'#pragma omp dispatch\' must be a direct call to a target function or an assignment to one","clang/test/OpenMP/dispatch_messages.cpp:111:3: error: statement after \'#pragma omp dispatch\' must be a direct call to a target function or an assignment to one","clang/test/OpenMP/dispatch_messages.cpp:115:3: error: statement after \'#pragma omp dispatch\' must be a direct call to a target function or an assignment to one"} } }, ["err_omp_duplicate_map_type_modifier"]={ [j]={{nil,y,"err_omp_duplicate_map_type_modifier"}}, [b]={{nil,y,"same map type modifier has been specified more than once"}}, [c]={{nil,y,"same map type modifier has been specified more than once"}}, [e]=d, [f]="same map type modifier has been specified more than once", [g]=a, [i]={{nil,y,n}}, [h]={"ef57943e3fba",1545171521,"[OPENMP] parsing and sema support for \'close\' map-type-modifier","[OPENMP] parsing and sema support for \'close\' map-type-modifier\n\nA map clause with the close map-type-modifier is a hint to \nprefer that the variables are mapped using a copy into faster \nmemory.\n\nPatch by Ahsan Saghir (saghir)\n\nDifferential Revision: https://reviews.llvm.org/D55719\n\nllvm-svn: 349551"}, [k]={{m,22174,"OMPClause *Sema::ActOnOpenMPMapClause(Expr *IteratorModifier, ArrayRef<OpenMPMapModifierKind> MapTypeModifiers, ArrayRef<SourceLocation> MapTypeModifiersLoc, CXXScopeSpec &MapperIdScopeSpec, DeclarationNameInfo &MapperId, OpenMPMapClauseKind MapType, bool IsMapTypeImplicit, SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, bool NoDiagnose, ArrayRef<Expr *> UnresolvedMappers) {\n // ...\n for (unsigned I = 0, E = MapTypeModifiers.size(); I < E; ++I) {\n if (MapTypeModifiers[I] != OMPC_MAP_MODIFIER_unknown && llvm::is_contained(Modifiers, MapTypeModifiers[I])) {\n Diag(MapTypeModifiersLoc[I], diag::err_omp_duplicate_map_type_modifier);"}}, [l]={ ["clang/test/OpenMP/target_map_messages.cpp"]={"clang/test/OpenMP/target_map_messages.cpp:192:35: error: same map type modifier has been specified more than once","clang/test/OpenMP/target_map_messages.cpp:194:43: error: same map type modifier has been specified more than once","clang/test/OpenMP/target_map_messages.cpp:194:51: error: same map type modifier has been specified more than once","clang/test/OpenMP/target_map_messages.cpp:198:37: error: same map type modifier has been specified more than once","clang/test/OpenMP/target_map_messages.cpp:205:39: error: same map type modifier has been specified more than once","clang/test/OpenMP/target_map_messages.cpp:216:63: error: same map type modifier has been specified more than once","clang/test/OpenMP/target_map_messages.cpp:216:71: error: same map type modifier has been specified more than once","clang/test/OpenMP/target_map_messages.cpp:216:78: error: same map type modifier has been specified more than once","clang/test/OpenMP/target_map_messages.cpp:216:87: error: same map type modifier has been specified more than once"} } }, ["err_omp_duplicate_motion_modifier"]={ [j]={{nil,A,"err_omp_duplicate_motion_modifier"}}, [b]={{nil,A,"same motion modifier has been specified more than once"}}, [c]={{nil,A,"same motion modifier has been specified more than once"}}, [e]=d, [f]="same motion modifier has been specified more than once", [g]=a, [i]={{nil,A,n}}, [h]={"14f6bfcb52e7",1582847864,"[clang] Implement objc_non_runtime_protocol to remove protocol metadata","[clang] Implement objc_non_runtime_protocol to remove protocol metadata\n\nSummary:\nMotivated by the new objc_direct attribute, this change adds a new\nattribute that remotes metadata from Protocols that the programmer knows\nisn\'t going to be used at runtime. We simply have the frontend skip\ngenerating any protocol metadata entries (e.g. OBJC_CLASS_NAME,\n_OBJC_$_PROTOCOL_INSTANCE_METHDOS, _OBJC_PROTOCOL, etc) for a protocol\nmarked with `__attribute__((objc_non_runtime_protocol))`.\n\nThere are a few APIs used to retrieve a protocol at runtime.\n`@protocol(SomeProtocol)` will now error out of the requested protocol\nis marked with attribute. `objc_getProtocol` will return `NULL` which\nis consistent with the behavior of a non-existing protocol.\n\nSubscribers: cfe-commits\n\nTags: #clang\n\nDifferential Revision: https://reviews.llvm.org/D75574"}, [k]={{m,23280,"OMPClause *Sema::ActOnOpenMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, ArrayRef<SourceLocation> MotionModifiersLoc, CXXScopeSpec &MapperIdScopeSpec, DeclarationNameInfo &MapperId, SourceLocation ColonLoc, ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) {\n // ...\n for (unsigned I = 0, E = MotionModifiers.size(); I < E; ++I) {\n if (MotionModifiers[I] != OMPC_MOTION_MODIFIER_unknown && llvm::is_contained(Modifiers, MotionModifiers[I])) {\n Diag(MotionModifiersLoc[I], diag::err_omp_duplicate_motion_modifier);"},{m,23317,"OMPClause *Sema::ActOnOpenMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, ArrayRef<SourceLocation> MotionModifiersLoc, CXXScopeSpec &MapperIdScopeSpec, DeclarationNameInfo &MapperId, SourceLocation ColonLoc, ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) {\n // ...\n for (unsigned I = 0, E = MotionModifiers.size(); I < E; ++I) {\n if (MotionModifiers[I] != OMPC_MOTION_MODIFIER_unknown && llvm::is_contained(Modifiers, MotionModifiers[I])) {\n Diag(MotionModifiersLoc[I], diag::err_omp_duplicate_motion_modifier);"}} }, ["err_omp_expected_access_to_data_field"]={ [j]="err_omp_expected_access_to_data_field", [b]="expected access to data field", [c]="expected access to data field", [e]=d, [f]="expected access to data field", [g]=a, [i]=n, [h]={"5de996e3bd79",1453494096,"[OpenMP] Update map clause SEMA to support OpenMP 4.5 possible list items.","[OpenMP] Update map clause SEMA to support OpenMP 4.5 possible list items.\n\nSummary:\nExtend support in the map clause SEMA for the expressions supported in the OpenMP 4.5 specification, namely member expressions. \n\nFix some bugs in the previous implementation of SEMA related with expressions that do not consist of single variable references.\n\nFix bug in parsing when the expression in the map clause do not start with an identifier: accept any expression in the map clause and check for validity in SEMA instead of just ignoring it.\n\nReviewers: hfinkel, kkwli0, arpith-jacob, carlo.bertolli, ABataev\n\nSubscribers: cfe-commits, fraggamuffin, caomhin\n\nDifferential Revision: http://reviews.llvm.org/D16385\n\nllvm-svn: 258543"}, [k]={{m,21156,"class MapBaseChecker final : public StmtVisitor<MapBaseChecker, bool> {\n // ...\n bool VisitMemberExpr(MemberExpr *ME) {\n // ...\n if (!isa<FieldDecl>(ME->getMemberDecl())) {\n if (!NoDiagnose) {\n SemaRef.Diag(ELoc, diag::err_omp_expected_access_to_data_field) << ME->getSourceRange();"}} }, ["err_omp_expected_addressable_lvalue_or_array_item"]={ [j]={{nil,L,"err_omp_expected_addressable_lvalue_or_array_item"}}, [b]={{nil,o,"expected addressable lvalue expression, array element%select{ or array section|, array section or array shaping expression}0%select{| of non \'omp_depend_t\' type}1"},{p,L,"expected addressable lvalue expression, array element or array section"}}, [c]={{nil,o,{"expected addressable lvalue expression, array element",{" or array section",", array section or array shaping expression"},{a," of non \'omp_depend_t\' type"}}},{p,L,"expected addressable lvalue expression, array element or array section"}}, [e]=d, [f]="expected addressable lvalue expression, array element(?: or array section|, array section or array shaping expression)(?:| of non \'omp_depend_t\' type)", [g]=a, [i]={{nil,L,n}}, [h]={"463a9fea1ec2",1501182930,"[OPENMP] Allow all lvalues in \'depend\' clause.","[OPENMP] Allow all lvalues in \'depend\' clause.\n\nAccording to upcoming OpenMP 5.0 all addressable lvalue expressions are\nallowed in deoend clause.\n\nllvm-svn: 309309"}, [k]={{m,20854,"OMPClause *Sema::ActOnOpenMPDependClause(const OMPDependClause::DependDataTy &Data, Expr *DepModifier, ArrayRef<Expr *> VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc) {\n // ...\n if (DepKind == OMPC_DEPEND_sink || DepKind == OMPC_DEPEND_source) {\n // ...\n } else {\n for (Expr *RefExpr : VarList) {\n // ...\n if (DepKind != OMPC_DEPEND_sink && DepKind != OMPC_DEPEND_source) {\n // ...\n if (DepKind == OMPC_DEPEND_depobj) {\n // ...\n } else {\n // ...\n // OpenMP 5.0, 2.17.11 depend Clause, Restrictions, C/C++\n // List items used in depend clauses with the in, out, inout,\n // inoutset, or mutexinoutset dependence types cannot be\n // expressions of the omp_depend_t type.\n if (!RefExpr->isValueDependent() && !RefExpr->isTypeDependent() && !RefExpr->isInstantiationDependent() && !RefExpr->containsUnexpandedParameterPack() && (!RefExpr->IgnoreParenImpCasts()->isLValue() || (OMPDependTFound && DSAStack->getOMPDependT().getTypePtr() == ExprTy.getTypePtr()))) {\n Diag(ELoc, diag::err_omp_expected_addressable_lvalue_or_array_item) << (LangOpts.OpenMP >= 50 ? 1 : 0) << (LangOpts.OpenMP >= 50 ? 1 : 0) << RefExpr->getSourceRange();"},{m,20867,"OMPClause *Sema::ActOnOpenMPDependClause(const OMPDependClause::DependDataTy &Data, Expr *DepModifier, ArrayRef<Expr *> VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc) {\n // ...\n if (DepKind == OMPC_DEPEND_sink || DepKind == OMPC_DEPEND_source) {\n // ...\n } else {\n for (Expr *RefExpr : VarList) {\n // ...\n if (DepKind != OMPC_DEPEND_sink && DepKind != OMPC_DEPEND_source) {\n // ...\n if (DepKind == OMPC_DEPEND_depobj) {\n // ...\n } else {\n // ...\n if (ASE && !ASE->getBase()->isTypeDependent() && !ASE->getBase()->getType().getNonReferenceType()->isPointerType() && !ASE->getBase()->getType().getNonReferenceType()->isArrayType()) {\n Diag(ELoc, diag::err_omp_expected_addressable_lvalue_or_array_item) << (LangOpts.OpenMP >= 50 ? 1 : 0) << (LangOpts.OpenMP >= 50 ? 1 : 0) << RefExpr->getSourceRange();"},{m,20881,"OMPClause *Sema::ActOnOpenMPDependClause(const OMPDependClause::DependDataTy &Data, Expr *DepModifier, ArrayRef<Expr *> VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc) {\n // ...\n if (DepKind == OMPC_DEPEND_sink || DepKind == OMPC_DEPEND_source) {\n // ...\n } else {\n for (Expr *RefExpr : VarList) {\n // ...\n if (DepKind != OMPC_DEPEND_sink && DepKind != OMPC_DEPEND_source) {\n // ...\n if (DepKind == OMPC_DEPEND_depobj) {\n // ...\n } else {\n // ...\n if (!Res.isUsable() && !isa<OMPArraySectionExpr>(SimpleExpr) && !isa<OMPArrayShapingExpr>(SimpleExpr)) {\n Diag(ELoc, diag::err_omp_expected_addressable_lvalue_or_array_item) << (LangOpts.OpenMP >= 50 ? 1 : 0) << (LangOpts.OpenMP >= 50 ? 1 : 0) << RefExpr->getSourceRange();"},{m,23995,"OMPClause *Sema::ActOnOpenMPAffinityClause(SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, Expr *Modifier, ArrayRef<Expr *> Locators) {\n // ...\n for (Expr *RefExpr : Locators) {\n // ...\n if (!SimpleExpr->isLValue()) {\n Diag(ELoc, diag::err_omp_expected_addressable_lvalue_or_array_item) << 1 << 0 << RefExpr->getSourceRange();"},{m,24007,"OMPClause *Sema::ActOnOpenMPAffinityClause(SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, Expr *Modifier, ArrayRef<Expr *> Locators) {\n // ...\n for (Expr *RefExpr : Locators) {\n // ...\n if (!Res.isUsable() && !isa<OMPArraySectionExpr>(SimpleExpr) && !isa<OMPArrayShapingExpr>(SimpleExpr)) {\n Diag(ELoc, diag::err_omp_expected_addressable_lvalue_or_array_item) << 1 << 0 << RefExpr->getSourceRange();"}}, [l]={ ["clang/test/OpenMP/taskwait_depend_messages.cpp"]={"clang/test/OpenMP/taskwait_depend_messages.cpp:36:40: error: expected addressable lvalue expression, array element, array section or array shaping expression of non \'omp_depend_t\' type","clang/test/OpenMP/taskwait_depend_messages.cpp:40:37: error: expected addressable lvalue expression, array element, array section or array shaping expression of non \'omp_depend_t\' type","clang/test/OpenMP/taskwait_depend_messages.cpp:44:36: error: expected addressable lvalue expression, array element, array section or array shaping expression of non \'omp_depend_t\' type"} } }, ["err_omp_expected_array_alloctraits"]={ [j]={{nil,o,"err_omp_expected_array_alloctraits"}}, [b]={{nil,o,"expected constant sized array of \'omp_alloctrait_t\' elements, not %0"}}, [c]={{nil,o,"expected constant sized array of \'omp_alloctrait_t\' elements, not A"}}, [e]=d, [f]="expected constant sized array of \'omp_alloctrait_t\' elements, not (.*?)", [g]=a, [i]={{nil,o,n}}, [h]={I,1576908663,H,F}, [k]={{m,23957,"OMPClause *Sema::ActOnOpenMPUsesAllocatorClause(SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc, ArrayRef<UsesAllocatorsData> Data) {\n // ...\n for (const UsesAllocatorsData &D : Data) {\n // ...\n if (D.AllocatorTraits) {\n if (D.AllocatorTraits->isTypeDependent()) {\n // ...\n } else {\n // ...\n if (TraitTy.isNull() || !(Context.hasSameUnqualifiedType(TraitTy, DSAStack->getOMPAlloctraitT()) || Context.typesAreCompatible(TraitTy, DSAStack->getOMPAlloctraitT(),\n // ...\n Diag(D.AllocatorTraits->getExprLoc(), diag::err_omp_expected_array_alloctraits) << AllocatorTraitsExpr->getType();"}}, [l]={ ["clang/test/OpenMP/target_uses_allocators_messages.cpp"]={"clang/test/OpenMP/target_uses_allocators_messages.cpp:45:45: error: expected constant sized array of \'omp_alloctrait_t\' elements, not \'int\'","clang/test/OpenMP/target_uses_allocators_messages.cpp:47:45: error: expected constant sized array of \'omp_alloctrait_t\' elements, not \'omp_alloctrait_t *\'"} } }, ["err_omp_expected_base_var_name"]={ [j]="err_omp_expected_base_var_name", [b]="expected variable name as a base of the array %select{subscript|section}0", [c]={{nil,nil,{"expected variable name as a base of the array ",{"subscript","section"}}}}, [e]=d, [f]="expected variable name as a base of the array (?:subscript|section)", [g]=a, [i]=n, [h]={"f24e7b1f609c",1444295453,"[OPENMP 4.1] Codegen for array sections/subscripts in \'reduction\' clause.","[OPENMP 4.1] Codegen for array sections/subscripts in \'reduction\' clause.\nOpenMP 4.1 adds support for array sections/subscripts in \'reduction\' clause. Patch adds codegen for this feature.\n\nllvm-svn: 249672"}, [k]={{m,5374,"static std::pair<ValueDecl *, bool> getPrivateItem(Sema &S, Expr *&RefExpr, SourceLocation &ELoc, SourceRange &ERange, bool AllowArraySection, StringRef DiagType) {\n // ...\n if ((!DE || !isa<VarDecl>(DE->getDecl())) && (S.getCurrentThisType().isNull() || !ME || !isa<CXXThisExpr>(ME->getBase()->IgnoreParenImpCasts()) || !isa<FieldDecl>(ME->getMemberDecl()))) {\n if (IsArrayExpr != NoArrayExpr) {\n S.Diag(ELoc, diag::err_omp_expected_base_var_name) << IsArrayExpr << ERange;"},{m,21219,"class MapBaseChecker final : public StmtVisitor<MapBaseChecker, bool> {\n // ...\n bool VisitArraySubscriptExpr(ArraySubscriptExpr *AE) {\n // ...\n if (!E->getType()->isAnyPointerType() && !E->getType()->isArrayType()) {\n if (!NoDiagnose) {\n SemaRef.Diag(ELoc, diag::err_omp_expected_base_var_name) << 0 << AE->getSourceRange();"},{m,21270,"class MapBaseChecker final : public StmtVisitor<MapBaseChecker, bool> {\n // ...\n bool VisitOMPArraySectionExpr(OMPArraySectionExpr *OASE) {\n // ...\n if (!IsPointer && !CurType->isArrayType()) {\n SemaRef.Diag(ELoc, diag::err_omp_expected_base_var_name) << 0 << OASE->getSourceRange();"}}, [l]={ ["clang/test/OpenMP/for_reduction_messages.cpp"]={"clang/test/OpenMP/for_reduction_messages.cpp:245:38: error: expected variable name as a base of the array subscript","clang/test/OpenMP/for_reduction_messages.cpp:410:40: error: expected variable name as a base of the array subscript"} } }, ["err_omp_expected_clause"]={ [j]={{nil,y,"err_omp_expected_clause"}}, [b]={{nil,y,"expected at least one clause on \'#pragma omp %0\' directive"}}, [c]={{nil,y,"expected at least one clause on \'#pragma omp A\' directive"}}, [e]=d, [f]="expected at least one clause on \'\\#pragma omp (.*?)\' directive", [g]=a, [i]={{nil,y,u}}, [h]={"1408f91a2588",1537936119,"[OPENMP] Add support for OMP5 requires directive + unified_address clause","[OPENMP] Add support for OMP5 requires directive + unified_address clause\n\nAdd support for OMP5.0 requires directive and unified_address clause.\nPatches to follow will include support for additional clauses.\n\nDifferential Revision: https://reviews.llvm.org/D52359\n\nllvm-svn: 343063"}, [k]={{t,620,"/// Parses \'omp declare mapper\' directive.\n///\n/// declare-mapper-directive:\n/// annot_pragma_openmp \'declare\' \'mapper\' \'(\' [<mapper-identifier> \':\']\n/// <type> <var> \')\' [<clause>[[,] <clause>] ... ]\n/// annot_pragma_openmp_end\n/// <mapper-identifier> and <var> are base language identifiers.\n///\nParser::DeclGroupPtrTy Parser::ParseOpenMPDeclareMapperDirective(AccessSpecifier AS) {\n // ...\n if (Clauses.empty()) {\n Diag(Tok, diag::err_omp_expected_clause) << getOpenMPDirectiveName(OMPD_declare_mapper);"},{t,2146,"/// Parsing of declarative OpenMP directives.\n///\n/// threadprivate-directive:\n/// annot_pragma_openmp \'threadprivate\' simple-variable-list\n/// annot_pragma_openmp_end\n///\n/// allocate-directive:\n/// annot_pragma_openmp \'allocate\' simple-variable-list [<clause>]\n/// annot_pragma_openmp_end\n///\n/// declare-reduction-directive:\n/// annot_pragma_openmp \'declare\' \'reduction\' [...]\n/// annot_pragma_openmp_end\n///\n/// declare-mapper-directive:\n/// annot_pragma_openmp \'declare\' \'mapper\' \'(\' [<mapper-identifer> \':\']\n/// <type> <var> \')\' [<clause>[[,] <clause>] ... ]\n/// annot_pragma_openmp_end\n///\n/// declare-simd-directive:\n/// annot_pragma_openmp \'declare simd\' {<clause> [,]}\n/// annot_pragma_openmp_end\n/// <function declaration/definition>\n///\n/// requires directive:\n/// annot_pragma_openmp \'requires\' <clause> [[[,] <clause>] ... ]\n/// annot_pragma_openmp_end\n///\n/// assumes directive:\n/// annot_pragma_openmp \'assumes\' <clause> [[[,] <clause>] ... ]\n/// annot_pragma_openmp_end\n/// or\n/// annot_pragma_openmp \'begin assumes\' <clause> [[[,] <clause>] ... ]\n/// annot_pragma_openmp \'end assumes\'\n/// annot_pragma_openmp_end\n///\nParser::DeclGroupPtrTy Parser::ParseOpenMPDeclarativeDirectiveWithExtDecl(AccessSpecifier &AS, ParsedAttributes &Attrs, bool Delayed, DeclSpec::TST TagType, Decl *Tag) {\n // ...\n case OMPD_requires: {\n // ...\n if (Tok.is(tok::annot_pragma_openmp_end)) {\n Diag(Tok, diag::err_omp_expected_clause) << getOpenMPDirectiveName(OMPD_requires);"},{t,2173,"/// Parsing of declarative OpenMP directives.\n///\n/// threadprivate-directive:\n/// annot_pragma_openmp \'threadprivate\' simple-variable-list\n/// annot_pragma_openmp_end\n///\n/// allocate-directive:\n/// annot_pragma_openmp \'allocate\' simple-variable-list [<clause>]\n/// annot_pragma_openmp_end\n///\n/// declare-reduction-directive:\n/// annot_pragma_openmp \'declare\' \'reduction\' [...]\n/// annot_pragma_openmp_end\n///\n/// declare-mapper-directive:\n/// annot_pragma_openmp \'declare\' \'mapper\' \'(\' [<mapper-identifer> \':\']\n/// <type> <var> \')\' [<clause>[[,] <clause>] ... ]\n/// annot_pragma_openmp_end\n///\n/// declare-simd-directive:\n/// annot_pragma_openmp \'declare simd\' {<clause> [,]}\n/// annot_pragma_openmp_end\n/// <function declaration/definition>\n///\n/// requires directive:\n/// annot_pragma_openmp \'requires\' <clause> [[[,] <clause>] ... ]\n/// annot_pragma_openmp_end\n///\n/// assumes directive:\n/// annot_pragma_openmp \'assumes\' <clause> [[[,] <clause>] ... ]\n/// annot_pragma_openmp_end\n/// or\n/// annot_pragma_openmp \'begin assumes\' <clause> [[[,] <clause>] ... ]\n/// annot_pragma_openmp \'end assumes\'\n/// annot_pragma_openmp_end\n///\nParser::DeclGroupPtrTy Parser::ParseOpenMPDeclarativeDirectiveWithExtDecl(AccessSpecifier &AS, ParsedAttributes &Attrs, bool Delayed, DeclSpec::TST TagType, Decl *Tag) {\n // ...\n case OMPD_requires: {\n // ...\n // Consume final annot_pragma_openmp_end\n if (Clauses.empty()) {\n Diag(Tok, diag::err_omp_expected_clause) << getOpenMPDirectiveName(OMPD_requires);"}}, [l]={ ["clang/test/OpenMP/requires_default_atomic_mem_order_messages.cpp"]={"clang/test/OpenMP/requires_default_atomic_mem_order_messages.cpp:12:248: error: expected at least one clause on \'#pragma omp requires\' directive"} } }, ["err_omp_expected_clause_argument"]={ [j]="err_omp_expected_clause_argument", [b]="expected \'%0\' clause with an argument on \'#pragma omp %1\' construct", [c]="expected \'A\' clause with an argument on \'#pragma omp B\' construct", [e]=d, [f]="expected \'(.*?)\' clause with an argument on \'\\#pragma omp (.*?)\' construct", [g]=a, [i]=u, [h]={"e716b0204a5a",1675799568,"[OpenMP 5.2] Deprecate \'destroy\' clause without argument for \'depobj\' construct","[OpenMP 5.2] Deprecate \'destroy\' clause without argument for \'depobj\' construct\n\nDeprecate and diagnose uses of the \'destroy\' clauses without an argument\nin \'omp depobj\' directives.\n\nDifferential Revision: https://reviews.llvm.org/D143021"}, [k]={{m,17738,"OMPClause *Sema::ActOnOpenMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation VarLoc, SourceLocation EndLoc) {\n if (!InteropVar && LangOpts.OpenMP >= 52 && DSAStack->getCurrentDirective() == OMPD_depobj) {\n Diag(StartLoc, diag::err_omp_expected_clause_argument) << getOpenMPClauseName(OMPC_destroy) << getOpenMPDirectiveName(OMPD_depobj);"}}, [l]={ ["clang/test/OpenMP/depobj_messages.cpp"]={"clang/test/OpenMP/depobj_messages.cpp:34:23: error: expected \'destroy\' clause with an argument on \'#pragma omp depobj\' construct","clang/test/OpenMP/depobj_messages.cpp:159:23: error: expected \'destroy\' clause with an argument on \'#pragma omp depobj\' construct","clang/test/OpenMP/depobj_messages.cpp:159:31: error: expected \'destroy\' clause with an argument on \'#pragma omp depobj\' construct","clang/test/OpenMP/depobj_messages.cpp:161:40: error: expected \'destroy\' clause with an argument on \'#pragma omp depobj\' construct","clang/test/OpenMP/depobj_messages.cpp:162:23: error: expected \'destroy\' clause with an argument on \'#pragma omp depobj\' construct","clang/test/OpenMP/depobj_messages.cpp:164:37: error: expected \'destroy\' clause with an argument on \'#pragma omp depobj\' construct","clang/test/OpenMP/depobj_messages.cpp:172:20: error: expected \'destroy\' clause with an argument on \'#pragma omp depobj\' construct"} } }, ["err_omp_expected_colon"]={ [j]={{nil,s,"err_omp_expected_colon"}}, [b]={{nil,s,"missing \':\' in %0"}}, [c]={{nil,s,"missing \':\' in A"}}, [e]=d, [f]="missing \'\\:\' in (.*?)", [g]=a, [i]={{nil,s,u}}, [h]={qb,1612659633,sb,tb}, [k]={{t,2567,"/// Parsing of declarative or executable OpenMP directives.\n///\n/// threadprivate-directive:\n/// annot_pragma_openmp \'threadprivate\' simple-variable-list\n/// annot_pragma_openmp_end\n///\n/// allocate-directive:\n/// annot_pragma_openmp \'allocate\' simple-variable-list\n/// annot_pragma_openmp_end\n///\n/// declare-reduction-directive:\n/// annot_pragma_openmp \'declare\' \'reduction\' \'(\' <reduction_id> \':\'\n/// <type> {\',\' <type>} \':\' <expression> \')\' [\'initializer\' \'(\'\n/// (\'omp_priv\' \'=\' <expression>|<function_call>) \')\']\n/// annot_pragma_openmp_end\n///\n/// declare-mapper-directive:\n/// annot_pragma_openmp \'declare\' \'mapper\' \'(\' [<mapper-identifer> \':\']\n/// <type> <var> \')\' [<clause>[[,] <clause>] ... ]\n/// annot_pragma_openmp_end\n///\n/// executable-directive:\n/// annot_pragma_openmp \'parallel\' | \'simd\' | \'for\' | \'sections\' |\n/// \'section\' | \'single\' | \'master\' | \'critical\' [ \'(\' <name> \')\' ] |\n/// \'parallel for\' | \'parallel sections\' | \'parallel master\' | \'task\' |\n/// \'taskyield\' | \'barrier\' | \'taskwait\' | \'flush\' | \'ordered\' | \'error\'\n/// | \'atomic\' | \'for simd\' | \'parallel for simd\' | \'target\' | \'target\n/// data\' | \'taskgroup\' | \'teams\' | \'taskloop\' | \'taskloop simd\' |\n/// \'master taskloop\' | \'master taskloop simd\' | \'parallel master\n/// taskloop\' | \'parallel master taskloop simd\' | \'distribute\' | \'target\n/// enter data\' | \'target exit data\' | \'target parallel\' | \'target\n/// parallel for\' | \'target update\' | \'distribute parallel for\' |\n/// \'distribute paralle for simd\' | \'distribute simd\' | \'target parallel\n/// for simd\' | \'target simd\' | \'teams distribute\' | \'teams distribute\n/// simd\' | \'teams distribute parallel for simd\' | \'teams distribute\n/// parallel for\' | \'target teams\' | \'target teams distribute\' | \'target\n/// teams distribute parallel for\' | \'target teams distribute parallel\n/// for simd\' | \'target teams distribute simd\' | \'masked\' |\n/// \'parallel masked\' {clause} annot_pragma_openmp_end\n///\nStmtResult Parser::ParseOpenMPDeclarativeOrExecutableDirective(ParsedStmtContext StmtCtx, bool ReadDirectiveWithinMetadirective) {\n // ...\n case OMPD_metadirective: {\n // ...\n while (Tok.isNot(tok::annot_pragma_openmp_end)) {\n // ...\n if (CKind == OMPC_when) {\n // ...\n // Parse \':\'\n if (Tok.is(tok::colon))\n // ...\n else {\n Diag(Tok, diag::err_omp_expected_colon) << \"when clause\";"}}, [l]={ ["clang/test/OpenMP/metadirective_messages.cpp"]={"clang/test/OpenMP/metadirective_messages.cpp:12:51: error: missing \':\' in when clause"} } }, ["err_omp_expected_context_selector"]={ [j]={{nil,s,"err_omp_expected_context_selector"}}, [b]={{nil,s,"expected valid context selector in %0"}}, [c]={{nil,s,"expected valid context selector in A"}}, [e]=d, [f]="expected valid context selector in (.*?)", [g]=a, [i]={{nil,s,u}}, [h]={qb,1612659633,sb,tb}, [k]={{t,2558,"/// Parsing of declarative or executable OpenMP directives.\n///\n/// threadprivate-directive:\n/// annot_pragma_openmp \'threadprivate\' simple-variable-list\n/// annot_pragma_openmp_end\n///\n/// allocate-directive:\n/// annot_pragma_openmp \'allocate\' simple-variable-list\n/// annot_pragma_openmp_end\n///\n/// declare-reduction-directive:\n/// annot_pragma_openmp \'declare\' \'reduction\' \'(\' <reduction_id> \':\'\n/// <type> {\',\' <type>} \':\' <expression> \')\' [\'initializer\' \'(\'\n/// (\'omp_priv\' \'=\' <expression>|<function_call>) \')\']\n/// annot_pragma_openmp_end\n///\n/// declare-mapper-directive:\n/// annot_pragma_openmp \'declare\' \'mapper\' \'(\' [<mapper-identifer> \':\']\n/// <type> <var> \')\' [<clause>[[,] <clause>] ... ]\n/// annot_pragma_openmp_end\n///\n/// executable-directive:\n/// annot_pragma_openmp \'parallel\' | \'simd\' | \'for\' | \'sections\' |\n/// \'section\' | \'single\' | \'master\' | \'critical\' [ \'(\' <name> \')\' ] |\n/// \'parallel for\' | \'parallel sections\' | \'parallel master\' | \'task\' |\n/// \'taskyield\' | \'barrier\' | \'taskwait\' | \'flush\' | \'ordered\' | \'error\'\n/// | \'atomic\' | \'for simd\' | \'parallel for simd\' | \'target\' | \'target\n/// data\' | \'taskgroup\' | \'teams\' | \'taskloop\' | \'taskloop simd\' |\n/// \'master taskloop\' | \'master taskloop simd\' | \'parallel master\n/// taskloop\' | \'parallel master taskloop simd\' | \'distribute\' | \'target\n/// enter data\' | \'target exit data\' | \'target parallel\' | \'target\n/// parallel for\' | \'target update\' | \'distribute parallel for\' |\n/// \'distribute paralle for simd\' | \'distribute simd\' | \'target parallel\n/// for simd\' | \'target simd\' | \'teams distribute\' | \'teams distribute\n/// simd\' | \'teams distribute parallel for simd\' | \'teams distribute\n/// parallel for\' | \'target teams\' | \'target teams distribute\' | \'target\n/// teams distribute parallel for\' | \'target teams distribute parallel\n/// for simd\' | \'target teams distribute simd\' | \'masked\' |\n/// \'parallel masked\' {clause} annot_pragma_openmp_end\n///\nStmtResult Parser::ParseOpenMPDeclarativeOrExecutableDirective(ParsedStmtContext StmtCtx, bool ReadDirectiveWithinMetadirective) {\n // ...\n case OMPD_metadirective: {\n // ...\n while (Tok.isNot(tok::annot_pragma_openmp_end)) {\n // ...\n if (CKind == OMPC_when) {\n // ...\n if (TI.Sets.size() == 0) {\n Diag(Tok, diag::err_omp_expected_context_selector) << \"when clause\";"}}, [l]={ ["clang/test/OpenMP/metadirective_messages.cpp"]={"clang/test/OpenMP/metadirective_messages.cpp:8:32: error: expected valid context selector in when clause","clang/test/OpenMP/metadirective_messages.cpp:10:40: error: expected valid context selector in when clause"} } }, ["err_omp_expected_equal_in_iterator"]={ [j]={{nil,o,"err_omp_expected_equal_in_iterator"}}, [b]={{nil,o,"expected \'=\' in iterator specifier"}}, [c]={{nil,o,"expected \'=\' in iterator specifier"}}, [e]=d, [f]="expected \'\\=\' in iterator specifier", [g]=a, [i]={{nil,o,u}}, [h]={"f08df464ae89",1582039343,"[OPENMP50]Add initial support for OpenMP 5.0 iterator.","[OPENMP50]Add initial support for OpenMP 5.0 iterator.\n\nAdded basic parsing/semantic analysis/(de)serialization support for\niterator expression introduced in OpenMP 5.0."}, [k]={{t,4230,"/// Parses simple expression in parens for single-expression clauses of OpenMP\n/// constructs.\nExprResult Parser::ParseOpenMPIteratorsExpr() {\n // ...\n while (Tok.isNot(tok::r_paren) && Tok.isNot(tok::annot_pragma_openmp_end)) {\n // ...\n if (Tok.is(tok::equal))\n // ...\n else\n Diag(Tok, diag::err_omp_expected_equal_in_iterator);"}}, [l]={ [Eb]={"clang/test/OpenMP/task_affinity_messages.cpp:65:51: error: expected \'=\' in iterator specifier"} } }, ["err_omp_expected_identifier_for_critical"]={ [j]="err_omp_expected_identifier_for_critical", [b]="expected identifier specifying the name of the \'omp critical\' directive", [c]="expected identifier specifying the name of the \'omp critical\' directive", [e]=d, [f]="expected identifier specifying the name of the \'omp critical\' directive", [g]=a, [i]=u, [h]={"d9ed09f7a5f1",1405935725,"[OPENMP] Parsing/Sema of the OpenMP directive \'critical\'.","[OPENMP] Parsing/Sema of the OpenMP directive \'critical\'.\n\nllvm-svn: 213510"}, [k]={{t,2859,"/// Parsing of declarative or executable OpenMP directives.\n///\n/// threadprivate-directive:\n/// annot_pragma_openmp \'threadprivate\' simple-variable-list\n/// annot_pragma_openmp_end\n///\n/// allocate-directive:\n/// annot_pragma_openmp \'allocate\' simple-variable-list\n/// annot_pragma_openmp_end\n///\n/// declare-reduction-directive:\n/// annot_pragma_openmp \'declare\' \'reduction\' \'(\' <reduction_id> \':\'\n/// <type> {\',\' <type>} \':\' <expression> \')\' [\'initializer\' \'(\'\n/// (\'omp_priv\' \'=\' <expression>|<function_call>) \')\']\n/// annot_pragma_openmp_end\n///\n/// declare-mapper-directive:\n/// annot_pragma_openmp \'declare\' \'mapper\' \'(\' [<mapper-identifer> \':\']\n/// <type> <var> \')\' [<clause>[[,] <clause>] ... ]\n/// annot_pragma_openmp_end\n///\n/// executable-directive:\n/// annot_pragma_openmp \'parallel\' | \'simd\' | \'for\' | \'sections\' |\n/// \'section\' | \'single\' | \'master\' | \'critical\' [ \'(\' <name> \')\' ] |\n/// \'parallel for\' | \'parallel sections\' | \'parallel master\' | \'task\' |\n/// \'taskyield\' | \'barrier\' | \'taskwait\' | \'flush\' | \'ordered\' | \'error\'\n/// | \'atomic\' | \'for simd\' | \'parallel for simd\' | \'target\' | \'target\n/// data\' | \'taskgroup\' | \'teams\' | \'taskloop\' | \'taskloop simd\' |\n/// \'master taskloop\' | \'master taskloop simd\' | \'parallel master\n/// taskloop\' | \'parallel master taskloop simd\' | \'distribute\' | \'target\n/// enter data\' | \'target exit data\' | \'target parallel\' | \'target\n/// parallel for\' | \'target update\' | \'distribute parallel for\' |\n/// \'distribute paralle for simd\' | \'distribute simd\' | \'target parallel\n/// for simd\' | \'target simd\' | \'teams distribute\' | \'teams distribute\n/// simd\' | \'teams distribute parallel for simd\' | \'teams distribute\n/// parallel for\' | \'target teams\' | \'target teams distribute\' | \'target\n/// teams distribute parallel for\' | \'target teams distribute parallel\n/// for simd\' | \'target teams distribute simd\' | \'masked\' |\n/// \'parallel masked\' {clause} annot_pragma_openmp_end\n///\nStmtResult Parser::ParseOpenMPDeclarativeOrExecutableDirective(ParsedStmtContext StmtCtx, bool ReadDirectiveWithinMetadirective) {\n // ...\n case OMPD_parallel:\n case OMPD_simd:\n case OMPD_tile:\n case OMPD_unroll:\n case OMPD_for:\n case OMPD_for_simd:\n case OMPD_sections:\n case OMPD_single:\n case OMPD_section:\n case OMPD_master:\n case OMPD_critical:\n case OMPD_parallel_for:\n case OMPD_parallel_for_simd:\n case OMPD_parallel_sections:\n case OMPD_parallel_master:\n case OMPD_parallel_masked:\n case OMPD_task:\n case OMPD_ordered:\n case OMPD_atomic:\n case OMPD_target:\n case OMPD_teams:\n case OMPD_taskgroup:\n case OMPD_target_data:\n case OMPD_target_parallel:\n case OMPD_target_parallel_for:\n case OMPD_loop:\n case OMPD_teams_loop:\n case OMPD_target_teams_loop:\n case OMPD_parallel_loop:\n case OMPD_target_parallel_loop:\n case OMPD_taskloop:\n case OMPD_taskloop_simd:\n case OMPD_master_taskloop:\n case OMPD_masked_taskloop:\n case OMPD_master_taskloop_simd:\n case OMPD_masked_taskloop_simd:\n case OMPD_parallel_master_taskloop:\n case OMPD_parallel_masked_taskloop:\n case OMPD_parallel_master_taskloop_simd:\n case OMPD_parallel_masked_taskloop_simd:\n case OMPD_distribute:\n case OMPD_distribute_parallel_for:\n case OMPD_distribute_parallel_for_simd:\n case OMPD_distribute_simd:\n case OMPD_target_parallel_for_simd:\n case OMPD_target_simd:\n case OMPD_teams_distribute:\n case OMPD_teams_distribute_simd:\n case OMPD_teams_distribute_parallel_for_simd:\n case OMPD_teams_distribute_parallel_for:\n case OMPD_target_teams:\n case OMPD_target_teams_distribute:\n case OMPD_target_teams_distribute_parallel_for:\n case OMPD_target_teams_distribute_parallel_for_simd:\n case OMPD_target_teams_distribute_simd:\n case OMPD_dispatch:\n case OMPD_masked: {\n // ...\n // Parse directive name of the \'critical\' directive if any.\n if (DKind == OMPD_critical) {\n // ...\n if (!T.consumeOpen()) {\n if (Tok.isAnyIdentifier()) {\n // ...\n } else {\n Diag(Tok, diag::err_omp_expected_identifier_for_critical);"}}, [l]={ ["clang/test/OpenMP/critical_messages.cpp"]={"clang/test/OpenMP/critical_messages.cpp:19:135: error: expected identifier specifying the name of the \'omp critical\' directive","clang/test/OpenMP/critical_messages.cpp:20:26: error: expected identifier specifying the name of the \'omp critical\' directive","clang/test/OpenMP/critical_messages.cpp:86:135: error: expected identifier specifying the name of the \'omp critical\' directive","clang/test/OpenMP/critical_messages.cpp:87:26: error: expected identifier specifying the name of the \'omp critical\' directive"} } }, ["err_omp_expected_int_param"]={ [j]="err_omp_expected_int_param", [b]="expected a reference to an integer-typed parameter", [c]="expected a reference to an integer-typed parameter", [e]=d, [f]="expected a reference to an integer\\-typed parameter", [g]=a, [i]=n, [h]={"ecba70f194b5",1460458931,"[OPENMP 4.0] Support for \'linear\' clause in \'declare simd\' directive.","[OPENMP 4.0] Support for \'linear\' clause in \'declare simd\' directive.\n\nThe linear clause declares one or more list items to be private to a SIMD lane and to have a linear relationship with respect to the iteration space of a loop.\n\'linear\' \'(\' <linear-list> [ \':\' <linear-step> ] \')\'\nWhen a linear-step expression is specified in a linear clause it must be\neither a constant integer expression or an integer-typed parameter that is specified in a uniform clause on the directive.\nThe special this pointer can be used as if was one of the arguments to the function in any of the linear, aligned, or uniform clauses.\n\nllvm-svn: 266056"}, [k]={{m,7049,"Sema::DeclGroupPtrTy Sema::ActOnOpenMPDeclareSimdDirective(DeclGroupPtrTy DG, OMPDeclareSimdDeclAttr::BranchStateTy BS, Expr *Simdlen, ArrayRef<Expr *> Uniforms, ArrayRef<Expr *> Aligneds, ArrayRef<Expr *> Alignments, ArrayRef<Expr *> Linears, ArrayRef<unsigned> LinModifiers, ArrayRef<Expr *> Steps, SourceRange SR) {\n // ...\n for (Expr *E : Steps) {\n // ...\n if (const auto *DRE = dyn_cast<DeclRefExpr>(Step))\n if (const auto *PVD = dyn_cast<ParmVarDecl>(DRE->getDecl())) {\n // ...\n if (UniformedArgs.count(CanonPVD) == 0) {\n // ...\n } else if (E->isValueDependent() || E->isTypeDependent() || E->isInstantiationDependent() || E->containsUnexpandedParameterPack() || CanonPVD->getType()->hasIntegerRepresentation()) {\n // ...\n } else {\n Diag(Step->getExprLoc(), diag::err_omp_expected_int_param) << Step->getSourceRange();"}} }, ["err_omp_expected_interop_type"]={ [j]={{nil,r,"err_omp_expected_interop_type"}}, [b]={{nil,r,"expected interop type: \'target\' and/or \'targetsync\'"}}, [c]={{nil,r,"expected interop type: \'target\' and/or \'targetsync\'"}}, [e]=d, [f]="expected interop type\\: \'target\' and\\/or \'targetsync\'", [g]=a, [i]={{nil,r,u}}, [h]={qb,1612659633,sb,tb}, [k]={{t,3599,"/// Parses a comma-separated list of interop-types and a prefer_type list.\n///\nbool Parser::ParseOMPInteropInfo(OMPInteropInfo &InteropInfo, OpenMPClauseKind Kind) {\n // ...\n while (Tok.is(tok::identifier)) {\n // ...\n if (Tok.getIdentifierInfo()->isStr(\"target\")) {\n // ...\n } else if (Tok.getIdentifierInfo()->isStr(\"targetsync\")) {\n // ...\n } else if (Tok.getIdentifierInfo()->isStr(\"prefer_type\") && PreferTypeAllowed) {\n // ...\n } else {\n // ...\n Diag(Tok, diag::err_omp_expected_interop_type);"},{t,3608,"/// Parses a comma-separated list of interop-types and a prefer_type list.\n///\nbool Parser::ParseOMPInteropInfo(OMPInteropInfo &InteropInfo, OpenMPClauseKind Kind) {\n // ...\n if (!HasError && !IsTarget && !IsTargetSync) {\n Diag(Tok, diag::err_omp_expected_interop_type);"}}, [l]={ [wb]={"clang/test/OpenMP/interop_messages.cpp:13:35: error: expected interop type: \'target\' and/or \'targetsync\'","clang/test/OpenMP/interop_messages.cpp:26:28: error: expected interop type: \'target\' and/or \'targetsync\'"} } }, ["err_omp_expected_named_var_member_or_array_expression"]={ [j]="err_omp_expected_named_var_member_or_array_expression", [b]="expected expression containing only member accesses and/or array sections based on named variables", [c]="expected expression containing only member accesses and/or array sections based on named variables", [e]=d, [f]="expected expression containing only member accesses and\\/or array sections based on named variables", [g]=a, [i]=n, [h]={"5de996e3bd79",1453494096,"[OpenMP] Update map clause SEMA to support OpenMP 4.5 possible list items.","[OpenMP] Update map clause SEMA to support OpenMP 4.5 possible list items.\n\nSummary:\nExtend support in the map clause SEMA for the expressions supported in the OpenMP 4.5 specification, namely member expressions. \n\nFix some bugs in the previous implementation of SEMA related with expressions that do not consist of single variable references.\n\nFix bug in parsing when the expression in the map clause do not start with an identifier: accept any expression in the map clause and check for validity in SEMA instead of just ignoring it.\n\nReviewers: hfinkel, kkwli0, arpith-jacob, carlo.bertolli, ABataev\n\nSubscribers: cfe-commits, fraggamuffin, caomhin\n\nDifferential Revision: http://reviews.llvm.org/D16385\n\nllvm-svn: 258543"}, [k]={{m,21121,"class MapBaseChecker final : public StmtVisitor<MapBaseChecker, bool> {\n // ...\n void emitErrorMsg() {\n // If nothing else worked, this is not a valid map clause expression.\n if (SemaRef.getLangOpts().OpenMP < 50) {\n SemaRef.Diag(ELoc, diag::err_omp_expected_named_var_member_or_array_expression) << ERange;"},{m,21911,"// Check the validity of the provided variable list for the provided clause kind\n// \\a CKind. In the check process the valid expressions, mappable expression\n// components, variables, and user-defined mappers are extracted and used to\n// fill \\a ProcessedVarList, \\a VarComponents, \\a VarBaseDeclarations, and \\a\n// UDMapperList in MVLI. \\a MapType, \\a IsMapTypeImplicit, \\a MapperIdScopeSpec,\n// and \\a MapperId are expected to be valid if the clause kind is \'map\'.\nstatic void checkMappableExpressionList(Sema &SemaRef, DSAStackTy *DSAS, OpenMPClauseKind CKind, MappableVarListInfo &MVLI, SourceLocation StartLoc, CXXScopeSpec &MapperIdScopeSpec, DeclarationNameInfo MapperId, ArrayRef<Expr *> UnresolvedMappers, OpenMPMapClauseKind MapType = OMPC_MAP_unknown, ArrayRef<OpenMPMapModifierKind> Modifiers = std::nullopt, bool IsMapTypeImplicit = false, bool NoDiagnose = false) {\n // ...\n for (Expr *RE : MVLI.VarList) {\n // ...\n if (!RE->isLValue()) {\n if (SemaRef.getLangOpts().OpenMP < 50) {\n SemaRef.Diag(ELoc, diag::err_omp_expected_named_var_member_or_array_expression) << RE->getSourceRange();"}}, [l]={ ["clang/test/OpenMP/target_update_from_messages.cpp"]={"clang/test/OpenMP/target_update_from_messages.cpp:70:32: error: expected expression containing only member accesses and/or array sections based on named variables","clang/test/OpenMP/target_update_from_messages.cpp:72:32: error: expected expression containing only member accesses and/or array sections based on named variables","clang/test/OpenMP/target_update_from_messages.cpp:73:32: error: expected expression containing only member accesses and/or array sections based on named variables","clang/test/OpenMP/target_update_from_messages.cpp:74:32: error: expected expression containing only member accesses and/or array sections based on named variables","clang/test/OpenMP/target_update_from_messages.cpp:75:32: error: expected expression containing only member accesses and/or array sections based on named variables","clang/test/OpenMP/target_update_from_messages.cpp:76:32: error: expected expression containing only member accesses and/or array sections based on named variables","clang/test/OpenMP/target_update_from_messages.cpp:172:32: error: expected expression containing only member accesses and/or array sections based on named variables","clang/test/OpenMP/target_update_from_messages.cpp:184:35: error: expected expression containing only member accesses and/or array sections based on named variables","clang/test/OpenMP/target_update_from_messages.cpp:192:32: error: expected expression containing only member accesses and/or array sections based on named variables","clang/test/OpenMP/target_update_from_messages.cpp:193:32: error: expected expression containing only member accesses and/or array sections based on named variables","clang/test/OpenMP/target_update_from_messages.cpp:194:32: error: expected expression containing only member accesses and/or array sections based on named variables","clang/test/OpenMP/target_update_from_messages.cpp:195:32: error: expected expression containing only member accesses and/or array sections based on named variables","clang/test/OpenMP/target_update_from_messages.cpp:196:32: error: expected expression containing only member accesses and/or array sections based on named variables","clang/test/OpenMP/target_update_from_messages.cpp:197:32: error: expected expression containing only member accesses and/or array sections based on named variables","clang/test/OpenMP/target_update_from_messages.cpp:198:32: error: expected expression containing only member accesses and/or array sections based on named variables","clang/test/OpenMP/target_update_from_messages.cpp:199:32: error: expected expression containing only member accesses and/or array sections based on named variables","clang/test/OpenMP/target_update_from_messages.cpp:200:32: error: expected expression containing only member accesses and/or array sections based on named variables","clang/test/OpenMP/target_update_from_messages.cpp:110:32: error: expected expression containing only member accesses and/or array sections based on named variables","clang/test/OpenMP/target_update_from_messages.cpp:115:32: error: expected expression containing only member accesses and/or array sections based on named variables","clang/test/OpenMP/target_update_from_messages.cpp:128:35: error: expected expression containing only member accesses and/or array sections based on named variables","clang/test/OpenMP/target_update_from_messages.cpp:110:32: error: expected expression containing only member accesses and/or array sections based on named variables","clang/test/OpenMP/target_update_from_messages.cpp:115:32: error: expected expression containing only member accesses and/or array sections based on named variables","clang/test/OpenMP/target_update_from_messages.cpp:128:35: error: expected expression containing only member accesses and/or array sections based on named variables"} } }, ["err_omp_expected_omp_depend_t_lvalue"]={ [j]={{nil,o,"err_omp_expected_omp_depend_t_lvalue"}}, [b]={{nil,o,"expected lvalue expression%select{ of \'omp_depend_t\' type, not %1|}0"}}, [c]={{nil,o,{"expected lvalue expression",{" of \'omp_depend_t\' type, not B",a}}}}, [e]=d, [f]="expected lvalue expression(?: of \'omp_depend_t\' type, not (.*?)|)", [g]=a, [i]={{nil,o,n}}, [h]={I,1576908663,H,F}, [k]={{m,20580,"OMPClause *Sema::ActOnOpenMPDepobjClause(Expr *Depobj, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc) {\n // ...\n // OpenMP 5.0, 2.17.10.1 depobj Construct\n // depobj is an lvalue expression of type omp_depend_t.\n if (!Depobj->isTypeDependent() && !Depobj->isValueDependent() && !Depobj->isInstantiationDependent() && !Depobj->containsUnexpandedParameterPack() &&\n // ...\n Diag(Depobj->getExprLoc(), diag::err_omp_expected_omp_depend_t_lvalue) << 0 << Depobj->getType() << Depobj->getSourceRange();"},{m,20585,"OMPClause *Sema::ActOnOpenMPDepobjClause(Expr *Depobj, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc) {\n // ...\n if (!Depobj->isLValue()) {\n Diag(Depobj->getExprLoc(), diag::err_omp_expected_omp_depend_t_lvalue) << 1 << Depobj->getSourceRange();"},{m,20809,"OMPClause *Sema::ActOnOpenMPDependClause(const OMPDependClause::DependDataTy &Data, Expr *DepModifier, ArrayRef<Expr *> VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc) {\n // ...\n if (DepKind == OMPC_DEPEND_sink || DepKind == OMPC_DEPEND_source) {\n // ...\n } else {\n for (Expr *RefExpr : VarList) {\n // ...\n if (DepKind != OMPC_DEPEND_sink && DepKind != OMPC_DEPEND_source) {\n // ...\n if (DepKind == OMPC_DEPEND_depobj) {\n // OpenMP 5.0, 2.17.11 depend Clause, Restrictions, C/C++\n // List items used in depend clauses with the depobj dependence type\n // must be expressions of the omp_depend_t type.\n if (!RefExpr->isValueDependent() && !RefExpr->isTypeDependent() && !RefExpr->isInstantiationDependent() && !RefExpr->containsUnexpandedParameterPack() && (OMPDependTFound && !Context.hasSameUnqualifiedType(DSAStack->getOMPDependT(), RefExpr->getType()))) {\n Diag(ELoc, diag::err_omp_expected_omp_depend_t_lvalue) << 0 << RefExpr->getType() << RefExpr->getSourceRange();"},{m,20814,"OMPClause *Sema::ActOnOpenMPDependClause(const OMPDependClause::DependDataTy &Data, Expr *DepModifier, ArrayRef<Expr *> VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc) {\n // ...\n if (DepKind == OMPC_DEPEND_sink || DepKind == OMPC_DEPEND_source) {\n // ...\n } else {\n for (Expr *RefExpr : VarList) {\n // ...\n if (DepKind != OMPC_DEPEND_sink && DepKind != OMPC_DEPEND_source) {\n // ...\n if (DepKind == OMPC_DEPEND_depobj) {\n // ...\n if (!RefExpr->isLValue()) {\n Diag(ELoc, diag::err_omp_expected_omp_depend_t_lvalue) << 1 << RefExpr->getType() << RefExpr->getSourceRange();"}}, [l]={ ["clang/test/OpenMP/depobj_messages.cpp"]={"clang/test/OpenMP/depobj_messages.cpp:21:20: error: expected lvalue expression","clang/test/OpenMP/depobj_messages.cpp:147:20: error: expected lvalue expression of \'omp_depend_t\' type, not \'int\'","clang/test/OpenMP/depobj_messages.cpp:148:20: error: expected lvalue expression of \'omp_depend_t\' type, not \'int\'","clang/test/OpenMP/depobj_messages.cpp:149:20: error: expected lvalue expression of \'omp_depend_t\' type, not \'int\'","clang/test/OpenMP/depobj_messages.cpp:151:20: error: expected lvalue expression of \'omp_depend_t\' type, not \'int\'","clang/test/OpenMP/depobj_messages.cpp:82:20: error: expected lvalue expression of \'omp_depend_t\' type, not \'int\'","clang/test/OpenMP/depobj_messages.cpp:83:20: error: expected lvalue expression of \'omp_depend_t\' type, not \'int\'","clang/test/OpenMP/depobj_messages.cpp:84:20: error: expected lvalue expression of \'omp_depend_t\' type, not \'int\'","clang/test/OpenMP/depobj_messages.cpp:86:20: error: expected lvalue expression of \'omp_depend_t\' type, not \'int\'"} } }, ["err_omp_expected_predefined_allocator"]={ [j]={{nil,v,"err_omp_expected_predefined_allocator"}}, [b]={{nil,v,"expected one of the predefined allocators for the variables with the static storage: \'omp_default_mem_alloc\', \'omp_large_cap_mem_alloc\', \'omp_const_mem_alloc\', \'omp_high_bw_mem_alloc\', \'omp_low_lat_mem_alloc\', \'omp_cgroup_mem_alloc\', \'omp_pteam_mem_alloc\' or \'omp_thread_mem_alloc\'"}}, [c]={{nil,v,"expected one of the predefined allocators for the variables with the static storage: \'omp_default_mem_alloc\', \'omp_large_cap_mem_alloc\', \'omp_const_mem_alloc\', \'omp_high_bw_mem_alloc\', \'omp_low_lat_mem_alloc\', \'omp_cgroup_mem_alloc\', \'omp_pteam_mem_alloc\' or \'omp_thread_mem_alloc\'"}}, [e]=d, [f]="expected one of the predefined allocators for the variables with the static storage\\: \'omp_default_mem_alloc\', \'omp_large_cap_mem_alloc\', \'omp_const_mem_alloc\', \'omp_high_bw_mem_alloc\', \'omp_low_lat_mem_alloc\', \'omp_cgroup_mem_alloc\', \'omp_pteam_mem_alloc\' or \'omp_thread_mem_alloc\'", [g]=a, [i]={{nil,v,n}}, [h]={"d2fc965f1b0c",1553020751,"[OPENMP]Check that global vars require predefined allocator.","[OPENMP]Check that global vars require predefined allocator.\n\nAccording to OpenMP, 2.11.3 allocate Directive, Restrictions, C / C++,\nif a list item has a static storage type, the allocator expression in\n the allocator clause must be a constant expression that evaluates to\n one of the predefined memory allocator values. Added check for this\n restriction.\n\nllvm-svn: 356496"}, [k]={{m,3429,"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 Diag(Allocator->getExprLoc(), diag::err_omp_expected_predefined_allocator) << Allocator->getSourceRange();"}}, [l]={ ["clang/test/OpenMP/allocate_allocator_messages.cpp"]={"clang/test/OpenMP/allocate_allocator_messages.cpp:38:35: error: expected one of the predefined allocators for the variables with the static storage: \'omp_default_mem_alloc\', \'omp_large_cap_mem_alloc\', \'omp_const_mem_alloc\', \'omp_high_bw_mem_alloc\', \'omp_low_lat_mem_alloc\', \'omp_cgroup_mem_alloc\', \'omp_pteam_mem_alloc\' or \'omp_thread_mem_alloc\'","clang/test/OpenMP/allocate_allocator_messages.cpp:41:35: error: expected one of the predefined allocators for the variables with the static storage: \'omp_default_mem_alloc\', \'omp_large_cap_mem_alloc\', \'omp_const_mem_alloc\', \'omp_high_bw_mem_alloc\', \'omp_low_lat_mem_alloc\', \'omp_cgroup_mem_alloc\', \'omp_pteam_mem_alloc\' or \'omp_thread_mem_alloc\'"} } }, ["err_omp_expected_private_copy_for_allocate"]={ [j]={{nil,v,"err_omp_expected_private_copy_for_allocate"}}, [b]={{nil,v,"the referenced item is not found in any private clause on the same directive"}}, [c]={{nil,v,"the referenced item is not found in any private clause on the same directive"}}, [e]=d, [f]="the referenced item is not found in any private clause on the same directive", [g]=a, [i]={{nil,v,n}}, [h]={"e106f25f056b",1554128731,"[OPENMP] Check that allocated variables are used in private clauses.","[OPENMP] Check that allocated variables are used in private clauses.\n\nAccording to OpenMP 5.0 standard, 2.11.4 allocate Clause, Restrictions,\nFor any list item that is specified in the allocate clause on a\ndirective, a data-sharing attribute clause that may create a private\ncopy of that list item must be specified on the same directive. Patch\nadds the checks for this restriction.\n\nllvm-svn: 357390"}, [k]={{m,5523,"static void checkAllocateClauses(Sema &S, DSAStackTy *Stack, ArrayRef<OMPClause *> Clauses) {\n // ...\n for (OMPClause *C : AllocateRange) {\n // ...\n for (Expr *E : AC->varlists()) {\n // ...\n if (!isOpenMPPrivate(Data.CKind)) {\n S.Diag(E->getExprLoc(), diag::err_omp_expected_private_copy_for_allocate);"}}, [l]={ ["clang/test/OpenMP/allocate_messages.cpp"]={"clang/test/OpenMP/allocate_messages.cpp:149:31: error: the referenced item is not found in any private clause on the same directive"} } }, ["err_omp_expected_punc"]={ [j]="err_omp_expected_punc", [b]="expected \',\' or \')\' in \'%0\' %select{clause|directive}1", [c]={{nil,nil,{"expected \',\' or \')\' in \'A\' ",{"clause","directive"}}}}, [e]=d, [f]="expected \',\' or \'\\)\' in \'(.*?)\' (?:clause|directive)", [g]=a, [i]=u, [h]={"5ec3eb11fcb8",1374203623,"OpenMP: basic support for #pragma omp parallel","OpenMP: basic support for #pragma omp parallel\n\nllvm-svn: 186647"}, [k]={{t,2580,"/// Parsing of declarative or executable OpenMP directives.\n///\n/// threadprivate-directive:\n/// annot_pragma_openmp \'threadprivate\' simple-variable-list\n/// annot_pragma_openmp_end\n///\n/// allocate-directive:\n/// annot_pragma_openmp \'allocate\' simple-variable-list\n/// annot_pragma_openmp_end\n///\n/// declare-reduction-directive:\n/// annot_pragma_openmp \'declare\' \'reduction\' \'(\' <reduction_id> \':\'\n/// <type> {\',\' <type>} \':\' <expression> \')\' [\'initializer\' \'(\'\n/// (\'omp_priv\' \'=\' <expression>|<function_call>) \')\']\n/// annot_pragma_openmp_end\n///\n/// declare-mapper-directive:\n/// annot_pragma_openmp \'declare\' \'mapper\' \'(\' [<mapper-identifer> \':\']\n/// <type> <var> \')\' [<clause>[[,] <clause>] ... ]\n/// annot_pragma_openmp_end\n///\n/// executable-directive:\n/// annot_pragma_openmp \'parallel\' | \'simd\' | \'for\' | \'sections\' |\n/// \'section\' | \'single\' | \'master\' | \'critical\' [ \'(\' <name> \')\' ] |\n/// \'parallel for\' | \'parallel sections\' | \'parallel master\' | \'task\' |\n/// \'taskyield\' | \'barrier\' | \'taskwait\' | \'flush\' | \'ordered\' | \'error\'\n/// | \'atomic\' | \'for simd\' | \'parallel for simd\' | \'target\' | \'target\n/// data\' | \'taskgroup\' | \'teams\' | \'taskloop\' | \'taskloop simd\' |\n/// \'master taskloop\' | \'master taskloop simd\' | \'parallel master\n/// taskloop\' | \'parallel master taskloop simd\' | \'distribute\' | \'target\n/// enter data\' | \'target exit data\' | \'target parallel\' | \'target\n/// parallel for\' | \'target update\' | \'distribute parallel for\' |\n/// \'distribute paralle for simd\' | \'distribute simd\' | \'target parallel\n/// for simd\' | \'target simd\' | \'teams distribute\' | \'teams distribute\n/// simd\' | \'teams distribute parallel for simd\' | \'teams distribute\n/// parallel for\' | \'target teams\' | \'target teams distribute\' | \'target\n/// teams distribute parallel for\' | \'target teams distribute parallel\n/// for simd\' | \'target teams distribute simd\' | \'masked\' |\n/// \'parallel masked\' {clause} annot_pragma_openmp_end\n///\nStmtResult Parser::ParseOpenMPDeclarativeOrExecutableDirective(ParsedStmtContext StmtCtx, bool ReadDirectiveWithinMetadirective) {\n // ...\n case OMPD_metadirective: {\n // ...\n while (Tok.isNot(tok::annot_pragma_openmp_end)) {\n // ...\n while (Tok.isNot(tok::r_paren) || paren != 0) {\n // ...\n if (Tok.is(tok::annot_pragma_openmp_end)) {\n Diag(Tok, diag::err_omp_expected_punc) << getOpenMPClauseName(CKind) << 0;"},{t,3141,"OMPClause *Parser::ParseOpenMPUsesAllocatorClause(OpenMPDirectiveKind DKind) {\n // ...\n do {\n // ...\n if (Tok.isNot(tok::comma) && Tok.isNot(tok::r_paren))\n Diag(Tok, diag::err_omp_expected_punc) << \"uses_allocators\" << 0;"},{t,4675,"/// Parses clauses with list.\nbool Parser::ParseOpenMPVarList(OpenMPDirectiveKind DKind, OpenMPClauseKind Kind, SmallVectorImpl<Expr *> &Vars, Sema::OpenMPVarListDataTy &Data) {\n // ...\n while (IsComma || (Tok.isNot(tok::r_paren) && Tok.isNot(tok::colon) && Tok.isNot(tok::annot_pragma_openmp_end))) {\n // ...\n if (IsComma)\n // ...\n else if (Tok.isNot(tok::r_paren) && Tok.isNot(tok::annot_pragma_openmp_end) && (!MayHaveTail || Tok.isNot(tok::colon)))\n Diag(Tok, diag::err_omp_expected_punc) << ((Kind == OMPC_flush) ? getOpenMPDirectiveName(OMPD_flush) : getOpenMPClauseName(Kind)) << (Kind == OMPC_flush);"}}, [l]={ ["clang/test/OpenMP/target_uses_allocators_messages.cpp"]={"clang/test/OpenMP/target_uses_allocators_messages.cpp:29:195: error: expected \',\' or \')\' in \'uses_allocators\' clause","clang/test/OpenMP/target_uses_allocators_messages.cpp:33:41: error: expected \',\' or \')\' in \'uses_allocators\' clause"} } }, ["err_omp_expected_punc_after_interop_mod"]={ [j]={{nil,r,"err_omp_expected_punc_after_interop_mod"}}, [b]={{nil,r,"expected \',\' after interop modifier"}}, [c]={{nil,r,"expected \',\' after interop modifier"}}, [e]=d, [f]="expected \',\' after interop modifier", [g]=a, [i]={{nil,r,u}}, [h]={qb,1612659633,sb,tb} }, ["err_omp_expected_punc_after_iterator"]={ [j]={{nil,o,"err_omp_expected_punc_after_iterator"}}, [b]={{nil,o,"expected \',\' or \')\' after iterator specifier"}}, [c]={{nil,o,"expected \',\' or \')\' after iterator specifier"}}, [e]=d, [f]="expected \',\' or \'\\)\' after iterator specifier", [g]=a, [i]={{nil,o,u}}, [h]={"f08df464ae89",1582039343,"[OPENMP50]Add initial support for OpenMP 5.0 iterator.","[OPENMP50]Add initial support for OpenMP 5.0 iterator.\n\nAdded basic parsing/semantic analysis/(de)serialization support for\niterator expression introduced in OpenMP 5.0."}, [k]={{t,4271,"/// Parses simple expression in parens for single-expression clauses of OpenMP\n/// constructs.\nExprResult Parser::ParseOpenMPIteratorsExpr() {\n // ...\n while (Tok.isNot(tok::r_paren) && Tok.isNot(tok::annot_pragma_openmp_end)) {\n // ...\n // Parse \',\' or \')\'\n if (Tok.isNot(tok::comma) && Tok.isNot(tok::r_paren))\n Diag(Tok, diag::err_omp_expected_punc_after_iterator);"}}, [l]={ [Eb]={"clang/test/OpenMP/task_affinity_messages.cpp:65:389: error: expected \',\' or \')\' after iterator specifier","clang/test/OpenMP/task_affinity_messages.cpp:66:336: error: expected \',\' or \')\' after iterator specifier"} } }, ["err_omp_expected_reduction_identifier"]={ [j]="err_omp_expected_reduction_identifier", [b]="expected identifier or one of the following operators: \'+\', \'-\', \'*\', \'&\', \'|\', \'^\', \'&&\', or \'||\'", [c]="expected identifier or one of the following operators: \'+\', \'-\', \'*\', \'&\', \'|\', \'^\', \'&&\', or \'||\'", [e]=d, [f]="expected identifier or one of the following operators\\: \'\\+\', \'\\-\', \'\\*\', \'&\', \'\\|\', \'\\^\', \'&&\', or \'\\|\\|\'", [g]=a, [i]=u, [h]={"94a4f0cb5f8a",1456982499,"[OPENMP 4.0] Initial support for \'omp declare reduction\' construct.","[OPENMP 4.0] Initial support for \'omp declare reduction\' construct.\n\nAdd parsing, sema analysis and serialization/deserialization for \'declare reduction\' construct.\nUser-defined reductions are defined as\n\n#pragma omp declare reduction( reduction-identifier : typename-list : combiner ) [initializer ( initializer-expr )]\nThese custom reductions may be used in \'reduction\' clauses of OpenMP constructs. The combiner specifies how partial results can be combined into a single value. The\ncombiner can use the special variable identifiers omp_in and omp_out that are of the type of the variables being reduced with this reduction-identifier. Each of them will\ndenote one of the values to be combined before executing the combiner. It is assumed that the special omp_out identifier will refer to the storage that holds the resulting\ncombined value after executing the combiner.\nAs the initializer-expr value of a user-defined reduction is not known a priori the initializer-clause can be used to specify one. Then the contents of the initializer-clause\nwill be used as the initializer for private copies of reduction list items where the omp_priv identifier will refer to the storage to be initialized. The special identifier\nomp_orig can also appear in the initializer-clause and it will refer to the storage of the original variable to be reduced.\nDifferential Revision: http://reviews.llvm.org/D11182\n\nllvm-svn: 262582"}, [k]={{t,267,"static DeclarationName parseOpenMPReductionId(Parser &P) {\n // ...\n default:\n P.Diag(Tok.getLocation(), diag::err_omp_expected_reduction_identifier);"}}, [l]={ ["clang/test/OpenMP/declare_reduction_messages.c"]={"clang/test/OpenMP/declare_reduction_messages.c:9:196: error: expected identifier or one of the following operators: \'+\', \'-\', \'*\', \'&\', \'|\', \'^\', \'&&\', or \'||\'","clang/test/OpenMP/declare_reduction_messages.c:10:31: error: expected identifier or one of the following operators: \'+\', \'-\', \'*\', \'&\', \'|\', \'^\', \'&&\', or \'||\'","clang/test/OpenMP/declare_reduction_messages.c:11:31: error: expected identifier or one of the following operators: \'+\', \'-\', \'*\', \'&\', \'|\', \'^\', \'&&\', or \'||\'","clang/test/OpenMP/declare_reduction_messages.c:13:31: error: expected identifier or one of the following operators: \'+\', \'-\', \'*\', \'&\', \'|\', \'^\', \'&&\', or \'||\'","clang/test/OpenMP/declare_reduction_messages.c:14:31: error: expected identifier or one of the following operators: \'+\', \'-\', \'*\', \'&\', \'|\', \'^\', \'&&\', or \'||\'"} } }, ["err_omp_expected_uniform_param"]={ [j]="err_omp_expected_uniform_param", [b]="expected a reference to a parameter specified in a \'uniform\' clause", [c]="expected a reference to a parameter specified in a \'uniform\' clause", [e]=d, [f]="expected a reference to a parameter specified in a \'uniform\' clause", [g]=a, [i]=n, [h]={"ecba70f194b5",1460458931,"[OPENMP 4.0] Support for \'linear\' clause in \'declare simd\' directive.","[OPENMP 4.0] Support for \'linear\' clause in \'declare simd\' directive.\n\nThe linear clause declares one or more list items to be private to a SIMD lane and to have a linear relationship with respect to the iteration space of a loop.\n\'linear\' \'(\' <linear-list> [ \':\' <linear-step> ] \')\'\nWhen a linear-step expression is specified in a linear clause it must be\neither a constant integer expression or an integer-typed parameter that is specified in a uniform clause on the directive.\nThe special this pointer can be used as if was one of the arguments to the function in any of the linear, aligned, or uniform clauses.\n\nllvm-svn: 266056"}, [k]={{m,7041,"Sema::DeclGroupPtrTy Sema::ActOnOpenMPDeclareSimdDirective(DeclGroupPtrTy DG, OMPDeclareSimdDeclAttr::BranchStateTy BS, Expr *Simdlen, ArrayRef<Expr *> Uniforms, ArrayRef<Expr *> Aligneds, ArrayRef<Expr *> Alignments, ArrayRef<Expr *> Linears, ArrayRef<unsigned> LinModifiers, ArrayRef<Expr *> Steps, SourceRange SR) {\n // ...\n for (Expr *E : Steps) {\n // ...\n if (const auto *DRE = dyn_cast<DeclRefExpr>(Step))\n if (const auto *PVD = dyn_cast<ParmVarDecl>(DRE->getDecl())) {\n // ...\n if (UniformedArgs.count(CanonPVD) == 0) {\n Diag(Step->getExprLoc(), diag::err_omp_expected_uniform_param) << Step->getSourceRange();"}}, [l]={ [Fb]={"clang/test/OpenMP/declare_simd_messages.cpp:194:36: error: expected a reference to a parameter specified in a \'uniform\' clause","clang/test/OpenMP/declare_simd_messages.cpp:223:91: error: expected a reference to a parameter specified in a \'uniform\' clause"} } }, ["err_omp_expected_var_arg"]={ [j]="err_omp_expected_var_arg", [b]="%0 is not a global variable, static local variable or static data member", [c]="A is not a global variable, static local variable or static data member", [e]=d, [f]="(.*?) is not a global variable, static local variable or static data member", [g]=a, [i]=n, [h]={"f9b1510576b2",1376700376,"Refactor all diagnosing of TypoCorrections through a common function, in","Refactor all diagnosing of TypoCorrections through a common function, in\npreparation for teaching this function how to diagnose a correction that\nincludes importing a module.\n\nllvm-svn: 188602"}, [k]={{m,3054,"ExprResult Sema::ActOnOpenMPIdExpression(Scope *CurScope, CXXScopeSpec &ScopeSpec, const DeclarationNameInfo &Id, OpenMPDirectiveKind Kind) {\n // ...\n if (!Lookup.isSingleResult()) {\n // ...\n if (TypoCorrection Corrected = CorrectTypo(Id, LookupOrdinaryName, CurScope, nullptr, CCC, CTK_ErrorRecovery)) {\n // ...\n } else {\n Diag(Id.getLoc(), Lookup.empty() ? diag::err_undeclared_var_use : diag::err_omp_expected_var_arg) << Id.getName();"},{m,3059,"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 Diag(Id.getLoc(), diag::err_omp_expected_var_arg) << Id.getName();"}}, [l]={ ["clang/test/OpenMP/threadprivate_messages.cpp"]={"clang/test/OpenMP/threadprivate_messages.cpp:50:27: error: \'foo\' is not a global variable, static local variable or static data member","clang/test/OpenMP/threadprivate_messages.cpp:68:31: error: \'a\' is not a global variable, static local variable or static data member"} } }, ["err_omp_expected_var_arg_suggest"]={ [j]="err_omp_expected_var_arg_suggest", [b]="%0 is not a global variable, static local variable or static data member; did you mean %1", [c]="A is not a global variable, static local variable or static data member; did you mean B", [e]=d, [f]="(.*?) is not a global variable, static local variable or static data member; did you mean (.*?)", [g]=a, [i]=n, [h]={"a769e07232d2",1363934075,"OpenMP threadprivate directive parsing and semantic analysis","OpenMP threadprivate directive parsing and semantic analysis\n\nllvm-svn: 177705"}, [k]={{m,3049,"ExprResult Sema::ActOnOpenMPIdExpression(Scope *CurScope, CXXScopeSpec &ScopeSpec, const DeclarationNameInfo &Id, OpenMPDirectiveKind Kind) {\n // ...\n if (!Lookup.isSingleResult()) {\n // ...\n if (TypoCorrection Corrected = CorrectTypo(Id, LookupOrdinaryName, CurScope, nullptr, CCC, CTK_ErrorRecovery)) {\n diagnoseTypo(Corrected, PDiag(Lookup.empty() ? diag::err_undeclared_var_use_suggest : diag::err_omp_expected_var_arg_suggest) << Id.getName());"}} }, ["err_omp_expected_var_name_member_expr"]={ [j]="err_omp_expected_var_name_member_expr", [b]="expected variable name%select{| or data member of current class}0", [c]={{nil,nil,{"expected variable name",{a," or data member of current class"}}}}, [e]=d, [f]="expected variable name(?:| or data member of current class)", [g]=a, [i]=n, [h]={"48c0bfb99f12",1453280874,"[OPENMP 4.5] Allow to use non-static data members in non-static member functions in \'private\' clause...","[OPENMP 4.5] Allow to use non-static data members in non-static member functions in \'private\' clause.\nOpenMP 4.5 allows to use non-static members of current class in non-static member functions in \'private\' clause. Patch adds initial support for privatizing data members.\n\nllvm-svn: 258299"}, [k]={{m,5386,"static std::pair<ValueDecl *, bool> getPrivateItem(Sema &S, Expr *&RefExpr, SourceLocation &ELoc, SourceRange &ERange, bool AllowArraySection, StringRef DiagType) {\n // ...\n if ((!DE || !isa<VarDecl>(DE->getDecl())) && (S.getCurrentThisType().isNull() || !ME || !isa<CXXThisExpr>(ME->getBase()->IgnoreParenImpCasts()) || !isa<FieldDecl>(ME->getMemberDecl()))) {\n if (IsArrayExpr != NoArrayExpr) {\n // ...\n } else if (!DiagType.empty()) {\n // ...\n } else {\n S.Diag(ELoc, AllowArraySection ? diag::err_omp_expected_var_name_member_expr_or_array_item : diag::err_omp_expected_var_name_member_expr) << (S.getCurrentThisType().isNull() ? 0 : 1) << ERange;"},{m,20357,"OMPClause *Sema::ActOnOpenMPCopyinClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc) {\n // ...\n for (Expr *RefExpr : VarList) {\n // ...\n if (!DE || !isa<VarDecl>(DE->getDecl())) {\n Diag(ELoc, diag::err_omp_expected_var_name_member_expr) << 0 << RefExpr->getSourceRange();"}}, [l]={ ["clang/test/OpenMP/sections_misc_messages.c"]={"clang/test/OpenMP/sections_misc_messages.c:184:30: error: expected variable name","clang/test/OpenMP/sections_misc_messages.c:244:34: error: expected variable name","clang/test/OpenMP/sections_misc_messages.c:304:35: error: expected variable name"} } }, ["err_omp_expected_var_name_member_expr_or_array_item"]={ [j]="err_omp_expected_var_name_member_expr_or_array_item", [b]="expected variable name%select{|, data member of current class}0, array element or array section", [c]={{nil,nil,{"expected variable name",{a,", data member of current class"},", array element or array section"}}}, [e]=d, [f]="expected variable name(?:|, data member of current class), array element or array section", [g]=a, [i]=n, [h]={"48c0bfb99f12",1453280874,"[OPENMP 4.5] Allow to use non-static data members in non-static member functions in \'private\' clause...","[OPENMP 4.5] Allow to use non-static data members in non-static member functions in \'private\' clause.\nOpenMP 4.5 allows to use non-static members of current class in non-static member functions in \'private\' clause. Patch adds initial support for privatizing data members.\n\nllvm-svn: 258299"}, [k]={{m,5385,"static std::pair<ValueDecl *, bool> getPrivateItem(Sema &S, Expr *&RefExpr, SourceLocation &ELoc, SourceRange &ERange, bool AllowArraySection, StringRef DiagType) {\n // ...\n if ((!DE || !isa<VarDecl>(DE->getDecl())) && (S.getCurrentThisType().isNull() || !ME || !isa<CXXThisExpr>(ME->getBase()->IgnoreParenImpCasts()) || !isa<FieldDecl>(ME->getMemberDecl()))) {\n if (IsArrayExpr != NoArrayExpr) {\n // ...\n } else if (!DiagType.empty()) {\n // ...\n } else {\n S.Diag(ELoc, AllowArraySection ? diag::err_omp_expected_var_name_member_expr_or_array_item : diag::err_omp_expected_var_name_member_expr) << (S.getCurrentThisType().isNull() ? 0 : 1) << ERange;"}}, [l]={ ["clang/test/OpenMP/parallel_reduction_messages.c"]={"clang/test/OpenMP/parallel_reduction_messages.c:19:48: error: expected variable name, array element or array section"} } }, ["err_omp_expected_var_name_member_expr_with_type"]={ [j]={{nil,w,"err_omp_expected_var_name_member_expr_with_type"}}, [b]={{nil,w,"expected variable%select{| or static data member|, static data member, or non-static data member of current class}0 of type \'%1\'"}}, [c]={{nil,w,{"expected variable",{a," or static data member",", static data member, or non-static data member of current class"}," of type \'B\'"}}}, [e]=d, [f]="expected variable(?:| or static data member|, static data member, or non\\-static data member of current class) of type \'(.*?)\'", [g]=a, [i]={{nil,w,n}}, [h]={"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"}, [k]={{m,5380,"static std::pair<ValueDecl *, bool> getPrivateItem(Sema &S, Expr *&RefExpr, SourceLocation &ELoc, SourceRange &ERange, bool AllowArraySection, StringRef DiagType) {\n // ...\n if ((!DE || !isa<VarDecl>(DE->getDecl())) && (S.getCurrentThisType().isNull() || !ME || !isa<CXXThisExpr>(ME->getBase()->IgnoreParenImpCasts()) || !isa<FieldDecl>(ME->getMemberDecl()))) {\n if (IsArrayExpr != NoArrayExpr) {\n // ...\n } else if (!DiagType.empty()) {\n // ...\n S.Diag(ELoc, diag::err_omp_expected_var_name_member_expr_with_type) << DiagSelect << DiagType << ERange;"}}, [l]={ [wb]={"clang/test/OpenMP/interop_messages.cpp:60:36: error: expected variable or static data member of type \'omp_interop_t\'","clang/test/OpenMP/interop_messages.cpp:63:28: error: expected variable or static data member of type \'omp_interop_t\'","clang/test/OpenMP/interop_messages.cpp:66:32: error: expected variable or static data member of type \'omp_interop_t\'","clang/test/OpenMP/interop_messages.cpp:136:37: error: expected variable or static data member of type \'omp_interop_t\'","clang/test/OpenMP/interop_messages.cpp:159:59: error: expected variable, static data member, or non-static data member of current class of type \'omp_interop_t\'","clang/test/OpenMP/interop_messages.cpp:162:59: error: expected variable, static data member, or non-static data member of current class of type \'omp_interop_t\'","clang/test/OpenMP/interop_messages.cpp:169:37: error: expected variable or static data member of type \'omp_interop_t\'","clang/test/OpenMP/interop_messages.cpp:172:36: error: expected variable or static data member of type \'omp_interop_t\'"} } }, ["err_omp_explicit_conversion"]={ [j]="err_omp_explicit_conversion", [b]="expression requires explicit conversion from %0 to %1", [c]="expression requires explicit conversion from A to B", [e]=d, [f]="expression requires explicit conversion from (.*?) to (.*?)", [g]=a, [i]=n, [h]={"568a833f68de",1394086519,"[OPENMP] Clause \'num_threads\'","[OPENMP] Clause \'num_threads\'\n\nllvm-svn: 203087"}, [k]={{m,16402,"ExprResult Sema::PerformOpenMPImplicitIntegerConversion(SourceLocation Loc, Expr *Op) {\n // ...\n class IntConvertDiagnoser : public ICEConvertDiagnoser {\n // ...\n SemaDiagnosticBuilder diagnoseExplicitConv(Sema &S, SourceLocation Loc, QualType T, QualType ConvTy) override { return S.Diag(Loc, diag::err_omp_explicit_conversion) << T << ConvTy; }"}} }, ["err_omp_firstprivate_incomplete_type"]={ [j]="err_omp_firstprivate_incomplete_type", [b]="a firstprivate variable with incomplete type %0", [c]="a firstprivate variable with incomplete type A", [e]=d, [f]="a firstprivate variable with incomplete type (.*?)", [g]=a, [i]=n, [h]={"d5af8e472d60",1380605554,"[OpenMP] Added parsing and semantic analysis for firstprivate clause","[OpenMP] Added parsing and semantic analysis for firstprivate clause\n\nllvm-svn: 191730"}, [k]={{m,18230,"OMPClause *Sema::ActOnOpenMPFirstprivateClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc) {\n // ...\n for (Expr *RefExpr : VarList) {\n // ...\n if (RequireCompleteType(ELoc, Type, diag::err_omp_firstprivate_incomplete_type))"}}, [l]={ ["clang/test/OpenMP/parallel_sections_firstprivate_messages.cpp"]={"clang/test/OpenMP/parallel_sections_firstprivate_messages.cpp:113:47: error: a firstprivate variable with incomplete type \'S1\'","clang/test/OpenMP/parallel_sections_firstprivate_messages.cpp:219:44: error: a firstprivate variable with incomplete type \'S1\'"} } }, ["err_omp_flush_order_clause_and_list"]={ [j]={{nil,o,"err_omp_flush_order_clause_and_list"}}, [b]={{nil,o,"\'flush\' directive with memory order clause \'%0\' cannot have the list"}}, [c]={{nil,o,"\'flush\' directive with memory order clause \'A\' cannot have the list"}}, [e]=d, [f]="\'flush\' directive with memory order clause \'(.*?)\' cannot have the list", [g]=a, [i]={{nil,o,n}}, [h]={"1228d42ddab8",1576809732,"[OpenMP][Part 2] Use reusable OpenMP context/traits handling","[OpenMP][Part 2] Use reusable OpenMP context/traits handling\n\nThis patch implements an almost complete handling of OpenMP\ncontexts/traits such that we can reuse most of the logic in Flang\nthrough the OMPContext.{h,cpp} in llvm/Frontend/OpenMP.\n\nAll but construct SIMD specifiers, e.g., inbranch, and the device ISA\nselector are define in `llvm/lib/Frontend/OpenMP/OMPKinds.def`. From\nthese definitions we generate the enum classes `TraitSet`,\n`TraitSelector`, and `TraitProperty` as well as conversion and helper\nfunctions in `llvm/lib/Frontend/OpenMP/OMPContext.{h,cpp}`.\n\nThe above enum classes are used in the parser, sema, and the AST\nattribute. The latter is not a collection of multiple primitive variant\narguments that contain encodings via numbers and strings but instead a\ntree that mirrors the `match` clause (see `struct OpenMPTraitInfo`).\n\nThe changes to the parser make it more forgiving when wrong syntax is\nread and they also resulted in more specialized diagnostics. The tests\nare updated and the core issues are detected as before. Here and\nelsewhere this patch tries to be generic, thus we do not distinguish\nwhat selector set, selector, or property is parsed except if they do\nbehave exceptionally, as for example `user={condition(EXPR)}` does.\n\nThe sema logic changed in two ways: First, the OMPDeclareVariantAttr\nrepresentation changed, as mentioned above, and the sema was adjusted to\nwork with the new `OpenMPTraitInfo`. Second, the matching and scoring\nlogic moved into `OMPContext.{h,cpp}`. It is implemented on a flat\nrepresentation of the `match` clause that is not tied to clang.\n`OpenMPTraitInfo` provides a method to generate this flat structure (see\n`struct VariantMatchInfo`) by computing integer score values and boolean\nuser conditions from the `clang::Expr` we keep for them.\n\nThe OpenMP context is now an explicit object (see `struct OMPContext`).\nThis is in anticipation of construct traits that need to be tracked. The\nOpenMP context, as well as the `VariantMatchInfo`, are basically made up\nof a set of active or respectively required traits, e.g., \'host\', and an\nordered container of constructs which allows duplication. Matching and\nscoring is kept as generic as possible to allow easy extension in the\nfuture.\n\n---\n\nTest changes:\n\nThe messages checked in `OpenMP/declare_variant_messages.{c,cpp}` have\nbeen auto generated to match the new warnings and notes of the parser.\nThe \"subset\" checks were reversed causing the wrong version to be\npicked. The tests have been adjusted to correct this.\nWe do not print scores if the user did not provide one.\nWe print spaces to make lists in the `match` clause more legible.\n\nReviewers: kiranchandramohan, ABataev, RaviNarayanaswamy, gtbercea, grokos, sdmitriev, JonChesterfield, hfinkel, fghanim\n\nSubscribers: merge_guards_bot, rampitec, mgorny, hiraditya, aheejin, fedor.sergeev, simoncook, bollu, guansong, dexonsmith, jfb, s.egerton, llvm-commits, cfe-commits\n\nTags: #clang, #llvm\n\nDifferential Revision: https://reviews.llvm.org/D71830"}, [k]={{m,11240,"StmtResult Sema::ActOnOpenMPFlushDirective(ArrayRef<OMPClause *> Clauses, SourceLocation StartLoc, SourceLocation EndLoc) {\n // ...\n if (FC && OrderClause) {\n Diag(FC->getLParenLoc(), diag::err_omp_flush_order_clause_and_list) << getOpenMPClauseName(OrderClause->getClauseKind());"}}, [l]={ ["clang/test/OpenMP/flush_messages.cpp"]={"clang/test/OpenMP/flush_messages.cpp:146:13: error: \'flush\' directive with memory order clause \'acq_rel\' cannot have the list"} } }, ["err_omp_function_expected"]={ [j]="err_omp_function_expected", [b]={{nil,p,"\'#pragma omp declare %select{simd|variant}0\' can only be applied to functions"},{v,nil,"\'#pragma omp declare simd\' can only be applied to functions"}}, [c]={{nil,p,{"\'#pragma omp declare ",{"simd","variant"},"\' can only be applied to functions"}},{v,nil,"\'#pragma omp declare simd\' can only be applied to functions"}}, [e]=d, [f]="\'\\#pragma omp declare (?:simd|variant)\' can only be applied to functions", [g]=a, [i]=n, [h]={"587e1de4ea2a",1459334635,"[OPENMP 4.0] Initial support for \'#pragma omp declare simd\' directive.","[OPENMP 4.0] Initial support for \'#pragma omp declare simd\' directive.\n\nInitial parsing/sema/serialization/deserialization support for \'#pragma\nomp declare simd\' directive.\nThe \'declare simd\' construct can be applied to a function to enable the\ncreation of one or more versions that can process multiple arguments\nusing SIMD instructions from a single invocation from a SIMD loop.\nIf the function has any declarations, then the declare simd construct\nfor any declaration that has one must be equivalent to the one specified\n for the definition. Otherwise, the result is unspecified.\nThis pragma can be applied many times to the same declaration.\nInternally this pragma is represented as an attribute. But we need special processing for this pragma because it must be used before function declaration, this directive is applied to.\nDifferential Revision: http://reviews.llvm.org/D10599\n\nllvm-svn: 264853"}, [k]={{m,6849,"Sema::DeclGroupPtrTy Sema::ActOnOpenMPDeclareSimdDirective(DeclGroupPtrTy DG, OMPDeclareSimdDeclAttr::BranchStateTy BS, Expr *Simdlen, ArrayRef<Expr *> Uniforms, ArrayRef<Expr *> Aligneds, ArrayRef<Expr *> Alignments, ArrayRef<Expr *> Linears, ArrayRef<unsigned> LinModifiers, ArrayRef<Expr *> Steps, SourceRange SR) {\n // ...\n if (!FD) {\n Diag(ADecl->getLocation(), diag::err_omp_function_expected) << SimdId;"},{m,7370,"std::optional<std::pair<FunctionDecl *, Expr *>> Sema::checkOpenMPDeclareVariantFunction(Sema::DeclGroupPtrTy DG, Expr *VariantRef, OMPTraitInfo &TI, unsigned NumAppendArgs, SourceRange SR) {\n // ...\n if (!FD) {\n Diag(ADecl->getLocation(), diag::err_omp_function_expected) << VariantId << SR;"},{m,7401,"std::optional<std::pair<FunctionDecl *, Expr *>> Sema::checkOpenMPDeclareVariantFunction(Sema::DeclGroupPtrTy DG, Expr *VariantRef, OMPTraitInfo &TI, unsigned NumAppendArgs, SourceRange SR) {\n // ...\n // The VariantRef must point to function.\n if (!VariantRef) {\n Diag(SR.getBegin(), diag::err_omp_function_expected) << VariantId;"},{m,7491,"std::optional<std::pair<FunctionDecl *, Expr *>> Sema::checkOpenMPDeclareVariantFunction(Sema::DeclGroupPtrTy DG, Expr *VariantRef, OMPTraitInfo &TI, unsigned NumAppendArgs, SourceRange SR) {\n // ...\n if (LangOpts.CPlusPlus) {\n // ...\n if (Method && !Method->isStatic()) {\n // ...\n if (!ER.isUsable()) {\n Diag(VariantRef->getExprLoc(), diag::err_omp_function_expected) << VariantId << VariantRef->getSourceRange();"},{m,7532,"std::optional<std::pair<FunctionDecl *, Expr *>> Sema::checkOpenMPDeclareVariantFunction(Sema::DeclGroupPtrTy DG, Expr *VariantRef, OMPTraitInfo &TI, unsigned NumAppendArgs, SourceRange SR) {\n // ...\n if (!ER.isUsable() || !ER.get()->IgnoreParenImpCasts()->getType()->isFunctionType()) {\n Diag(VariantRef->getExprLoc(), diag::err_omp_function_expected) << VariantId << VariantRef->getSourceRange();"},{m,7540,"std::optional<std::pair<FunctionDecl *, Expr *>> Sema::checkOpenMPDeclareVariantFunction(Sema::DeclGroupPtrTy DG, Expr *VariantRef, OMPTraitInfo &TI, unsigned NumAppendArgs, SourceRange SR) {\n // ...\n if (!DRE) {\n Diag(VariantRef->getExprLoc(), diag::err_omp_function_expected) << VariantId << VariantRef->getSourceRange();"},{m,7546,"std::optional<std::pair<FunctionDecl *, Expr *>> Sema::checkOpenMPDeclareVariantFunction(Sema::DeclGroupPtrTy DG, Expr *VariantRef, OMPTraitInfo &TI, unsigned NumAppendArgs, SourceRange SR) {\n // ...\n if (!NewFD) {\n Diag(VariantRef->getExprLoc(), diag::err_omp_function_expected) << VariantId << VariantRef->getSourceRange();"}}, [l]={ [Fb]={"clang/test/OpenMP/declare_simd_messages.cpp:10:5: error: \'#pragma omp declare simd\' can only be applied to functions","clang/test/OpenMP/declare_simd_messages.cpp:13:1: error: \'#pragma omp declare simd\' can only be applied to functions"} } }, ["err_omp_function_in_link_clause"]={ [j]={{nil,L,"err_omp_function_in_link_clause"}}, [b]={{nil,L,"function name is not allowed in \'link\' clause"}}, [c]={{nil,L,"function name is not allowed in \'link\' clause"}}, [e]=d, [f]="function name is not allowed in \'link\' clause", [g]=a, [i]={{nil,L,n}}, [h]={"1ce87c705167",1513109292,"[OpenMP] Diagnose function name on the link clause","[OpenMP] Diagnose function name on the link clause\n\nThis patch is to add diagnose when a function name is\nspecified on the link clause. According to the OpenMP\nspec, only the list items that exclude the function \nname are allowed on the link clause.\n\nDifferential Revision: https://reviews.llvm.org/D40968\n\nllvm-svn: 320521"}, [k]={{m,23170,"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 Diag(IdLoc, diag::err_omp_function_in_link_clause);"}}, [l]={ [U]={"clang/test/OpenMP/declare_target_messages.cpp:72:33: error: function name is not allowed in \'link\' clause"} } }, ["err_omp_global_var_arg"]={ [j]="err_omp_global_var_arg", [b]="arguments of \'#pragma omp %0\' must have %select{global storage|static storage duration}1", [c]={{nil,nil,{"arguments of \'#pragma omp A\' must have ",{"global storage","static storage duration"}}}}, [e]=d, [f]="arguments of \'\\#pragma omp (.*?)\' must have (?:global storage|static storage duration)", [g]=a, [i]=n, [h]={"a769e07232d2",1363934075,"OpenMP threadprivate directive parsing and semantic analysis","OpenMP threadprivate directive parsing and semantic analysis\n\nllvm-svn: 177705"}, [k]={{m,3068,"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 Diag(Id.getLoc(), diag::err_omp_global_var_arg) << getOpenMPDirectiveName(Kind) << !VD->isStaticLocal();"}}, [l]={ ["clang/test/OpenMP/threadprivate_messages.cpp"]={"clang/test/OpenMP/threadprivate_messages.cpp:132:27: error: arguments of \'#pragma omp threadprivate\' must have static storage duration","clang/test/OpenMP/threadprivate_messages.cpp:132:32: error: arguments of \'#pragma omp threadprivate\' must have static storage duration"} } }, ["err_omp_hint_clause_no_name"]={ [j]="err_omp_hint_clause_no_name", [b]="the name of the construct must be specified in presence of \'hint\' clause", [c]="the name of the construct must be specified in presence of \'hint\' clause", [e]=d, [f]="the name of the construct must be specified in presence of \'hint\' clause", [g]=a, [i]=n, [h]={"28c75417b2c4",1450167564,"[OPENMP 4.5] Parsing/sema for \'hint\' clause of \'critical\' directive.","[OPENMP 4.5] Parsing/sema for \'hint\' clause of \'critical\' directive.\nOpenMP 4.5 adds \'hint\' clause to critical directive. Patch adds parsing/semantic analysis for this clause.\n\nllvm-svn: 255625"}, [k]={{m,10870,"StmtResult Sema::ActOnOpenMPCriticalDirective(const DeclarationNameInfo &DirName, ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc) {\n // ...\n for (const OMPClause *C : Clauses) {\n if (C->getClauseKind() == OMPC_hint) {\n if (!DirName.getName()) {\n Diag(C->getBeginLoc(), diag::err_omp_hint_clause_no_name);"}}, [l]={ ["clang/test/OpenMP/critical_messages.cpp"]={"clang/test/OpenMP/critical_messages.cpp:72:24: error: the name of the construct must be specified in presence of \'hint\' clause","clang/test/OpenMP/critical_messages.cpp:141:24: error: the name of the construct must be specified in presence of \'hint\' clause"} } }, ["err_omp_immediate_directive"]={ [j]="err_omp_immediate_directive", [b]="\'#pragma omp %0\' %select{|with \'%2\' clause }1cannot be an immediate substatement", [c]={{nil,nil,{"\'#pragma omp A\' ",{a,"with \'C\' clause "},"cannot be an immediate substatement"}}}, [e]=d, [f]="\'\\#pragma omp (.*?)\' (?:|with \'(.*?)\' clause )cannot be an immediate substatement", [g]=a, [i]=u, [h]={"68446b72530b",1405669639,"[OPENMP] Initial parsing and sema analysis of \'taskyield\' directive.","[OPENMP] Initial parsing and sema analysis of \'taskyield\' directive.\n\nllvm-svn: 213355"}, [k]={{t,2523,"/// Parsing of declarative or executable OpenMP directives.\n///\n/// threadprivate-directive:\n/// annot_pragma_openmp \'threadprivate\' simple-variable-list\n/// annot_pragma_openmp_end\n///\n/// allocate-directive:\n/// annot_pragma_openmp \'allocate\' simple-variable-list\n/// annot_pragma_openmp_end\n///\n/// declare-reduction-directive:\n/// annot_pragma_openmp \'declare\' \'reduction\' \'(\' <reduction_id> \':\'\n/// <type> {\',\' <type>} \':\' <expression> \')\' [\'initializer\' \'(\'\n/// (\'omp_priv\' \'=\' <expression>|<function_call>) \')\']\n/// annot_pragma_openmp_end\n///\n/// declare-mapper-directive:\n/// annot_pragma_openmp \'declare\' \'mapper\' \'(\' [<mapper-identifer> \':\']\n/// <type> <var> \')\' [<clause>[[,] <clause>] ... ]\n/// annot_pragma_openmp_end\n///\n/// executable-directive:\n/// annot_pragma_openmp \'parallel\' | \'simd\' | \'for\' | \'sections\' |\n/// \'section\' | \'single\' | \'master\' | \'critical\' [ \'(\' <name> \')\' ] |\n/// \'parallel for\' | \'parallel sections\' | \'parallel master\' | \'task\' |\n/// \'taskyield\' | \'barrier\' | \'taskwait\' | \'flush\' | \'ordered\' | \'error\'\n/// | \'atomic\' | \'for simd\' | \'parallel for simd\' | \'target\' | \'target\n/// data\' | \'taskgroup\' | \'teams\' | \'taskloop\' | \'taskloop simd\' |\n/// \'master taskloop\' | \'master taskloop simd\' | \'parallel master\n/// taskloop\' | \'parallel master taskloop simd\' | \'distribute\' | \'target\n/// enter data\' | \'target exit data\' | \'target parallel\' | \'target\n/// parallel for\' | \'target update\' | \'distribute parallel for\' |\n/// \'distribute paralle for simd\' | \'distribute simd\' | \'target parallel\n/// for simd\' | \'target simd\' | \'teams distribute\' | \'teams distribute\n/// simd\' | \'teams distribute parallel for simd\' | \'teams distribute\n/// parallel for\' | \'target teams\' | \'target teams distribute\' | \'target\n/// teams distribute parallel for\' | \'target teams distribute parallel\n/// for simd\' | \'target teams distribute simd\' | \'masked\' |\n/// \'parallel masked\' {clause} annot_pragma_openmp_end\n///\nStmtResult Parser::ParseOpenMPDeclarativeOrExecutableDirective(ParsedStmtContext StmtCtx, bool ReadDirectiveWithinMetadirective) {\n // ...\n case OMPD_nothing:\n if ((StmtCtx & ParsedStmtContext::AllowStandaloneOpenMPDirectives) == ParsedStmtContext())\n Diag(Tok, diag::err_omp_immediate_directive) << getOpenMPDirectiveName(DKind) << 0;"},{t,2675,"/// Parsing of declarative or executable OpenMP directives.\n///\n/// threadprivate-directive:\n/// annot_pragma_openmp \'threadprivate\' simple-variable-list\n/// annot_pragma_openmp_end\n///\n/// allocate-directive:\n/// annot_pragma_openmp \'allocate\' simple-variable-list\n/// annot_pragma_openmp_end\n///\n/// declare-reduction-directive:\n/// annot_pragma_openmp \'declare\' \'reduction\' \'(\' <reduction_id> \':\'\n/// <type> {\',\' <type>} \':\' <expression> \')\' [\'initializer\' \'(\'\n/// (\'omp_priv\' \'=\' <expression>|<function_call>) \')\']\n/// annot_pragma_openmp_end\n///\n/// declare-mapper-directive:\n/// annot_pragma_openmp \'declare\' \'mapper\' \'(\' [<mapper-identifer> \':\']\n/// <type> <var> \')\' [<clause>[[,] <clause>] ... ]\n/// annot_pragma_openmp_end\n///\n/// executable-directive:\n/// annot_pragma_openmp \'parallel\' | \'simd\' | \'for\' | \'sections\' |\n/// \'section\' | \'single\' | \'master\' | \'critical\' [ \'(\' <name> \')\' ] |\n/// \'parallel for\' | \'parallel sections\' | \'parallel master\' | \'task\' |\n/// \'taskyield\' | \'barrier\' | \'taskwait\' | \'flush\' | \'ordered\' | \'error\'\n/// | \'atomic\' | \'for simd\' | \'parallel for simd\' | \'target\' | \'target\n/// data\' | \'taskgroup\' | \'teams\' | \'taskloop\' | \'taskloop simd\' |\n/// \'master taskloop\' | \'master taskloop simd\' | \'parallel master\n/// taskloop\' | \'parallel master taskloop simd\' | \'distribute\' | \'target\n/// enter data\' | \'target exit data\' | \'target parallel\' | \'target\n/// parallel for\' | \'target update\' | \'distribute parallel for\' |\n/// \'distribute paralle for simd\' | \'distribute simd\' | \'target parallel\n/// for simd\' | \'target simd\' | \'teams distribute\' | \'teams distribute\n/// simd\' | \'teams distribute parallel for simd\' | \'teams distribute\n/// parallel for\' | \'target teams\' | \'target teams distribute\' | \'target\n/// teams distribute parallel for\' | \'target teams distribute parallel\n/// for simd\' | \'target teams distribute simd\' | \'masked\' |\n/// \'parallel masked\' {clause} annot_pragma_openmp_end\n///\nStmtResult Parser::ParseOpenMPDeclarativeOrExecutableDirective(ParsedStmtContext StmtCtx, bool ReadDirectiveWithinMetadirective) {\n // ...\n case OMPD_threadprivate: {\n // FIXME: Should this be permitted in C++?\n if ((StmtCtx & ParsedStmtContext::AllowDeclarationsInC) == ParsedStmtContext()) {\n Diag(Tok, diag::err_omp_immediate_directive) << getOpenMPDirectiveName(DKind) << 0;"},{t,2694,"/// Parsing of declarative or executable OpenMP directives.\n///\n/// threadprivate-directive:\n/// annot_pragma_openmp \'threadprivate\' simple-variable-list\n/// annot_pragma_openmp_end\n///\n/// allocate-directive:\n/// annot_pragma_openmp \'allocate\' simple-variable-list\n/// annot_pragma_openmp_end\n///\n/// declare-reduction-directive:\n/// annot_pragma_openmp \'declare\' \'reduction\' \'(\' <reduction_id> \':\'\n/// <type> {\',\' <type>} \':\' <expression> \')\' [\'initializer\' \'(\'\n/// (\'omp_priv\' \'=\' <expression>|<function_call>) \')\']\n/// annot_pragma_openmp_end\n///\n/// declare-mapper-directive:\n/// annot_pragma_openmp \'declare\' \'mapper\' \'(\' [<mapper-identifer> \':\']\n/// <type> <var> \')\' [<clause>[[,] <clause>] ... ]\n/// annot_pragma_openmp_end\n///\n/// executable-directive:\n/// annot_pragma_openmp \'parallel\' | \'simd\' | \'for\' | \'sections\' |\n/// \'section\' | \'single\' | \'master\' | \'critical\' [ \'(\' <name> \')\' ] |\n/// \'parallel for\' | \'parallel sections\' | \'parallel master\' | \'task\' |\n/// \'taskyield\' | \'barrier\' | \'taskwait\' | \'flush\' | \'ordered\' | \'error\'\n/// | \'atomic\' | \'for simd\' | \'parallel for simd\' | \'target\' | \'target\n/// data\' | \'taskgroup\' | \'teams\' | \'taskloop\' | \'taskloop simd\' |\n/// \'master taskloop\' | \'master taskloop simd\' | \'parallel master\n/// taskloop\' | \'parallel master taskloop simd\' | \'distribute\' | \'target\n/// enter data\' | \'target exit data\' | \'target parallel\' | \'target\n/// parallel for\' | \'target update\' | \'distribute parallel for\' |\n/// \'distribute paralle for simd\' | \'distribute simd\' | \'target parallel\n/// for simd\' | \'target simd\' | \'teams distribute\' | \'teams distribute\n/// simd\' | \'teams distribute parallel for simd\' | \'teams distribute\n/// parallel for\' | \'target teams\' | \'target teams distribute\' | \'target\n/// teams distribute parallel for\' | \'target teams distribute parallel\n/// for simd\' | \'target teams distribute simd\' | \'masked\' |\n/// \'parallel masked\' {clause} annot_pragma_openmp_end\n///\nStmtResult Parser::ParseOpenMPDeclarativeOrExecutableDirective(ParsedStmtContext StmtCtx, bool ReadDirectiveWithinMetadirective) {\n // ...\n case OMPD_allocate: {\n // FIXME: Should this be permitted in C++?\n if ((StmtCtx & ParsedStmtContext::AllowDeclarationsInC) == ParsedStmtContext()) {\n Diag(Tok, diag::err_omp_immediate_directive) << getOpenMPDirectiveName(DKind) << 0;"},{t,2774,"/// Parsing of declarative or executable OpenMP directives.\n///\n/// threadprivate-directive:\n/// annot_pragma_openmp \'threadprivate\' simple-variable-list\n/// annot_pragma_openmp_end\n///\n/// allocate-directive:\n/// annot_pragma_openmp \'allocate\' simple-variable-list\n/// annot_pragma_openmp_end\n///\n/// declare-reduction-directive:\n/// annot_pragma_openmp \'declare\' \'reduction\' \'(\' <reduction_id> \':\'\n/// <type> {\',\' <type>} \':\' <expression> \')\' [\'initializer\' \'(\'\n/// (\'omp_priv\' \'=\' <expression>|<function_call>) \')\']\n/// annot_pragma_openmp_end\n///\n/// declare-mapper-directive:\n/// annot_pragma_openmp \'declare\' \'mapper\' \'(\' [<mapper-identifer> \':\']\n/// <type> <var> \')\' [<clause>[[,] <clause>] ... ]\n/// annot_pragma_openmp_end\n///\n/// executable-directive:\n/// annot_pragma_openmp \'parallel\' | \'simd\' | \'for\' | \'sections\' |\n/// \'section\' | \'single\' | \'master\' | \'critical\' [ \'(\' <name> \')\' ] |\n/// \'parallel for\' | \'parallel sections\' | \'parallel master\' | \'task\' |\n/// \'taskyield\' | \'barrier\' | \'taskwait\' | \'flush\' | \'ordered\' | \'error\'\n/// | \'atomic\' | \'for simd\' | \'parallel for simd\' | \'target\' | \'target\n/// data\' | \'taskgroup\' | \'teams\' | \'taskloop\' | \'taskloop simd\' |\n/// \'master taskloop\' | \'master taskloop simd\' | \'parallel master\n/// taskloop\' | \'parallel master taskloop simd\' | \'distribute\' | \'target\n/// enter data\' | \'target exit data\' | \'target parallel\' | \'target\n/// parallel for\' | \'target update\' | \'distribute parallel for\' |\n/// \'distribute paralle for simd\' | \'distribute simd\' | \'target parallel\n/// for simd\' | \'target simd\' | \'teams distribute\' | \'teams distribute\n/// simd\' | \'teams distribute parallel for simd\' | \'teams distribute\n/// parallel for\' | \'target teams\' | \'target teams distribute\' | \'target\n/// teams distribute parallel for\' | \'target teams distribute parallel\n/// for simd\' | \'target teams distribute simd\' | \'masked\' |\n/// \'parallel masked\' {clause} annot_pragma_openmp_end\n///\nStmtResult Parser::ParseOpenMPDeclarativeOrExecutableDirective(ParsedStmtContext StmtCtx, bool ReadDirectiveWithinMetadirective) {\n // ...\n case OMPD_flush:\n case OMPD_depobj:\n case OMPD_scan:\n case OMPD_taskyield:\n case OMPD_error:\n case OMPD_barrier:\n case OMPD_taskwait:\n case OMPD_cancellation_point:\n case OMPD_cancel:\n case OMPD_target_enter_data:\n case OMPD_target_exit_data:\n case OMPD_target_update:\n case OMPD_interop:\n if ((StmtCtx & ParsedStmtContext::AllowStandaloneOpenMPDirectives) == ParsedStmtContext()) {\n Diag(Tok, diag::err_omp_immediate_directive) << getOpenMPDirectiveName(DKind) << 0;"},{t,2935,"/// Parsing of declarative or executable OpenMP directives.\n///\n/// threadprivate-directive:\n/// annot_pragma_openmp \'threadprivate\' simple-variable-list\n/// annot_pragma_openmp_end\n///\n/// allocate-directive:\n/// annot_pragma_openmp \'allocate\' simple-variable-list\n/// annot_pragma_openmp_end\n///\n/// declare-reduction-directive:\n/// annot_pragma_openmp \'declare\' \'reduction\' \'(\' <reduction_id> \':\'\n/// <type> {\',\' <type>} \':\' <expression> \')\' [\'initializer\' \'(\'\n/// (\'omp_priv\' \'=\' <expression>|<function_call>) \')\']\n/// annot_pragma_openmp_end\n///\n/// declare-mapper-directive:\n/// annot_pragma_openmp \'declare\' \'mapper\' \'(\' [<mapper-identifer> \':\']\n/// <type> <var> \')\' [<clause>[[,] <clause>] ... ]\n/// annot_pragma_openmp_end\n///\n/// executable-directive:\n/// annot_pragma_openmp \'parallel\' | \'simd\' | \'for\' | \'sections\' |\n/// \'section\' | \'single\' | \'master\' | \'critical\' [ \'(\' <name> \')\' ] |\n/// \'parallel for\' | \'parallel sections\' | \'parallel master\' | \'task\' |\n/// \'taskyield\' | \'barrier\' | \'taskwait\' | \'flush\' | \'ordered\' | \'error\'\n/// | \'atomic\' | \'for simd\' | \'parallel for simd\' | \'target\' | \'target\n/// data\' | \'taskgroup\' | \'teams\' | \'taskloop\' | \'taskloop simd\' |\n/// \'master taskloop\' | \'master taskloop simd\' | \'parallel master\n/// taskloop\' | \'parallel master taskloop simd\' | \'distribute\' | \'target\n/// enter data\' | \'target exit data\' | \'target parallel\' | \'target\n/// parallel for\' | \'target update\' | \'distribute parallel for\' |\n/// \'distribute paralle for simd\' | \'distribute simd\' | \'target parallel\n/// for simd\' | \'target simd\' | \'teams distribute\' | \'teams distribute\n/// simd\' | \'teams distribute parallel for simd\' | \'teams distribute\n/// parallel for\' | \'target teams\' | \'target teams distribute\' | \'target\n/// teams distribute parallel for\' | \'target teams distribute parallel\n/// for simd\' | \'target teams distribute simd\' | \'masked\' |\n/// \'parallel masked\' {clause} annot_pragma_openmp_end\n///\nStmtResult Parser::ParseOpenMPDeclarativeOrExecutableDirective(ParsedStmtContext StmtCtx, bool ReadDirectiveWithinMetadirective) {\n // ...\n case OMPD_parallel:\n case OMPD_simd:\n case OMPD_tile:\n case OMPD_unroll:\n case OMPD_for:\n case OMPD_for_simd:\n case OMPD_sections:\n case OMPD_single:\n case OMPD_section:\n case OMPD_master:\n case OMPD_critical:\n case OMPD_parallel_for:\n case OMPD_parallel_for_simd:\n case OMPD_parallel_sections:\n case OMPD_parallel_master:\n case OMPD_parallel_masked:\n case OMPD_task:\n case OMPD_ordered:\n case OMPD_atomic:\n case OMPD_target:\n case OMPD_teams:\n case OMPD_taskgroup:\n case OMPD_target_data:\n case OMPD_target_parallel:\n case OMPD_target_parallel_for:\n case OMPD_loop:\n case OMPD_teams_loop:\n case OMPD_target_teams_loop:\n case OMPD_parallel_loop:\n case OMPD_target_parallel_loop:\n case OMPD_taskloop:\n case OMPD_taskloop_simd:\n case OMPD_master_taskloop:\n case OMPD_masked_taskloop:\n case OMPD_master_taskloop_simd:\n case OMPD_masked_taskloop_simd:\n case OMPD_parallel_master_taskloop:\n case OMPD_parallel_masked_taskloop:\n case OMPD_parallel_master_taskloop_simd:\n case OMPD_parallel_masked_taskloop_simd:\n case OMPD_distribute:\n case OMPD_distribute_parallel_for:\n case OMPD_distribute_parallel_for_simd:\n case OMPD_distribute_simd:\n case OMPD_target_parallel_for_simd:\n case OMPD_target_simd:\n case OMPD_teams_distribute:\n case OMPD_teams_distribute_simd:\n case OMPD_teams_distribute_parallel_for_simd:\n case OMPD_teams_distribute_parallel_for:\n case OMPD_target_teams:\n case OMPD_target_teams_distribute:\n case OMPD_target_teams_distribute_parallel_for:\n case OMPD_target_teams_distribute_parallel_for_simd:\n case OMPD_target_teams_distribute_simd:\n case OMPD_dispatch:\n case OMPD_masked: {\n // ...\n if (DKind == OMPD_ordered) {\n // If the depend or doacross clause is specified, the ordered construct\n // is a stand-alone directive.\n for (auto CK : {OMPC_depend, OMPC_doacross}) {\n if (FirstClauses[unsigned(CK)].getInt()) {\n if ((StmtCtx & ParsedStmtContext::AllowStandaloneOpenMPDirectives) == ParsedStmtContext()) {\n Diag(Loc, diag::err_omp_immediate_directive) << getOpenMPDirectiveName(DKind) << 1 << getOpenMPClauseName(CK);"}}, [l]={ ["clang/test/OpenMP/cancel_messages.cpp"]={"clang/test/OpenMP/cancel_messages.cpp:24:13: error: \'#pragma omp cancel\' cannot be an immediate substatement","clang/test/OpenMP/cancel_messages.cpp:51:13: error: \'#pragma omp cancel\' cannot be an immediate substatement","clang/test/OpenMP/cancel_messages.cpp:56:13: error: \'#pragma omp cancel\' cannot be an immediate substatement","clang/test/OpenMP/cancel_messages.cpp:63:13: error: \'#pragma omp cancel\' cannot be an immediate substatement","clang/test/OpenMP/cancel_messages.cpp:66:13: error: \'#pragma omp cancel\' cannot be an immediate substatement","clang/test/OpenMP/cancel_messages.cpp:81:13: error: \'#pragma omp cancel\' cannot be an immediate substatement"} } }, ["err_omp_implied_type_not_found"]={ [j]={{nil,o,"err_omp_implied_type_not_found"}}, [b]={{nil,o,"\'%0\' type not found; include <omp.h>"}}, [c]={{nil,o,"\'A\' type not found; include <omp.h>"}}, [e]=d, [f]="\'(.*?)\' type not found; include \\<omp\\.h\\>", [g]=a, [i]={{nil,o,n}}, [h]={I,1576908663,H,F}, [k]={{m,16579,"/// Tries to find omp_allocator_handle_t type.\nstatic bool findOMPAllocatorHandleT(Sema &S, SourceLocation Loc, DSAStackTy *Stack) {\n // ...\n if (!PT.getAsOpaquePtr() || PT.get().isNull()) {\n S.Diag(Loc, diag::err_omp_implied_type_not_found) << \"omp_allocator_handle_t\";"},{m,16617,"/// Tries to find omp_allocator_handle_t type.\nstatic bool findOMPAllocatorHandleT(Sema &S, SourceLocation Loc, DSAStackTy *Stack) {\n // ...\n if (ErrorFound) {\n S.Diag(Loc, diag::err_omp_implied_type_not_found) << \"omp_allocator_handle_t\";"},{m,17671,"static bool isValidInteropVariable(Sema &SemaRef, Expr *InteropVarExpr, SourceLocation VarLoc, OpenMPClauseKind Kind) {\n // ...\n if (HasError) {\n SemaRef.Diag(VarLoc, diag::err_omp_implied_type_not_found) << \"omp_interop_t\";"},{m,20557,"/// Tries to find omp_depend_t. type.\nstatic bool findOMPDependT(Sema &S, SourceLocation Loc, DSAStackTy *Stack, bool Diagnose = true) {\n // ...\n if (!PT.getAsOpaquePtr() || PT.get().isNull()) {\n if (Diagnose)\n S.Diag(Loc, diag::err_omp_implied_type_not_found) << \"omp_depend_t\";"},{m,22779,"/// Tries to find omp_event_handle_t type.\nstatic bool findOMPEventHandleT(Sema &S, SourceLocation Loc, DSAStackTy *Stack) {\n // ...\n if (!PT.getAsOpaquePtr() || PT.get().isNull()) {\n S.Diag(Loc, diag::err_omp_implied_type_not_found) << \"omp_event_handle_t\";"},{m,23838,"/// Tries to find omp_alloctrait_t type.\nstatic bool findOMPAlloctraitT(Sema &S, SourceLocation Loc, DSAStackTy *Stack) {\n // ...\n if (!PT.getAsOpaquePtr() || PT.get().isNull()) {\n S.Diag(Loc, diag::err_omp_implied_type_not_found) << \"omp_alloctrait_t\";"}}, [l]={ ["clang/test/OpenMP/allocate_allocator_messages.cpp"]={"clang/test/OpenMP/allocate_allocator_messages.cpp:13:37: error: \'omp_allocator_handle_t\' type not found; include <omp.h>","clang/test/OpenMP/allocate_allocator_messages.cpp:14:37: error: \'omp_allocator_handle_t\' type not found; include <omp.h>","clang/test/OpenMP/allocate_allocator_messages.cpp:15:37: error: \'omp_allocator_handle_t\' type not found; include <omp.h>","clang/test/OpenMP/allocate_allocator_messages.cpp:16:37: error: \'omp_allocator_handle_t\' type not found; include <omp.h>"} } }, ["err_omp_inclusive_exclusive_not_reduction"]={ [j]={{nil,o,"err_omp_inclusive_exclusive_not_reduction"}}, [b]={{nil,o,"the list item must appear in \'reduction\' clause with the \'inscan\' modifier of the parent directive"}}, [c]={{nil,o,"the list item must appear in \'reduction\' clause with the \'inscan\' modifier of the parent directive"}}, [e]=d, [f]="the list item must appear in \'reduction\' clause with the \'inscan\' modifier of the parent directive", [g]=a, [i]={{nil,o,n}}, [h]={I,1576908663,H,F}, [k]={{m,23773,"OMPClause *Sema::ActOnOpenMPInclusiveClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc) {\n // ...\n for (Expr *RefExpr : VarList) {\n // ...\n // OpenMP 5.0, 2.9.6, scan Directive, Restrictions.\n // A list item that appears in the inclusive or exclusive clause must appear\n // in a reduction clause with the inscan modifier on the enclosing\n // worksharing-loop, worksharing-loop SIMD, or simd construct.\n if (DVar.CKind != OMPC_reduction || DVar.Modifier != OMPC_REDUCTION_inscan)\n Diag(ELoc, diag::err_omp_inclusive_exclusive_not_reduction) << RefExpr->getSourceRange();"},{m,23816,"OMPClause *Sema::ActOnOpenMPExclusiveClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc) {\n // ...\n for (Expr *RefExpr : VarList) {\n // ...\n // OpenMP 5.0, 2.9.6, scan Directive, Restrictions.\n // A list item that appears in the inclusive or exclusive clause must appear\n // in a reduction clause with the inscan modifier on the enclosing\n // worksharing-loop, worksharing-loop SIMD, or simd construct.\n if (ParentDirective == OMPD_unknown || DVar.CKind != OMPC_reduction || DVar.Modifier != OMPC_REDUCTION_inscan) {\n Diag(ELoc, diag::err_omp_inclusive_exclusive_not_reduction) << RefExpr->getSourceRange();"}}, [l]={ ["clang/test/OpenMP/scan_messages.cpp"]={"clang/test/OpenMP/scan_messages.cpp:116:28: error: the list item must appear in \'reduction\' clause with the \'inscan\' modifier of the parent directive","clang/test/OpenMP/scan_messages.cpp:123:28: error: the list item must appear in \'reduction\' clause with the \'inscan\' modifier of the parent directive","clang/test/OpenMP/scan_messages.cpp:142:28: error: the list item must appear in \'reduction\' clause with the \'inscan\' modifier of the parent directive","clang/test/OpenMP/scan_messages.cpp:145:28: error: the list item must appear in \'reduction\' clause with the \'inscan\' modifier of the parent directive","clang/test/OpenMP/scan_messages.cpp:163:28: error: the list item must appear in \'reduction\' clause with the \'inscan\' modifier of the parent directive"} } }, ["err_omp_incomplete_type"]={ [j]="err_omp_incomplete_type", [b]="expression has incomplete class type %0", [c]="expression has incomplete class type A", [e]=d, [f]="expression has incomplete class type (.*?)", [g]=a, [i]=n, [h]={"a769e07232d2",1363934075,"OpenMP threadprivate directive parsing and semantic analysis","OpenMP threadprivate directive parsing and semantic analysis\n\nllvm-svn: 177705"}, [k]={{m,16397,"ExprResult Sema::PerformOpenMPImplicitIntegerConversion(SourceLocation Loc, Expr *Op) {\n // ...\n class IntConvertDiagnoser : public ICEConvertDiagnoser {\n // ...\n SemaDiagnosticBuilder diagnoseIncomplete(Sema &S, SourceLocation Loc, QualType T) override { return S.Diag(Loc, diag::err_omp_incomplete_type) << T; }"}} }, ["err_omp_inscan_reduction_expected"]={ [j]={{nil,o,"err_omp_inscan_reduction_expected"}}, [b]={{nil,o,"expected \'reduction\' clause with the \'inscan\' modifier"}}, [c]={{nil,o,"expected \'reduction\' clause with the \'inscan\' modifier"}}, [e]=d, [f]="expected \'reduction\' clause with the \'inscan\' modifier", [g]=a, [i]={{nil,o,n}}, [h]={I,1576908663,H,F}, [k]={{m,2820,"/// Check consistency of the reduction clauses.\nstatic void checkReductionClauses(Sema &S, DSAStackTy *Stack, ArrayRef<OMPClause *> Clauses) {\n // ...\n if (InscanFound) {\n for (OMPClause *C : Clauses) {\n // ...\n if (RC->getModifier() != OMPC_REDUCTION_inscan) {\n S.Diag(RC->getModifier() == OMPC_REDUCTION_unknown ? RC->getBeginLoc() : RC->getModifierLoc(), diag::err_omp_inscan_reduction_expected);"}}, [l]={ ["clang/test/OpenMP/parallel_for_reduction_messages.cpp"]={"clang/test/OpenMP/parallel_for_reduction_messages.cpp:362:51: error: expected \'reduction\' clause with the \'inscan\' modifier","clang/test/OpenMP/parallel_for_reduction_messages.cpp:362:78: error: expected \'reduction\' clause with the \'inscan\' modifier"} } }, ["err_omp_instantiation_not_supported"]={ [j]={{nil,s,"err_omp_instantiation_not_supported"}}, [b]={{nil,s,"instantiation of \'%0\' not supported yet"}}, [c]={{nil,s,"instantiation of \'A\' not supported yet"}}, [e]=d, [f]="instantiation of \'(.*?)\' not supported yet", [g]=a, [i]={{nil,s,n}}, [h]={"3dbcea8b957a",1615397021,"Reland [clang] Check unsupported types in expressions","Reland [clang] Check unsupported types in expressions\n\nThis was committed as ec6c847179fd, but then reverted after a failure\nin: https://lab.llvm.org/buildbot/#/builders/84/builds/13983\n\nI was not able to reproduce the problem, but I added an extra check\nfor a NULL QualType just in case.\n\nOriginal comit message:\n\nThe patch adds missing diagnostics for cases like:\n\n float F3 = ((__float128)F1 * (__float128)F2) / 2.0f;\n\nSema::checkDeviceDecl (renamed to checkTypeSupport) is changed to work\nwith a type without the corresponding ValueDecl. It is also refactored\nso that host diagnostics for unsupported types can be added here as\nwell.\n\nDifferential Revision: https://reviews.llvm.org/D109315"} }, ["err_omp_interop_bad_depend_clause"]={ [j]={{nil,r,"err_omp_interop_bad_depend_clause"}}, [b]={{nil,r,"\'depend\' clause requires the \'targetsync\' interop type"}}, [c]={{nil,r,"\'depend\' clause requires the \'targetsync\' interop type"}}, [e]=d, [f]="\'depend\' clause requires the \'targetsync\' interop type", [g]=a, [i]={{nil,r,n}}, [h]={hb,1590001902,gb,kb}, [k]={{m,17599,"StmtResult Sema::ActOnOpenMPInteropDirective(ArrayRef<OMPClause *> Clauses, SourceLocation StartLoc, SourceLocation EndLoc) {\n // ...\n if (DependClause && HasInitClause && !IsTargetSync) {\n Diag(DependClause->getBeginLoc(), diag::err_omp_interop_bad_depend_clause);"}}, [l]={ [wb]={"clang/test/OpenMP/interop_messages.cpp:90:47: error: \'depend\' clause requires the \'targetsync\' interop type"} } }, ["err_omp_interop_prefer_type"]={ [j]={{nil,r,"err_omp_interop_prefer_type"}}, [b]={{nil,r,"prefer_list item must be a string literal or constant integral expression"}}, [c]={{nil,r,"prefer_list item must be a string literal or constant integral expression"}}, [e]=d, [f]="prefer_list item must be a string literal or constant integral expression", [g]=a, [i]={{nil,r,n}}, [h]={hb,1590001902,gb,kb}, [k]={{m,17711,"OMPClause *Sema::ActOnOpenMPInitClause(Expr *InteropVar, OMPInteropInfo &InteropInfo, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation VarLoc, SourceLocation EndLoc) {\n // ...\n // Check prefer_type values. These foreign-runtime-id values are either\n // string literals or constant integral expressions.\n for (const Expr *E : InteropInfo.PreferTypes) {\n // ...\n Diag(E->getExprLoc(), diag::err_omp_interop_prefer_type);"}}, [l]={ [wb]={"clang/test/OpenMP/interop_messages.cpp:76:40: error: prefer_list item must be a string literal or constant integral expression","clang/test/OpenMP/interop_messages.cpp:80:40: error: prefer_list item must be a string literal or constant integral expression"} } }, ["err_omp_interop_type_not_found"]={ [j]={{nil,s,"err_omp_interop_type_not_found"}}, [b]={{nil,s,"\'omp_interop_t\' must be defined when \'append_args\' clause is used; include <omp.h>"}}, [c]={{nil,s,"\'omp_interop_t\' must be defined when \'append_args\' clause is used; include <omp.h>"}}, [e]=d, [f]="\'omp_interop_t\' must be defined when \'append_args\' clause is used; include \\<omp\\.h\\>", [g]=a, [i]={{nil,s,n}}, [h]={ib,1616787805,lb,jb}, [k]={{m,7457,"std::optional<std::pair<FunctionDecl *, Expr *>> Sema::checkOpenMPDeclareVariantFunction(Sema::DeclGroupPtrTy DG, Expr *VariantRef, OMPTraitInfo &TI, unsigned NumAppendArgs, SourceRange SR) {\n // ...\n if (NumAppendArgs) {\n // ...\n if (!TD) {\n Diag(SR.getBegin(), diag::err_omp_interop_type_not_found) << SR;"}}, [l]={ [zb]={"clang/test/OpenMP/declare_variant_clauses_messages.cpp:12:1: error: \'omp_interop_t\' must be defined when \'append_args\' clause is used; include <omp.h>"} } }, ["err_omp_interop_var_multiple_actions"]={ [j]={{nil,r,"err_omp_interop_var_multiple_actions"}}, [b]={{nil,r,"interop variable %0 used in multiple action clauses"}}, [c]={{nil,r,"interop variable A used in multiple action clauses"}}, [e]=d, [f]="interop variable (.*?) used in multiple action clauses", [g]=a, [i]={{nil,r,n}}, [h]={hb,1590001902,gb,kb}, [k]={{m,17626,"StmtResult Sema::ActOnOpenMPInteropDirective(ArrayRef<OMPClause *> Clauses, SourceLocation StartLoc, SourceLocation EndLoc) {\n // ...\n for (OMPClause *C : Clauses) {\n // ...\n if (DeclResult.first) {\n if (!InteropVars.insert(DeclResult.first).second) {\n Diag(ELoc, diag::err_omp_interop_var_multiple_actions) << DeclResult.first;"}}, [l]={ [wb]={"clang/test/OpenMP/interop_messages.cpp:93:59: error: interop variable \'InteropVar\' used in multiple action clauses","clang/test/OpenMP/interop_messages.cpp:96:43: error: interop variable \'InteropVar\' used in multiple action clauses","clang/test/OpenMP/interop_messages.cpp:99:51: error: interop variable \'InteropVar\' used in multiple action clauses","clang/test/OpenMP/interop_messages.cpp:102:51: error: interop variable \'InteropVar\' used in multiple action clauses","clang/test/OpenMP/interop_messages.cpp:105:55: error: interop variable \'InteropVar\' used in multiple action clauses","clang/test/OpenMP/interop_messages.cpp:108:47: error: interop variable \'InteropVar\' used in multiple action clauses","clang/test/OpenMP/interop_messages.cpp:141:59: error: interop variable \'InteropVar\' used in multiple action clauses","clang/test/OpenMP/interop_messages.cpp:144:43: error: interop variable \'InteropVar\' used in multiple action clauses","clang/test/OpenMP/interop_messages.cpp:147:51: error: interop variable \'InteropVar\' used in multiple action clauses","clang/test/OpenMP/interop_messages.cpp:150:51: error: interop variable \'InteropVar\' used in multiple action clauses","clang/test/OpenMP/interop_messages.cpp:153:55: error: interop variable \'InteropVar\' used in multiple action clauses","clang/test/OpenMP/interop_messages.cpp:156:47: error: interop variable \'InteropVar\' used in multiple action clauses"} } }, ["err_omp_interop_variable_expected"]={ [j]={{nil,r,"err_omp_interop_variable_expected"}}, [b]={{nil,r,"expected%select{| non-const}0 variable of type \'omp_interop_t\'"}}, [c]={{nil,r,{"expected",{a," non-const"}," variable of type \'omp_interop_t\'"}}}, [e]=d, [f]="expected(?:| non\\-const) variable of type \'omp_interop_t\'", [g]=a, [i]={{nil,r,n}}, [h]={hb,1590001902,gb,kb}, [k]={{m,17686,"static bool isValidInteropVariable(Sema &SemaRef, Expr *InteropVarExpr, SourceLocation VarLoc, OpenMPClauseKind Kind) {\n // ...\n // OpenMP 5.1 [2.15.1, interop Construct, Restrictions]\n // The interop-var passed to init or destroy must be non-const.\n if ((Kind == OMPC_init || Kind == OMPC_destroy) && isConstNotMutableType(SemaRef, InteropVarExpr->getType())) {\n SemaRef.Diag(VarLoc, diag::err_omp_interop_variable_expected) << /*non-const*/ 1;"}}, [l]={ [wb]={"clang/test/OpenMP/interop_messages.cpp:197:50: error: expected variable of type \'omp_interop_t\'","clang/test/OpenMP/interop_messages.cpp:200:52: error: expected variable of type \'omp_interop_t\'"} } }, ["err_omp_interop_variable_wrong_type"]={ [j]={{nil,r,"err_omp_interop_variable_wrong_type"}}, [b]={{nil,r,"interop variable must be of type \'omp_interop_t\'"}}, [c]={{nil,r,"interop variable must be of type \'omp_interop_t\'"}}, [e]=d, [f]="interop variable must be of type \'omp_interop_t\'", [g]=a, [i]={{nil,r,n}}, [h]={hb,1590001902,gb,kb}, [k]={{m,17678,"static bool isValidInteropVariable(Sema &SemaRef, Expr *InteropVarExpr, SourceLocation VarLoc, OpenMPClauseKind Kind) {\n // ...\n if (!SemaRef.Context.hasSameType(InteropType, VarType)) {\n SemaRef.Diag(VarLoc, diag::err_omp_interop_variable_wrong_type);"}}, [l]={ [wb]={"clang/test/OpenMP/interop_messages.cpp:39:59: error: interop variable must be of type \'omp_interop_t\'","clang/test/OpenMP/interop_messages.cpp:43:27: error: interop variable must be of type \'omp_interop_t\'","clang/test/OpenMP/interop_messages.cpp:46:31: error: interop variable must be of type \'omp_interop_t\'","clang/test/OpenMP/interop_messages.cpp:49:59: error: interop variable must be of type \'omp_interop_t\'","clang/test/OpenMP/interop_messages.cpp:53:27: error: interop variable must be of type \'omp_interop_t\'","clang/test/OpenMP/interop_messages.cpp:56:31: error: interop variable must be of type \'omp_interop_t\'"} } }, ["err_omp_invalid_dsa"]={ [j]={{nil,o,"err_omp_invalid_dsa"}}, [b]={{nil,o,"data-sharing attribute \'%0\' in \'%1\' clause requires OpenMP version %2 or above"}}, [c]={{nil,o,"data-sharing attribute \'A\' in \'B\' clause requires OpenMP version C or above"}}, [e]=d, [f]="data\\-sharing attribute \'(.*?)\' in \'(.*?)\' clause requires OpenMP version (.*?) or above", [g]=a, [i]={{nil,o,u}}, [h]={"ee05167cc42b",1594102083,"[OpenMP] Allow traits for the OpenMP context selector `isa`","[OpenMP] Allow traits for the OpenMP context selector `isa`\n\nIt was unclear what `isa` was supposed to mean so we did not provide any\ntraits for this context selector. With this patch we will allow *any*\nstring or identifier. We use the target attribute and target info to\ndetermine if the trait matches. In other words, we will check if the\nprovided value is a target feature that is available (at the call site).\n\nFixes PR46338\n\nReviewed By: ABataev\n\nDifferential Revision: https://reviews.llvm.org/D83281"}, [k]={{t,3719,"/// Parsing of simple OpenMP clauses like \'default\' or \'proc_bind\'.\n///\n/// default-clause:\n/// \'default\' \'(\' \'none\' | \'shared\' | \'private\' | \'firstprivate\' \')\'\n///\n/// proc_bind-clause:\n/// \'proc_bind\' \'(\' \'master\' | \'close\' | \'spread\' \')\'\n///\n/// bind-clause:\n/// \'bind\' \'(\' \'teams\' | \'parallel\' | \'thread\' \')\'\n///\n/// update-clause:\n/// \'update\' \'(\' \'in\' | \'out\' | \'inout\' | \'mutexinoutset\' |\n/// \'inoutset\' \')\'\n///\nOMPClause *Parser::ParseOpenMPSimpleClause(OpenMPClauseKind Kind, bool ParseOnly) {\n // ...\n if (getLangOpts().OpenMP < 51 && Kind == OMPC_default && (static_cast<DefaultKind>(Val->Type) == OMP_DEFAULT_private || static_cast<DefaultKind>(Val->Type) == OMP_DEFAULT_firstprivate)) {\n Diag(Val->LOpen, diag::err_omp_invalid_dsa) << getOpenMPClauseName(static_cast<DefaultKind>(Val->Type) == OMP_DEFAULT_private ? OMPC_private : OMPC_firstprivate) << getOpenMPClauseName(OMPC_default) << \"5.1\";"}}, [l]={ ["clang/test/OpenMP/target_teams_distribute_default_messages.cpp"]={"clang/test/OpenMP/target_teams_distribute_default_messages.cpp:34:37: error: data-sharing attribute \'firstprivate\' in \'default\' clause requires OpenMP version 5.1 or above","clang/test/OpenMP/target_teams_distribute_default_messages.cpp:39:37: error: data-sharing attribute \'private\' in \'default\' clause requires OpenMP version 5.1 or above"} } }, ["err_omp_invalid_map_this_expr"]={ [j]={{nil,y,"err_omp_invalid_map_this_expr"}}, [b]={{nil,y,"invalid \'this\' expression on \'map\' clause"}}, [c]={{nil,y,"invalid \'this\' expression on \'map\' clause"}}, [e]=d, [f]="invalid \'this\' expression on \'map\' clause", [g]=a, [i]={{nil,y,n}}, [h]={"e13b1e3299c1",1546457328,"[OpenMP] Added support for explicit mapping of classes using \'this\' pointer. Differential revision: ...","[OpenMP] Added support for explicit mapping of classes using \'this\' pointer. Differential revision: https://reviews.llvm.org/D55982\n\nllvm-svn: 350252"}, [k]={{m,21238,"class MapBaseChecker final : public StmtVisitor<MapBaseChecker, bool> {\n // ...\n bool VisitArraySubscriptExpr(ArraySubscriptExpr *AE) {\n // ...\n if (const auto *TE = dyn_cast<CXXThisExpr>(E->IgnoreParenCasts())) {\n // ...\n if (!AE->getIdx()->isValueDependent() && AE->getIdx()->EvaluateAsInt(Result, SemaRef.getASTContext()) && !Result.Val.getInt().isZero()) {\n SemaRef.Diag(AE->getIdx()->getExprLoc(), diag::err_omp_invalid_map_this_expr);"},{m,21317,"class MapBaseChecker final : public StmtVisitor<MapBaseChecker, bool> {\n // ...\n bool VisitOMPArraySectionExpr(OMPArraySectionExpr *OASE) {\n // ...\n if (const auto *TE = dyn_cast<CXXThisExpr>(E)) {\n // ...\n if (!OASE->getLength()->isValueDependent() && OASE->getLength()->EvaluateAsInt(ResultR, SemaRef.getASTContext()) && !ResultR.Val.getInt().isOne()) {\n SemaRef.Diag(OASE->getLength()->getExprLoc(), diag::err_omp_invalid_map_this_expr);"},{m,21326,"class MapBaseChecker final : public StmtVisitor<MapBaseChecker, bool> {\n // ...\n bool VisitOMPArraySectionExpr(OMPArraySectionExpr *OASE) {\n // ...\n if (const auto *TE = dyn_cast<CXXThisExpr>(E)) {\n // ...\n if (OASE->getLowerBound() && !OASE->getLowerBound()->isValueDependent() && OASE->getLowerBound()->EvaluateAsInt(ResultL, SemaRef.getASTContext()) && !ResultL.Val.getInt().isZero()) {\n SemaRef.Diag(OASE->getLowerBound()->getExprLoc(), diag::err_omp_invalid_map_this_expr);"}}, [l]={ ["clang/test/OpenMP/target_messages.cpp"]={"clang/test/OpenMP/target_messages.cpp:51:34: error: invalid \'this\' expression on \'map\' clause","clang/test/OpenMP/target_messages.cpp:53:33: error: invalid \'this\' expression on \'map\' clause","clang/test/OpenMP/target_messages.cpp:55:33: error: invalid \'this\' expression on \'map\' clause"} } }, ["err_omp_invalid_map_type_for_directive"]={ [j]="err_omp_invalid_map_type_for_directive", [b]="%select{map type \'%1\' is not allowed|map type must be specified}0 for \'#pragma omp %2\'", [c]={{nil,nil,{{"map type \'B\' is not allowed","map type must be specified"}," for \'#pragma omp C\'"}}}, [e]=d, [f]="(?:map type \'(.*?)\' is not allowed|map type must be specified) for \'\\#pragma omp (.*?)\'", [g]=a, [i]=n, [h]={"df67fc468eb3",1453230956,"[OpenMP] Parsing + sema for \"target enter data\" directive.","[OpenMP] Parsing + sema for \"target enter data\" directive.\n\nPatch by Arpith Jacob. Thanks!\n\nllvm-svn: 258165"}, [k]={{m,22048,"// Check the validity of the provided variable list for the provided clause kind\n// \\a CKind. In the check process the valid expressions, mappable expression\n// components, variables, and user-defined mappers are extracted and used to\n// fill \\a ProcessedVarList, \\a VarComponents, \\a VarBaseDeclarations, and \\a\n// UDMapperList in MVLI. \\a MapType, \\a IsMapTypeImplicit, \\a MapperIdScopeSpec,\n// and \\a MapperId are expected to be valid if the clause kind is \'map\'.\nstatic void checkMappableExpressionList(Sema &SemaRef, DSAStackTy *DSAS, OpenMPClauseKind CKind, MappableVarListInfo &MVLI, SourceLocation StartLoc, CXXScopeSpec &MapperIdScopeSpec, DeclarationNameInfo MapperId, ArrayRef<Expr *> UnresolvedMappers, OpenMPMapClauseKind MapType = OMPC_MAP_unknown, ArrayRef<OpenMPMapModifierKind> Modifiers = std::nullopt, bool IsMapTypeImplicit = false, bool NoDiagnose = false) {\n // ...\n for (Expr *RE : MVLI.VarList) {\n // ...\n if (CKind == OMPC_map) {\n // ...\n if (DKind == OMPD_target_enter_data && !(MapType == OMPC_MAP_to || MapType == OMPC_MAP_alloc || SemaRef.getLangOpts().OpenMP >= 52)) {\n SemaRef.Diag(StartLoc, diag::err_omp_invalid_map_type_for_directive) << (IsMapTypeImplicit ? 1 : 0) << getOpenMPSimpleClauseTypeName(OMPC_map, MapType) << getOpenMPDirectiveName(DKind);"},{m,22063,"// Check the validity of the provided variable list for the provided clause kind\n// \\a CKind. In the check process the valid expressions, mappable expression\n// components, variables, and user-defined mappers are extracted and used to\n// fill \\a ProcessedVarList, \\a VarComponents, \\a VarBaseDeclarations, and \\a\n// UDMapperList in MVLI. \\a MapType, \\a IsMapTypeImplicit, \\a MapperIdScopeSpec,\n// and \\a MapperId are expected to be valid if the clause kind is \'map\'.\nstatic void checkMappableExpressionList(Sema &SemaRef, DSAStackTy *DSAS, OpenMPClauseKind CKind, MappableVarListInfo &MVLI, SourceLocation StartLoc, CXXScopeSpec &MapperIdScopeSpec, DeclarationNameInfo MapperId, ArrayRef<Expr *> UnresolvedMappers, OpenMPMapClauseKind MapType = OMPC_MAP_unknown, ArrayRef<OpenMPMapModifierKind> Modifiers = std::nullopt, bool IsMapTypeImplicit = false, bool NoDiagnose = false) {\n // ...\n for (Expr *RE : MVLI.VarList) {\n // ...\n if (CKind == OMPC_map) {\n // ...\n // target exit_data\n // OpenMP [2.10.3, Restrictions, p. 102]\n // A map-type must be specified in all map clauses and must be either\n // from, release, or delete. Starting with OpenMP 5.2 the default map\n // type is `from` if no map type is present.\n if (DKind == OMPD_target_exit_data && !(MapType == OMPC_MAP_from || MapType == OMPC_MAP_release || MapType == OMPC_MAP_delete || SemaRef.getLangOpts().OpenMP >= 52)) {\n SemaRef.Diag(StartLoc, diag::err_omp_invalid_map_type_for_directive) << (IsMapTypeImplicit ? 1 : 0) << getOpenMPSimpleClauseTypeName(OMPC_map, MapType) << getOpenMPDirectiveName(DKind);"},{m,22093,"// Check the validity of the provided variable list for the provided clause kind\n// \\a CKind. In the check process the valid expressions, mappable expression\n// components, variables, and user-defined mappers are extracted and used to\n// fill \\a ProcessedVarList, \\a VarComponents, \\a VarBaseDeclarations, and \\a\n// UDMapperList in MVLI. \\a MapType, \\a IsMapTypeImplicit, \\a MapperIdScopeSpec,\n// and \\a MapperId are expected to be valid if the clause kind is \'map\'.\nstatic void checkMappableExpressionList(Sema &SemaRef, DSAStackTy *DSAS, OpenMPClauseKind CKind, MappableVarListInfo &MVLI, SourceLocation StartLoc, CXXScopeSpec &MapperIdScopeSpec, DeclarationNameInfo MapperId, ArrayRef<Expr *> UnresolvedMappers, OpenMPMapClauseKind MapType = OMPC_MAP_unknown, ArrayRef<OpenMPMapModifierKind> Modifiers = std::nullopt, bool IsMapTypeImplicit = false, bool NoDiagnose = false) {\n // ...\n for (Expr *RE : MVLI.VarList) {\n // ...\n if (CKind == OMPC_map) {\n // ...\n // target, target data\n // OpenMP 5.0 [2.12.2, Restrictions, p. 163]\n // OpenMP 5.0 [2.12.5, Restrictions, p. 174]\n // A map-type in a map clause must be to, from, tofrom or alloc\n if ((DKind == OMPD_target_data || isOpenMPTargetExecutionDirective(DKind)) && !(MapType == OMPC_MAP_to || MapType == OMPC_MAP_from || MapType == OMPC_MAP_tofrom || MapType == OMPC_MAP_alloc)) {\n SemaRef.Diag(StartLoc, diag::err_omp_invalid_map_type_for_directive) << (IsMapTypeImplicit ? 1 : 0) << getOpenMPSimpleClauseTypeName(OMPC_map, MapType) << getOpenMPDirectiveName(DKind);"}}, [l]={ ["clang/test/OpenMP/target_data_messages.c"]={"clang/test/OpenMP/target_data_messages.c:40:27: error: map type \'delete\' is not allowed for \'#pragma omp target data\'","clang/test/OpenMP/target_data_messages.c:44:27: error: map type \'release\' is not allowed for \'#pragma omp target data\'"} } }, ["err_omp_invalid_map_type_modifier_for_directive"]={ [j]={{nil,s,"err_omp_invalid_map_type_modifier_for_directive"}}, [b]={{nil,s,"map type modifier \'%0\' is not allowed for \'#pragma omp %1\'"}}, [c]={{nil,s,"map type modifier \'A\' is not allowed for \'#pragma omp B\'"}}, [e]=d, [f]="map type modifier \'(.*?)\' is not allowed for \'\\#pragma omp (.*?)\'", [g]=a, [i]={{nil,s,n}}, [h]={"3dbcea8b957a",1615397021,"Reland [clang] Check unsupported types in expressions","Reland [clang] Check unsupported types in expressions\n\nThis was committed as ec6c847179fd, but then reverted after a failure\nin: https://lab.llvm.org/buildbot/#/builders/84/builds/13983\n\nI was not able to reproduce the problem, but I added an extra check\nfor a NULL QualType just in case.\n\nOriginal comit message:\n\nThe patch adds missing diagnostics for cases like:\n\n float F3 = ((__float128)F1 * (__float128)F2) / 2.0f;\n\nSema::checkDeviceDecl (renamed to checkTypeSupport) is changed to work\nwith a type without the corresponding ValueDecl. It is also refactored\nso that host diagnostics for unsupported types can be added here as\nwell.\n\nDifferential Revision: https://reviews.llvm.org/D109315"}, [k]={{m,22078,"// Check the validity of the provided variable list for the provided clause kind\n// \\a CKind. In the check process the valid expressions, mappable expression\n// components, variables, and user-defined mappers are extracted and used to\n// fill \\a ProcessedVarList, \\a VarComponents, \\a VarBaseDeclarations, and \\a\n// UDMapperList in MVLI. \\a MapType, \\a IsMapTypeImplicit, \\a MapperIdScopeSpec,\n// and \\a MapperId are expected to be valid if the clause kind is \'map\'.\nstatic void checkMappableExpressionList(Sema &SemaRef, DSAStackTy *DSAS, OpenMPClauseKind CKind, MappableVarListInfo &MVLI, SourceLocation StartLoc, CXXScopeSpec &MapperIdScopeSpec, DeclarationNameInfo MapperId, ArrayRef<Expr *> UnresolvedMappers, OpenMPMapClauseKind MapType = OMPC_MAP_unknown, ArrayRef<OpenMPMapModifierKind> Modifiers = std::nullopt, bool IsMapTypeImplicit = false, bool NoDiagnose = false) {\n // ...\n for (Expr *RE : MVLI.VarList) {\n // ...\n if (CKind == OMPC_map) {\n // ...\n // The \'ompx_hold\' modifier is specifically intended to be used on a\n // \'target\' or \'target data\' directive to prevent data from being unmapped\n // during the associated statement. It is not permitted on a \'target\n // enter data\' or \'target exit data\' directive, which have no associated\n // statement.\n if ((DKind == OMPD_target_enter_data || DKind == OMPD_target_exit_data) && HasHoldModifier) {\n SemaRef.Diag(StartLoc, diag::err_omp_invalid_map_type_modifier_for_directive) << getOpenMPSimpleClauseTypeName(OMPC_map, OMPC_MAP_MODIFIER_ompx_hold) << getOpenMPDirectiveName(DKind);"}}, [l]={ ["clang/test/OpenMP/target_exit_data_map_messages.c"]={"clang/test/OpenMP/target_exit_data_map_messages.c:29:32: error: map type modifier \'ompx_hold\' is not allowed for \'#pragma omp target exit data\'","clang/test/OpenMP/target_exit_data_map_messages.c:32:32: error: map type modifier \'ompx_hold\' is not allowed for \'#pragma omp target exit data\'","clang/test/OpenMP/target_exit_data_map_messages.c:35:32: error: map type modifier \'ompx_hold\' is not allowed for \'#pragma omp target exit data\'"} } }, ["err_omp_invalid_mapper"]={ [j]={{nil,v,"err_omp_invalid_mapper"}}, [b]={{nil,v,"cannot find a valid user-defined mapper for type %0 with name %1"}}, [c]={{nil,v,"cannot find a valid user-defined mapper for type A with name B"}}, [e]=d, [f]="cannot find a valid user\\-defined mapper for type (.*?) with name (.*?)", [g]=a, [i]={{nil,v,n}}, [h]={"4304e9d14399",1550594300,"[OpenMP 5.0] Parsing/sema support for map clause with mapper modifier.","[OpenMP 5.0] Parsing/sema support for map clause with mapper modifier.\n\nThis patch implements the parsing and sema support for OpenMP map\nclauses with potential user-defined mapper attached. User defined mapper\nis a new feature in OpenMP 5.0. A map clause can have an explicit or\nimplicit associated mapper, which instructs the compiler to generate\nextra data mapping. An example is shown below:\n\n struct S { int len; int *d; };\n #pragma omp declare mapper(id: struct S s) map(s, s.d[0:s.len])\n struct S ss;\n #pragma omp target map(mapper(id) tofrom: ss) // use the mapper with name \'id\' to map ss\n\nContributed-by: Lingda Li <lildmh@gmail.com>\n\nDifferential Revision: https://reviews.llvm.org/D58074\n\nllvm-svn: 354347"}, [k]={{m,21799,"// Look up the user-defined mapper given the mapper name and mapped type, and\n// build a reference to it.\nstatic ExprResult buildUserDefinedMapperRef(Sema &SemaRef, Scope *S, CXXScopeSpec &MapperIdScopeSpec, const DeclarationNameInfo &MapperId, QualType Type, Expr *UnresolvedMapper) {\n // ...\n // Report error if a mapper is specified, but cannot be found.\n if (MapperIdScopeSpec.isSet() || MapperId.getAsString() != \"default\") {\n SemaRef.Diag(Loc, diag::err_omp_invalid_mapper) << Type << MapperId.getName();"}}, [l]={ [vb]={"clang/test/OpenMP/declare_mapper_messages.cpp:75:31: error: cannot find a valid user-defined mapper for type \'vec\' with name \'ab\'","clang/test/OpenMP/declare_mapper_messages.cpp:83:35: error: cannot find a valid user-defined mapper for type \'vec\' with name \'aa\'","clang/test/OpenMP/declare_mapper_messages.cpp:85:35: error: cannot find a valid user-defined mapper for type \'vec\' with name \'aa\'","clang/test/OpenMP/declare_mapper_messages.cpp:99:41: error: cannot find a valid user-defined mapper for type \'vec\' with name \'aa\'","clang/test/OpenMP/declare_mapper_messages.cpp:100:37: error: cannot find a valid user-defined mapper for type \'vec\' with name \'ab\'","clang/test/OpenMP/declare_mapper_messages.cpp:101:37: error: cannot find a valid user-defined mapper for type \'vec\' with name \'ab\'","clang/test/OpenMP/declare_mapper_messages.cpp:113:43: error: cannot find a valid user-defined mapper for type \'vec\' with name \'aa\'","clang/test/OpenMP/declare_mapper_messages.cpp:114:39: error: cannot find a valid user-defined mapper for type \'vec\' with name \'ab\'","clang/test/OpenMP/declare_mapper_messages.cpp:115:39: error: cannot find a valid user-defined mapper for type \'vec\' with name \'ab\'"} } }, ["err_omp_invalid_scope"]={ [j]={{nil,y,"err_omp_invalid_scope"}}, [b]={{nil,y,"\'#pragma omp %0\' directive must appear only in file scope"}}, [c]={{nil,y,"\'#pragma omp A\' directive must appear only in file scope"}}, [e]=d, [f]="\'\\#pragma omp (.*?)\' directive must appear only in file scope", [g]=a, [i]={{nil,y,n}}, [h]={"1408f91a2588",1537936119,"[OPENMP] Add support for OMP5 requires directive + unified_address clause","[OPENMP] Add support for OMP5 requires directive + unified_address clause\n\nAdd support for OMP5.0 requires directive and unified_address clause.\nPatches to follow will include support for additional clauses.\n\nDifferential Revision: https://reviews.llvm.org/D52359\n\nllvm-svn: 343063"}, [k]={{m,3459,"Sema::DeclGroupPtrTy Sema::ActOnOpenMPRequiresDirective(SourceLocation Loc, ArrayRef<OMPClause *> ClauseList) {\n // ...\n if (!CurContext->isFileContext()) {\n Diag(Loc, diag::err_omp_invalid_scope) << \"requires\";"}}, [l]={ ["clang/test/OpenMP/requires_messages.cpp"]={"clang/test/OpenMP/requires_messages.cpp:69:15: error: \'#pragma omp requires\' directive must appear only in file scope"} } }, ["err_omp_invalid_target_decl"]={ [j]="err_omp_invalid_target_decl", [b]="%0 used in declare target directive is not a variable or a function name", [c]="A used in declare target directive is not a variable or a function name", [e]=d, [f]="(.*?) used in declare target directive is not a variable or a function name", [g]=a, [i]=n, [h]={"d69b505e3c67",1462805953,"[OpenMP] Parse+Sema for \'#pragma omp declare target\' syntax version 4.5","[OpenMP] Parse+Sema for \'#pragma omp declare target\' syntax version 4.5\n\nSupport OpenMP version 4.5 syntax for #pragma omp declare target.\n\nSyntax:\n #pragma omp declare target (extended-list) new-line\nor\n #pragma omp declare target clause[ [,] clause ... ] new-line\n\nWhere clause is one of the following:\n to(extended-list)\n link(list)\n\nDifferential Revision: http://reviews.llvm.org/D20011\n\nllvm-svn: 268925"}, [k]={{m,23044,"NamedDecl *Sema::lookupOpenMPDeclareTargetName(Scope *CurScope, CXXScopeSpec &ScopeSpec, const DeclarationNameInfo &Id) {\n // ...\n if (!isa<VarDecl>(ND) && !isa<FunctionDecl>(ND) && !isa<FunctionTemplateDecl>(ND)) {\n Diag(Id.getLoc(), diag::err_omp_invalid_target_decl) << Id.getName();"}}, [l]={ [U]={"clang/test/OpenMP/declare_target_messages.cpp:199:33: error: \'S\' used in declare target directive is not a variable or a function name"} } }, ["err_omp_invariant_dependency"]={ [j]={{nil,r,"err_omp_invariant_dependency"}}, [b]={{nil,r,"expected loop invariant expression"}}, [c]={{nil,r,"expected loop invariant expression"}}, [e]=d, [f]="expected loop invariant expression", [g]=a, [i]={{nil,r,n}}, [h]={hb,1590001902,gb,kb}, [k]={{m,8078,"/// Checker for the non-rectangular loops. Checks if the initializer or\n/// condition expression references loop counter variable.\nclass LoopCounterRefChecker final : public ConstStmtVisitor<LoopCounterRefChecker, bool> {\n // ...\n bool checkDecl(const Expr *E, const ValueDecl *VD) {\n // ...\n if (Data.first && !SupportsNonRectangular) {\n SemaRef.Diag(E->getExprLoc(), diag::err_omp_invariant_dependency);"}}, [l]={ ["clang/test/OpenMP/tile_messages.cpp"]={"clang/test/OpenMP/tile_messages.cpp:95:18: error: expected loop invariant expression","clang/test/OpenMP/tile_messages.cpp:101:25: error: expected loop invariant expression","clang/test/OpenMP/tile_messages.cpp:107:25: error: expected loop invariant expression"} } }, ["err_omp_invariant_or_linear_dependency"]={ [j]={{nil,v,"err_omp_invariant_or_linear_dependency"}}, [b]={{nil,v,"expected loop invariant expression or \'<invariant1> * %0 + <invariant2>\' kind of expression"}}, [c]={{nil,v,"expected loop invariant expression or \'<invariant1> * A + <invariant2>\' kind of expression"}}, [e]=d, [f]="expected loop invariant expression or \'\\<invariant1\\> \\* (.*?) \\+ \\<invariant2\\>\' kind of expression", [g]=a, [i]={{nil,v,n}}, [h]={"5ddc6d180cd6",1556306917,"[OPENMP]Added check for non-random access types for the dependent loop","[OPENMP]Added check for non-random access types for the dependent loop\ncounters.\n\nAccording to the OpenMP 5.0, For any associated loop where the b or lb\nexpression is not loop invariant with respect to the outermost loop, the\nvar-outer that appears in the expression may not have a random access\niterator type.\n\nllvm-svn: 359340"}, [k]={{m,8091,"/// Checker for the non-rectangular loops. Checks if the initializer or\n/// condition expression references loop counter variable.\nclass LoopCounterRefChecker final : public ConstStmtVisitor<LoopCounterRefChecker, bool> {\n // ...\n bool checkDecl(const Expr *E, const ValueDecl *VD) {\n // ...\n if (Data.first && (DepDecl || (PrevDepDecl && getCanonicalDecl(VD) != getCanonicalDecl(PrevDepDecl)))) {\n // ...\n SemaRef.Diag(E->getExprLoc(), diag::err_omp_invariant_or_linear_dependency) << OS.str();"}}, [l]={ ["clang/test/OpenMP/for_loop_messages.cpp"]={"clang/test/OpenMP/for_loop_messages.cpp:301:41: error: expected loop invariant expression or \'<invariant1> * ii + <invariant2>\' kind of expression","clang/test/OpenMP/for_loop_messages.cpp:308:38: error: expected loop invariant expression or \'<invariant1> * ii + <invariant2>\' kind of expression","clang/test/OpenMP/for_loop_messages.cpp:652:43: error: expected loop invariant expression or \'<invariant1> * TC::ii + <invariant2>\' kind of expression","clang/test/OpenMP/for_loop_messages.cpp:662:43: error: expected loop invariant expression or \'<invariant1> * TC::ii + <invariant2>\' kind of expression","clang/test/OpenMP/for_loop_messages.cpp:663:38: error: expected loop invariant expression or \'<invariant1> * TC::ii + <invariant2>\' kind of expression","clang/test/OpenMP/for_loop_messages.cpp:652:43: error: expected loop invariant expression or \'<invariant1> * ii + <invariant2>\' kind of expression","clang/test/OpenMP/for_loop_messages.cpp:662:43: error: expected loop invariant expression or \'<invariant1> * ii + <invariant2>\' kind of expression","clang/test/OpenMP/for_loop_messages.cpp:663:38: error: expected loop invariant expression or \'<invariant1> * ii + <invariant2>\' kind of expression","clang/test/OpenMP/for_loop_messages.cpp:652:43: error: expected loop invariant expression or \'<invariant1> * ii + <invariant2>\' kind of expression","clang/test/OpenMP/for_loop_messages.cpp:662:43: error: expected loop invariant expression or \'<invariant1> * ii + <invariant2>\' kind of expression","clang/test/OpenMP/for_loop_messages.cpp:663:38: error: expected loop invariant expression or \'<invariant1> * ii + <invariant2>\' kind of expression"} } }, ["err_omp_iterator_not_integral_or_pointer"]={ [j]={{nil,o,"err_omp_iterator_not_integral_or_pointer"}}, [b]={{nil,o,"expected integral or pointer type as the iterator-type, not %0"}}, [c]={{nil,o,"expected integral or pointer type as the iterator-type, not A"}}, [e]=d, [f]="expected integral or pointer type as the iterator\\-type, not (.*?)", [g]=a, [i]={{nil,o,n}}, [h]={I,1576908663,H,F}, [k]={{N,5538,"ExprResult Sema::ActOnOMPIteratorExpr(Scope *S, SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc, ArrayRef<OMPIteratorData> Data) {\n // ...\n for (const OMPIteratorData &D : Data) {\n // ...\n if (!IsDeclTyDependent) {\n if (!DeclTy->isIntegralType(Context) && !DeclTy->isAnyPointerType()) {\n // ...\n Diag(StartLoc, diag::err_omp_iterator_not_integral_or_pointer) << DeclTy;"},{N,5564,"ExprResult Sema::ActOnOMPIteratorExpr(Scope *S, SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc, ArrayRef<OMPIteratorData> Data) {\n // ...\n for (const OMPIteratorData &D : Data) {\n // ...\n if (!IsDeclTyDependent) {\n // ...\n if (DeclTy.isConstant(Context)) {\n // ...\n Diag(StartLoc, diag::err_omp_iterator_not_integral_or_pointer) << DeclTy;"}}, [l]={ [Eb]={"clang/test/OpenMP/task_affinity_messages.cpp:67:38: error: expected integral or pointer type as the iterator-type, not \'vector\'"} } }, ["err_omp_iterator_step_constant_zero"]={ [j]={{nil,o,"err_omp_iterator_step_constant_zero"}}, [b]={{nil,o,"iterator step expression %0 evaluates to 0"}}, [c]={{nil,o,"iterator step expression A evaluates to 0"}}, [e]=d, [f]="iterator step expression (.*?) evaluates to 0", [g]=a, [i]={{nil,o,n}}, [h]={I,1576908663,H,F}, [k]={{N,5866,"ExprResult Sema::ActOnOMPIteratorExpr(Scope *S, SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc, ArrayRef<OMPIteratorData> Data) {\n // ...\n for (const OMPIteratorData &D : Data) {\n // ...\n if (!IsDeclTyDependent && Step && !Step->isTypeDependent()) {\n // ...\n // OpenMP 5.0, 2.1.6 Iterators, Restrictions\n // If the step expression of a range-specification equals zero, the\n // behavior is unspecified.\n if (Result && Result->isZero()) {\n Diag(Step->getExprLoc(), diag::err_omp_iterator_step_constant_zero) << Step << Step->getSourceRange();"}}, [l]={ [Eb]={"clang/test/OpenMP/task_affinity_messages.cpp:68:71: error: iterator step expression 0 evaluates to 0"} } }, ["err_omp_iterator_step_not_integral"]={ [j]={{nil,o,"err_omp_iterator_step_not_integral"}}, [b]={{nil,o,"iterator step expression %0 is not the integral expression"}}, [c]={{nil,o,"iterator step expression A is not the integral expression"}}, [e]=d, [f]="iterator step expression (.*?) is not the integral expression", [g]=a, [i]={{nil,o,n}}, [h]={I,1576908663,H,F}, [k]={{N,5601,"ExprResult Sema::ActOnOMPIteratorExpr(Scope *S, SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc, ArrayRef<OMPIteratorData> Data) {\n // ...\n for (const OMPIteratorData &D : Data) {\n // ...\n if (!IsDeclTyDependent && Step && !Step->isTypeDependent()) {\n if (!Step->getType()->isIntegralType(Context)) {\n Diag(Step->getExprLoc(), diag::err_omp_iterator_step_not_integral) << Step << Step->getSourceRange();"}} }, ["err_omp_iterator_use"]={ [j]={{nil,o,"err_omp_iterator_use"}}, [b]={{nil,o,"OpenMP iterator is not allowed here"}}, [c]={{nil,o,"OpenMP iterator is not allowed here"}}, [e]=d, [f]="OpenMP iterator is not allowed here", [g]=a, [i]={{nil,o,n}}, [h]={I,1576908663,H,F}, [k]={{N,1,"/// Check for operands with placeholder types and complain if found.\n/// Returns ExprError() if there was an error and no recovery was possible.\nExprResult Sema::CheckPlaceholderExpr(Expr *E) {\n // ...\n case BuiltinType::OMPIterator:\n return ExprError(Diag(E->getBeginLoc(), diag::err_omp_iterator_use));"}} }, ["err_omp_lambda_capture_in_declare_target_not_to"]={ [j]={{nil,p,"err_omp_lambda_capture_in_declare_target_not_to"}}, [b]={{nil,p,"variable captured in declare target region must appear in a to clause"}}, [c]={{nil,p,"variable captured in declare target region must appear in a to clause"}}, [e]=d, [f]="variable captured in declare target region must appear in a to clause", [g]=a, [i]={{nil,p,n}}, [h]={"c4299553f05e",1566323413,"Fix name of the error message, NFC.","Fix name of the error message, NFC.\n\nllvm-svn: 369418"}, [k]={{m,23125,"static void checkDeclInTargetContext(SourceLocation SL, SourceRange SR, Sema &SemaRef, Decl *D) {\n // ...\n if (SemaRef.LangOpts.OpenMP >= 50 && (SemaRef.getCurLambda(/*IgnoreNonLambdaCapturingScope=*/true) || SemaRef.getCurBlock() || SemaRef.getCurCapturedRegion()) && VD->hasGlobalStorage()) {\n if (!MapTy || (*MapTy != OMPDeclareTargetDeclAttr::MT_To && *MapTy != OMPDeclareTargetDeclAttr::MT_Enter)) {\n // ...\n SemaRef.Diag(VD->getLocation(), diag::err_omp_lambda_capture_in_declare_target_not_to);"}}, [l]={ [U]={"clang/test/OpenMP/declare_target_messages.cpp:19:11: error: variable captured in declare target region must appear in a to clause"} } }, ["err_omp_lastprivate_conditional_non_scalar"]={ [j]={{nil,p,"err_omp_lastprivate_conditional_non_scalar"}}, [b]={{nil,p,"expected list item of scalar type in \'lastprivate\' clause with \'conditional\' modifier"}}, [c]={{nil,p,"expected list item of scalar type in \'lastprivate\' clause with \'conditional\' modifier"}}, [e]=d, [f]="expected list item of scalar type in \'lastprivate\' clause with \'conditional\' modifier", [g]=a, [i]={{nil,p,n}}, [h]={"349636d2bfc3",1575555459,"Implement VectorType conditional operator GNU extension.","Implement VectorType conditional operator GNU extension.\n\nGCC supports the conditional operator on VectorTypes that acts as a\n\'select\' in C++ mode. This patch implements the support. Types are\nconverted as closely to GCC\'s behavior as possible, though in a few\nplaces consistency with our existing vector type support was preferred.\n\nNote that this implementation is different from the OpenCL version in a\nnumber of ways, so it unfortunately required a different implementation.\n\nFirst, the SEMA rules and promotion rules are significantly different.\n\nSecondly, GCC implements COND[i] != 0 ? LHS[i] : RHS[i] (where i is in\nthe range 0- VectorSize, for each element). In OpenCL, the condition is\nCOND[i] < 0 ? LHS[i]: RHS[i].\n\nIn the process of implementing this, it was also required to make the\nexpression COND ? LHS : RHS type dependent if COND is type dependent,\nsince the type is now dependent on the condition. For example:\n\n T ? 1 : 2;\n\nIs not typically type dependent, since the result can be deduced from\nthe operands. HOWEVER, if T is a VectorType now, it could change this\nto a \'select\' (basically a swizzle with a non-constant mask) with the 1\nand 2 being promoted to vectors themselves.\n\nWhile this is a change, it is NOT a standards incompatible change. Based\non my (and D. Gregor\'s, at the time of writing the code) reading of the\nstandard, the expression is supposed to be type dependent if ANY\nsub-expression is type dependent.\n\nDifferential Revision: https://reviews.llvm.org/D71463"}, [k]={{m,18543,"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 Diag(ELoc, diag::err_omp_lastprivate_conditional_non_scalar);"}}, [l]={ ["clang/test/OpenMP/sections_lastprivate_messages.cpp"]={"clang/test/OpenMP/sections_lastprivate_messages.cpp:112:52: error: expected list item of scalar type in \'lastprivate\' clause with \'conditional\' modifier"} } }, ["err_omp_lastprivate_incomplete_type"]={ [j]="err_omp_lastprivate_incomplete_type", [b]="a lastprivate variable with incomplete type %0", [c]="a lastprivate variable with incomplete type A", [e]=d, [f]="a lastprivate variable with incomplete type (.*?)", [g]=a, [i]=n, [h]={"1bb328cca568",1401887199,"[OPENMP] Parsing/Sema for OMPLasprivateClause.","[OPENMP] Parsing/Sema for OMPLasprivateClause.\nParsing this clause, allowing it on directive ‘omp simd’ and semantic checks.\n\nllvm-svn: 210184"}, [k]={{m,18524,"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 if (RequireCompleteType(ELoc, Type, diag::err_omp_lastprivate_incomplete_type))"}}, [l]={ ["clang/test/OpenMP/sections_lastprivate_messages.cpp"]={"clang/test/OpenMP/sections_lastprivate_messages.cpp:127:34: error: a lastprivate variable with incomplete type \'S1\'","clang/test/OpenMP/sections_lastprivate_messages.cpp:233:34: error: a lastprivate variable with incomplete type \'S1\'"} } }, ["err_omp_lastprivate_loop_var_non_loop_iteration"]={ [j]={{nil,s,"err_omp_lastprivate_loop_var_non_loop_iteration"}}, [b]={{nil,E,"only loop iteration variables are allowed in \'lastprivate\' clause in \'omp %0\' directives"},{s,s,"only loop iteration variables are allowed in \'lastprivate\' clause in \'omp loop\' directives"}}, [c]={{nil,E,"only loop iteration variables are allowed in \'lastprivate\' clause in \'omp A\' directives"},{s,s,"only loop iteration variables are allowed in \'lastprivate\' clause in \'omp loop\' directives"}}, [e]=d, [f]="only loop iteration variables are allowed in \'lastprivate\' clause in \'omp (.*?)\' directives", [g]=a, [i]={{nil,s,n}}, [h]={ib,1616787805,lb,jb}, [k]={{m,10561,"static bool checkGenericLoopLastprivate(Sema &S, ArrayRef<OMPClause *> Clauses, OpenMPDirectiveKind K, DSAStackTy *Stack) {\n // ...\n for (OMPClause *C : Clauses) {\n if (auto *LPC = dyn_cast<OMPLastprivateClause>(C)) {\n for (Expr *RefExpr : LPC->varlists()) {\n // ...\n if (ValueDecl *D = Res.first) {\n // ...\n if (!Info.first) {\n S.Diag(ELoc, diag::err_omp_lastprivate_loop_var_non_loop_iteration) << getOpenMPDirectiveName(K);"}}, [l]={ ["clang/test/OpenMP/target_teams_generic_loop_messages.cpp"]={"clang/test/OpenMP/target_teams_generic_loop_messages.cpp:104:45: error: only loop iteration variables are allowed in \'lastprivate\' clause in \'omp target teams loop\' directives","clang/test/OpenMP/target_teams_generic_loop_messages.cpp:110:45: error: only loop iteration variables are allowed in \'lastprivate\' clause in \'omp target teams loop\' directives","clang/test/OpenMP/target_teams_generic_loop_messages.cpp:143:45: error: only loop iteration variables are allowed in \'lastprivate\' clause in \'omp target teams loop\' directives"} } }, ["err_omp_linear_distribute_var_non_loop_iteration"]={ [j]={{nil,L,"err_omp_linear_distribute_var_non_loop_iteration"}}, [b]={{nil,L,"only loop iteration variables are allowed in \'linear\' clause in distribute directives"}}, [c]={{nil,L,"only loop iteration variables are allowed in \'linear\' clause in distribute directives"}}, [e]=d, [f]="only loop iteration variables are allowed in \'linear\' clause in distribute directives", [g]=a, [i]={{nil,L,n}}, [h]={"2b86f21ce580",1511991108,"[OPENMP] Allow only loop control variables in distribute simd","[OPENMP] Allow only loop control variables in distribute simd\ndirectives.\n\nAccording to the OpenMP standard, only loop control variables can be\nused in linear clauses of distribute-based simd directives.\n\nllvm-svn: 319362"}, [k]={{m,20192,"static bool FinishOpenMPLinearClause(OMPLinearClause &Clause, DeclRefExpr *IV, Expr *NumIterations, Sema &SemaRef, Scope *S, DSAStackTy *Stack) {\n // ...\n for (Expr *RefExpr : Clause.varlists()) {\n // ...\n // OpenMP [2.15.11, distribute simd Construct]\n // A list item may not appear in a linear clause, unless it is the loop\n // iteration variable.\n if (isOpenMPDistributeDirective(Stack->getCurrentDirective()) && isOpenMPSimdDirective(Stack->getCurrentDirective()) && !Info.first) {\n SemaRef.Diag(ELoc, diag::err_omp_linear_distribute_var_non_loop_iteration);"}}, [l]={ ["clang/test/OpenMP/distribute_parallel_for_simd_linear_messages.cpp"]={"clang/test/OpenMP/distribute_parallel_for_simd_linear_messages.cpp:35:49: error: only loop iteration variables are allowed in \'linear\' clause in distribute directives","clang/test/OpenMP/distribute_parallel_for_simd_linear_messages.cpp:41:49: error: only loop iteration variables are allowed in \'linear\' clause in distribute directives","clang/test/OpenMP/distribute_parallel_for_simd_linear_messages.cpp:47:49: error: only loop iteration variables are allowed in \'linear\' clause in distribute directives","clang/test/OpenMP/distribute_parallel_for_simd_linear_messages.cpp:53:49: error: only loop iteration variables are allowed in \'linear\' clause in distribute directives","clang/test/OpenMP/distribute_parallel_for_simd_linear_messages.cpp:59:49: error: only loop iteration variables are allowed in \'linear\' clause in distribute directives","clang/test/OpenMP/distribute_parallel_for_simd_linear_messages.cpp:65:49: error: only loop iteration variables are allowed in \'linear\' clause in distribute directives","clang/test/OpenMP/distribute_parallel_for_simd_linear_messages.cpp:71:49: error: only loop iteration variables are allowed in \'linear\' clause in distribute directives","clang/test/OpenMP/distribute_parallel_for_simd_linear_messages.cpp:71:51: error: only loop iteration variables are allowed in \'linear\' clause in distribute directives","clang/test/OpenMP/distribute_parallel_for_simd_linear_messages.cpp:71:56: error: only loop iteration variables are allowed in \'linear\' clause in distribute directives","clang/test/OpenMP/distribute_parallel_for_simd_linear_messages.cpp:77:49: error: only loop iteration variables are allowed in \'linear\' clause in distribute directives","clang/test/OpenMP/distribute_parallel_for_simd_linear_messages.cpp:88:49: error: only loop iteration variables are allowed in \'linear\' clause in distribute directives","clang/test/OpenMP/distribute_parallel_for_simd_linear_messages.cpp:88:55: error: only loop iteration variables are allowed in \'linear\' clause in distribute directives","clang/test/OpenMP/distribute_parallel_for_simd_linear_messages.cpp:278:50: error: only loop iteration variables are allowed in \'linear\' clause in distribute directives","clang/test/OpenMP/distribute_parallel_for_simd_linear_messages.cpp:284:50: error: only loop iteration variables are allowed in \'linear\' clause in distribute directives","clang/test/OpenMP/distribute_parallel_for_simd_linear_messages.cpp:295:50: error: only loop iteration variables are allowed in \'linear\' clause in distribute directives","clang/test/OpenMP/distribute_parallel_for_simd_linear_messages.cpp:174:50: error: only loop iteration variables are allowed in \'linear\' clause in distribute directives","clang/test/OpenMP/distribute_parallel_for_simd_linear_messages.cpp:180:50: error: only loop iteration variables are allowed in \'linear\' clause in distribute directives","clang/test/OpenMP/distribute_parallel_for_simd_linear_messages.cpp:191:50: error: only loop iteration variables are allowed in \'linear\' clause in distribute directives","clang/test/OpenMP/distribute_parallel_for_simd_linear_messages.cpp:212:49: error: only loop iteration variables are allowed in \'linear\' clause in distribute directives","clang/test/OpenMP/distribute_parallel_for_simd_linear_messages.cpp:212:52: error: only loop iteration variables are allowed in \'linear\' clause in distribute directives","clang/test/OpenMP/distribute_parallel_for_simd_linear_messages.cpp:223:49: error: only loop iteration variables are allowed in \'linear\' clause in distribute directives"} } }, ["err_omp_linear_expected_int_or_ptr"]={ [j]="err_omp_linear_expected_int_or_ptr", [b]="argument of a linear clause should be of integral or pointer type, not %0", [c]="argument of a linear clause should be of integral or pointer type, not A", [e]=d, [f]="argument of a linear clause should be of integral or pointer type, not (.*?)", [g]=a, [i]=n, [h]={"8dba66412b0a",1398172182,"[OPENMP] parsing \'linear\' clause (for directive \'omp simd\')","[OPENMP] parsing \'linear\' clause (for directive \'omp simd\')\n\nDifferential Revision: http://reviews.llvm.org/D3272\n\nllvm-svn: 206891"}, [k]={{m,20007,"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 Diag(ELoc, diag::err_omp_linear_expected_int_or_ptr) << Type;"}}, [l]={ ["clang/test/OpenMP/for_simd_linear_messages.cpp"]={"clang/test/OpenMP/for_simd_linear_messages.cpp:135:35: error: argument of a linear clause should be of integral or pointer type, not \'S2\'","clang/test/OpenMP/for_simd_linear_messages.cpp:200:34: error: argument of a linear clause should be of integral or pointer type, not \'S2\'","clang/test/OpenMP/for_simd_linear_messages.cpp:206:31: error: argument of a linear clause should be of integral or pointer type, not \'S4\'","clang/test/OpenMP/for_simd_linear_messages.cpp:206:34: error: argument of a linear clause should be of integral or pointer type, not \'S5\'","clang/test/OpenMP/for_simd_linear_messages.cpp:62:29: error: argument of a linear clause should be of integral or pointer type, not \'double\'"} } }, ["err_omp_linear_incomplete_type"]={ [j]="err_omp_linear_incomplete_type", [b]="a linear variable with incomplete type %0", [c]="a linear variable with incomplete type A", [e]=d, [f]="a linear variable with incomplete type (.*?)", [g]=a, [i]=n, [h]={"8dba66412b0a",1398172182,"[OPENMP] parsing \'linear\' clause (for directive \'omp simd\')","[OPENMP] parsing \'linear\' clause (for directive \'omp simd\')\n\nDifferential Revision: http://reviews.llvm.org/D3272\n\nllvm-svn: 206891"}, [k]={{m,19983,"bool Sema::CheckOpenMPLinearDecl(const ValueDecl *D, SourceLocation ELoc, OpenMPLinearClauseKind LinKind, QualType Type, bool IsDeclareSimd) {\n // ...\n if (RequireCompleteType(ELoc, Type, diag::err_omp_linear_incomplete_type))"}}, [l]={ ["clang/test/OpenMP/for_simd_linear_messages.cpp"]={"clang/test/OpenMP/for_simd_linear_messages.cpp:135:32: error: a linear variable with incomplete type \'S1\'","clang/test/OpenMP/for_simd_linear_messages.cpp:200:31: error: a linear variable with incomplete type \'S1\'"} } }, ["err_omp_linear_ordered"]={ [j]="err_omp_linear_ordered", [b]="\'linear\' clause cannot be specified along with \'ordered\' clause with a parameter", [c]="\'linear\' clause cannot be specified along with \'ordered\' clause with a parameter", [e]=d, [f]="\'linear\' clause cannot be specified along with \'ordered\' clause with a parameter", [g]=a, [i]=n, [h]={"993d28073c1b",1451283788,"[OPENMP 4.5] Do not allow \'linear\' clause along with \'ordered(expr)\' clause.","[OPENMP 4.5] Do not allow \'linear\' clause along with \'ordered(expr)\' clause.\nAccording to OpenMP 4.5 \"A linear clause or an ordered clause with a parameter can be specified on a loop directive but not both.\"\"\n\nllvm-svn: 256485"}, [k]={{m,4872,"StmtResult Sema::ActOnOpenMPRegionEnd(StmtResult S, ArrayRef<OMPClause *> Clauses) {\n // ...\n if (!LCs.empty() && OC && OC->getNumForLoops()) {\n for (const OMPLinearClause *C : LCs) {\n Diag(C->getBeginLoc(), diag::err_omp_linear_ordered) << SourceRange(OC->getBeginLoc(), OC->getEndLoc());"}}, [l]={ ["clang/test/OpenMP/for_linear_messages.cpp"]={"clang/test/OpenMP/for_linear_messages.cpp:159:19: error: \'linear\' clause cannot be specified along with \'ordered\' clause with a parameter","clang/test/OpenMP/for_linear_messages.cpp:223:19: error: \'linear\' clause cannot be specified along with \'ordered\' clause with a parameter"} } }, ["err_omp_local_var_in_threadprivate_init"]={ [j]="err_omp_local_var_in_threadprivate_init", [b]="variable with local storage in initial value of threadprivate variable", [c]="variable with local storage in initial value of threadprivate variable", [e]=d, [f]="variable with local storage in initial value of threadprivate variable", [g]=a, [i]=n, [h]={"18b92eeacb23",1401262825,"[OPENMP] Additional checking for local vars in initial values for threadprivate vars","[OPENMP] Additional checking for local vars in initial values for threadprivate vars\n\nllvm-svn: 209716"}, [k]={{m,3177,"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 SemaRef.Diag(E->getBeginLoc(), diag::err_omp_local_var_in_threadprivate_init) << E->getSourceRange();"}}, [l]={ ["clang/test/OpenMP/threadprivate_messages.cpp"]={"clang/test/OpenMP/threadprivate_messages.cpp:125:31: error: variable with local storage in initial value of threadprivate variable"} } }, ["err_omp_loop_cannot_use_stmt"]={ [j]="err_omp_loop_cannot_use_stmt", [b]="\'%0\' statement cannot be used in OpenMP for loop", [c]="\'A\' statement cannot be used in OpenMP for loop", [e]=d, [f]="\'(.*?)\' statement cannot be used in OpenMP for loop", [g]=a, [i]=n, [h]={pb,1401790607,rb,ob}, [k]={{fb,3352,"StmtResult Sema::ActOnBreakStmt(SourceLocation BreakLoc, Scope *CurScope) {\n // ...\n if (S->isOpenMPLoopScope())\n return StmtError(Diag(BreakLoc, diag::err_omp_loop_cannot_use_stmt) << \"break\");"}}, [l]={ ["clang/test/OpenMP/parallel_for_simd_messages.cpp"]={"clang/test/OpenMP/parallel_for_simd_messages.cpp:61:9: error: \'break\' statement cannot be used in OpenMP for loop"} } }, ["err_omp_loop_diff_cxx"]={ [j]="err_omp_loop_diff_cxx", [b]="could not calculate number of iterations calling \'operator-\' with upper and lower loop bounds", [c]="could not calculate number of iterations calling \'operator-\' with upper and lower loop bounds", [e]=d, [f]="could not calculate number of iterations calling \'operator\\-\' with upper and lower loop bounds", [g]=a, [i]=n, [h]={"a5f070aec038",1412143436,"[OPENMP] Loop collapsing and codegen for \'omp simd\' directive.","[OPENMP] Loop collapsing and codegen for \'omp simd\' directive.\n\nThis patch implements collapsing of the loops (in particular, in\npresense of clause \'collapse\'). It calculates number of iterations N\nand expressions nesessary to calculate the nested loops counters\nvalues based on new iteration variable (that goes from 0 to N-1)\nin Sema. It also adds Codegen for \'omp simd\', which uses\n(and tests) this feature.\n\nDifferential Revision: http://reviews.llvm.org/D5184\n\nllvm-svn: 218743"}, [k]={{m,8584,"/// Calculate number of iterations, transforming to unsigned, if number of\n/// iterations may be larger than the original type.\nstatic Expr *calculateNumIters(Sema &SemaRef, Scope *S, SourceLocation DefaultLoc, Expr *Lower, Expr *Upper, Expr *Step, QualType LCTy, bool TestIsStrictOp, bool RoundToStep, llvm::MapVector<const Expr *, DeclRefExpr *> &Captures) {\n // ...\n // If need to reorganize, then calculate the form as Upper - (Lower - Step [+\n // 1]).\n if (NeedToReorganize) {\n // ...\n } else {\n // ...\n if (!Diff.isUsable() && LCTy->getAsCXXRecordDecl()) {\n // ...\n SemaRef.Diag(Upper->getBeginLoc(), diag::err_omp_loop_diff_cxx) << Upper->getSourceRange() << Lower->getSourceRange();"}}, [l]={ ["clang/test/OpenMP/parallel_for_simd_loop_messages.cpp"]={"clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:413:32: error: could not calculate number of iterations calling \'operator-\' with upper and lower loop bounds","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:469:30: error: could not calculate number of iterations calling \'operator-\' with upper and lower loop bounds","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:481:21: error: could not calculate number of iterations calling \'operator-\' with upper and lower loop bounds"} } }, ["err_omp_loop_incr_not_compatible"]={ [j]="err_omp_loop_incr_not_compatible", [b]="increment expression must cause %0 to %select{decrease|increase}1 on each iteration of OpenMP for loop", [c]={{nil,nil,{"increment expression must cause A to ",{"decrease","increase"}," on each iteration of OpenMP for loop"}}}, [e]=d, [f]="increment expression must cause (.*?) to (?:decrease|increase) on each iteration of OpenMP for loop", [g]=a, [i]=n, [h]={pb,1401790607,rb,ob}, [k]={{m,8023,"bool OpenMPIterationSpaceChecker::setStep(Expr *NewStep, bool Subtract) {\n // ...\n if (!NewStep->isValueDependent()) {\n // ...\n if (UB && (IsConstZero || (*TestIsLessOp ? (IsConstNeg || (IsUnsigned && Subtract)) : (IsConstPos || (IsUnsigned && !Subtract))))) {\n SemaRef.Diag(NewStep->getExprLoc(), diag::err_omp_loop_incr_not_compatible) << LCDecl << *TestIsLessOp << NewStep->getSourceRange();"}}, [l]={ ["clang/test/OpenMP/parallel_for_simd_loop_messages.cpp"]={"clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:199:35: error: increment expression must cause \'ii\' to increase on each iteration of OpenMP for loop","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:205:35: error: increment expression must cause \'ii\' to increase on each iteration of OpenMP for loop","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:211:33: error: increment expression must cause \'ii\' to increase on each iteration of OpenMP for loop","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:217:33: error: increment expression must cause \'ii\' to increase on each iteration of OpenMP for loop","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:223:32: error: increment expression must cause \'ii\' to decrease on each iteration of OpenMP for loop","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:229:35: error: increment expression must cause \'ii\' to increase on each iteration of OpenMP for loop","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:235:34: error: increment expression must cause \'ii\' to decrease on each iteration of OpenMP for loop","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:241:34: error: increment expression must cause \'ii\' to increase on each iteration of OpenMP for loop","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:295:32: error: increment expression must cause \'i\' to increase on each iteration of OpenMP for loop","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:437:46: error: increment expression must cause \'I\' to decrease on each iteration of OpenMP for loop","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:449:42: error: increment expression must cause \'I\' to decrease on each iteration of OpenMP for loop","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:474:37: error: increment expression must cause \'I\' to decrease on each iteration of OpenMP for loop","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:530:32: error: increment expression must cause \'I\' to decrease on each iteration of OpenMP for loop","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:493:41: error: increment expression must cause \'I\' to increase on each iteration of OpenMP for loop","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:499:39: error: increment expression must cause \'I\' to increase on each iteration of OpenMP for loop","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:517:40: error: increment expression must cause \'I\' to decrease on each iteration of OpenMP for loop","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:523:37: error: increment expression must cause \'I\' to decrease on each iteration of OpenMP for loop","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:517:40: error: increment expression must cause \'I\' to decrease on each iteration of OpenMP for loop","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:523:37: error: increment expression must cause \'I\' to decrease on each iteration of OpenMP for loop"} } }, ["err_omp_loop_not_canonical_cond"]={ [j]="err_omp_loop_not_canonical_cond", [b]={{nil,p,"condition of OpenMP for loop must be a relational comparison (\'<\', \'<=\', \'>\', %select{or \'>=\'|\'>=\', or \'!=\'}0) of loop variable %1"},{v,nil,"condition of OpenMP for loop must be a relational comparison (\'<\', \'<=\', \'>\', or \'>=\') of loop variable %0"}}, [c]={{nil,p,{"condition of OpenMP for loop must be a relational comparison (\'<\', \'<=\', \'>\', ",{"or \'>=\'","\'>=\', or \'!=\'"},") of loop variable B"}},{v,nil,"condition of OpenMP for loop must be a relational comparison (\'<\', \'<=\', \'>\', or \'>=\') of loop variable A"}}, [e]=d, [f]="condition of OpenMP for loop must be a relational comparison \\(\'\\<\', \'\\<\\=\', \'\\>\', (?:or \'\\>\\=\'|\'\\>\\=\', or \'\\!\\=\')\\) of loop variable (.*?)", [g]=a, [i]=n, [h]={pb,1401790607,rb,ob}, [k]={{m,8270,"bool OpenMPIterationSpaceChecker::checkAndSetCond(Expr *S) {\n // ...\n if (!S) {\n SemaRef.Diag(DefaultLoc, diag::err_omp_loop_not_canonical_cond) << (IneqCondIsCanonical ? 1 : 0) << LCDecl;"},{m,8316,"bool OpenMPIterationSpaceChecker::checkAndSetCond(Expr *S) {\n // ...\n SemaRef.Diag(CondLoc, diag::err_omp_loop_not_canonical_cond) << (IneqCondIsCanonical ? 1 : 0) << S->getSourceRange() << LCDecl;"}}, [l]={ [Gb]={"clang/test/OpenMP/unroll_messages.cpp:18:19: error: condition of OpenMP for loop must be a relational comparison (\'<\', \'<=\', \'>\', \'>=\', or \'!=\') of loop variable \'i\'"} } }, ["err_omp_loop_not_canonical_incr"]={ [j]="err_omp_loop_not_canonical_incr", [b]="increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable %0", [c]="increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable A", [e]=d, [f]="increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable (.*?)", [g]=a, [i]=n, [h]={pb,1401790607,rb,ob}, [k]={{m,8347,"bool OpenMPIterationSpaceChecker::checkAndSetIncRHS(Expr *RHS) {\n // ...\n SemaRef.Diag(RHS->getBeginLoc(), diag::err_omp_loop_not_canonical_incr) << RHS->getSourceRange() << LCDecl;"},{m,8367,"bool OpenMPIterationSpaceChecker::checkAndSetInc(Expr *S) {\n // Check incr-expr for canonical loop form and return true if it\n // does not conform.\n // OpenMP [2.6] Canonical loop form. Test-expr may be one of the following:\n // ++var\n // var++\n // --var\n // var--\n // var += incr\n // var -= incr\n // var = var + incr\n // var = incr + var\n // var = var - incr\n //\n if (!S) {\n SemaRef.Diag(DefaultLoc, diag::err_omp_loop_not_canonical_incr) << LCDecl;"},{m,8425,"bool OpenMPIterationSpaceChecker::checkAndSetInc(Expr *S) {\n // ...\n SemaRef.Diag(S->getBeginLoc(), diag::err_omp_loop_not_canonical_incr) << S->getSourceRange() << LCDecl;"}}, [l]={ ["clang/test/OpenMP/parallel_for_simd_loop_messages.cpp"]={"clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:105:28: error: increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable \'i\'","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:140:25: error: increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable \'ii\'","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:145:25: error: increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable \'ii\'","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:166:25: error: increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable \'ii\'","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:172:23: error: increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable \'ii\'","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:177:3: error: increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable \'ii\'","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:183:25: error: increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable \'ii\'","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:188:25: error: increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable \'ii\'","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:193:30: error: increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable \'ii\'","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:444:42: error: increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable \'I\'","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:453:42: error: increment clause of OpenMP for loop must perform simple addition or subtraction on loop variable \'I\'"} } }, ["err_omp_loop_not_canonical_init"]={ [j]="err_omp_loop_not_canonical_init", [b]="initialization clause of OpenMP for loop is not in canonical form (\'var = init\' or \'T var = init\')", [c]="initialization clause of OpenMP for loop is not in canonical form (\'var = init\' or \'T var = init\')", [e]=d, [f]="initialization clause of OpenMP for loop is not in canonical form \\(\'var \\= init\' or \'T var \\= init\'\\)", [g]=a, [i]=n, [h]={pb,1401790607,rb,ob}, [k]={{m,8165,"bool OpenMPIterationSpaceChecker::checkAndSetInit(Stmt *S, bool EmitDiags) {\n // Check init-expr for canonical loop form and save loop counter\n // variable - #Var and its initialization value - #LB.\n // OpenMP [2.6] Canonical loop form. init-expr may be one of the following:\n // var = lb\n // integer-type var = lb\n // random-access-iterator-type var = lb\n // pointer-type var = lb\n //\n if (!S) {\n if (EmitDiags) {\n SemaRef.Diag(DefaultLoc, diag::err_omp_loop_not_canonical_init);"},{m,8233,"bool OpenMPIterationSpaceChecker::checkAndSetInit(Stmt *S, bool EmitDiags) {\n // ...\n if (EmitDiags) {\n SemaRef.Diag(S->getBeginLoc(), diag::err_omp_loop_not_canonical_init) << S->getSourceRange();"}}, [l]={ ["clang/test/OpenMP/parallel_for_simd_loop_messages.cpp"]={"clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:64:8: error: initialization clause of OpenMP for loop is not in canonical form (\'var = init\' or \'T var = init\')","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:68:8: error: initialization clause of OpenMP for loop is not in canonical form (\'var = init\' or \'T var = init\')","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:73:8: error: initialization clause of OpenMP for loop is not in canonical form (\'var = init\' or \'T var = init\')","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:78:3: error: initialization clause of OpenMP for loop is not in canonical form (\'var = init\' or \'T var = init\')","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:84:8: error: initialization clause of OpenMP for loop is not in canonical form (\'var = init\' or \'T var = init\')","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:89:8: error: initialization clause of OpenMP for loop is not in canonical form (\'var = init\' or \'T var = init\')","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:386:8: error: initialization clause of OpenMP for loop is not in canonical form (\'var = init\' or \'T var = init\')","clang/test/OpenMP/parallel_for_simd_loop_messages.cpp:417:8: error: initialization clause of OpenMP for loop is not in canonical form (\'var = init\' or \'T var = init\')"} } }, ["err_omp_loop_var_dsa"]={ [j]="err_omp_loop_var_dsa", [b]="loop iteration variable in the associated loop of \'omp %1\' directive may not be %0, predetermined as %2", [c]="loop iteration variable in the associated loop of \'omp B\' directive may not be A, predetermined as C", [e]=d, [f]="loop iteration variable in the associated loop of \'omp (.*?)\' directive may not be (.*?), predetermined as (.*?)", [g]=a, [i]=n, [h]={pb,1401790607,rb,ob}, [k]={{m,9146,"void Sema::ActOnOpenMPLoopInitialization(SourceLocation ForLoc, Stmt *Init) {\n // ...\n if (AssociatedLoops > 0 && isOpenMPLoopDirective(DSAStack->getCurrentDirective())) {\n // ...\n if (!ISC.checkAndSetInit(Init, /*EmitDiags=*/false)) {\n if (ValueDecl *D = ISC.getLoopDecl()) {\n // ...\n if (((isOpenMPSimdDirective(DKind) && DVar.CKind != OMPC_unknown && DVar.CKind != PredeterminedCKind && DVar.RefExpr && (LangOpts.OpenMP <= 45 || (DVar.CKind != OMPC_lastprivate && DVar.CKind != OMPC_private))) || ((isOpenMPWorksharingDirective(DKind) || DKind == OMPD_taskloop || DKind == OMPD_master_taskloop || DKind == OMPD_masked_taskloop || DKind == OMPD_parallel_master_taskloop || DKind == OMPD_parallel_masked_taskloop || isOpenMPDistributeDirective(DKind)) && !isOpenMPSimdDirective(DKind) && DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_private && DVar.CKind != OMPC_lastprivate)) && (DVar.CKind != OMPC_private || DVar.RefExpr)) {\n Diag(Init->getBeginLoc(), diag::err_omp_loop_var_dsa) << getOpenMPClauseName(DVar.CKind) << getOpenMPDirectiveName(DKind) << getOpenMPClauseName(PredeterminedCKind);"}}, [l]={ ["clang/test/OpenMP/target_teams_distribute_firstprivate_messages.cpp"]={"clang/test/OpenMP/target_teams_distribute_firstprivate_messages.cpp:144:8: error: loop iteration variable in the associated loop of \'omp target teams distribute\' directive may not be firstprivate, predetermined as private"} } }, ["err_omp_loop_variable_type"]={ [j]="err_omp_loop_variable_type", [b]="variable must be of integer or %select{pointer|random access iterator}0 type", [c]={{nil,nil,{"variable must be of integer or ",{"pointer","random access iterator"}," type"}}}, [e]=d, [f]="variable must be of integer or (?:pointer|random access iterator) type", [g]=a, [i]=n, [h]={pb,1401790607,rb,ob}, [k]={{m,9253,"/// Called on a for stmt to check and extract its iteration space\n/// for further processing (such as collapsing).\nstatic bool checkOpenMPIterationSpace(OpenMPDirectiveKind DKind, Stmt *S, Sema &SemaRef, DSAStackTy &DSA, unsigned CurrentNestedLoopCount, unsigned NestedLoopCount, unsigned TotalNestedLoopCount, Expr *CollapseLoopCountExpr, Expr *OrderedLoopCountExpr, Sema::VarsWithInheritedDSAType &VarsWithImplicitDSA, llvm::MutableArrayRef<LoopIterationSpace> ResultIterSpaces, llvm::MapVector<const Expr *, DeclRefExpr *> &Captures) {\n // ...\n // Check loop variable\'s type.\n if (ValueDecl *LCDecl = ISC.getLoopDecl()) {\n // ...\n if (!VarType->isDependentType() && !VarType->isIntegerType() && !VarType->isPointerType() && !(SemaRef.getLangOpts().CPlusPlus && VarType->isOverloadableType())) {\n SemaRef.Diag(Init->getBeginLoc(), diag::err_omp_loop_variable_type) << SemaRef.getLangOpts().CPlusPlus;"}}, [l]={ ["clang/test/OpenMP/target_teams_distribute_misc_messages.c"]={"clang/test/OpenMP/target_teams_distribute_misc_messages.c:308:8: error: variable must be of integer or pointer type","clang/test/OpenMP/target_teams_distribute_misc_messages.c:313:8: error: variable must be of integer or pointer type"} } }, ["err_omp_map_modifier_not_iterator"]={ [j]={{nil,w,"err_omp_map_modifier_not_iterator"}}, [b]={{nil,w,"expected iterator specification as map modifier"}}, [c]={{nil,w,"expected iterator specification as map modifier"}}, [e]=d, [f]="expected iterator specification as map modifier", [g]=a, [i]={{nil,w,n}}, [h]={"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"}, [k]={{m,22167,"OMPClause *Sema::ActOnOpenMPMapClause(Expr *IteratorModifier, ArrayRef<OpenMPMapModifierKind> MapTypeModifiers, ArrayRef<SourceLocation> MapTypeModifiersLoc, CXXScopeSpec &MapperIdScopeSpec, DeclarationNameInfo &MapperId, OpenMPMapClauseKind MapType, bool IsMapTypeImplicit, SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, bool NoDiagnose, ArrayRef<Expr *> UnresolvedMappers) {\n // ...\n if (IteratorModifier && !IteratorModifier->getType()->isSpecificBuiltinType(BuiltinType::OMPIterator))\n Diag(IteratorModifier->getExprLoc(), diag::err_omp_map_modifier_not_iterator);"}} }, ["err_omp_map_shared_storage"]={ [j]="err_omp_map_shared_storage", [b]="variable already marked as mapped in current construct", [c]="variable already marked as mapped in current construct", [e]=d, [f]="variable already marked as mapped in current construct", [g]=a, [i]=n, [h]={"0bff7afab5bb",1448256723,"[OpenMP] Parsing and sema support for map clause","[OpenMP] Parsing and sema support for map clause\n\nhttp://reviews.llvm.org/D14134 \n\nllvm-svn: 253849"}, [k]={{m,21557,"// Return true if expression E associated with value VD has conflicts with other\n// map information.\nstatic bool checkMapConflicts(Sema &SemaRef, DSAStackTy *DSAS, const ValueDecl *VD, const Expr *E, bool CurrentRegionOnly, OMPClauseMappableExprCommon::MappableExprComponentListRef CurComponents, OpenMPClauseKind CKind) {\n // ...\n bool FoundError = DSAS->checkMappableExprComponentListsForDecl(VD, CurrentRegionOnly, [&IsEnclosedByDataEnvironmentExpr, &SemaRef, VD, CurrentRegionOnly, ELoc, ERange, CKind, &EnclosingExpr, CurComponents](OMPClauseMappableExprCommon::MappableExprComponentListRef StackComponents, OpenMPClauseKind Kind) {\n // ...\n // OpenMP 4.5 [2.15.5.1, map Clause, Restrictions, p.4]\n // List items of map clauses in the same construct must not share\n // original storage.\n //\n // If the expressions are exactly the same or one is a subset of the\n // other, it means they are sharing storage.\n if (CI == CE && SI == SE) {\n if (CurrentRegionOnly) {\n if (CKind == OMPC_map) {\n SemaRef.Diag(ELoc, diag::err_omp_map_shared_storage) << ERange;"},{m,21644,"// Return true if expression E associated with value VD has conflicts with other\n// map information.\nstatic bool checkMapConflicts(Sema &SemaRef, DSAStackTy *DSAS, const ValueDecl *VD, const Expr *E, bool CurrentRegionOnly, OMPClauseMappableExprCommon::MappableExprComponentListRef CurComponents, OpenMPClauseKind CKind) {\n // ...\n bool FoundError = DSAS->checkMappableExprComponentListsForDecl(VD, CurrentRegionOnly, [&IsEnclosedByDataEnvironmentExpr, &SemaRef, VD, CurrentRegionOnly, ELoc, ERange, CKind, &EnclosingExpr, CurComponents](OMPClauseMappableExprCommon::MappableExprComponentListRef StackComponents, OpenMPClauseKind Kind) {\n // ...\n // OpenMP 4.5 [2.15.5.1, map Clause, Restrictions, p.4]\n // List items of map clauses in the same construct must not share\n // original storage.\n //\n // An expression is a subset of the other.\n if (CurrentRegionOnly && (CI == CE || SI == SE)) {\n if (CKind == OMPC_map) {\n // ...\n SemaRef.Diag(ELoc, diag::err_omp_map_shared_storage) << ERange;"},{m,23523,"OMPClause *Sema::ActOnOpenMPIsDevicePtrClause(ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs) {\n // ...\n for (Expr *RefExpr : VarList) {\n // ...\n if (DSAStack->checkMappableExprComponentListsForDecl(D, /*CurrentRegionOnly=*/true, [&ConflictExpr](OMPClauseMappableExprCommon::MappableExprComponentListRef R, OpenMPClauseKind) -> bool {\n // ...\n Diag(ELoc, diag::err_omp_map_shared_storage) << RefExpr->getSourceRange();"},{m,23598,"OMPClause *Sema::ActOnOpenMPHasDeviceAddrClause(ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs) {\n // ...\n for (Expr *RefExpr : VarList) {\n // ...\n if (DSAStack->checkMappableExprComponentListsForDecl(D, /*CurrentRegionOnly=*/true, [&ConflictExpr](OMPClauseMappableExprCommon::MappableExprComponentListRef R, OpenMPClauseKind) -> bool {\n // ...\n Diag(ELoc, diag::err_omp_map_shared_storage) << RefExpr->getSourceRange();"}}, [l]={ ["clang/test/OpenMP/target_has_device_addr_messages.cpp"]={"clang/test/OpenMP/target_has_device_addr_messages.cpp:187:44: error: variable already marked as mapped in current construct","clang/test/OpenMP/target_has_device_addr_messages.cpp:189:44: error: variable already marked as mapped in current construct","clang/test/OpenMP/target_has_device_addr_messages.cpp:191:47: error: variable already marked as mapped in current construct","clang/test/OpenMP/target_has_device_addr_messages.cpp:256:44: error: variable already marked as mapped in current construct","clang/test/OpenMP/target_has_device_addr_messages.cpp:258:44: error: variable already marked as mapped in current construct","clang/test/OpenMP/target_has_device_addr_messages.cpp:260:47: error: variable already marked as mapped in current construct"} } }, ["err_omp_map_type_missing"]={ [j]="err_omp_map_type_missing", [b]="missing map type", [c]="missing map type", [e]=d, [f]="missing map type", [g]=a, [i]=u, [h]={"0bff7afab5bb",1448256723,"[OpenMP] Parsing and sema support for map clause","[OpenMP] Parsing and sema support for map clause\n\nhttp://reviews.llvm.org/D14134 \n\nllvm-svn: 253849"}, [k]={{t,4180,"/// Parse map-type in map clause.\n/// map([ [map-type-modifier[,] [map-type-modifier[,] ...] map-type : ] list)\n/// where, map-type ::= to | from | tofrom | alloc | release | delete\nstatic void parseMapType(Parser &P, Sema::OpenMPVarListDataTy &Data) {\n // ...\n if (Tok.is(tok::colon)) {\n P.Diag(Tok, diag::err_omp_map_type_missing);"}}, [l]={ [vb]={"clang/test/OpenMP/declare_mapper_messages.cpp:75:35: error: missing map type","clang/test/OpenMP/declare_mapper_messages.cpp:81:35: error: missing map type"} } }, ["err_omp_map_type_modifier_missing"]={ [j]={{nil,y,"err_omp_map_type_modifier_missing"}}, [b]={{nil,y,"missing map type modifier"}}, [c]={{nil,y,"missing map type modifier"}}, [e]=d, [f]="missing map type modifier", [g]=a, [i]={{nil,y,u}}, [h]={"ef57943e3fba",1545171521,"[OPENMP] parsing and sema support for \'close\' map-type-modifier","[OPENMP] parsing and sema support for \'close\' map-type-modifier\n\nA map clause with the close map-type-modifier is a hint to \nprefer that the variables are mapped using a copy into faster \nmemory.\n\nPatch by Ahsan Saghir (saghir)\n\nDifferential Revision: https://reviews.llvm.org/D55719\n\nllvm-svn: 349551"}, [k]={{t,4141,"/// Parse map-type-modifiers in map clause.\n/// map([ [map-type-modifier[,] [map-type-modifier[,] ...] map-type : ] list)\n/// where, map-type-modifier ::= always | close | mapper(mapper-identifier) |\n/// present\nbool Parser::parseMapTypeModifiers(Sema::OpenMPVarListDataTy &Data) {\n while (getCurToken().isNot(tok::colon)) {\n // ...\n if (TypeModifier == OMPC_MAP_MODIFIER_always || TypeModifier == OMPC_MAP_MODIFIER_close || TypeModifier == OMPC_MAP_MODIFIER_present || TypeModifier == OMPC_MAP_MODIFIER_ompx_hold) {\n // ...\n } else if (TypeModifier == OMPC_MAP_MODIFIER_mapper) {\n // ...\n } else {\n // For the case of unknown map-type-modifier or a map-type.\n // Map-type is followed by a colon; the function returns when it\n // encounters a token followed by a colon.\n if (Tok.is(tok::comma)) {\n Diag(Tok, diag::err_omp_map_type_modifier_missing);"}}, [l]={ ["clang/test/OpenMP/target_map_messages.cpp"]={"clang/test/OpenMP/target_map_messages.cpp:218:29: error: missing map type modifier","clang/test/OpenMP/target_map_messages.cpp:220:29: error: missing map type modifier","clang/test/OpenMP/target_map_messages.cpp:220:31: error: missing map type modifier","clang/test/OpenMP/target_map_messages.cpp:222:29: error: missing map type modifier","clang/test/OpenMP/target_map_messages.cpp:222:31: error: missing map type modifier","clang/test/OpenMP/target_map_messages.cpp:233:29: error: missing map type modifier"} } }, ["err_omp_mapper_expected_declarator"]={ [j]={{nil,v,"err_omp_mapper_expected_declarator"}}, [b]={{nil,v,"expected declarator on \'omp declare mapper\' directive"}}, [c]={{nil,v,"expected declarator on \'omp declare mapper\' directive"}}, [e]=d, [f]="expected declarator on \'omp declare mapper\' directive", [g]=a, [i]={{nil,v,u}}, [h]={Jb,1549052704,Kb,Hb}, [k]={{t,651,"TypeResult Parser::parseOpenMPDeclareMapperVarDecl(SourceRange &Range, DeclarationName &Name, AccessSpecifier AS) {\n // ...\n if (DeclaratorInfo.getIdentifier() == nullptr) {\n Diag(Tok.getLocation(), diag::err_omp_mapper_expected_declarator);"}}, [l]={ [vb]={"clang/test/OpenMP/declare_mapper_messages.cpp:20:183: error: expected declarator on \'omp declare mapper\' directive","clang/test/OpenMP/declare_mapper_messages.cpp:21:28: error: expected declarator on \'omp declare mapper\' directive","clang/test/OpenMP/declare_mapper_messages.cpp:22:189: error: expected declarator on \'omp declare mapper\' directive","clang/test/OpenMP/declare_mapper_messages.cpp:23:148: error: expected declarator on \'omp declare mapper\' directive"} } }, ["err_omp_mapper_illegal_identifier"]={ [j]={{nil,v,"err_omp_mapper_illegal_identifier"}}, [b]={{nil,v,"illegal OpenMP user-defined mapper identifier"}}, [c]={{nil,v,"illegal OpenMP user-defined mapper identifier"}}, [e]=d, [f]="illegal OpenMP user\\-defined mapper identifier", [g]=a, [i]={{nil,v,u}}, [h]={Jb,1549052704,Kb,Hb}, [k]={{t,550,"/// Parses \'omp declare mapper\' directive.\n///\n/// declare-mapper-directive:\n/// annot_pragma_openmp \'declare\' \'mapper\' \'(\' [<mapper-identifier> \':\']\n/// <type> <var> \')\' [<clause>[[,] <clause>] ... ]\n/// annot_pragma_openmp_end\n/// <mapper-identifier> and <var> are base language identifiers.\n///\nParser::DeclGroupPtrTy Parser::ParseOpenMPDeclareMapperDirective(AccessSpecifier AS) {\n // ...\n if (PP.LookAhead(0).is(tok::colon)) {\n if (Tok.isNot(tok::identifier) && Tok.isNot(tok::kw_default)) {\n Diag(Tok.getLocation(), diag::err_omp_mapper_illegal_identifier);"},{t,4103,"/// Parse the mapper modifier in map, to, and from clauses.\nbool Parser::parseMapperModifier(Sema::OpenMPVarListDataTy &Data) {\n // ...\n if (Tok.isNot(tok::identifier) && Tok.isNot(tok::kw_default)) {\n Diag(Tok.getLocation(), diag::err_omp_mapper_illegal_identifier);"}}, [l]={ [vb]={"clang/test/OpenMP/declare_mapper_messages.cpp:30:28: error: illegal OpenMP user-defined mapper identifier","clang/test/OpenMP/declare_mapper_messages.cpp:77:35: error: illegal OpenMP user-defined mapper identifier","clang/test/OpenMP/declare_mapper_messages.cpp:79:35: error: illegal OpenMP user-defined mapper identifier","clang/test/OpenMP/declare_mapper_messages.cpp:93:37: error: illegal OpenMP user-defined mapper identifier","clang/test/OpenMP/declare_mapper_messages.cpp:95:37: error: illegal OpenMP user-defined mapper identifier","clang/test/OpenMP/declare_mapper_messages.cpp:97:42: error: illegal OpenMP user-defined mapper identifier","clang/test/OpenMP/declare_mapper_messages.cpp:98:42: error: illegal OpenMP user-defined mapper identifier","clang/test/OpenMP/declare_mapper_messages.cpp:107:39: error: illegal OpenMP user-defined mapper identifier","clang/test/OpenMP/declare_mapper_messages.cpp:109:39: error: illegal OpenMP user-defined mapper identifier","clang/test/OpenMP/declare_mapper_messages.cpp:111:44: error: illegal OpenMP user-defined mapper identifier","clang/test/OpenMP/declare_mapper_messages.cpp:112:44: error: illegal OpenMP user-defined mapper identifier"} } }, ["err_omp_mapper_wrong_type"]={ [j]={{nil,v,"err_omp_mapper_wrong_type"}}, [b]={{nil,v,"mapper type must be of struct, union or class type"}}, [c]={{nil,v,"mapper type must be of struct, union or class type"}}, [e]=d, [f]="mapper type must be of struct, union or class type", [g]=a, [i]={{nil,v,n}}, [h]={Jb,1549052704,Kb,Hb}, [k]={{m,21759,"// Look up the user-defined mapper given the mapper name and mapped type, and\n// build a reference to it.\nstatic ExprResult buildUserDefinedMapperRef(Sema &SemaRef, Scope *S, CXXScopeSpec &MapperIdScopeSpec, const DeclarationNameInfo &MapperId, QualType Type, Expr *UnresolvedMapper) {\n // ...\n // [OpenMP 5.0], 2.19.7.3 declare mapper Directive, Restrictions\n // The type must be of struct, union or class type in C and C++\n if (!Type->isStructureOrClassType() && !Type->isUnionType() && (MapperIdScopeSpec.isSet() || MapperId.getAsString() != \"default\")) {\n SemaRef.Diag(Loc, diag::err_omp_mapper_wrong_type);"},{m,22480,"QualType Sema::ActOnOpenMPDeclareMapperType(SourceLocation TyLoc, TypeResult ParsedType) {\n // ...\n // [OpenMP 5.0], 2.19.7.3 declare mapper Directive, Restrictions\n // The type must be of struct, union or class type in C and C++\n if (!MapperType->isStructureOrClassType() && !MapperType->isUnionType()) {\n Diag(TyLoc, diag::err_omp_mapper_wrong_type);"}}, [l]={ [vb]={"clang/test/OpenMP/declare_mapper_messages.cpp:34:28: error: mapper type must be of struct, union or class type"} } }, ["err_omp_more_one_clause"]={ [j]="err_omp_more_one_clause", [b]="directive \'#pragma omp %0\' cannot contain more than one \'%1\' clause%select{| with \'%3\' name modifier| with \'source\' dependence}2", [c]={{nil,nil,{"directive \'#pragma omp A\' cannot contain more than one \'B\' clause",{a," with \'D\' name modifier"," with \'source\' dependence"}}}}, [e]=d, [f]="directive \'\\#pragma omp (.*?)\' cannot contain more than one \'(.*?)\' clause(?:| with \'(.*?)\' name modifier| with \'source\' dependence)", [g]=a, [i]=C, [h]={"5ec3eb11fcb8",1374203623,"OpenMP: basic support for #pragma omp parallel","OpenMP: basic support for #pragma omp parallel\n\nllvm-svn: 186647"}, [k]={{t,739,"/// Parses clauses for \'declare simd\' directive.\n/// clause:\n/// \'inbranch\' | \'notinbranch\'\n/// \'simdlen\' \'(\' <expr> \')\'\n/// { \'uniform\' \'(\' <argument_list> \')\' }\n/// { \'aligned \'(\' <argument_list> [ \':\' <alignment> ] \')\' }\n/// { \'linear \'(\' <argument_list> [ \':\' <step> ] \')\' }\nstatic bool parseDeclareSimdClauses(Parser &P, OMPDeclareSimdDeclAttr::BranchStateTy &BS, ExprResult &SimdLen, SmallVectorImpl<Expr *> &Uniforms, SmallVectorImpl<Expr *> &Aligneds, SmallVectorImpl<Expr *> &Alignments, SmallVectorImpl<Expr *> &Linears, SmallVectorImpl<unsigned> &LinModifiers, SmallVectorImpl<Expr *> &Steps) {\n // ...\n while (Tok.isNot(tok::annot_pragma_openmp_end)) {\n // ...\n // Parse \'inranch|notinbranch\' clauses.\n if (OMPDeclareSimdDeclAttr::ConvertStrToBranchStateTy(ClauseName, Out)) {\n // ...\n } else if (ClauseName.equals(\"simdlen\")) {\n if (SimdLen.isUsable()) {\n P.Diag(Tok, diag::err_omp_more_one_clause) << getOpenMPDirectiveName(OMPD_declare_simd) << ClauseName << 0;"},{t,1462,"/// Parse clauses for \'#pragma omp declare variant ( variant-func-id ) clause\'.\nvoid Parser::ParseOMPDeclareVariantClauses(Parser::DeclGroupPtrTy Ptr, CachedTokens &Toks, SourceLocation Loc) {\n // ...\n while (Tok.isNot(tok::annot_pragma_openmp_end)) {\n // ...\n if (!IsError) {\n // ...\n case OMPC_append_args:\n if (!AppendArgs.empty()) {\n Diag(AppendArgsLoc, diag::err_omp_more_one_clause) << getOpenMPDirectiveName(OMPD_declare_variant) << getOpenMPClauseName(CKind) << 0;"},{t,1834,"void Parser::ParseOMPDeclareTargetClauses(Sema::DeclareTargetContextInfo &DTCI) {\n // ...\n while (Tok.isNot(tok::annot_pragma_openmp_end)) {\n // ...\n if (HasIdentifier) {\n // ...\n if (DTCI.Indirect && IsIndirectClause) {\n Diag(Tok, diag::err_omp_more_one_clause) << getOpenMPDirectiveName(OMPD_declare_target) << getOpenMPClauseName(OMPC_indirect) << 0;"},{t,3237,"/// Parsing of OpenMP clauses.\n///\n/// clause:\n/// if-clause | final-clause | num_threads-clause | safelen-clause |\n/// default-clause | private-clause | firstprivate-clause | shared-clause\n/// | linear-clause | aligned-clause | collapse-clause | bind-clause |\n/// lastprivate-clause | reduction-clause | proc_bind-clause |\n/// schedule-clause | copyin-clause | copyprivate-clause | untied-clause |\n/// mergeable-clause | flush-clause | read-clause | write-clause |\n/// update-clause | capture-clause | seq_cst-clause | device-clause |\n/// simdlen-clause | threads-clause | simd-clause | num_teams-clause |\n/// thread_limit-clause | priority-clause | grainsize-clause |\n/// nogroup-clause | num_tasks-clause | hint-clause | to-clause |\n/// from-clause | is_device_ptr-clause | task_reduction-clause |\n/// in_reduction-clause | allocator-clause | allocate-clause |\n/// acq_rel-clause | acquire-clause | release-clause | relaxed-clause |\n/// depobj-clause | destroy-clause | detach-clause | inclusive-clause |\n/// exclusive-clause | uses_allocators-clause | use_device_addr-clause |\n/// has_device_addr\n///\nOMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind, OpenMPClauseKind CKind, bool FirstClause) {\n // ...\n case OMPC_final:\n case OMPC_num_threads:\n case OMPC_safelen:\n case OMPC_simdlen:\n case OMPC_collapse:\n case OMPC_ordered:\n case OMPC_num_teams:\n case OMPC_thread_limit:\n case OMPC_priority:\n case OMPC_grainsize:\n case OMPC_num_tasks:\n case OMPC_hint:\n case OMPC_allocator:\n case OMPC_depobj:\n case OMPC_detach:\n case OMPC_novariants:\n case OMPC_nocontext:\n case OMPC_filter:\n case OMPC_partial:\n case OMPC_align:\n case OMPC_message:\n case OMPC_ompx_dyn_cgroup_mem:\n // OpenMP [2.5, Restrictions]\n // At most one num_threads clause can appear on the directive.\n // OpenMP [2.8.1, simd construct, Restrictions]\n // Only one safelen clause can appear on a simd directive.\n // Only one simdlen clause can appear on a simd directive.\n // Only one collapse clause can appear on a simd directive.\n // OpenMP [2.11.1, task Construct, Restrictions]\n // At most one if clause can appear on the directive.\n // At most one final clause can appear on the directive.\n // OpenMP [teams Construct, Restrictions]\n // At most one num_teams clause can appear on the directive.\n // At most one thread_limit clause can appear on the directive.\n // OpenMP [2.9.1, task Construct, Restrictions]\n // At most one priority clause can appear on the directive.\n // OpenMP [2.9.2, taskloop Construct, Restrictions]\n // At most one grainsize clause can appear on the directive.\n // OpenMP [2.9.2, taskloop Construct, Restrictions]\n // At most one num_tasks clause can appear on the directive.\n // OpenMP [2.11.3, allocate Directive, Restrictions]\n // At most one allocator clause can appear on the directive.\n // OpenMP 5.0, 2.10.1 task Construct, Restrictions.\n // At most one detach clause can appear on the directive.\n // OpenMP 5.1, 2.3.6 dispatch Construct, Restrictions.\n // At most one novariants clause can appear on a dispatch directive.\n // At most one nocontext clause can appear on a dispatch directive.\n // OpenMP [5.1, error directive, Restrictions]\n // At most one message clause can appear on the directive\n if (!FirstClause) {\n Diag(Tok, diag::err_omp_more_one_clause) << getOpenMPDirectiveName(DKind) << getOpenMPClauseName(CKind) << 0;"},{t,3270,"/// Parsing of OpenMP clauses.\n///\n/// clause:\n/// if-clause | final-clause | num_threads-clause | safelen-clause |\n/// default-clause | private-clause | firstprivate-clause | shared-clause\n/// | linear-clause | aligned-clause | collapse-clause | bind-clause |\n/// lastprivate-clause | reduction-clause | proc_bind-clause |\n/// schedule-clause | copyin-clause | copyprivate-clause | untied-clause |\n/// mergeable-clause | flush-clause | read-clause | write-clause |\n/// update-clause | capture-clause | seq_cst-clause | device-clause |\n/// simdlen-clause | threads-clause | simd-clause | num_teams-clause |\n/// thread_limit-clause | priority-clause | grainsize-clause |\n/// nogroup-clause | num_tasks-clause | hint-clause | to-clause |\n/// from-clause | is_device_ptr-clause | task_reduction-clause |\n/// in_reduction-clause | allocator-clause | allocate-clause |\n/// acq_rel-clause | acquire-clause | release-clause | relaxed-clause |\n/// depobj-clause | destroy-clause | detach-clause | inclusive-clause |\n/// exclusive-clause | uses_allocators-clause | use_device_addr-clause |\n/// has_device_addr\n///\nOMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind, OpenMPClauseKind CKind, bool FirstClause) {\n // ...\n case OMPC_default:\n case OMPC_proc_bind:\n case OMPC_atomic_default_mem_order:\n case OMPC_at:\n case OMPC_severity:\n case OMPC_bind:\n // OpenMP [2.14.3.1, Restrictions]\n // Only a single default clause may be specified on a parallel, task or\n // teams directive.\n // OpenMP [2.5, parallel Construct, Restrictions]\n // At most one proc_bind clause can appear on the directive.\n // OpenMP [5.0, Requires directive, Restrictions]\n // At most one atomic_default_mem_order clause can appear\n // on the directive\n // OpenMP [5.1, error directive, Restrictions]\n // At most one at clause can appear on the directive\n // At most one severity clause can appear on the directive\n // OpenMP 5.1, 2.11.7 loop Construct, Restrictions.\n // At most one bind clause can appear on a loop directive.\n if (!FirstClause) {\n Diag(Tok, diag::err_omp_more_one_clause) << getOpenMPDirectiveName(DKind) << getOpenMPClauseName(CKind) << 0;"},{t,3292,"/// Parsing of OpenMP clauses.\n///\n/// clause:\n/// if-clause | final-clause | num_threads-clause | safelen-clause |\n/// default-clause | private-clause | firstprivate-clause | shared-clause\n/// | linear-clause | aligned-clause | collapse-clause | bind-clause |\n/// lastprivate-clause | reduction-clause | proc_bind-clause |\n/// schedule-clause | copyin-clause | copyprivate-clause | untied-clause |\n/// mergeable-clause | flush-clause | read-clause | write-clause |\n/// update-clause | capture-clause | seq_cst-clause | device-clause |\n/// simdlen-clause | threads-clause | simd-clause | num_teams-clause |\n/// thread_limit-clause | priority-clause | grainsize-clause |\n/// nogroup-clause | num_tasks-clause | hint-clause | to-clause |\n/// from-clause | is_device_ptr-clause | task_reduction-clause |\n/// in_reduction-clause | allocator-clause | allocate-clause |\n/// acq_rel-clause | acquire-clause | release-clause | relaxed-clause |\n/// depobj-clause | destroy-clause | detach-clause | inclusive-clause |\n/// exclusive-clause | uses_allocators-clause | use_device_addr-clause |\n/// has_device_addr\n///\nOMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind, OpenMPClauseKind CKind, bool FirstClause) {\n // ...\n case OMPC_device:\n case OMPC_schedule:\n case OMPC_dist_schedule:\n case OMPC_defaultmap:\n case OMPC_order:\n // OpenMP [2.7.1, Restrictions, p. 3]\n // Only one schedule clause can appear on a loop directive.\n // OpenMP 4.5 [2.10.4, Restrictions, p. 106]\n // At most one defaultmap clause can appear on the directive.\n // OpenMP 5.0 [2.12.5, target construct, Restrictions]\n // At most one device clause can appear on the directive.\n // OpenMP 5.1 [2.11.3, order clause, Restrictions]\n // At most one order clause may appear on a construct.\n if ((getLangOpts().OpenMP < 50 || CKind != OMPC_defaultmap) && (CKind != OMPC_order || getLangOpts().OpenMP >= 51) && !FirstClause) {\n Diag(Tok, diag::err_omp_more_one_clause) << getOpenMPDirectiveName(DKind) << getOpenMPClauseName(CKind) << 0;"},{t,3327,"/// Parsing of OpenMP clauses.\n///\n/// clause:\n/// if-clause | final-clause | num_threads-clause | safelen-clause |\n/// default-clause | private-clause | firstprivate-clause | shared-clause\n/// | linear-clause | aligned-clause | collapse-clause | bind-clause |\n/// lastprivate-clause | reduction-clause | proc_bind-clause |\n/// schedule-clause | copyin-clause | copyprivate-clause | untied-clause |\n/// mergeable-clause | flush-clause | read-clause | write-clause |\n/// update-clause | capture-clause | seq_cst-clause | device-clause |\n/// simdlen-clause | threads-clause | simd-clause | num_teams-clause |\n/// thread_limit-clause | priority-clause | grainsize-clause |\n/// nogroup-clause | num_tasks-clause | hint-clause | to-clause |\n/// from-clause | is_device_ptr-clause | task_reduction-clause |\n/// in_reduction-clause | allocator-clause | allocate-clause |\n/// acq_rel-clause | acquire-clause | release-clause | relaxed-clause |\n/// depobj-clause | destroy-clause | detach-clause | inclusive-clause |\n/// exclusive-clause | uses_allocators-clause | use_device_addr-clause |\n/// has_device_addr\n///\nOMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind, OpenMPClauseKind CKind, bool FirstClause) {\n // ...\n case OMPC_nowait:\n case OMPC_untied:\n case OMPC_mergeable:\n case OMPC_read:\n case OMPC_write:\n case OMPC_capture:\n case OMPC_compare:\n case OMPC_seq_cst:\n case OMPC_acq_rel:\n case OMPC_acquire:\n case OMPC_release:\n case OMPC_relaxed:\n case OMPC_threads:\n case OMPC_simd:\n case OMPC_nogroup:\n case OMPC_unified_address:\n case OMPC_unified_shared_memory:\n case OMPC_reverse_offload:\n case OMPC_dynamic_allocators:\n case OMPC_full:\n // OpenMP [2.7.1, Restrictions, p. 9]\n // Only one ordered clause can appear on a loop directive.\n // OpenMP [2.7.1, Restrictions, C/C++, p. 4]\n // Only one nowait clause can appear on a for directive.\n // OpenMP [5.0, Requires directive, Restrictions]\n // Each of the requires clauses can appear at most once on the directive.\n if (!FirstClause) {\n Diag(Tok, diag::err_omp_more_one_clause) << getOpenMPDirectiveName(DKind) << getOpenMPClauseName(CKind) << 0;"},{t,3336,"/// Parsing of OpenMP clauses.\n///\n/// clause:\n/// if-clause | final-clause | num_threads-clause | safelen-clause |\n/// default-clause | private-clause | firstprivate-clause | shared-clause\n/// | linear-clause | aligned-clause | collapse-clause | bind-clause |\n/// lastprivate-clause | reduction-clause | proc_bind-clause |\n/// schedule-clause | copyin-clause | copyprivate-clause | untied-clause |\n/// mergeable-clause | flush-clause | read-clause | write-clause |\n/// update-clause | capture-clause | seq_cst-clause | device-clause |\n/// simdlen-clause | threads-clause | simd-clause | num_teams-clause |\n/// thread_limit-clause | priority-clause | grainsize-clause |\n/// nogroup-clause | num_tasks-clause | hint-clause | to-clause |\n/// from-clause | is_device_ptr-clause | task_reduction-clause |\n/// in_reduction-clause | allocator-clause | allocate-clause |\n/// acq_rel-clause | acquire-clause | release-clause | relaxed-clause |\n/// depobj-clause | destroy-clause | detach-clause | inclusive-clause |\n/// exclusive-clause | uses_allocators-clause | use_device_addr-clause |\n/// has_device_addr\n///\nOMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind, OpenMPClauseKind CKind, bool FirstClause) {\n // ...\n case OMPC_update:\n if (!FirstClause) {\n Diag(Tok, diag::err_omp_more_one_clause) << getOpenMPDirectiveName(DKind) << getOpenMPClauseName(CKind) << 0;"},{t,3378,"/// Parsing of OpenMP clauses.\n///\n/// clause:\n/// if-clause | final-clause | num_threads-clause | safelen-clause |\n/// default-clause | private-clause | firstprivate-clause | shared-clause\n/// | linear-clause | aligned-clause | collapse-clause | bind-clause |\n/// lastprivate-clause | reduction-clause | proc_bind-clause |\n/// schedule-clause | copyin-clause | copyprivate-clause | untied-clause |\n/// mergeable-clause | flush-clause | read-clause | write-clause |\n/// update-clause | capture-clause | seq_cst-clause | device-clause |\n/// simdlen-clause | threads-clause | simd-clause | num_teams-clause |\n/// thread_limit-clause | priority-clause | grainsize-clause |\n/// nogroup-clause | num_tasks-clause | hint-clause | to-clause |\n/// from-clause | is_device_ptr-clause | task_reduction-clause |\n/// in_reduction-clause | allocator-clause | allocate-clause |\n/// acq_rel-clause | acquire-clause | release-clause | relaxed-clause |\n/// depobj-clause | destroy-clause | detach-clause | inclusive-clause |\n/// exclusive-clause | uses_allocators-clause | use_device_addr-clause |\n/// has_device_addr\n///\nOMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind, OpenMPClauseKind CKind, bool FirstClause) {\n // ...\n case OMPC_sizes:\n if (!FirstClause) {\n Diag(Tok, diag::err_omp_more_one_clause) << getOpenMPDirectiveName(DKind) << getOpenMPClauseName(CKind) << 0;"},{t,3391,"/// Parsing of OpenMP clauses.\n///\n/// clause:\n/// if-clause | final-clause | num_threads-clause | safelen-clause |\n/// default-clause | private-clause | firstprivate-clause | shared-clause\n/// | linear-clause | aligned-clause | collapse-clause | bind-clause |\n/// lastprivate-clause | reduction-clause | proc_bind-clause |\n/// schedule-clause | copyin-clause | copyprivate-clause | untied-clause |\n/// mergeable-clause | flush-clause | read-clause | write-clause |\n/// update-clause | capture-clause | seq_cst-clause | device-clause |\n/// simdlen-clause | threads-clause | simd-clause | num_teams-clause |\n/// thread_limit-clause | priority-clause | grainsize-clause |\n/// nogroup-clause | num_tasks-clause | hint-clause | to-clause |\n/// from-clause | is_device_ptr-clause | task_reduction-clause |\n/// in_reduction-clause | allocator-clause | allocate-clause |\n/// acq_rel-clause | acquire-clause | release-clause | relaxed-clause |\n/// depobj-clause | destroy-clause | detach-clause | inclusive-clause |\n/// exclusive-clause | uses_allocators-clause | use_device_addr-clause |\n/// has_device_addr\n///\nOMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind, OpenMPClauseKind CKind, bool FirstClause) {\n // ...\n case OMPC_destroy:\n if (DKind != OMPD_interop) {\n if (!FirstClause) {\n Diag(Tok, diag::err_omp_more_one_clause) << getOpenMPDirectiveName(DKind) << getOpenMPClauseName(CKind) << 0;"},{m,5266,"static bool checkIfClauses(Sema &S, OpenMPDirectiveKind Kind, ArrayRef<OMPClause *> Clauses, ArrayRef<OpenMPDirectiveKind> AllowedNameModifiers) {\n // ...\n for (const OMPClause *C : Clauses) {\n if (const auto *IC = dyn_cast_or_null<OMPIfClause>(C)) {\n // ...\n if (FoundNameModifiers[CurNM]) {\n S.Diag(C->getBeginLoc(), diag::err_omp_more_one_clause) << getOpenMPDirectiveName(Kind) << getOpenMPClauseName(OMPC_if) << (CurNM != OMPD_unknown) << getOpenMPDirectiveName(CurNM);"},{m,11324,"StmtResult Sema::ActOnOpenMPOrderedDirective(ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc) {\n // ...\n for (const OMPClause *C : Clauses) {\n // ...\n if (DC || DOC) {\n // ...\n if ((DC && DC->getDependencyKind() == OMPC_DEPEND_source) || (DOC && (ODK.isSource(DOC)))) {\n if ((DC && DependSourceClause) || (DOC && DoacrossSourceClause)) {\n Diag(C->getBeginLoc(), diag::err_omp_more_one_clause) << getOpenMPDirectiveName(OMPD_ordered) << getOpenMPClauseName(DC ? OMPC_depend : OMPC_doacross) << 2;"}}, [l]={ [Gb]={"clang/test/OpenMP/unroll_messages.cpp:63:30: error: directive \'#pragma omp unroll\' cannot contain more than one \'partial\' clause","clang/test/OpenMP/unroll_messages.cpp:67:33: error: directive \'#pragma omp unroll\' cannot contain more than one \'partial\' clause","clang/test/OpenMP/unroll_messages.cpp:71:27: error: directive \'#pragma omp unroll\' cannot contain more than one \'full\' clause"} } }, ["err_omp_multiple_array_items_in_map_clause"]={ [j]="err_omp_multiple_array_items_in_map_clause", [b]="multiple array elements associated with the same variable are not allowed in map clauses of the same construct", [c]="multiple array elements associated with the same variable are not allowed in map clauses of the same construct", [e]=d, [f]="multiple array elements associated with the same variable are not allowed in map clauses of the same construct", [g]=a, [i]=n, [h]={"5de996e3bd79",1453494096,"[OpenMP] Update map clause SEMA to support OpenMP 4.5 possible list items.","[OpenMP] Update map clause SEMA to support OpenMP 4.5 possible list items.\n\nSummary:\nExtend support in the map clause SEMA for the expressions supported in the OpenMP 4.5 specification, namely member expressions. \n\nFix some bugs in the previous implementation of SEMA related with expressions that do not consist of single variable references.\n\nFix bug in parsing when the expression in the map clause do not start with an identifier: accept any expression in the map clause and check for validity in SEMA instead of just ignoring it.\n\nReviewers: hfinkel, kkwli0, arpith-jacob, carlo.bertolli, ABataev\n\nSubscribers: cfe-commits, fraggamuffin, caomhin\n\nDifferential Revision: http://reviews.llvm.org/D16385\n\nllvm-svn: 258543"}, [k]={{m,21508,"// Return true if expression E associated with value VD has conflicts with other\n// map information.\nstatic bool checkMapConflicts(Sema &SemaRef, DSAStackTy *DSAS, const ValueDecl *VD, const Expr *E, bool CurrentRegionOnly, OMPClauseMappableExprCommon::MappableExprComponentListRef CurComponents, OpenMPClauseKind CKind) {\n // ...\n bool FoundError = DSAS->checkMappableExprComponentListsForDecl(VD, CurrentRegionOnly, [&IsEnclosedByDataEnvironmentExpr, &SemaRef, VD, CurrentRegionOnly, ELoc, ERange, CKind, &EnclosingExpr, CurComponents](OMPClauseMappableExprCommon::MappableExprComponentListRef StackComponents, OpenMPClauseKind Kind) {\n // ...\n for (; CI != CE && SI != SE; ++CI, ++SI) {\n // OpenMP 4.5 [2.15.5.1, map Clause, Restrictions, p.3]\n // At most one list item can be an array item derived from a given\n // variable in map clauses of the same construct.\n if (CurrentRegionOnly && (isa<ArraySubscriptExpr>(CI->getAssociatedExpression()) || isa<OMPArraySectionExpr>(CI->getAssociatedExpression()) || isa<OMPArrayShapingExpr>(CI->getAssociatedExpression())) && (isa<ArraySubscriptExpr>(SI->getAssociatedExpression()) || isa<OMPArraySectionExpr>(SI->getAssociatedExpression()) || isa<OMPArrayShapingExpr>(SI->getAssociatedExpression()))) {\n SemaRef.Diag(CI->getAssociatedExpression()->getExprLoc(), diag::err_omp_multiple_array_items_in_map_clause) << CI->getAssociatedExpression()->getSourceRange();"}}, [l]={ ["clang/test/OpenMP/target_teams_map_messages.cpp"]={"clang/test/OpenMP/target_teams_map_messages.cpp:241:45: error: multiple array elements associated with the same variable are not allowed in map clauses of the same construct"} } }, ["err_omp_negative_expression_in_clause"]={ [j]="err_omp_negative_expression_in_clause", [b]="argument to \'%0\' clause must be a %select{non-negative|strictly positive}1 integer value", [c]={{nil,nil,{"argument to \'A\' clause must be a ",{"non-negative","strictly positive"}," integer value"}}}, [e]=d, [f]="argument to \'(.*?)\' clause must be a (?:non\\-negative|strictly positive) integer value", [g]=a, [i]=n, [h]={"568a833f68de",1394086519,"[OPENMP] Clause \'num_threads\'","[OPENMP] Clause \'num_threads\'\n\nllvm-svn: 203087"}, [k]={{m,16447,"static bool isNonNegativeIntegerValue(Expr *&ValExpr, Sema &SemaRef, OpenMPClauseKind CKind, bool StrictlyPositive, bool BuildCapture = false, OpenMPDirectiveKind DKind = OMPD_unknown, OpenMPDirectiveKind *CaptureRegion = nullptr, Stmt **HelperValStmt = nullptr) {\n if (!ValExpr->isTypeDependent() && !ValExpr->isValueDependent() && !ValExpr->isInstantiationDependent()) {\n // ...\n // The expression must evaluate to a non-negative integer value.\n if (std::optional<llvm::APSInt> Result = ValExpr->getIntegerConstantExpr(SemaRef.Context)) {\n if (Result->isSigned() && !((!StrictlyPositive && Result->isNonNegative()) || (StrictlyPositive && Result->isStrictlyPositive()))) {\n SemaRef.Diag(Loc, diag::err_omp_negative_expression_in_clause) << getOpenMPClauseName(CKind) << (StrictlyPositive ? 1 : 0) << ValExpr->getSourceRange();"},{m,16526,"ExprResult Sema::VerifyPositiveIntegerConstantInClause(Expr *E, OpenMPClauseKind CKind, bool StrictlyPositive, bool SuppressExprDiags) {\n // ...\n if ((StrictlyPositive && !Result.isStrictlyPositive()) || (!StrictlyPositive && !Result.isNonNegative())) {\n Diag(E->getExprLoc(), diag::err_omp_negative_expression_in_clause) << getOpenMPClauseName(CKind) << (StrictlyPositive ? 1 : 0) << E->getSourceRange();"},{m,17293,"OMPClause *Sema::ActOnOpenMPScheduleClause(OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2, OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc, SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {\n // ...\n if (ChunkSize) {\n if (!ChunkSize->isValueDependent() && !ChunkSize->isTypeDependent() && !ChunkSize->isInstantiationDependent() && !ChunkSize->containsUnexpandedParameterPack()) {\n // ...\n // OpenMP [2.7.1, Restrictions]\n // chunk_size must be a loop invariant integer expression with a positive\n // value.\n if (std::optional<llvm::APSInt> Result = ValExpr->getIntegerConstantExpr(Context)) {\n if (Result->isSigned() && !Result->isStrictlyPositive()) {\n Diag(ChunkSizeLoc, diag::err_omp_negative_expression_in_clause) << \"schedule\" << 1 << ChunkSize->getSourceRange();"},{m,22866,"OMPClause *Sema::ActOnOpenMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {\n // ...\n if (ChunkSize) {\n if (!ChunkSize->isValueDependent() && !ChunkSize->isTypeDependent() && !ChunkSize->isInstantiationDependent() && !ChunkSize->containsUnexpandedParameterPack()) {\n // ...\n // OpenMP [2.7.1, Restrictions]\n // chunk_size must be a loop invariant integer expression with a positive\n // value.\n if (std::optional<llvm::APSInt> Result = ValExpr->getIntegerConstantExpr(Context)) {\n if (Result->isSigned() && !Result->isStrictlyPositive()) {\n Diag(ChunkSizeLoc, diag::err_omp_negative_expression_in_clause) << \"dist_schedule\" << ChunkSize->getSourceRange();"}}, [l]={ [Gb]={"clang/test/OpenMP/unroll_messages.cpp:59:30: error: argument to \'partial\' clause must be a strictly positive integer value","clang/test/OpenMP/unroll_messages.cpp:119:30: error: argument to \'partial\' clause must be a strictly positive integer value"} } }, ["err_omp_no_clause_for_directive"]={ [j]={{nil,P,"err_omp_no_clause_for_directive"}}, [b]={{nil,P,"expected at least one %0 clause for \'#pragma omp %1\'"}}, [c]={{nil,P,"expected at least one A clause for \'#pragma omp B\'"}}, [e]=d, [f]="expected at least one (.*?) clause for \'\\#pragma omp (.*?)\'", [g]=a, [i]={{nil,P,n}}, [h]={"95b64a982694",1496160004,"[OPENMP] Allow \'use_device_ptr\' clause in \'target data\' alone.","[OPENMP] Allow \'use_device_ptr\' clause in \'target data\' alone.\n\nAccording to OpenMP 5.0 at least one \'map\' or \'use_device_ptr\' clause\nmust be specified for \'target data\' construct. Patch adds support for\nthis feature.\n\nllvm-svn: 304216"}, [k]={{m,3475,"void Sema::ActOnOpenMPAssumesDirective(SourceLocation Loc, OpenMPDirectiveKind DKind, ArrayRef<std::string> Assumptions, bool SkippedClauses) {\n if (!SkippedClauses && Assumptions.empty())\n Diag(Loc, diag::err_omp_no_clause_for_directive) << llvm::omp::getAllAssumeClauseOptions() << llvm::omp::getOpenMPDirectiveName(DKind);"},{m,13211,"StmtResult Sema::ActOnOpenMPTargetDataDirective(ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc) {\n // ...\n // OpenMP [2.12.2, target data Construct, Restrictions]\n // At least one map, use_device_addr or use_device_ptr clause must appear on\n // the directive.\n if (!hasClauses(Clauses, OMPC_map, OMPC_use_device_ptr) && (LangOpts.OpenMP < 50 || !hasClauses(Clauses, OMPC_use_device_addr))) {\n // ...\n Diag(StartLoc, diag::err_omp_no_clause_for_directive) << Expected << getOpenMPDirectiveName(OMPD_target_data);"},{m,13250,"StmtResult Sema::ActOnOpenMPTargetEnterDataDirective(ArrayRef<OMPClause *> Clauses, SourceLocation StartLoc, SourceLocation EndLoc, Stmt *AStmt) {\n // ...\n // OpenMP [2.10.2, Restrictions, p. 99]\n // At least one map clause must appear on the directive.\n if (!hasClauses(Clauses, OMPC_map)) {\n Diag(StartLoc, diag::err_omp_no_clause_for_directive) << \"\'map\'\" << getOpenMPDirectiveName(OMPD_target_enter_data);"},{m,13287,"StmtResult Sema::ActOnOpenMPTargetExitDataDirective(ArrayRef<OMPClause *> Clauses, SourceLocation StartLoc, SourceLocation EndLoc, Stmt *AStmt) {\n // ...\n // OpenMP [2.10.3, Restrictions, p. 102]\n // At least one map clause must appear on the directive.\n if (!hasClauses(Clauses, OMPC_map)) {\n Diag(StartLoc, diag::err_omp_no_clause_for_directive) << \"\'map\'\" << getOpenMPDirectiveName(OMPD_target_exit_data);"},{m,17571,"StmtResult Sema::ActOnOpenMPInteropDirective(ArrayRef<OMPClause *> Clauses, SourceLocation StartLoc, SourceLocation EndLoc) {\n // OpenMP 5.1 [2.15.1, interop Construct, Restrictions]\n // At least one action-clause must appear on a directive.\n if (!hasClauses(Clauses, OMPC_init, OMPC_use, OMPC_destroy, OMPC_nowait)) {\n // ...\n Diag(StartLoc, diag::err_omp_no_clause_for_directive) << Expected << getOpenMPDirectiveName(OMPD_interop);"}}, [l]={ ["clang/test/OpenMP/target_exit_data_nowait_messages.cpp"]={"clang/test/OpenMP/target_exit_data_nowait_messages.cpp:11:3: error: expected at least one \'map\' clause for \'#pragma omp target exit data\'"} } }, ["err_omp_no_dsa_for_variable"]={ [j]="err_omp_no_dsa_for_variable", [b]="variable %0 must have explicitly specified data sharing attributes", [c]="variable A must have explicitly specified data sharing attributes", [e]=d, [f]="variable (.*?) must have explicitly specified data sharing attributes", [g]=a, [i]=n, [h]={"d4183dabd7a9",1378212952,"OpenMP: Data-sharing attributes analysis and clause \'shared\'","OpenMP: Data-sharing attributes analysis and clause \'shared\'\n\nllvm-svn: 189795"}, [k]={{m,6794,"StmtResult Sema::ActOnOpenMPExecutableDirective(OpenMPDirectiveKind Kind, const DeclarationNameInfo &DirName, OpenMPDirectiveKind CancelRegion, ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc) {\n // ...\n for (const auto &P : VarsWithInheritedDSA) {\n // ...\n if (DSAStack->getDefaultDSA() == DSA_none || DSAStack->getDefaultDSA() == DSA_private || DSAStack->getDefaultDSA() == DSA_firstprivate) {\n Diag(P.second->getExprLoc(), diag::err_omp_no_dsa_for_variable) << P.first << P.second->getSourceRange();"}}, [l]={ ["clang/test/OpenMP/parallel_messages.cpp"]={"clang/test/OpenMP/parallel_messages.cpp:66:7: error: variable \'argc\' must have explicitly specified data sharing attributes","clang/test/OpenMP/parallel_messages.cpp:67:7: error: variable \'a\' must have explicitly specified data sharing attributes"} } }, ["err_omp_no_more_if_clause"]={ [j]="err_omp_no_more_if_clause", [b]="no more \'if\' clause is allowed", [c]="no more \'if\' clause is allowed", [e]=d, [f]="no more \'if\' clause is allowed", [g]=a, [i]=n, [h]={"6b8046addfce",1441265028,"[OPENMP 4.1] Parsing/sema analysis for extended format of \'if\' clause.","[OPENMP 4.1] Parsing/sema analysis for extended format of \'if\' clause.\nOpenMP 4.1 added special \'directive-name-modifier\' to the \'if\' clause.\nFormat of \'if\' clause is as follows:\n```\nif([ directive-name-modifier :] scalar-logical-expression)\n```\n\nThe restriction rules are also changed.\n1. If any \'if\' clause on the directive includes a \'directive-name-modifier\' then all \'if\' clauses on the directive must include a \'directive-name-modifier\'.\n2. At most one \'if\' clause without a \'directive-name-modifier\' can appear on the directive.\n3. At most one \'if\' clause with some particular \'directive-name-modifier\' can appear on the directive.\n\n\'directive-name-modifier\' is important for combined directives and allows to separate conditions in \'if\' clause for simple sub-directives in combined directive. This \'directive-name-modifier\' identifies the sub-directive to which this \'if\' clause must be applied.\n\nllvm-svn: 246747"}, [k]={{m,5294,"static bool checkIfClauses(Sema &S, OpenMPDirectiveKind Kind, ArrayRef<OMPClause *> Clauses, ArrayRef<OpenMPDirectiveKind> AllowedNameModifiers) {\n // ...\n // If any if clause on the directive includes a directive-name-modifier then\n // all if clauses on the directive must include a directive-name-modifier.\n if (FoundNameModifiers[OMPD_unknown] && NamedModifiersNumber > 0) {\n if (NamedModifiersNumber == AllowedNameModifiers.size()) {\n S.Diag(FoundNameModifiers[OMPD_unknown]->getBeginLoc(), diag::err_omp_no_more_if_clause);"}}, [l]={ ["clang/test/OpenMP/target_data_if_messages.cpp"]={"clang/test/OpenMP/target_data_if_messages.cpp:38:61: error: no more \'if\' clause is allowed"} } }, ["err_omp_non_lvalue_in_map_or_motion_clauses"]={ [j]={{nil,o,"err_omp_non_lvalue_in_map_or_motion_clauses"}}, [b]={{nil,o,"expected addressable lvalue in \'%0\' clause"}}, [c]={{nil,o,"expected addressable lvalue in \'A\' clause"}}, [e]=d, [f]="expected addressable lvalue in \'(.*?)\' clause", [g]=a, [i]={{nil,o,n}}, [h]={I,1576908663,H,F}, [k]={{m,21124,"class MapBaseChecker final : public StmtVisitor<MapBaseChecker, bool> {\n // ...\n void emitErrorMsg() {\n // If nothing else worked, this is not a valid map clause expression.\n if (SemaRef.getLangOpts().OpenMP < 50) {\n // ...\n } else {\n SemaRef.Diag(ELoc, diag::err_omp_non_lvalue_in_map_or_motion_clauses) << getOpenMPClauseName(CKind) << ERange;"},{m,21914,"// Check the validity of the provided variable list for the provided clause kind\n// \\a CKind. In the check process the valid expressions, mappable expression\n// components, variables, and user-defined mappers are extracted and used to\n// fill \\a ProcessedVarList, \\a VarComponents, \\a VarBaseDeclarations, and \\a\n// UDMapperList in MVLI. \\a MapType, \\a IsMapTypeImplicit, \\a MapperIdScopeSpec,\n// and \\a MapperId are expected to be valid if the clause kind is \'map\'.\nstatic void checkMappableExpressionList(Sema &SemaRef, DSAStackTy *DSAS, OpenMPClauseKind CKind, MappableVarListInfo &MVLI, SourceLocation StartLoc, CXXScopeSpec &MapperIdScopeSpec, DeclarationNameInfo MapperId, ArrayRef<Expr *> UnresolvedMappers, OpenMPMapClauseKind MapType = OMPC_MAP_unknown, ArrayRef<OpenMPMapModifierKind> Modifiers = std::nullopt, bool IsMapTypeImplicit = false, bool NoDiagnose = false) {\n // ...\n for (Expr *RE : MVLI.VarList) {\n // ...\n if (!RE->isLValue()) {\n if (SemaRef.getLangOpts().OpenMP < 50) {\n // ...\n } else {\n SemaRef.Diag(ELoc, diag::err_omp_non_lvalue_in_map_or_motion_clauses) << getOpenMPClauseName(CKind) << RE->getSourceRange();"}}, [l]={ ["clang/test/OpenMP/target_update_from_messages.cpp"]={"clang/test/OpenMP/target_update_from_messages.cpp:172:32: error: expected addressable lvalue in \'from\' clause","clang/test/OpenMP/target_update_from_messages.cpp:110:32: error: expected addressable lvalue in \'from\' clause","clang/test/OpenMP/target_update_from_messages.cpp:115:32: error: expected addressable lvalue in \'from\' clause","clang/test/OpenMP/target_update_from_messages.cpp:110:32: error: expected addressable lvalue in \'from\' clause","clang/test/OpenMP/target_update_from_messages.cpp:115:32: error: expected addressable lvalue in \'from\' clause"} } }, ["err_omp_non_pointer_type_array_shaping_base"]={ [j]={{nil,o,"err_omp_non_pointer_type_array_shaping_base"}}, [b]={{nil,o,"expected expression with a pointer to a complete type as a base of an array shaping operation"}}, [c]={{nil,o,"expected expression with a pointer to a complete type as a base of an array shaping operation"}}, [e]=d, [f]="expected expression with a pointer to a complete type as a base of an array shaping operation", [g]=a, [i]={{nil,o,n}}, [h]={I,1576908663,H,F}, [k]={{N,5475,"ExprResult Sema::ActOnOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc, SourceLocation RParenLoc, ArrayRef<Expr *> Dims, ArrayRef<SourceRange> Brackets) {\n // ...\n if (!BaseTy->isPointerType() || (!Base->isTypeDependent() && BaseTy->getPointeeType()->isIncompleteType()))\n return ExprError(Diag(Base->getExprLoc(), diag::err_omp_non_pointer_type_array_shaping_base) << Base->getSourceRange());"}}, [l]={ [Eb]={"clang/test/OpenMP/task_affinity_messages.cpp:59:34: error: expected expression with a pointer to a complete type as a base of an array shaping operation","clang/test/OpenMP/task_affinity_messages.cpp:60:34: error: expected expression with a pointer to a complete type as a base of an array shaping operation"} } }, ["err_omp_nonpredefined_allocator_without_traits"]={ [j]={{nil,o,"err_omp_nonpredefined_allocator_without_traits"}}, [b]={{nil,o,"non-predefined allocator must have traits specified"}}, [c]={{nil,o,"non-predefined allocator must have traits specified"}}, [e]=d, [f]="non\\-predefined allocator must have traits specified", [g]=a, [i]={{nil,o,n}}, [h]={I,1576908663,H,F}, [k]={{m,23923,"OMPClause *Sema::ActOnOpenMPUsesAllocatorClause(SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc, ArrayRef<UsesAllocatorsData> Data) {\n // ...\n for (const UsesAllocatorsData &D : Data) {\n // ...\n // Check allocator expression.\n if (D.Allocator->isTypeDependent()) {\n // ...\n } else {\n // ...\n // OpenMP [2.12.5, target Construct]\n // Non-predefined allocators appearing in a uses_allocators clause must\n // have traits specified.\n if (!IsPredefinedAllocator && !D.AllocatorTraits) {\n Diag(D.Allocator->getExprLoc(), diag::err_omp_nonpredefined_allocator_without_traits);"}}, [l]={ ["clang/test/OpenMP/target_uses_allocators_messages.cpp"]={"clang/test/OpenMP/target_uses_allocators_messages.cpp:39:36: error: non-predefined allocator must have traits specified","clang/test/OpenMP/target_uses_allocators_messages.cpp:41:36: error: non-predefined allocator must have traits specified","clang/test/OpenMP/target_uses_allocators_messages.cpp:43:36: error: non-predefined allocator must have traits specified"} } }, ["err_omp_not_for"]={ [j]="err_omp_not_for", [b]="%select{statement after \'#pragma omp %1\' must be a for loop|expected %2 for loops after \'#pragma omp %1\'%select{|, but found only %4}3}0", [c]={{nil,nil,{{"statement after \'#pragma omp B\' must be a for loop",{"expected C for loops after \'#pragma omp B\'",{a,", but found only E"}}}}}}, [e]=d, [f]="(?:statement after \'\\#pragma omp (.*?)\' must be a for loop|expected (.*?) for loops after \'\\#pragma omp (.*?)\'(?:|, but found only (.*?)))", [g]=a, [i]=n, [h]={"1b59ab568333",1393489752,"[OPENMP] First changes for Parsing and Sema for \'omp simd\' directive support","[OPENMP] First changes for Parsing and Sema for \'omp simd\' directive support\n\nllvm-svn: 202360"}, [k]={{m,9205,"/// Called on a for stmt to check and extract its iteration space\n/// for further processing (such as collapsing).\nstatic bool checkOpenMPIterationSpace(OpenMPDirectiveKind DKind, Stmt *S, Sema &SemaRef, DSAStackTy &DSA, unsigned CurrentNestedLoopCount, unsigned NestedLoopCount, unsigned TotalNestedLoopCount, Expr *CollapseLoopCountExpr, Expr *OrderedLoopCountExpr, Sema::VarsWithInheritedDSAType &VarsWithImplicitDSA, llvm::MutableArrayRef<LoopIterationSpace> ResultIterSpaces, llvm::MapVector<const Expr *, DeclRefExpr *> &Captures) {\n // ...\n // Ranged for is supported only in OpenMP 5.0.\n if (!For && (SemaRef.LangOpts.OpenMP <= 45 || !CXXFor)) {\n SemaRef.Diag(S->getBeginLoc(), diag::err_omp_not_for) << (CollapseLoopCountExpr != nullptr || OrderedLoopCountExpr != nullptr) << getOpenMPDirectiveName(DKind) << TotalNestedLoopCount << (CurrentNestedLoopCount > 0) << CurrentNestedLoopCount;"}}, [l]={ [Gb]={"clang/test/OpenMP/unroll_messages.cpp:6:3: error: statement after \'#pragma omp unroll\' must be a for loop","clang/test/OpenMP/unroll_messages.cpp:10:5: error: statement after \'#pragma omp unroll\' must be a for loop","clang/test/OpenMP/unroll_messages.cpp:88:3: error: statement after \'#pragma omp for\' must be a for loop","clang/test/OpenMP/unroll_messages.cpp:93:3: error: statement after \'#pragma omp for\' must be a for loop","clang/test/OpenMP/unroll_messages.cpp:98:3: error: statement after \'#pragma omp unroll\' must be a for loop","clang/test/OpenMP/unroll_messages.cpp:103:3: error: statement after \'#pragma omp tile\' must be a for loop","clang/test/OpenMP/unroll_messages.cpp:110:5: error: expected 2 for loops after \'#pragma omp for\', but found only 1"} } }, ["err_omp_not_integral"]={ [j]="err_omp_not_integral", [b]="expression must have integral or unscoped enumeration type, not %0", [c]="expression must have integral or unscoped enumeration type, not A", [e]=d, [f]="expression must have integral or unscoped enumeration type, not (.*?)", [g]=a, [i]=n, [h]={"568a833f68de",1394086519,"[OPENMP] Clause \'num_threads\'","[OPENMP] Clause \'num_threads\'\n\nllvm-svn: 203087"}, [k]={{m,16393,"ExprResult Sema::PerformOpenMPImplicitIntegerConversion(SourceLocation Loc, Expr *Op) {\n // ...\n class IntConvertDiagnoser : public ICEConvertDiagnoser {\n // ...\n SemaDiagnosticBuilder diagnoseNotInt(Sema &S, SourceLocation Loc, QualType T) override { return S.Diag(Loc, diag::err_omp_not_integral) << T; }"}}, [l]={ ["clang/test/OpenMP/teams_num_teams_messages.cpp"]={"clang/test/OpenMP/teams_num_teams_messages.cpp:58:29: error: expression must have integral or unscoped enumeration type, not \'double\'","clang/test/OpenMP/teams_num_teams_messages.cpp:87:30: error: expression must have integral or unscoped enumeration type, not \'char *\'","clang/test/OpenMP/teams_num_teams_messages.cpp:111:30: error: expression must have integral or unscoped enumeration type, not \'double\'","clang/test/OpenMP/teams_num_teams_messages.cpp:40:29: error: expression must have integral or unscoped enumeration type, not \'char *\'","clang/test/OpenMP/teams_num_teams_messages.cpp:58:29: error: expression must have integral or unscoped enumeration type, not \'double\'"} } }, ["err_omp_not_resolved_reduction_identifier"]={ [j]="err_omp_not_resolved_reduction_identifier", [b]="unable to resolve declare reduction construct for type %0", [c]="unable to resolve declare reduction construct for type A", [e]=d, [f]="unable to resolve declare reduction construct for type (.*?)", [g]=a, [i]=n, [h]={"a839dddf9232",1458209986,"[OPENMP 4.0] Use \'declare reduction\' constructs in \'reduction\' clauses.","[OPENMP 4.0] Use \'declare reduction\' constructs in \'reduction\' clauses.\n\nOpenMP 4.0 allows to define custom reduction operations using \'#pragma\nomp declare reduction\' construct. Patch allows to use this custom\ndefined reduction operations in \'reduction\' clauses.\n\nllvm-svn: 263701"}, [k]={{m,18982,"static ExprResult buildDeclareReductionRef(Sema &SemaRef, SourceLocation Loc, SourceRange Range, Scope *S, CXXScopeSpec &ReductionIdScopeSpec, const DeclarationNameInfo &ReductionId, QualType Ty, CXXCastPath &BasePath, Expr *UnresolvedReduction) {\n // ...\n if (ReductionIdScopeSpec.isSet()) {\n SemaRef.Diag(Loc, diag::err_omp_not_resolved_reduction_identifier) << Ty << Range;"}}, [l]={ ["clang/test/OpenMP/declare_reduction_messages.cpp"]={"clang/test/OpenMP/declare_reduction_messages.cpp:151:65: error: unable to resolve declare reduction construct for type \'A\'"} } }, ["err_omp_nowait_clause_without_depend"]={ [j]={{nil,w,"err_omp_nowait_clause_without_depend"}}, [b]={{nil,w,"directive \'#pragma omp taskwait\' cannot use \'nowait\' clause without \'depend\' clause"}}, [c]={{nil,w,"directive \'#pragma omp taskwait\' cannot use \'nowait\' clause without \'depend\' clause"}}, [e]=d, [f]="directive \'\\#pragma omp taskwait\' cannot use \'nowait\' clause without \'depend\' clause", [g]=a, [i]={{nil,w,n}}, [h]={"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"}, [k]={{m,11187,"StmtResult Sema::ActOnOpenMPTaskwaitDirective(ArrayRef<OMPClause *> Clauses, SourceLocation StartLoc, SourceLocation EndLoc) {\n // ...\n if (NowaitC && !HasDependC) {\n Diag(StartLoc, diag::err_omp_nowait_clause_without_depend);"}} }, ["err_omp_once_referenced"]={ [j]="err_omp_once_referenced", [b]="variable can appear only once in OpenMP \'%0\' clause", [c]="variable can appear only once in OpenMP \'A\' clause", [e]=d, [f]="variable can appear only once in OpenMP \'(.*?)\' clause", [g]=a, [i]=n, [h]={"c5e025831ba7",1402902515,"[OPENMP] Initial support of \'reduction\' clause","[OPENMP] Initial support of \'reduction\' clause\n\nllvm-svn: 211007"}, [k]={{m,19365,"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 // ...\n if (DVar.CKind == OMPC_reduction) {\n S.Diag(ELoc, diag::err_omp_once_referenced) << getOpenMPClauseName(ClauseKind);"}}, [l]={ ["clang/test/OpenMP/taskloop_reduction_messages_attr.cpp"]={"clang/test/OpenMP/taskloop_reduction_messages_attr.cpp:287:61: error: variable can appear only once in OpenMP \'reduction\' clause","clang/test/OpenMP/taskloop_reduction_messages_attr.cpp:182:61: error: variable can appear only once in OpenMP \'reduction\' clause","clang/test/OpenMP/taskloop_reduction_messages_attr.cpp:182:61: error: variable can appear only once in OpenMP \'reduction\' clause"} } }, ["err_omp_once_referenced_in_target_update"]={ [j]="err_omp_once_referenced_in_target_update", [b]="variable can appear only once in OpenMP \'target update\' construct", [c]="variable can appear only once in OpenMP \'target update\' construct", [e]=d, [f]="variable can appear only once in OpenMP \'target update\' construct", [g]=a, [i]=n, [h]={"661c0904e144",1464284398,"[OpenMP] Parsing and sema support for the to clause","[OpenMP] Parsing and sema support for the to clause\n\nSummary:\nThe patch contains the parsing and sema support for the `to` clause. \n\nPatch based on the original post by Kelvin Li.\n\nReviewers: carlo.bertolli, hfinkel, kkwli0, arpith-jacob, ABataev\n\nSubscribers: caomhin, cfe-commits\n\nDifferential Revision: http://reviews.llvm.org/D18597\n\nllvm-svn: 270880"}, [k]={{m,21560,"// Return true if expression E associated with value VD has conflicts with other\n// map information.\nstatic bool checkMapConflicts(Sema &SemaRef, DSAStackTy *DSAS, const ValueDecl *VD, const Expr *E, bool CurrentRegionOnly, OMPClauseMappableExprCommon::MappableExprComponentListRef CurComponents, OpenMPClauseKind CKind) {\n // ...\n bool FoundError = DSAS->checkMappableExprComponentListsForDecl(VD, CurrentRegionOnly, [&IsEnclosedByDataEnvironmentExpr, &SemaRef, VD, CurrentRegionOnly, ELoc, ERange, CKind, &EnclosingExpr, CurComponents](OMPClauseMappableExprCommon::MappableExprComponentListRef StackComponents, OpenMPClauseKind Kind) {\n // ...\n // OpenMP 4.5 [2.15.5.1, map Clause, Restrictions, p.4]\n // List items of map clauses in the same construct must not share\n // original storage.\n //\n // If the expressions are exactly the same or one is a subset of the\n // other, it means they are sharing storage.\n if (CI == CE && SI == SE) {\n if (CurrentRegionOnly) {\n if (CKind == OMPC_map) {\n // ...\n } else {\n // ...\n SemaRef.Diag(ELoc, diag::err_omp_once_referenced_in_target_update) << ERange;"},{m,21647,"// Return true if expression E associated with value VD has conflicts with other\n// map information.\nstatic bool checkMapConflicts(Sema &SemaRef, DSAStackTy *DSAS, const ValueDecl *VD, const Expr *E, bool CurrentRegionOnly, OMPClauseMappableExprCommon::MappableExprComponentListRef CurComponents, OpenMPClauseKind CKind) {\n // ...\n bool FoundError = DSAS->checkMappableExprComponentListsForDecl(VD, CurrentRegionOnly, [&IsEnclosedByDataEnvironmentExpr, &SemaRef, VD, CurrentRegionOnly, ELoc, ERange, CKind, &EnclosingExpr, CurComponents](OMPClauseMappableExprCommon::MappableExprComponentListRef StackComponents, OpenMPClauseKind Kind) {\n // ...\n // OpenMP 4.5 [2.15.5.1, map Clause, Restrictions, p.4]\n // List items of map clauses in the same construct must not share\n // original storage.\n //\n // An expression is a subset of the other.\n if (CurrentRegionOnly && (CI == CE || SI == SE)) {\n if (CKind == OMPC_map) {\n // ...\n } else {\n // ...\n SemaRef.Diag(ELoc, diag::err_omp_once_referenced_in_target_update) << ERange;"}}, [l]={ ["clang/test/OpenMP/target_update_from_messages.cpp"]={"clang/test/OpenMP/target_update_from_messages.cpp:177:39: error: variable can appear only once in OpenMP \'target update\' construct","clang/test/OpenMP/target_update_from_messages.cpp:178:41: error: variable can appear only once in OpenMP \'target update\' construct","clang/test/OpenMP/target_update_from_messages.cpp:121:39: error: variable can appear only once in OpenMP \'target update\' construct","clang/test/OpenMP/target_update_from_messages.cpp:122:41: error: variable can appear only once in OpenMP \'target update\' construct","clang/test/OpenMP/target_update_from_messages.cpp:121:39: error: variable can appear only once in OpenMP \'target update\' construct","clang/test/OpenMP/target_update_from_messages.cpp:122:41: error: variable can appear only once in OpenMP \'target update\' construct"} } }, ["err_omp_one_defaultmap_each_category"]={ [j]={{nil,p,"err_omp_one_defaultmap_each_category"}}, [b]={{nil,p,"at most one defaultmap clause for each variable-category can appear on the directive"}}, [c]={{nil,p,"at most one defaultmap clause for each variable-category can appear on the directive"}}, [e]=d, [f]="at most one defaultmap clause for each variable\\-category can appear on the directive", [g]=a, [i]={{nil,p,n}}, [h]={xb,1573050950,Cb,yb}, [k]={{m,22956,"OMPClause *Sema::ActOnOpenMPDefaultmapClause(OpenMPDefaultmapClauseModifier M, OpenMPDefaultmapClauseKind Kind, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation MLoc, SourceLocation KindLoc, SourceLocation EndLoc) {\n if (getLangOpts().OpenMP < 50) {\n // ...\n } else {\n // ...\n // OpenMP [5.0, 2.12.5, Restrictions, p. 174]\n // At most one defaultmap clause for each category can appear on the\n // directive.\n if (DSAStack->checkDefaultmapCategory(Kind)) {\n Diag(StartLoc, diag::err_omp_one_defaultmap_each_category);"}}, [l]={ ["clang/test/OpenMP/target_defaultmap_messages.cpp"]={"clang/test/OpenMP/target_defaultmap_messages.cpp:49:48: error: at most one defaultmap clause for each variable-category can appear on the directive","clang/test/OpenMP/target_defaultmap_messages.cpp:56:48: error: at most one defaultmap clause for each variable-category can appear on the directive","clang/test/OpenMP/target_defaultmap_messages.cpp:58:71: error: at most one defaultmap clause for each variable-category can appear on the directive","clang/test/OpenMP/target_defaultmap_messages.cpp:112:47: error: at most one defaultmap clause for each variable-category can appear on the directive","clang/test/OpenMP/target_defaultmap_messages.cpp:116:48: error: at most one defaultmap clause for each variable-category can appear on the directive","clang/test/OpenMP/target_defaultmap_messages.cpp:118:70: error: at most one defaultmap clause for each variable-category can appear on the directive"} } }, ["err_omp_ordered_directive_with_param"]={ [j]="err_omp_ordered_directive_with_param", [b]="\'ordered\' directive %select{without any clauses|with \'threads\' clause}0 cannot be closely nested inside ordered region with specified parameter", [c]={{nil,nil,{"\'ordered\' directive ",{"without any clauses","with \'threads\' clause"}," cannot be closely nested inside ordered region with specified parameter"}}}, [e]=d, [f]="\'ordered\' directive (?:without any clauses|with \'threads\' clause) cannot be closely nested inside ordered region with specified parameter", [g]=a, [i]=n, [h]={"346265e3bcee",1443177432,"[OPENMP 4.1] Add \'threads\' clause for \'#pragma omp ordered\'.","[OPENMP 4.1] Add \'threads\' clause for \'#pragma omp ordered\'.\nOpenMP 4.1 extends format of \'#pragma omp ordered\'. It adds 3 additional clauses: \'threads\', \'simd\' and \'depend\'.\nIf no clause is specified, the ordered construct behaves as if the threads clause had been specified. If the threads clause is specified, the threads in the team executing the loop region execute ordered regions sequentially in the order of the loop iterations.\nThe loop region to which an ordered region without any clause or with a threads clause binds must have an ordered clause without the parameter specified on the corresponding loop directive.\n\nllvm-svn: 248569"}, [k]={{m,11382,"StmtResult Sema::ActOnOpenMPOrderedDirective(ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc) {\n // ...\n if (!ErrorFound && !SC && isOpenMPSimdDirective(DSAStack->getParentDirective())) {\n // ...\n } else if ((DependFound || DoacrossFound) && (TC || SC)) {\n // ...\n } else if ((DependFound || DoacrossFound) && !DSAStack->getParentOrderedRegionParam().first) {\n // ...\n } else if (TC || Clauses.empty()) {\n if (const Expr *Param = DSAStack->getParentOrderedRegionParam().first) {\n // ...\n Diag(ErrLoc, diag::err_omp_ordered_directive_with_param) << (TC != nullptr);"}}, [l]={ [Bb]={"clang/test/OpenMP/ordered_messages.cpp:56:5: error: \'ordered\' directive without any clauses cannot be closely nested inside ordered region with specified parameter","clang/test/OpenMP/ordered_messages.cpp:63:25: error: \'ordered\' directive with \'threads\' clause cannot be closely nested inside ordered region with specified parameter","clang/test/OpenMP/ordered_messages.cpp:189:1: error: \'ordered\' directive without any clauses cannot be closely nested inside ordered region with specified parameter","clang/test/OpenMP/ordered_messages.cpp:190:1: error: \'ordered\' directive without any clauses cannot be closely nested inside ordered region with specified parameter","clang/test/OpenMP/ordered_messages.cpp:206:1: error: \'ordered\' directive without any clauses cannot be closely nested inside ordered region with specified parameter","clang/test/OpenMP/ordered_messages.cpp:263:5: error: \'ordered\' directive without any clauses cannot be closely nested inside ordered region with specified parameter","clang/test/OpenMP/ordered_messages.cpp:270:25: error: \'ordered\' directive with \'threads\' clause cannot be closely nested inside ordered region with specified parameter","clang/test/OpenMP/ordered_messages.cpp:368:1: error: \'ordered\' directive without any clauses cannot be closely nested inside ordered region with specified parameter","clang/test/OpenMP/ordered_messages.cpp:369:1: error: \'ordered\' directive without any clauses cannot be closely nested inside ordered region with specified parameter","clang/test/OpenMP/ordered_messages.cpp:385:1: error: \'ordered\' directive without any clauses cannot be closely nested inside ordered region with specified parameter"} } }, ["err_omp_ordered_directive_without_param"]={ [j]="err_omp_ordered_directive_without_param", [b]="\'ordered\' directive with \'%0\' clause cannot be closely nested inside ordered region without specified parameter", [c]="\'ordered\' directive with \'A\' clause cannot be closely nested inside ordered region without specified parameter", [e]=d, [f]="\'ordered\' directive with \'(.*?)\' clause cannot be closely nested inside ordered region without specified parameter", [g]=a, [i]=n, [h]={"eb4823503331",1450415156,"[OPENMP 4.5] Parsing/sema analysis for \'depend(source)\' clause in \'ordered\' directive.","[OPENMP 4.5] Parsing/sema analysis for \'depend(source)\' clause in \'ordered\' directive.\nOpenMP 4.5 adds \'depend(source)\' clause for \'ordered\' directive to support cross-iteration dependence. Patch adds parsing and semantic analysis for this construct.\n\nllvm-svn: 255986"}, [k]={{m,11376,"StmtResult Sema::ActOnOpenMPOrderedDirective(ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc) {\n // ...\n if (!ErrorFound && !SC && isOpenMPSimdDirective(DSAStack->getParentDirective())) {\n // ...\n } else if ((DependFound || DoacrossFound) && (TC || SC)) {\n // ...\n } else if ((DependFound || DoacrossFound) && !DSAStack->getParentOrderedRegionParam().first) {\n // ...\n Diag(Loc, diag::err_omp_ordered_directive_without_param) << getOpenMPClauseName(DependFound ? OMPC_depend : OMPC_doacross);"}}, [l]={ [Bb]={"clang/test/OpenMP/ordered_messages.cpp:147:25: error: \'ordered\' directive with \'depend\' clause cannot be closely nested inside ordered region without specified parameter","clang/test/OpenMP/ordered_messages.cpp:148:25: error: \'ordered\' directive with \'depend\' clause cannot be closely nested inside ordered region without specified parameter","clang/test/OpenMP/ordered_messages.cpp:223:21: error: \'ordered\' directive with \'depend\' clause cannot be closely nested inside ordered region without specified parameter","clang/test/OpenMP/ordered_messages.cpp:224:21: error: \'ordered\' directive with \'depend\' clause cannot be closely nested inside ordered region without specified parameter","clang/test/OpenMP/ordered_messages.cpp:330:25: error: \'ordered\' directive with \'depend\' clause cannot be closely nested inside ordered region without specified parameter","clang/test/OpenMP/ordered_messages.cpp:331:25: error: \'ordered\' directive with \'depend\' clause cannot be closely nested inside ordered region without specified parameter"} } }, ["err_omp_ordered_simd"]={ [j]="err_omp_ordered_simd", [b]="\'ordered\' clause with a parameter can not be specified in \'#pragma omp %0\' directive", [c]="\'ordered\' clause with a parameter can not be specified in \'#pragma omp A\' directive", [e]=d, [f]="\'ordered\' clause with a parameter can not be specified in \'\\#pragma omp (.*?)\' directive", [g]=a, [i]=n, [h]={"113438cd5cc3",1451477183,"[OPENMP 4.5] Allow \'ordered\' clause on \'loop simd\' constructs.","[OPENMP 4.5] Allow \'ordered\' clause on \'loop simd\' constructs.\nOpenMP 4.5 allows to use \'ordered\' clause without parameter on \'loop simd\' constructs.\n\nllvm-svn: 256639"}, [k]={{m,4880,"StmtResult Sema::ActOnOpenMPRegionEnd(StmtResult S, ArrayRef<OMPClause *> Clauses) {\n // ...\n if (isOpenMPWorksharingDirective(DSAStack->getCurrentDirective()) && isOpenMPSimdDirective(DSAStack->getCurrentDirective()) && OC && OC->getNumForLoops()) {\n Diag(OC->getBeginLoc(), diag::err_omp_ordered_simd) << getOpenMPDirectiveName(DSAStack->getCurrentDirective());"}}, [l]={ ["clang/test/OpenMP/parallel_for_simd_messages.cpp"]={"clang/test/OpenMP/parallel_for_simd_messages.cpp:98:31: error: \'ordered\' clause with a parameter can not be specified in \'#pragma omp parallel for simd\' directive"} } }, ["err_omp_original_storage_is_shared_and_does_not_contain"]={ [j]="err_omp_original_storage_is_shared_and_does_not_contain", [b]="original storage of expression in data environment is shared but data environment do not fully contain mapped expression storage", [c]="original storage of expression in data environment is shared but data environment do not fully contain mapped expression storage", [e]=d, [f]="original storage of expression in data environment is shared but data environment do not fully contain mapped expression storage", [g]=a, [i]=n, [h]={"5de996e3bd79",1453494096,"[OpenMP] Update map clause SEMA to support OpenMP 4.5 possible list items.","[OpenMP] Update map clause SEMA to support OpenMP 4.5 possible list items.\n\nSummary:\nExtend support in the map clause SEMA for the expressions supported in the OpenMP 4.5 specification, namely member expressions. \n\nFix some bugs in the previous implementation of SEMA related with expressions that do not consist of single variable references.\n\nFix bug in parsing when the expression in the map clause do not start with an identifier: accept any expression in the map clause and check for validity in SEMA instead of just ignoring it.\n\nReviewers: hfinkel, kkwli0, arpith-jacob, carlo.bertolli, ABataev\n\nSubscribers: cfe-commits, fraggamuffin, caomhin\n\nDifferential Revision: http://reviews.llvm.org/D16385\n\nllvm-svn: 258543"}, [k]={{m,21684,"// Return true if expression E associated with value VD has conflicts with other\n// map information.\nstatic bool checkMapConflicts(Sema &SemaRef, DSAStackTy *DSAS, const ValueDecl *VD, const Expr *E, bool CurrentRegionOnly, OMPClauseMappableExprCommon::MappableExprComponentListRef CurComponents, OpenMPClauseKind CKind) {\n // ...\n // OpenMP 4.5 [2.15.5.1, map Clause, Restrictions, p.5]\n // If any part of the original storage of a list item has corresponding\n // storage in the device data environment, all of the original storage must\n // have corresponding storage in the device data environment.\n // OpenMP 4.5 [2.15.5.1, map Clause, Restrictions, p.6]\n // If a list item is an element of a structure, and a different element of\n // the structure has a corresponding list item in the device data environment\n // prior to a task encountering the construct associated with the map clause,\n // then the list item must also have a corresponding list item in the device\n // data environment prior to the task encountering the construct.\n //\n if (EnclosingExpr && !IsEnclosedByDataEnvironmentExpr) {\n SemaRef.Diag(ELoc, diag::err_omp_original_storage_is_shared_and_does_not_contain) << ERange;"}}, [l]={ ["clang/test/OpenMP/target_teams_map_messages.cpp"]={"clang/test/OpenMP/target_teams_map_messages.cpp:303:36: error: original storage of expression in data environment is shared but data environment do not fully contain mapped expression storage"} } }, ["err_omp_orphaned_device_directive"]={ [j]="err_omp_orphaned_device_directive", [b]={{nil,o,"orphaned \'omp %0\' directives are prohibited; perhaps you forget to enclose the directive into a %select{|||target |teams|for, simd, for simd, parallel for, or parallel for simd }1region?"},{p,nil,"orphaned \'omp %0\' directives are prohibited; perhaps you forget to enclose the directive into a %select{|||target |teams }1region?"}}, [c]={{nil,o,{"orphaned \'omp A\' directives are prohibited; perhaps you forget to enclose the directive into a ",{a,a,a,"target ","teams","for, simd, for simd, parallel for, or parallel for simd "},"region?"}},{p,nil,{"orphaned \'omp A\' directives are prohibited; perhaps you forget to enclose the directive into a ",{a,a,a,"target ","teams "},"region?"}}}, [e]=d, [f]="orphaned \'omp (.*?)\' directives are prohibited; perhaps you forget to enclose the directive into a (?:|||target |teams|for, simd, for simd, parallel for, or parallel for simd )region\\?", [g]=a, [i]=n, [h]={"2b51f7284b29",1469507570,"[OpenMP] diagnose orphaned teams construct","[OpenMP] diagnose orphaned teams construct\n\nThe OpenMP spec mandates that \'a teams construct must be contained within a \ntarget construct\'. Currently, this scenario is not diagnosed. This patch is \nto add check for orphaned teams construct and issue an error message.\n\nDifferential Revision: https://reviews.llvm.org/D22785\n\nllvm-svn: 276726"}, [k]={{m,5235,"static bool checkNestingOfRegions(Sema &SemaRef, const DSAStackTy *Stack, OpenMPDirectiveKind CurrentRegion, const DeclarationNameInfo &CurrentName, OpenMPDirectiveKind CancelRegion, OpenMPBindClauseKind BindKind, SourceLocation StartLoc) {\n if (Stack->getCurScope()) {\n // ...\n if (NestingProhibited) {\n if (OrphanSeen) {\n SemaRef.Diag(StartLoc, diag::err_omp_orphaned_device_directive) << getOpenMPDirectiveName(CurrentRegion) << Recommend;"},{m,11285,"StmtResult Sema::ActOnOpenMPScanDirective(ArrayRef<OMPClause *> Clauses, SourceLocation StartLoc, SourceLocation EndLoc) {\n // ...\n // Check that scan directive is used in the scopeof the OpenMP loop body.\n if (Scope *S = DSAStack->getCurScope()) {\n // ...\n if (!ParentS || ParentS->getParent() != ParentS->getBreakParent() || !ParentS->getBreakParent()->isOpenMPLoopScope())\n return StmtError(Diag(StartLoc, diag::err_omp_orphaned_device_directive) << getOpenMPDirectiveName(OMPD_scan) << 5);"}}, [l]={ ["clang/test/OpenMP/cancel_messages.cpp"]={"clang/test/OpenMP/cancel_messages.cpp:13:1: error: orphaned \'omp cancel\' directives are prohibited; perhaps you forget to enclose the directive into a region?","clang/test/OpenMP/cancel_messages.cpp:19:1: error: orphaned \'omp cancel\' directives are prohibited; perhaps you forget to enclose the directive into a region?","clang/test/OpenMP/cancel_messages.cpp:20:1: error: orphaned \'omp cancel\' directives are prohibited; perhaps you forget to enclose the directive into a region?","clang/test/OpenMP/cancel_messages.cpp:21:1: error: orphaned \'omp cancel\' directives are prohibited; perhaps you forget to enclose the directive into a region?","clang/test/OpenMP/cancel_messages.cpp:22:1: error: orphaned \'omp cancel\' directives are prohibited; perhaps you forget to enclose the directive into a region?","clang/test/OpenMP/cancel_messages.cpp:24:1: error: orphaned \'omp cancel\' directives are prohibited; perhaps you forget to enclose the directive into a region?","clang/test/OpenMP/cancel_messages.cpp:51:1: error: orphaned \'omp cancel\' directives are prohibited; perhaps you forget to enclose the directive into a region?","clang/test/OpenMP/cancel_messages.cpp:53:1: error: orphaned \'omp cancel\' directives are prohibited; perhaps you forget to enclose the directive into a region?","clang/test/OpenMP/cancel_messages.cpp:56:1: error: orphaned \'omp cancel\' directives are prohibited; perhaps you forget to enclose the directive into a region?","clang/test/OpenMP/cancel_messages.cpp:60:1: error: orphaned \'omp cancel\' directives are prohibited; perhaps you forget to enclose the directive into a region?","clang/test/OpenMP/cancel_messages.cpp:63:1: error: orphaned \'omp cancel\' directives are prohibited; perhaps you forget to enclose the directive into a region?","clang/test/OpenMP/cancel_messages.cpp:66:1: error: orphaned \'omp cancel\' directives are prohibited; perhaps you forget to enclose the directive into a region?","clang/test/OpenMP/cancel_messages.cpp:69:1: error: orphaned \'omp cancel\' directives are prohibited; perhaps you forget to enclose the directive into a region?","clang/test/OpenMP/cancel_messages.cpp:72:1: error: orphaned \'omp cancel\' directives are prohibited; perhaps you forget to enclose the directive into a region?","clang/test/OpenMP/cancel_messages.cpp:74:1: error: orphaned \'omp cancel\' directives are prohibited; perhaps you forget to enclose the directive into a region?","clang/test/OpenMP/cancel_messages.cpp:77:1: error: orphaned \'omp cancel\' directives are prohibited; perhaps you forget to enclose the directive into a region?","clang/test/OpenMP/cancel_messages.cpp:81:1: error: orphaned \'omp cancel\' directives are prohibited; perhaps you forget to enclose the directive into a region?","clang/test/OpenMP/cancel_messages.cpp:83:1: error: orphaned \'omp cancel\' directives are prohibited; perhaps you forget to enclose the directive into a region?","clang/test/OpenMP/cancel_messages.cpp:86:1: error: orphaned \'omp cancel\' directives are prohibited; perhaps you forget to enclose the directive into a region?","clang/test/OpenMP/cancel_messages.cpp:88:1: error: orphaned \'omp cancel\' directives are prohibited; perhaps you forget to enclose the directive into a region?"} } }, ["err_omp_orphaned_section_directive"]={ [j]="err_omp_orphaned_section_directive", [b]="%select{orphaned \'omp section\' directives are prohibited, it|\'omp section\' directive}0 must be closely nested to a sections region%select{|, not a %1 region}0", [c]={{nil,nil,{{"orphaned \'omp section\' directives are prohibited, it","\'omp section\' directive"}," must be closely nested to a sections region",{a,", not a B region"}}}}, [e]=d, [f]="(?:orphaned \'omp section\' directives are prohibited, it|\'omp section\' directive) must be closely nested to a sections region(?:|, not a (.*?) region)", [g]=a, [i]=n, [h]={"1e0498a92d6e",1403770918,"[OPENMP] Initial parsing and sema analysis for \'section\' directive.","[OPENMP] Initial parsing and sema analysis for \'section\' directive.\n\nllvm-svn: 211767"}, [k]={{m,5028,"static bool checkNestingOfRegions(Sema &SemaRef, const DSAStackTy *Stack, OpenMPDirectiveKind CurrentRegion, const DeclarationNameInfo &CurrentName, OpenMPDirectiveKind CancelRegion, OpenMPBindClauseKind BindKind, SourceLocation StartLoc) {\n if (Stack->getCurScope()) {\n // ...\n if (CurrentRegion == OMPD_section) {\n // OpenMP [2.7.2, sections Construct, Restrictions]\n // Orphaned section directives are prohibited. That is, the section\n // directives must appear within the sections construct and must not be\n // encountered elsewhere in the sections region.\n if (ParentRegion != OMPD_sections && ParentRegion != OMPD_parallel_sections) {\n SemaRef.Diag(StartLoc, diag::err_omp_orphaned_section_directive) << (ParentRegion != OMPD_unknown) << getOpenMPDirectiveName(ParentRegion);"}}, [l]={ ["clang/test/OpenMP/nesting_of_regions.cpp"]={"clang/test/OpenMP/nesting_of_regions.cpp:35:1: error: \'omp section\' directive must be closely nested to a sections region, not a parallel region","clang/test/OpenMP/nesting_of_regions.cpp:545:1: error: \'omp section\' directive must be closely nested to a sections region, not a for region","clang/test/OpenMP/nesting_of_regions.cpp:1353:1: error: orphaned \'omp section\' directives are prohibited, it must be closely nested to a sections region","clang/test/OpenMP/nesting_of_regions.cpp:1407:1: error: \'omp section\' directive must be closely nested to a sections region, not a section region","clang/test/OpenMP/nesting_of_regions.cpp:2592:1: error: \'omp section\' directive must be closely nested to a sections region, not a parallel for region","clang/test/OpenMP/nesting_of_regions.cpp:3947:1: error: \'omp section\' directive must be closely nested to a sections region, not a task region","clang/test/OpenMP/nesting_of_regions.cpp:4790:1: error: \'omp section\' directive must be closely nested to a sections region, not a target region","clang/test/OpenMP/nesting_of_regions.cpp:5024:1: error: \'omp section\' directive must be closely nested to a sections region, not a target parallel region","clang/test/OpenMP/nesting_of_regions.cpp:5266:1: error: \'omp section\' directive must be closely nested to a sections region, not a target parallel for region","clang/test/OpenMP/nesting_of_regions.cpp:5536:1: error: \'omp section\' directive must be closely nested to a sections region, not a teams region","clang/test/OpenMP/nesting_of_regions.cpp:5815:1: error: \'omp section\' directive must be closely nested to a sections region, not a taskloop region","clang/test/OpenMP/nesting_of_regions.cpp:6130:1: error: \'omp section\' directive must be closely nested to a sections region, not a distribute region","clang/test/OpenMP/nesting_of_regions.cpp:6449:1: error: \'omp section\' directive must be closely nested to a sections region, not a distribute parallel for region","clang/test/OpenMP/nesting_of_regions.cpp:7318:1: error: \'omp section\' directive must be closely nested to a sections region, not a teams distribute region","clang/test/OpenMP/nesting_of_regions.cpp:7587:1: error: \'omp section\' directive must be closely nested to a sections region, not a teams distribute region","clang/test/OpenMP/nesting_of_regions.cpp:8454:1: error: \'omp section\' directive must be closely nested to a sections region, not a teams distribute parallel for region","clang/test/OpenMP/nesting_of_regions.cpp:8708:1: error: \'omp section\' directive must be closely nested to a sections region, not a target teams region","clang/test/OpenMP/nesting_of_regions.cpp:8961:1: error: \'omp section\' directive must be closely nested to a sections region, not a target teams distribute region","clang/test/OpenMP/nesting_of_regions.cpp:9209:1: error: \'omp section\' directive must be closely nested to a sections region, not a target teams distribute parallel for region","clang/test/OpenMP/nesting_of_regions.cpp:9927:1: error: \'omp section\' directive must be closely nested to a sections region, not a parallel region","clang/test/OpenMP/nesting_of_regions.cpp:10400:1: error: \'omp section\' directive must be closely nested to a sections region, not a for region","clang/test/OpenMP/nesting_of_regions.cpp:11116:1: error: orphaned \'omp section\' directives are prohibited, it must be closely nested to a sections region","clang/test/OpenMP/nesting_of_regions.cpp:11170:1: error: \'omp section\' directive must be closely nested to a sections region, not a section region","clang/test/OpenMP/nesting_of_regions.cpp:12305:1: error: \'omp section\' directive must be closely nested to a sections region, not a parallel for region","clang/test/OpenMP/nesting_of_regions.cpp:13097:1: error: \'omp section\' directive must be closely nested to a sections region, not a task region","clang/test/OpenMP/nesting_of_regions.cpp:13639:1: error: \'omp section\' directive must be closely nested to a sections region, not a target region","clang/test/OpenMP/nesting_of_regions.cpp:13869:1: error: \'omp section\' directive must be closely nested to a sections region, not a target parallel region","clang/test/OpenMP/nesting_of_regions.cpp:14101:1: error: \'omp section\' directive must be closely nested to a sections region, not a target parallel for region","clang/test/OpenMP/nesting_of_regions.cpp:14370:1: error: \'omp section\' directive must be closely nested to a sections region, not a teams region","clang/test/OpenMP/nesting_of_regions.cpp:14653:1: error: \'omp section\' directive must be closely nested to a sections region, not a taskloop region","clang/test/OpenMP/nesting_of_regions.cpp:14938:1: error: \'omp section\' directive must be closely nested to a sections region, not a distribute region","clang/test/OpenMP/nesting_of_regions.cpp:15267:1: error: \'omp section\' directive must be closely nested to a sections region, not a distribute parallel for region","clang/test/OpenMP/nesting_of_regions.cpp:16466:1: error: \'omp section\' directive must be closely nested to a sections region, not a teams distribute region","clang/test/OpenMP/nesting_of_regions.cpp:17333:1: error: \'omp section\' directive must be closely nested to a sections region, not a teams distribute parallel for region","clang/test/OpenMP/nesting_of_regions.cpp:17587:1: error: \'omp section\' directive must be closely nested to a sections region, not a target teams region","clang/test/OpenMP/nesting_of_regions.cpp:17840:1: error: \'omp section\' directive must be closely nested to a sections region, not a target teams distribute region","clang/test/OpenMP/nesting_of_regions.cpp:18088:1: error: \'omp section\' directive must be closely nested to a sections region, not a target teams distribute parallel for region"} } }, ["err_omp_parallel_reduction_in_task_firstprivate"]={ [j]="err_omp_parallel_reduction_in_task_firstprivate", [b]="argument of a reduction clause of a %0 construct must not appear in a firstprivate clause on a task construct", [c]="argument of a reduction clause of a A construct must not appear in a firstprivate clause on a task construct", [e]=d, [f]="argument of a reduction clause of a (.*?) construct must not appear in a firstprivate clause on a task construct", [g]=a, [i]=n, [h]={"9c2e8ee72fe8",1405077916,"[OPENMP] Parsing and sema analysis for \'omp task\' directive.","[OPENMP] Parsing and sema analysis for \'omp task\' directive.\n\nllvm-svn: 212804"}, [k]={{m,18344,"OMPClause *Sema::ActOnOpenMPFirstprivateClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc) {\n // ...\n for (Expr *RefExpr : VarList) {\n // ...\n if (!IsImplicitClause) {\n // ...\n // OpenMP [2.9.3.4, Restrictions, p.3]\n // A list item that appears in a reduction clause of a parallel construct\n // must not appear in a firstprivate clause on a worksharing or task\n // construct if any of the worksharing or task regions arising from the\n // worksharing or task construct ever bind to any of the parallel regions\n // arising from the parallel construct.\n // OpenMP [2.9.3.4, Restrictions, p.4]\n // A list item that appears in a reduction clause in worksharing\n // construct must not appear in a firstprivate clause in a task construct\n // encountered during execution of any of the worksharing regions arising\n // from the worksharing construct.\n if (isOpenMPTaskingDirective(CurrDir)) {\n // ...\n if (DVar.CKind == OMPC_reduction && (isOpenMPParallelDirective(DVar.DKind) || isOpenMPWorksharingDirective(DVar.DKind) || isOpenMPTeamsDirective(DVar.DKind))) {\n Diag(ELoc, diag::err_omp_parallel_reduction_in_task_firstprivate) << getOpenMPDirectiveName(DVar.DKind);"}}, [l]={ ["clang/test/OpenMP/parallel_master_taskloop_firstprivate_messages.cpp"]={"clang/test/OpenMP/parallel_master_taskloop_firstprivate_messages.cpp:319:51: error: argument of a reduction clause of a parallel construct must not appear in a firstprivate clause on a task construct","clang/test/OpenMP/parallel_master_taskloop_firstprivate_messages.cpp:165:51: error: argument of a reduction clause of a parallel construct must not appear in a firstprivate clause on a task construct"} } }, ["err_omp_parallel_sections_not_compound_stmt"]={ [j]="err_omp_parallel_sections_not_compound_stmt", [b]="the statement for \'#pragma omp parallel sections\' must be a compound statement", [c]="the statement for \'#pragma omp parallel sections\' must be a compound statement", [e]=d, [f]="the statement for \'\\#pragma omp parallel sections\' must be a compound statement", [g]=a, [i]=n, [h]={"84d0b3efee50",1404807123,"[OPENMP] Parsing and sema analysis for \'omp parallel sections\' directive.","[OPENMP] Parsing and sema analysis for \'omp parallel sections\' directive.\n\nllvm-svn: 212516"}, [k]={{m,11076,"StmtResult Sema::ActOnOpenMPParallelSectionsDirective(ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc) {\n // ...\n if (auto *C = dyn_cast_or_null<CompoundStmt>(BaseStmt)) {\n // ...\n } else {\n Diag(AStmt->getBeginLoc(), diag::err_omp_parallel_sections_not_compound_stmt);"}}, [l]={ ["clang/test/OpenMP/parallel_sections_misc_messages.c"]={"clang/test/OpenMP/parallel_sections_misc_messages.c:22:3: error: the statement for \'#pragma omp parallel sections\' must be a compound statement"} } }, ["err_omp_parallel_sections_substmt_not_section"]={ [j]="err_omp_parallel_sections_substmt_not_section", [b]="statement in \'omp parallel sections\' directive must be enclosed into a section region", [c]="statement in \'omp parallel sections\' directive must be enclosed into a section region", [e]=d, [f]="statement in \'omp parallel sections\' directive must be enclosed into a section region", [g]=a, [i]=n, [h]={"84d0b3efee50",1404807123,"[OPENMP] Parsing and sema analysis for \'omp parallel sections\' directive.","[OPENMP] Parsing and sema analysis for \'omp parallel sections\' directive.\n\nllvm-svn: 212516"}, [k]={{m,11068,"StmtResult Sema::ActOnOpenMPParallelSectionsDirective(ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, SourceLocation EndLoc) {\n // ...\n if (auto *C = dyn_cast_or_null<CompoundStmt>(BaseStmt)) {\n // ...\n // All associated statements must be \'#pragma omp section\' except for\n // the first one.\n for (Stmt *SectionStmt : llvm::drop_begin(S)) {\n if (!SectionStmt || !isa<OMPSectionDirective>(SectionStmt)) {\n if (SectionStmt)\n Diag(SectionStmt->getBeginLoc(), diag::err_omp_parallel_sections_substmt_not_section);"}}, [l]={ ["clang/test/OpenMP/parallel_sections_misc_messages.c"]={"clang/test/OpenMP/parallel_sections_misc_messages.c:27:5: error: statement in \'omp parallel sections\' directive must be enclosed into a section region"} } }, ["err_omp_param_or_this_in_clause"]={ [j]="err_omp_param_or_this_in_clause", [b]="expected reference to one of the parameters of function %0%select{| or \'this\'}1", [c]={{nil,nil,{"expected reference to one of the parameters of function A",{a," or \'this\'"}}}}, [e]=d, [f]="expected reference to one of the parameters of function (.*?)(?:| or \'this\')", [g]=a, [i]=n, [h]={"e48a5fc56d7d",1460438914,"[OPENMP 4.0] Support for \'uniform\' clause in \'declare simd\' directive.","[OPENMP 4.0] Support for \'uniform\' clause in \'declare simd\' directive.\n\nOpenMP 4.0 defines clause \'uniform\' in \'declare simd\' directive:\n\'uniform\' \'(\' <argument-list> \')\'\nThe uniform clause declares one or more arguments to have an invariant value for all concurrent invocations of the function in the execution of a single SIMD loop.\nThe special this pointer can be used as if was one of the arguments to the function in any of the linear, aligned, or uniform clauses.\n\nllvm-svn: 266041"}, [k]={{m,6881,"Sema::DeclGroupPtrTy Sema::ActOnOpenMPDeclareSimdDirective(DeclGroupPtrTy DG, OMPDeclareSimdDeclAttr::BranchStateTy BS, Expr *Simdlen, ArrayRef<Expr *> Uniforms, ArrayRef<Expr *> Aligneds, ArrayRef<Expr *> Alignments, ArrayRef<Expr *> Linears, ArrayRef<unsigned> LinModifiers, ArrayRef<Expr *> Steps, SourceRange SR) {\n // ...\n for (const Expr *E : Uniforms) {\n // ...\n Diag(E->getExprLoc(), diag::err_omp_param_or_this_in_clause) << FD->getDeclName() << (isa<CXXMethodDecl>(ADecl) ? 1 : 0);"},{m,6937,"Sema::DeclGroupPtrTy Sema::ActOnOpenMPDeclareSimdDirective(DeclGroupPtrTy DG, OMPDeclareSimdDeclAttr::BranchStateTy BS, Expr *Simdlen, ArrayRef<Expr *> Uniforms, ArrayRef<Expr *> Aligneds, ArrayRef<Expr *> Alignments, ArrayRef<Expr *> Linears, ArrayRef<unsigned> LinModifiers, ArrayRef<Expr *> Steps, SourceRange SR) {\n // ...\n for (const Expr *E : Aligneds) {\n // ...\n Diag(E->getExprLoc(), diag::err_omp_param_or_this_in_clause) << FD->getDeclName() << (isa<CXXMethodDecl>(ADecl) ? 1 : 0);"},{m,7024,"Sema::DeclGroupPtrTy Sema::ActOnOpenMPDeclareSimdDirective(DeclGroupPtrTy DG, OMPDeclareSimdDeclAttr::BranchStateTy BS, Expr *Simdlen, ArrayRef<Expr *> Uniforms, ArrayRef<Expr *> Aligneds, ArrayRef<Expr *> Alignments, ArrayRef<Expr *> Linears, ArrayRef<unsigned> LinModifiers, ArrayRef<Expr *> Steps, SourceRange SR) {\n // ...\n for (const Expr *E : Linears) {\n // ...\n Diag(E->getExprLoc(), diag::err_omp_param_or_this_in_clause) << FD->getDeclName() << (isa<CXXMethodDecl>(ADecl) ? 1 : 0);"},{m,7708,"void Sema::ActOnOpenMPDeclareVariantDirective(FunctionDecl *FD, Expr *VariantRef, OMPTraitInfo &TI, ArrayRef<Expr *> AdjustArgsNothing, ArrayRef<Expr *> AdjustArgsNeedDevicePtr, ArrayRef<OMPInteropInfo> AppendArgs, SourceLocation AdjustArgsLoc, SourceLocation AppendArgsLoc, SourceRange SR) {\n // ...\n for (Expr *E : AllAdjustArgs) {\n // ...\n Diag(E->getExprLoc(), diag::err_omp_param_or_this_in_clause) << FD << 0;"}}, [l]={ [Fb]={"clang/test/OpenMP/declare_simd_messages.cpp:90:51: error: expected reference to one of the parameters of function \'foo\'","clang/test/OpenMP/declare_simd_messages.cpp:90:64: error: expected reference to one of the parameters of function \'foo\'","clang/test/OpenMP/declare_simd_messages.cpp:90:51: error: expected reference to one of the parameters of function \'foo\'","clang/test/OpenMP/declare_simd_messages.cpp:90:64: error: expected reference to one of the parameters of function \'foo\'"} } }, ["err_omp_parent_cancel_region_nowait"]={ [j]="err_omp_parent_cancel_region_nowait", [b]={{nil,L,"parent region for \'omp %select{cancellation point|cancel}0\' construct cannot be nowait"},{P,nil,"parent region for \'omp %select{cancellation point/cancel}0\' construct cannot be nowait"}}, [c]={{nil,L,{"parent region for \'omp ",{"cancellation point","cancel"},"\' construct cannot be nowait"}},{P,nil,{"parent region for \'omp ",{"cancellation point/cancel"},"\' construct cannot be nowait"}}}, [e]=d, [f]="parent region for \'omp (?:cancellation point|cancel)\' construct cannot be nowait", [g]=a, [i]=n, [h]={"6d4ed0583033",1435733861,"[OPENMP 4.0] Initial support for \'omp cancellation point\' construct.","[OPENMP 4.0] Initial support for \'omp cancellation point\' construct.\n\nAdd parsing and sema analysis for \'omp cancellation point\' directive.\n\nllvm-svn: 241145"}, [k]={{m,13365,"StmtResult Sema::ActOnOpenMPCancellationPointDirective(SourceLocation StartLoc, SourceLocation EndLoc, OpenMPDirectiveKind CancelRegion) {\n if (DSAStack->isParentNowaitRegion()) {\n Diag(StartLoc, diag::err_omp_parent_cancel_region_nowait) << 0;"},{m,13381,"StmtResult Sema::ActOnOpenMPCancelDirective(ArrayRef<OMPClause *> Clauses, SourceLocation StartLoc, SourceLocation EndLoc, OpenMPDirectiveKind CancelRegion) {\n if (DSAStack->isParentNowaitRegion()) {\n Diag(StartLoc, diag::err_omp_parent_cancel_region_nowait) << 1;"}} } };