diff options
author | Richard Sandiford <richard.sandiford@arm.com> | 2020-03-02 18:33:12 +0000 |
---|---|---|
committer | Richard Sandiford <richard.sandiford@arm.com> | 2020-05-06 12:24:27 +0100 |
commit | 69ab8b46b84daa42f334ea2dc7a097f7b81bae77 (patch) | |
tree | d045156cab2469350967c22947069c951a074269 /clang/lib/Sema/SemaInit.cpp | |
parent | 9b509bca858cbc37ab8e36383f2550d5e2f8a312 (diff) | |
download | llvm-69ab8b46b84daa42f334ea2dc7a097f7b81bae77.zip llvm-69ab8b46b84daa42f334ea2dc7a097f7b81bae77.tar.gz llvm-69ab8b46b84daa42f334ea2dc7a097f7b81bae77.tar.bz2 |
[Sema][SVE] Fix handling of initialisers for built-in SVE types
The built-in SVE types are supposed to be treated as opaque types.
This means that for initialisation purposes they should be treated
as a single unit, much like a scalar type.
However, as Eli pointed out, actually using "scalar" in the diagnostics
is likely to cause confusion, given the types are logically vectors.
The patch therefore uses custom diagnostics or generalises existing
ones. Some of the messages use the word "indivisible" to try to make
it clear(er) that these types can't be initialised elementwise.
I don't think it's possible to trigger warn_braces_around_(scalar_)init
for sizeless types as things stand, since the types can't be used as
members or elements of more complex types. But it seemed better to be
consistent with ext_many_braces_around_(scalar_)init, so the patch
changes it anyway.
Differential Revision: https://reviews.llvm.org/D76689
Diffstat (limited to 'clang/lib/Sema/SemaInit.cpp')
-rw-r--r-- | clang/lib/Sema/SemaInit.cpp | 50 |
1 files changed, 33 insertions, 17 deletions
diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index 9c6c9f1..e64b6d6 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -1119,14 +1119,14 @@ static void warnBracedScalarInit(Sema &S, const InitializedEntity &Entity, case InitializedEntity::EK_Parameter_CF_Audited: case InitializedEntity::EK_Result: // Extra braces here are suspicious. - DiagID = diag::warn_braces_around_scalar_init; + DiagID = diag::warn_braces_around_init; break; case InitializedEntity::EK_Member: // Warn on aggregate initialization but not on ctor init list or // default member initializer. if (Entity.getParent()) - DiagID = diag::warn_braces_around_scalar_init; + DiagID = diag::warn_braces_around_init; break; case InitializedEntity::EK_Variable: @@ -1157,9 +1157,9 @@ static void warnBracedScalarInit(Sema &S, const InitializedEntity &Entity, if (DiagID) { S.Diag(Braces.getBegin(), DiagID) - << Braces - << FixItHint::CreateRemoval(Braces.getBegin()) - << FixItHint::CreateRemoval(Braces.getEnd()); + << Entity.getType()->isSizelessBuiltinType() << Braces + << FixItHint::CreateRemoval(Braces.getBegin()) + << FixItHint::CreateRemoval(Braces.getEnd()); } } @@ -1203,6 +1203,12 @@ void InitListChecker::CheckExplicitInitList(const InitializedEntity &Entity, : diag::ext_excess_initializers_in_char_array_initializer; SemaRef.Diag(IList->getInit(Index)->getBeginLoc(), DK) << IList->getInit(Index)->getSourceRange(); + } else if (T->isSizelessBuiltinType()) { + unsigned DK = ExtraInitsIsError + ? diag::err_excess_initializers_for_sizeless_type + : diag::ext_excess_initializers_for_sizeless_type; + SemaRef.Diag(IList->getInit(Index)->getBeginLoc(), DK) + << T << IList->getInit(Index)->getSourceRange(); } else { int initKind = T->isArrayType() ? 0 : T->isVectorType() ? 1 : @@ -1295,7 +1301,8 @@ void InitListChecker::CheckListElementTypes(const InitializedEntity &Entity, if (!VerifyOnly) SemaRef.Diag(IList->getBeginLoc(), diag::err_init_objc_class) << DeclType; hadError = true; - } else if (DeclType->isOCLIntelSubgroupAVCType()) { + } else if (DeclType->isOCLIntelSubgroupAVCType() || + DeclType->isSizelessBuiltinType()) { // Checks for scalar type are sufficient for these types too. CheckScalarType(Entity, IList, DeclType, Index, StructuredList, StructuredIndex); @@ -1508,12 +1515,20 @@ void InitListChecker::CheckScalarType(const InitializedEntity &Entity, InitListExpr *StructuredList, unsigned &StructuredIndex) { if (Index >= IList->getNumInits()) { - if (!VerifyOnly) - SemaRef.Diag(IList->getBeginLoc(), - SemaRef.getLangOpts().CPlusPlus11 - ? diag::warn_cxx98_compat_empty_scalar_initializer - : diag::err_empty_scalar_initializer) - << IList->getSourceRange(); + if (!VerifyOnly) { + if (DeclType->isSizelessBuiltinType()) + SemaRef.Diag(IList->getBeginLoc(), + SemaRef.getLangOpts().CPlusPlus11 + ? diag::warn_cxx98_compat_empty_sizeless_initializer + : diag::err_empty_sizeless_initializer) + << DeclType << IList->getSourceRange(); + else + SemaRef.Diag(IList->getBeginLoc(), + SemaRef.getLangOpts().CPlusPlus11 + ? diag::warn_cxx98_compat_empty_scalar_initializer + : diag::err_empty_scalar_initializer) + << IList->getSourceRange(); + } hadError = !SemaRef.getLangOpts().CPlusPlus11; ++Index; ++StructuredIndex; @@ -1525,17 +1540,18 @@ void InitListChecker::CheckScalarType(const InitializedEntity &Entity, // FIXME: This is invalid, and accepting it causes overload resolution // to pick the wrong overload in some corner cases. if (!VerifyOnly) - SemaRef.Diag(SubIList->getBeginLoc(), - diag::ext_many_braces_around_scalar_init) - << SubIList->getSourceRange(); + SemaRef.Diag(SubIList->getBeginLoc(), diag::ext_many_braces_around_init) + << DeclType->isSizelessBuiltinType() << SubIList->getSourceRange(); CheckScalarType(Entity, SubIList, DeclType, Index, StructuredList, StructuredIndex); return; } else if (isa<DesignatedInitExpr>(expr)) { if (!VerifyOnly) - SemaRef.Diag(expr->getBeginLoc(), diag::err_designator_for_scalar_init) - << DeclType << expr->getSourceRange(); + SemaRef.Diag(expr->getBeginLoc(), + diag::err_designator_for_scalar_or_sizeless_init) + << DeclType->isSizelessBuiltinType() << DeclType + << expr->getSourceRange(); hadError = true; ++Index; ++StructuredIndex; |