[PATCH] D46911: [Fixed Point Arithmetic] Addition of the remaining fixed point types and their saturated equivalents

Bevin Hansson via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu May 31 01:00:13 PDT 2018


ebevhan added inline comments.


================
Comment at: include/clang/AST/Type.h:6551
+
+QualType getCorrespondingSaturatedType(const ASTContext &Context,
+                                       const QualType &Ty);
----------------
These should probably be in ASTContext directly.


================
Comment at: include/clang/Basic/TargetInfo.h:83
+  unsigned char LongFractWidth, LongFractAlign;
+  unsigned char SatShortAccumWidth, SatShortAccumAlign;
+  unsigned char SatAccumWidth, SatAccumAlign;
----------------
I don't think the saturating types need separate configurations. Embedded-C says "Each saturating fixed-point type has the same representation and the same rank as its corresponding primary fixed-point type."


================
Comment at: lib/Parse/ParseDecl.cpp:3614
+      } else {
+        isInvalid = DS.SetTypeSpecSat(/*isSat=*/true, Loc, PrevSpec, DiagID);
+      }
----------------
Is there a use for the isSat parameter?


================
Comment at: lib/Sema/DeclSpec.cpp:1123
+    if (!(TypeSpecType == TST_accum || TypeSpecType == TST_fract)) {
+      S.Diag(TSSatLoc, diag::err_invalid_saturation_spec)
+          << getSpecifierName((TST)TypeSpecType, Policy);
----------------
Handling this case here means that placing _Sat on something other than exactly a fixed-point type is a parsing error rather than a semantic error. How does this handle _Sat on sugared types? Should _Sat on things like typedefs work?

  typedef _Fract myfract;
  _Sat myfract F;

The primary issue (and this is one that we have encountered as well) is that you cannot have a true _Sat typedef since _Sat only exists as part of builtin types. You need to desugar/canonicalize the type and then do getCorrespondingSaturatingType (or have getCorrespondingSaturatingType look at the canonical type internally).


================
Comment at: lib/Sema/DeclSpec.cpp:1135
              TypeSpecType != TST_char && TypeSpecType != TST_wchar &&
-             TypeSpecType != TST_accum) {
+             TypeSpecType != TST_accum && TypeSpecType != TST_fract) {
       S.Diag(TSSLoc, diag::err_invalid_sign_spec)
----------------
IsFixedPointType can be used here as well.


================
Comment at: lib/Sema/DeclSpec.cpp:1165
     else if (TypeSpecType != TST_int && TypeSpecType != TST_double &&
-             TypeSpecType != TST_accum) {
+             TypeSpecType != TST_accum && TypeSpecType != TST_fract) {
       S.Diag(TSWRange.getBegin(), diag::err_invalid_width_spec)
----------------
IsFixedPointType?


================
Comment at: lib/Sema/SemaType.cpp:1410
+
+    if (DS.getTypeSpecSign() != DeclSpec::TSS_unsigned)
+      Result = fixedpoint::getCorrespondingSignedType(Context, Result);
----------------
The logic is a bit reversed. The default should be to select the signed variant, and if the TSS is unsigned, then convert it to the unsigned variant.


================
Comment at: lib/Sema/SemaType.cpp:1609
     declarator.setInvalidType(true);
 
   // Handle complex types.
----------------
Other qualifiers like const and volatile are handled down here. Should the _Sat application be performed somewhere here instead?


Repository:
  rC Clang

https://reviews.llvm.org/D46911





More information about the cfe-commits mailing list