forked from OSchip/llvm-project
[Sema][SVE] Reject aligned/_Alignas for sizeless types
A previous patch rejected alignof for sizeless types. This patch extends that to cover the "aligned" attribute and _Alignas. Since sizeless types are not meant to be used for long-term data, cannot be used in aggregates, and cannot have static storage duration, there shouldn't be any need to fiddle with their alignment. Like with alignof, this is a conservative position that can be relaxed in future if it turns out to be too restrictive. Differential Revision: https://reviews.llvm.org/D75573
This commit is contained in:
parent
39969c7d3a
commit
627b5c1206
|
@ -2807,6 +2807,8 @@ def err_alignas_mismatch : Error<
|
|||
"redeclaration has different alignment requirement (%1 vs %0)">;
|
||||
def err_alignas_underaligned : Error<
|
||||
"requested alignment is less than minimum alignment of %1 for type %0">;
|
||||
def err_attribute_sizeless_type : Error<
|
||||
"%0 attribute cannot be applied to sizeless type %1">;
|
||||
def err_attribute_argument_n_type : Error<
|
||||
"%0 attribute requires parameter %1 to be %select{int or bool|an integer "
|
||||
"constant|a string|an identifier}2">;
|
||||
|
|
|
@ -3868,6 +3868,7 @@ void Sema::CheckAlignasUnderalignment(Decl *D) {
|
|||
// not specify an alignment that is less strict than the alignment that
|
||||
// would otherwise be required for the entity being declared.
|
||||
AlignedAttr *AlignasAttr = nullptr;
|
||||
AlignedAttr *LastAlignedAttr = nullptr;
|
||||
unsigned Align = 0;
|
||||
for (auto *I : D->specific_attrs<AlignedAttr>()) {
|
||||
if (I->isAlignmentDependent())
|
||||
|
@ -3875,9 +3876,13 @@ void Sema::CheckAlignasUnderalignment(Decl *D) {
|
|||
if (I->isAlignas())
|
||||
AlignasAttr = I;
|
||||
Align = std::max(Align, I->getAlignment(Context));
|
||||
LastAlignedAttr = I;
|
||||
}
|
||||
|
||||
if (AlignasAttr && Align) {
|
||||
if (Align && DiagTy->isSizelessType()) {
|
||||
Diag(LastAlignedAttr->getLocation(), diag::err_attribute_sizeless_type)
|
||||
<< LastAlignedAttr << DiagTy;
|
||||
} else if (AlignasAttr && Align) {
|
||||
CharUnits RequestedAlign = Context.toCharUnitsFromBits(Align);
|
||||
CharUnits NaturalAlign = Context.getTypeAlignInChars(UnderlyingTy);
|
||||
if (NaturalAlign > RequestedAlign)
|
||||
|
|
|
@ -51,6 +51,10 @@ void func(int sel) {
|
|||
svint8_t local_int8;
|
||||
svint16_t local_int16;
|
||||
|
||||
svint8_t __attribute__((aligned)) aligned_int8_1; // expected-error {{'aligned' attribute cannot be applied to sizeless type 'svint8_t'}}
|
||||
svint8_t __attribute__((aligned(4))) aligned_int8_2; // expected-error {{'aligned' attribute cannot be applied to sizeless type 'svint8_t'}}
|
||||
svint8_t _Alignas(int) aligned_int8_3; // expected-error {{'_Alignas' attribute cannot be applied to sizeless type 'svint8_t'}}
|
||||
|
||||
int _Alignas(svint8_t) aligned_int; // expected-error {{invalid application of 'alignof' to sizeless type 'svint8_t'}}
|
||||
|
||||
// Using pointers to sizeless data isn't wrong here, but because the
|
||||
|
|
|
@ -61,6 +61,10 @@ void func(int sel) {
|
|||
svint8_t local_int8;
|
||||
svint16_t local_int16;
|
||||
|
||||
svint8_t __attribute__((aligned)) aligned_int8_1; // expected-error {{'aligned' attribute cannot be applied to sizeless type 'svint8_t'}}
|
||||
svint8_t __attribute__((aligned(4))) aligned_int8_2; // expected-error {{'aligned' attribute cannot be applied to sizeless type 'svint8_t'}}
|
||||
svint8_t _Alignas(int) aligned_int8_3; // expected-error {{'_Alignas' attribute cannot be applied to sizeless type 'svint8_t'}}
|
||||
|
||||
int _Alignas(svint8_t) aligned_int; // expected-error {{invalid application of 'alignof' to sizeless type 'svint8_t'}}
|
||||
|
||||
// Using pointers to sizeless data isn't wrong here, but because the
|
||||
|
|
Loading…
Reference in New Issue