[PATCH] D76689: [Sema][SVE] Fix handling of initialisers for built-in SVE types
Richard Sandiford via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Mar 24 05:21:01 PDT 2020
rsandifo-arm created this revision.
rsandifo-arm added reviewers: sdesmalen, efriedma, rovka, rjmccall.
Herald added subscribers: cfe-commits, psnobl, rkruppe, tschuett.
Herald added a reviewer: rengolin.
Herald added a project: clang.
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.
clang-format would have changed the formatting of the initKind
calculation to:
int initKind =
T->isArrayType()
? 0
: T->isVectorType()
? 1
: T->isScalarType() || T->isScalarType()
...
I can't remember seeing that style elsewhere, so the patch instead
uses an if-else, like some other diagnostics do.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D76689
Files:
clang/lib/Sema/SemaInit.cpp
clang/test/Sema/sizeless-1.c
clang/test/SemaCXX/sizeless-1.cpp
Index: clang/test/SemaCXX/sizeless-1.cpp
===================================================================
--- clang/test/SemaCXX/sizeless-1.cpp
+++ clang/test/SemaCXX/sizeless-1.cpp
@@ -94,9 +94,15 @@
#if __cplusplus >= 201103L
int empty_brace_init_int = {};
+ svint8_t empty_brace_init_int8 = {};
#else
int empty_brace_init_int = {}; // expected-error {{scalar initializer cannot be empty}}
+ svint8_t empty_brace_init_int8 = {}; // expected-error {{scalar initializer cannot be empty}}
#endif
+ svint8_t brace_init_int8 = {local_int8};
+ svint8_t bad_brace_init_int8_1 = {local_int8, 0}; // expected-error {{excess elements in scalar initializer}}
+ svint8_t bad_brace_init_int8_2 = {0}; // expected-error {{rvalue of type 'int'}}
+ svint8_t bad_brace_init_int8_3 = {local_int16}; // expected-error {{lvalue of type 'svint16_t'}}
const svint8_t const_int8 = local_int8; // expected-note {{declared const here}}
const svint8_t uninit_const_int8; // expected-error {{default initialization of an object of const type 'const svint8_t'}}
@@ -454,6 +460,11 @@
local_int8 = ref_int8;
#if __cplusplus >= 201103L
+ svint8_t zero_init_int8{};
+ svint8_t init_int8{local_int8};
+ svint8_t bad_brace_init_int8_1{local_int8, 0}; // expected-error {{excess elements in scalar initializer}}
+ svint8_t bad_brace_init_int8_2{0}; // expected-error {{rvalue of type 'int'}}
+ svint8_t bad_brace_init_int8_3{local_int16}; // expected-error {{lvalue of type 'svint16_t'}}
svint8_t wrapper_init_int8{wrapper<svint8_t>()};
svint8_t &ref_init_int8{local_int8};
Index: clang/test/Sema/sizeless-1.c
===================================================================
--- clang/test/Sema/sizeless-1.c
+++ clang/test/Sema/sizeless-1.c
@@ -83,6 +83,11 @@
svint8_t bad_init_int8 = for; // expected-error {{expected expression}}
int empty_brace_init_int = {}; // expected-error {{scalar initializer cannot be empty}}
+ svint8_t empty_brace_init_int8 = {}; // expected-error {{scalar initializer cannot be empty}}
+ svint8_t brace_init_int8 = {local_int8};
+ svint8_t bad_brace_init_int8_1 = {local_int8, 0}; // expected-warning {{excess elements in scalar initializer}}
+ svint8_t bad_brace_init_int8_2 = {0}; // expected-error {{incompatible type 'int'}}
+ svint8_t bad_brace_init_int8_3 = {local_int16}; // expected-error {{incompatible type 'svint16_t'}}
const svint8_t const_int8 = local_int8; // expected-note {{declared const here}}
const svint8_t uninit_const_int8;
Index: clang/lib/Sema/SemaInit.cpp
===================================================================
--- clang/lib/Sema/SemaInit.cpp
+++ clang/lib/Sema/SemaInit.cpp
@@ -1204,11 +1204,18 @@
SemaRef.Diag(IList->getInit(Index)->getBeginLoc(), DK)
<< IList->getInit(Index)->getSourceRange();
} else {
- int initKind = T->isArrayType() ? 0 :
- T->isVectorType() ? 1 :
- T->isScalarType() ? 2 :
- T->isUnionType() ? 3 :
- 4;
+ int initKind = 4;
+ if (T->isArrayType())
+ initKind = 0;
+ else if (T->isVectorType())
+ initKind = 1;
+ // Since we apply the rules for scalar types to sizeless built-in types,
+ // we get more consistent error messages by treating them as scalar
+ // here. "sizeless initializer" wouldn't make much sense anyhow.
+ else if (T->isScalarType() || T->isSizelessBuiltinType())
+ initKind = 2;
+ else if (T->isUnionType())
+ initKind = 3;
unsigned DK = ExtraInitsIsError ? diag::err_excess_initializers
: diag::ext_excess_initializers;
@@ -1295,7 +1302,8 @@
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);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D76689.252270.patch
Type: text/x-patch
Size: 4228 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200324/f5e73c00/attachment-0001.bin>
More information about the cfe-commits
mailing list