[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