[LifetimeAnalysis] Do not forbid void deref type in gsl::Pointer/gsl::Owner annotations
It turns out it is useful to be able to define the deref type as void. In case we have a type erased owner, we want to express that the pointee can be basically any type. It should not be unnatural to have a void deref type as we already familiar with "pointers to void". Differential Revision: https://reviews.llvm.org/D72097
This commit is contained in:
parent
a3832f33d9
commit
247a603254
|
@ -4590,7 +4590,7 @@ object of type ``T``:
|
|||
|
||||
The argument ``T`` is optional and is ignored.
|
||||
This attribute may be used by analysis tools and has no effect on code
|
||||
generation.
|
||||
generation. A ``void`` argument means that the class can own any type.
|
||||
|
||||
See Pointer_ for an example.
|
||||
}];
|
||||
|
@ -4616,7 +4616,7 @@ like pointers to an object of type ``T``:
|
|||
|
||||
The argument ``T`` is optional and is ignored.
|
||||
This attribute may be used by analysis tools and has no effect on code
|
||||
generation.
|
||||
generation. A ``void`` argument means that the pointer can point to any type.
|
||||
|
||||
Example:
|
||||
When constructing an instance of a class annotated like this (a Pointer) from
|
||||
|
|
|
@ -2631,7 +2631,7 @@ def err_nsobject_attribute : Error<
|
|||
def err_attributes_are_not_compatible : Error<
|
||||
"%0 and %1 attributes are not compatible">;
|
||||
def err_attribute_invalid_argument : Error<
|
||||
"%select{'void'|a reference type|an array type|a non-vector or "
|
||||
"%select{a reference type|an array type|a non-vector or "
|
||||
"non-vectorizable scalar type}0 is an invalid argument to attribute %1">;
|
||||
def err_attribute_wrong_number_arguments : Error<
|
||||
"%0 attribute %plural{0:takes no arguments|1:takes one argument|"
|
||||
|
|
|
@ -2913,7 +2913,7 @@ static void handleVecTypeHint(Sema &S, Decl *D, const ParsedAttr &AL) {
|
|||
if (!ParmType->isExtVectorType() && !ParmType->isFloatingType() &&
|
||||
(ParmType->isBooleanType() ||
|
||||
!ParmType->isIntegralType(S.getASTContext()))) {
|
||||
S.Diag(AL.getLoc(), diag::err_attribute_invalid_argument) << 3 << AL;
|
||||
S.Diag(AL.getLoc(), diag::err_attribute_invalid_argument) << 2 << AL;
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -4454,12 +4454,10 @@ static void handleLifetimeCategoryAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
|
|||
ParmType = S.GetTypeFromParser(AL.getTypeArg(), &DerefTypeLoc);
|
||||
|
||||
unsigned SelectIdx = ~0U;
|
||||
if (ParmType->isVoidType())
|
||||
if (ParmType->isReferenceType())
|
||||
SelectIdx = 0;
|
||||
else if (ParmType->isReferenceType())
|
||||
SelectIdx = 1;
|
||||
else if (ParmType->isArrayType())
|
||||
SelectIdx = 2;
|
||||
SelectIdx = 1;
|
||||
|
||||
if (SelectIdx != ~0U) {
|
||||
S.Diag(AL.getLoc(), diag::err_attribute_invalid_argument)
|
||||
|
|
|
@ -31,9 +31,11 @@ class [[gsl::Owner(int)]] [[gsl::Pointer(int)]] BothOwnerPointer{};
|
|||
// CHECK: OwnerAttr {{.*}} int
|
||||
|
||||
class [[gsl::Owner(void)]] OwnerVoidDerefType{};
|
||||
// expected-error@-1 {{'void' is an invalid argument to attribute 'Owner'}}
|
||||
// CHECK: CXXRecordDecl {{.*}} OwnerVoidDerefType
|
||||
// CHECK: OwnerAttr {{.*}} void
|
||||
class [[gsl::Pointer(void)]] PointerVoidDerefType{};
|
||||
// expected-error@-1 {{'void' is an invalid argument to attribute 'Pointer'}}
|
||||
// CHECK: CXXRecordDecl {{.*}} PointerVoidDerefType
|
||||
// CHECK: PointerAttr {{.*}} void
|
||||
|
||||
class [[gsl::Pointer(int)]] AddConflictLater{};
|
||||
// CHECK: CXXRecordDecl {{.*}} AddConflictLater
|
||||
|
|
Loading…
Reference in New Issue