14 #ifndef LLVM_CLANG_SEMA_ATTRIBUTELIST_H 15 #define LLVM_CLANG_SEMA_ATTRIBUTELIST_H 22 #include "llvm/ADT/PointerUnion.h" 23 #include "llvm/ADT/SmallVector.h" 24 #include "llvm/ADT/TinyPtrVector.h" 25 #include "llvm/Support/Allocator.h" 26 #include "llvm/Support/VersionTuple.h" 54 bool isValid()
const {
return !Version.empty(); }
72 : StrictLoc(Strict), Replacement(ReplaceExpr) {
88 : GetterId(getterId), SetterId(setterId) {}
104 using ArgsUnion = llvm::PointerUnion<Expr *, IdentifierLoc *>;
118 ParsedAttr, ArgsUnion, detail::AvailabilityData,
119 detail::TypeTagForDatatypeData, ParsedType, detail::PropertyData> {
122 size_t numTrailingObjects(OverloadToken<ArgsUnion>)
const {
return NumArgs; }
123 size_t numTrailingObjects(OverloadToken<detail::AvailabilityData>)
const {
124 return IsAvailability;
127 numTrailingObjects(OverloadToken<detail::TypeTagForDatatypeData>)
const {
128 return IsTypeTagForDatatype;
130 size_t numTrailingObjects(OverloadToken<ParsedType>)
const {
131 return HasParsedType;
133 size_t numTrailingObjects(OverloadToken<detail::PropertyData>)
const {
176 unsigned AttrKind : 16;
180 unsigned NumArgs : 16;
183 unsigned SyntaxUsed : 3;
186 mutable unsigned Invalid : 1;
189 mutable unsigned UsedAsTypeAttr : 1;
193 unsigned IsAvailability : 1;
197 unsigned IsTypeTagForDatatype : 1;
201 unsigned IsProperty : 1;
204 unsigned HasParsedType : 1;
207 mutable unsigned HasProcessingCache : 1;
210 mutable unsigned ProcessingCache : 8;
213 mutable unsigned IsPragmaClangAttribute : 1;
219 const Expr *MessageExpr;
221 ArgsUnion *getArgsBuffer() {
return getTrailingObjects<ArgsUnion>(); }
223 return getTrailingObjects<ArgsUnion>();
227 return getTrailingObjects<detail::AvailabilityData>();
230 return getTrailingObjects<detail::AvailabilityData>();
242 : AttrName(attrName), ScopeName(scopeName), AttrRange(attrRange),
243 ScopeLoc(scopeLoc), EllipsisLoc(ellipsisLoc), NumArgs(numArgs),
244 SyntaxUsed(syntaxUsed), Invalid(
false), UsedAsTypeAttr(
false),
246 HasParsedType(
false), HasProcessingCache(
false),
247 IsPragmaClangAttribute(
false) {
248 if (numArgs)
memcpy(getArgsBuffer(), args, numArgs *
sizeof(
ArgsUnion));
259 const Expr *replacementExpr)
260 : AttrName(attrName), ScopeName(scopeName), AttrRange(attrRange),
261 ScopeLoc(scopeLoc), NumArgs(1), SyntaxUsed(syntaxUsed), Invalid(
false),
262 UsedAsTypeAttr(
false), IsAvailability(
true),
264 HasProcessingCache(
false), IsPragmaClangAttribute(
false),
265 UnavailableLoc(unavailable), MessageExpr(messageExpr) {
269 introduced, deprecated, obsoleted, strict, replacementExpr);
278 : AttrName(attrName), ScopeName(scopeName), AttrRange(attrRange),
279 ScopeLoc(scopeLoc), NumArgs(3), SyntaxUsed(syntaxUsed), Invalid(
false),
282 HasProcessingCache(
false), IsPragmaClangAttribute(
false) {
294 bool layoutCompatible,
bool mustBeNull,
Syntax syntaxUsed)
295 : AttrName(attrName), ScopeName(scopeName), AttrRange(attrRange),
296 ScopeLoc(scopeLoc), NumArgs(1), SyntaxUsed(syntaxUsed), Invalid(
false),
298 IsTypeTagForDatatype(
true), IsProperty(
false), HasParsedType(
false),
299 HasProcessingCache(
false), IsPragmaClangAttribute(
false) {
313 : AttrName(attrName), ScopeName(scopeName), AttrRange(attrRange),
314 ScopeLoc(scopeLoc), NumArgs(0), SyntaxUsed(syntaxUsed), Invalid(
false),
316 IsTypeTagForDatatype(
false), IsProperty(
false), HasParsedType(
true),
317 HasProcessingCache(
false), IsPragmaClangAttribute(
false) {
327 : AttrName(attrName), ScopeName(scopeName), AttrRange(attrRange),
328 ScopeLoc(scopeLoc), NumArgs(0), SyntaxUsed(syntaxUsed), Invalid(
false),
330 IsTypeTagForDatatype(
false), IsProperty(
true), HasParsedType(
false),
331 HasProcessingCache(
false), IsPragmaClangAttribute(
false) {
340 return *getTrailingObjects<detail::TypeTagForDatatypeData>();
343 return *getTrailingObjects<detail::TypeTagForDatatypeData>();
348 ParsedType &getTypeBuffer() {
return *getTrailingObjects<ParsedType>(); }
350 return *getTrailingObjects<ParsedType>();
357 return *getTrailingObjects<detail::PropertyData>();
361 return *getTrailingObjects<detail::PropertyData>();
364 size_t allocated_size()
const;
373 void operator delete(
void *) =
delete;
376 #define PARSED_ATTR(NAME) AT_##NAME, 377 #include "clang/Sema/AttrParsedAttrList.inc" 393 (ScopeName->
isStr(
"gnu") || ScopeName->
isStr(
"__gnu__"));
405 return getKind() == AT_Aligned && isKeywordAttribute();
412 return SyntaxUsed == AS_CXX11 || isAlignasAttribute();
416 return SyntaxUsed == AS_C2x;
420 return SyntaxUsed == AS_Keyword || SyntaxUsed == AS_ContextSensitiveKeyword;
424 return SyntaxUsed == AS_ContextSensitiveKeyword;
433 assert(hasProcessingCache());
434 return ProcessingCache;
438 ProcessingCache = value;
439 HasProcessingCache =
true;
462 assert(Arg < NumArgs &&
"Arg access out of range!");
463 return getArgsBuffer()[Arg];
467 return Arg < NumArgs && getArg(Arg).is<
Expr*>();
471 return getArg(Arg).get<
Expr*>();
483 assert(
getKind() == AT_Availability &&
"Not an availability attribute");
488 assert(
getKind() == AT_Availability &&
"Not an availability attribute");
493 assert(
getKind() == AT_Availability &&
"Not an availability attribute");
498 assert(
getKind() == AT_Availability &&
"Not an availability attribute");
499 return getAvailabilityData()->StrictLoc;
503 assert(
getKind() == AT_Availability &&
"Not an availability attribute");
504 return UnavailableLoc;
508 assert(
getKind() == AT_Availability &&
"Not an availability attribute");
513 assert(
getKind() == AT_Availability &&
"Not an availability attribute");
514 return getAvailabilityData()->Replacement;
518 assert(
getKind() == AT_TypeTagForDatatype &&
519 "Not a type_tag_for_datatype attribute");
520 return getTypeTagForDatatypeDataSlot().MatchingCType;
524 assert(
getKind() == AT_TypeTagForDatatype &&
525 "Not a type_tag_for_datatype attribute");
526 return getTypeTagForDatatypeDataSlot().LayoutCompatible;
530 assert(
getKind() == AT_TypeTagForDatatype &&
531 "Not a type_tag_for_datatype attribute");
532 return getTypeTagForDatatypeDataSlot().MustBeNull;
536 assert(HasParsedType &&
"Not a type attribute");
537 return getTypeBuffer();
541 assert(isDeclspecPropertyAttribute() &&
542 "Not a __delcspec(property) attribute");
543 return getPropertyDataBuffer().GetterId;
547 assert(isDeclspecPropertyAttribute() &&
548 "Not a __delcspec(property) attribute");
549 return getPropertyDataBuffer().SetterId;
557 MacroExpansionLoc = Loc;
568 assert(hasMacroIdentifier() &&
"Can only get the macro expansion location " 569 "if this attribute has a macro identifier.");
570 return MacroExpansionLoc;
576 unsigned getAttributeSpellingListIndex()
const;
578 bool isTargetSpecificAttr()
const;
579 bool isTypeAttr()
const;
580 bool isStmtAttr()
const;
582 bool hasCustomParsing()
const;
583 unsigned getMinArgs()
const;
584 unsigned getMaxArgs()
const;
585 bool hasVariadicArg()
const;
586 bool diagnoseAppertainsTo(
class Sema &S,
const Decl *D)
const;
591 bool diagnoseLangOpts(
class Sema &S)
const;
593 bool isKnownToGCC()
const;
594 bool isSupportedByPragmaAttribute()
const;
601 unsigned getSemanticSpelling()
const;
607 case ParsedAttr::AT_OpenCLConstantAddressSpace:
609 case ParsedAttr::AT_OpenCLGlobalAddressSpace:
611 case ParsedAttr::AT_OpenCLLocalAddressSpace:
613 case ParsedAttr::AT_OpenCLPrivateAddressSpace:
615 case ParsedAttr::AT_OpenCLGenericAddressSpace:
632 AvailabilityAllocSize =
636 TypeTagForDatatypeAllocSize =
637 ParsedAttr::totalSizeToAlloc<ArgsUnion, detail::AvailabilityData,
638 detail::TypeTagForDatatypeData, ParsedType,
639 detail::PropertyData>(1, 0, 1, 0, 0),
641 ParsedAttr::totalSizeToAlloc<
ArgsUnion, detail::AvailabilityData,
643 detail::PropertyData>(0, 0, 0, 0, 1),
653 InlineFreeListsCapacity =
654 1 + (AvailabilityAllocSize -
sizeof(
ParsedAttr)) /
sizeof(
void *)
657 llvm::BumpPtrAllocator Alloc;
667 void *allocate(
size_t size);
687 llvm::TinyPtrVector<ParsedAttr *> Attrs;
689 void *allocate(
size_t size) {
690 return Factory.allocate(size);
694 Attrs.push_back(attr);
699 assert(llvm::is_contained(Attrs, attr) &&
700 "Can't take attribute from a pool that doesn't own it!");
701 Attrs.erase(llvm::find(Attrs, attr));
720 Factory.reclaimPool(*
this);
740 void *memory = allocate(
741 ParsedAttr::totalSizeToAlloc<ArgsUnion, detail::AvailabilityData,
742 detail::TypeTagForDatatypeData, ParsedType,
745 return add(
new (memory)
ParsedAttr(attrName, attrRange, scopeName, scopeLoc,
746 args, numArgs, syntax, ellipsisLoc));
756 const Expr *ReplacementExpr) {
759 attrName, attrRange, scopeName, scopeLoc, Param, introduced, deprecated,
760 obsoleted, unavailable, MessageExpr, syntax, strict, ReplacementExpr));
767 void *memory = allocate(
771 return add(
new (memory)
ParsedAttr(attrName, attrRange, scopeName, scopeLoc,
772 Param1, Param2, Param3, syntax));
779 ParsedType matchingCType,
bool layoutCompatible,
782 return add(
new (memory)
ParsedAttr(attrName, attrRange, scopeName, scopeLoc,
783 argumentKind, matchingCType,
784 layoutCompatible, mustBeNull, syntax));
792 void *memory = allocate(
796 return add(
new (memory)
ParsedAttr(attrName, attrRange, scopeName, scopeLoc,
797 typeArg, syntaxUsed));
806 return add(
new (memory)
ParsedAttr(attrName, attrRange, scopeName, scopeLoc,
807 getterId, setterId, syntaxUsed));
812 using VecTy = llvm::TinyPtrVector<ParsedAttr *>;
813 using SizeType = decltype(std::declval<VecTy>().size());
816 bool empty()
const {
return AttrList.empty(); }
817 SizeType
size()
const {
return AttrList.size(); }
823 AttrList.push_back(newAttr);
827 assert(is_contained(AttrList, ToBeRemoved) &&
828 "Cannot remove attribute that isn't in the list");
829 AttrList.erase(llvm::find(AttrList, ToBeRemoved));
834 struct iterator : llvm::iterator_adaptor_base<iterator, VecTy::iterator,
835 std::random_access_iterator_tag,
838 iterator(VecTy::iterator I) : iterator_adaptor_base(I) {}
843 : llvm::iterator_adaptor_base<const_iterator, VecTy::const_iterator,
844 std::random_access_iterator_tag,
854 AttrList.insert(AttrList.begin(), B.I, E.I);
858 AttrList.insert(AttrList.begin(), B.I, E.I);
862 AttrList.insert(AttrList.end(), B.I, E.I);
866 AttrList.insert(AttrList.end(), B.I, E.I);
876 return *AttrList.front();
880 return *AttrList.front();
884 return *AttrList.back();
888 return *AttrList.back();
916 pool.takeAllFrom(attrs.pool);
937 ParsedAttr *attr = pool.create(attrName, attrRange, scopeName, scopeLoc,
938 args, numArgs, syntax, ellipsisLoc);
951 const Expr *ReplacementExpr) {
953 attrName, attrRange, scopeName, scopeLoc, Param, introduced, deprecated,
954 obsoleted, unavailable, MessageExpr, syntax, strict, ReplacementExpr);
964 ParsedAttr *attr = pool.create(attrName, attrRange, scopeName, scopeLoc,
965 Param1, Param2, Param3, syntax);
975 ParsedType matchingCType,
bool layoutCompatible,
977 ParsedAttr *attr = pool.createTypeTagForDatatype(
978 attrName, attrRange, scopeName, scopeLoc, argumentKind, matchingCType,
979 layoutCompatible, mustBeNull, syntax);
989 ParsedAttr *attr = pool.createTypeAttribute(attrName, attrRange, scopeName,
990 scopeLoc, typeArg, syntaxUsed);
1002 pool.createPropertyAttribute(attrName, attrRange, scopeName, scopeLoc,
1003 getterId, setterId, syntaxUsed);
1069 #endif // LLVM_CLANG_SEMA_ATTRIBUTELIST_H ParsedAttr * createTypeAttribute(IdentifierInfo *attrName, SourceRange attrRange, IdentifierInfo *scopeName, SourceLocation scopeLoc, ParsedType typeArg, ParsedAttr::Syntax syntaxUsed)
ParsedAttr * create(IdentifierInfo *attrName, SourceRange attrRange, IdentifierInfo *scopeName, SourceLocation scopeLoc, IdentifierLoc *Param1, IdentifierLoc *Param2, IdentifierLoc *Param3, ParsedAttr::Syntax syntax)
bool isAlignasAttribute() const
const_iterator end() const
bool isDeclspecAttribute() const
const_iterator(VecTy::const_iterator I)
ParsedAttributes(AttributeFactory &factory)
void takeOneFrom(ParsedAttributes &Attrs, ParsedAttr *PA)
llvm::PointerUnion< Expr *, IdentifierLoc * > ArgsUnion
A union of the various pointer types that can be passed to an ParsedAttr as an argument.
iterator(VecTy::iterator I)
Decl - This represents one declaration (or definition), e.g.
void AddTaggedVal(intptr_t V, DiagnosticsEngine::ArgumentKind Kind) const
Expr * getArgAsExpr(unsigned Arg) const
const DiagnosticBuilder & operator<<(const DiagnosticBuilder &DB, const Attr *At)
bool getMustBeNull() const
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
bool hasParsedType() const
IdentifierInfo * getPropertyDataGetter() const
const_iterator begin() const
reference operator*() const
bool hasAttribute(ParsedAttr::Kind K) const
IdentifierInfo * getPropertyDataSetter() const
LangAS
Defines the address space values used by the address space qualifier of QualType. ...
bool isCXX11Attribute() const
ParsedAttr & operator[](SizeType pos)
const ParsedType & getMatchingCType() const
void AddTaggedVal(intptr_t V, DiagnosticsEngine::ArgumentKind Kind) const
One of these records is kept for each identifier that is lexed.
SubjectMatchRule
A list of all the recognized kinds of attributes.
bool isStr(const char(&Str)[StrLen]) const
Return true if this is the identifier for the specified string.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
const ParsedAttr & front() const
unsigned LayoutCompatible
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this attribute.
void setIsPragmaClangAttribute()
AttributeArgumentNType
These constants match the enumerated choices of err_attribute_argument_n_type and err_attribute_argum...
void takeAllFrom(ParsedAttributes &attrs)
Defines the Diagnostic-related interfaces.
void setUsedAsTypeAttr(bool Used=true)
Scope - A scope is a transient data structure that is used while parsing the program.
Represents information about a change in availability for an entity, which is part of the encoding of...
IdentifierInfo * getMacroIdentifier() const
Return the macro identifier if this attribute was declared in a macro.
void addAtEnd(ParsedAttr *newAttr)
VersionTuple Version
The version number at which the change occurred.
void setInvalid(bool b=true) const
bool isDeclspecPropertyAttribute() const
Is this the Microsoft __declspec(property) attribute?
Sema - This implements semantic analysis and AST building for C.
A little helper class used to produce diagnostics.
AvailabilityData(const AvailabilityChange &Introduced, const AvailabilityChange &Deprecated, const AvailabilityChange &Obsoleted, SourceLocation Strict, const Expr *ReplaceExpr)
ParsedAttr * addNewTypeTagForDatatype(IdentifierInfo *attrName, SourceRange attrRange, IdentifierInfo *scopeName, SourceLocation scopeLoc, IdentifierLoc *argumentKind, ParsedType matchingCType, bool layoutCompatible, bool mustBeNull, ParsedAttr::Syntax syntax)
Add type_tag_for_datatype attribute.
void addAllAtEnd(const_iterator B, const_iterator E)
Exposes information about the current target.
void setMacroIdentifier(IdentifierInfo *MacroName, SourceLocation Loc)
Set the macro identifier info object that this parsed attribute was declared in if it was declared in...
SourceLocation getScopeLoc() const
This represents one expression.
ParsedAttr * addNewPropertyAttr(IdentifierInfo *attrName, SourceRange attrRange, IdentifierInfo *scopeName, SourceLocation scopeLoc, IdentifierInfo *getterId, IdentifierInfo *setterId, ParsedAttr::Syntax syntaxUsed)
Add microsoft __delspec(property) attribute.
bool isC2xAttribute() const
const AvailabilityChange & getAvailabilityObsoleted() const
ParsedAttr * addNew(IdentifierInfo *attrName, SourceRange attrRange, IdentifierInfo *scopeName, SourceLocation scopeLoc, IdentifierLoc *Param, const AvailabilityChange &introduced, const AvailabilityChange &deprecated, const AvailabilityChange &obsoleted, SourceLocation unavailable, const Expr *MessageExpr, ParsedAttr::Syntax syntax, SourceLocation strict, const Expr *ReplacementExpr)
Add availability attribute.
AttributeFactory & getFactory() const
void addAllAtEnd(iterator B, iterator E)
void addAll(iterator B, iterator E)
SourceLocation KeywordLoc
The location of the keyword indicating the kind of change.
bool isValid() const
Determine whether this availability change is valid.
Wraps an identifier and optional source location for the identifier.
SourceRange VersionRange
The source range covering the version number.
bool getLayoutCompatible() const
SourceLocation getEllipsisLoc() const
ParsedAttr * createPropertyAttribute(IdentifierInfo *attrName, SourceRange attrRange, IdentifierInfo *scopeName, SourceLocation scopeLoc, IdentifierInfo *getterId, IdentifierInfo *setterId, ParsedAttr::Syntax syntaxUsed)
Encodes a location in the source.
const ParsedType & getTypeArg() const
void addAll(const_iterator B, const_iterator E)
SourceLocation getMacroExpansionLoc() const
Syntax
The style used to specify an attribute.
bool hasMacroIdentifier() const
Returns true if this attribute was declared in a macro.
ParsedAttr - Represents a syntactic attribute.
const ParsedAttr & back() const
const ParsedAttr & operator[](SizeType pos) const
bool hasProcessingCache() const
bool isUsedAsTypeAttr() const
ParsedAttr * addNew(IdentifierInfo *attrName, SourceRange attrRange, IdentifierInfo *scopeName, SourceLocation scopeLoc, ArgsUnion *args, unsigned numArgs, ParsedAttr::Syntax syntax, SourceLocation ellipsisLoc=SourceLocation())
Add attribute with expression arguments.
void remove(ParsedAttr *ToBeRemoved)
bool isContextSensitiveKeywordAttribute() const
bool isArgExpr(unsigned Arg) const
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
Describes the trailing object for Availability attribute in ParsedAttr.
SourceRange getRange() const
void setProcessingCache(unsigned value) const
ArgsUnion getArg(unsigned Arg) const
getArg - Return the specified argument.
Dataflow Directional Tag Classes.
bool isValid() const
Return true if this is a valid SourceLocation object.
static std::string getName(const CallEvent &Call)
const AvailabilityChange & getAvailabilityIntroduced() const
std::unique_ptr< DiagnosticConsumer > create(StringRef OutputFile, DiagnosticOptions *Diags, bool MergeChildRecords=false)
Returns a DiagnosticConsumer that serializes diagnostics to a bitcode file.
bool isKeywordAttribute() const
bool isPackExpansion() const
bool isMicrosoftAttribute() const
SourceLocation getLoc() const
void takeAllFrom(AttributePool &pool)
Take the given pool's allocations and add them to this pool.
SourceLocation getStrictLoc() const
ParsedAttr * create(IdentifierInfo *attrName, SourceRange attrRange, IdentifierInfo *scopeName, SourceLocation scopeLoc, ArgsUnion *args, unsigned numArgs, ParsedAttr::Syntax syntax, SourceLocation ellipsisLoc=SourceLocation())
AttributePool(AttributeFactory &factory)
Create a new pool for a factory.
IdentifierInfo * getName() const
ParsedAttr * createTypeTagForDatatype(IdentifierInfo *attrName, SourceRange attrRange, IdentifierInfo *scopeName, SourceLocation scopeLoc, IdentifierLoc *argumentKind, ParsedType matchingCType, bool layoutCompatible, bool mustBeNull, ParsedAttr::Syntax syntax)
const AvailabilityChange & getAvailabilityDeprecated() const
ParsedAttr * addNew(IdentifierInfo *attrName, SourceRange attrRange, IdentifierInfo *scopeName, SourceLocation scopeLoc, IdentifierLoc *Param1, IdentifierLoc *Param2, IdentifierLoc *Param3, ParsedAttr::Syntax syntax)
Add objc_bridge_related attribute.
ParsedAttr * addNewTypeAttr(IdentifierInfo *attrName, SourceRange attrRange, IdentifierInfo *scopeName, SourceLocation scopeLoc, ParsedType typeArg, ParsedAttr::Syntax syntaxUsed)
Add an attribute with a single type argument.
Context-sensitive version of a keyword attribute.
LangAS asOpenCLLangAS() const
If this is an OpenCL addr space attribute returns its representation in LangAS, otherwise returns def...
Defines the clang::SourceLocation class and associated facilities.
A factory, from which one makes pools, from which one creates individual attributes which are dealloc...
ParsedAttr * create(IdentifierInfo *attrName, SourceRange attrRange, IdentifierInfo *scopeName, SourceLocation scopeLoc, IdentifierLoc *Param, const AvailabilityChange &introduced, const AvailabilityChange &deprecated, const AvailabilityChange &obsoleted, SourceLocation unavailable, const Expr *MessageExpr, ParsedAttr::Syntax syntax, SourceLocation strict, const Expr *ReplacementExpr)
AttributePool & getPool() const
const Expr * getMessageExpr() const
Defines the clang::TargetInfo interface.
static Decl::Kind getKind(const Decl *D)
bool isArgIdent(unsigned Arg) const
A trivial tuple used to represent a source range.
__ptr16, alignas(...), etc.
bool isPragmaClangAttribute() const
True if the attribute is specified using '#pragma clang attribute'.
SourceLocation getBegin() const
SourceLocation getUnavailableLoc() const
ParsedAttributes - A collection of parsed attributes.
AttributeDeclKind
These constants match the enumerated choices of warn_attribute_wrong_decl_type and err_attribute_wron...
IdentifierLoc * getArgAsIdent(unsigned Arg) const
IdentifierInfo * getScopeName() const
IdentifierInfo * SetterId
unsigned getProcessingCache() const
const Expr * getReplacementExpr() const
PropertyData(IdentifierInfo *getterId, IdentifierInfo *setterId)