xazax.hun created this revision. xazax.hun added reviewers: aaron.ballman, gribozavr2, mgehre. xazax.hun added a project: clang. Herald added subscribers: Szelethus, Charusso, gamesh411, dkrupp, rnkovacs.
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. I think it should not be unnatural to have a void deref type as we already familiar with "pointers to void". Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D72097 Files: clang/include/clang/Basic/DiagnosticSemaKinds.td clang/lib/Sema/SemaDeclAttr.cpp clang/test/SemaCXX/attr-gsl-owner-pointer.cpp Index: clang/test/SemaCXX/attr-gsl-owner-pointer.cpp =================================================================== --- clang/test/SemaCXX/attr-gsl-owner-pointer.cpp +++ clang/test/SemaCXX/attr-gsl-owner-pointer.cpp @@ -31,9 +31,11 @@ // 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 Index: clang/lib/Sema/SemaDeclAttr.cpp =================================================================== --- clang/lib/Sema/SemaDeclAttr.cpp +++ clang/lib/Sema/SemaDeclAttr.cpp @@ -2913,7 +2913,7 @@ 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 @@ 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) Index: clang/include/clang/Basic/DiagnosticSemaKinds.td =================================================================== --- clang/include/clang/Basic/DiagnosticSemaKinds.td +++ clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -2631,7 +2631,7 @@ 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|"
Index: clang/test/SemaCXX/attr-gsl-owner-pointer.cpp =================================================================== --- clang/test/SemaCXX/attr-gsl-owner-pointer.cpp +++ clang/test/SemaCXX/attr-gsl-owner-pointer.cpp @@ -31,9 +31,11 @@ // 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 Index: clang/lib/Sema/SemaDeclAttr.cpp =================================================================== --- clang/lib/Sema/SemaDeclAttr.cpp +++ clang/lib/Sema/SemaDeclAttr.cpp @@ -2913,7 +2913,7 @@ 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 @@ 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) Index: clang/include/clang/Basic/DiagnosticSemaKinds.td =================================================================== --- clang/include/clang/Basic/DiagnosticSemaKinds.td +++ clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -2631,7 +2631,7 @@ 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|"
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits