summaryrefslogtreecommitdiffstats
path: root/clang/test/Frontend
diff options
context:
space:
mode:
Diffstat (limited to 'clang/test/Frontend')
-rw-r--r--clang/test/Frontend/fixed_point.c202
-rw-r--r--clang/test/Frontend/fixed_point_bit_widths.c178
-rw-r--r--clang/test/Frontend/fixed_point_errors.c66
-rw-r--r--clang/test/Frontend/fixed_point_errors.cpp4
4 files changed, 426 insertions, 24 deletions
diff --git a/clang/test/Frontend/fixed_point.c b/clang/test/Frontend/fixed_point.c
index d64bd55aa0b..bc8cf2dcd7b 100644
--- a/clang/test/Frontend/fixed_point.c
+++ b/clang/test/Frontend/fixed_point.c
@@ -9,21 +9,79 @@ signed long _Accum s_long_accum;
unsigned short _Accum u_short_accum;
unsigned _Accum u_accum;
unsigned long _Accum u_long_accum;
+signed short _Fract s_short_fract;
+signed _Fract s_fract;
+signed long _Fract s_long_fract;
+unsigned short _Fract u_short_fract;
+unsigned _Fract u_fract;
+unsigned long _Fract u_long_fract;
// Aliased fixed point types
short _Accum short_accum;
_Accum accum;
long _Accum long_accum;
+short _Fract short_fract;
+_Fract fract;
+long _Fract long_fract;
-// CHECK: |-VarDecl {{.*}} s_short_accum 'short _Accum'
-// CHECK-NEXT: |-VarDecl {{.*}} s_accum '_Accum'
-// CHECK-NEXT: |-VarDecl {{.*}} s_long_accum 'long _Accum'
-// CHECK-NEXT: |-VarDecl {{.*}} u_short_accum 'unsigned short _Accum'
-// CHECK-NEXT: |-VarDecl {{.*}} u_accum 'unsigned _Accum'
-// CHECK-NEXT: |-VarDecl {{.*}} u_long_accum 'unsigned long _Accum'
-// CHECK-NEXT: |-VarDecl {{.*}} short_accum 'short _Accum'
-// CHECK-NEXT: |-VarDecl {{.*}} accum '_Accum'
-// CHECK-NEXT: |-VarDecl {{.*}} long_accum 'long _Accum'
+// Saturated fixed point types
+_Sat signed short _Accum sat_s_short_accum;
+_Sat signed _Accum sat_s_accum;
+_Sat signed long _Accum sat_s_long_accum;
+_Sat unsigned short _Accum sat_u_short_accum;
+_Sat unsigned _Accum sat_u_accum;
+_Sat unsigned long _Accum sat_u_long_accum;
+_Sat signed short _Fract sat_s_short_fract;
+_Sat signed _Fract sat_s_fract;
+_Sat signed long _Fract sat_s_long_fract;
+_Sat unsigned short _Fract sat_u_short_fract;
+_Sat unsigned _Fract sat_u_fract;
+_Sat unsigned long _Fract sat_u_long_fract;
+
+// Aliased saturated fixed point types
+_Sat short _Accum sat_short_accum;
+_Sat _Accum sat_accum;
+_Sat long _Accum sat_long_accum;
+_Sat short _Fract sat_short_fract;
+_Sat _Fract sat_fract;
+_Sat long _Fract sat_long_fract;
+
+//CHECK: |-VarDecl {{.*}} s_short_accum 'short _Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} s_accum '_Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} s_long_accum 'long _Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} u_short_accum 'unsigned short _Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} u_accum 'unsigned _Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} u_long_accum 'unsigned long _Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} s_short_fract 'short _Fract'
+//CHECK-NEXT: |-VarDecl {{.*}} s_fract '_Fract'
+//CHECK-NEXT: |-VarDecl {{.*}} s_long_fract 'long _Fract'
+//CHECK-NEXT: |-VarDecl {{.*}} u_short_fract 'unsigned short _Fract'
+//CHECK-NEXT: |-VarDecl {{.*}} u_fract 'unsigned _Fract'
+//CHECK-NEXT: |-VarDecl {{.*}} u_long_fract 'unsigned long _Fract'
+//CHECK-NEXT: |-VarDecl {{.*}} short_accum 'short _Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} accum '_Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} long_accum 'long _Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} short_fract 'short _Fract'
+//CHECK-NEXT: |-VarDecl {{.*}} fract '_Fract'
+//CHECK-NEXT: |-VarDecl {{.*}} long_fract 'long _Fract'
+//CHECK-NEXT: |-VarDecl {{.*}} sat_s_short_accum '_Sat short _Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} sat_s_accum '_Sat _Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} sat_s_long_accum '_Sat long _Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} sat_u_short_accum '_Sat unsigned short _Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} sat_u_accum '_Sat unsigned _Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} sat_u_long_accum '_Sat unsigned long _Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} sat_s_short_fract '_Sat short _Fract'
+//CHECK-NEXT: |-VarDecl {{.*}} sat_s_fract '_Sat _Fract'
+//CHECK-NEXT: |-VarDecl {{.*}} sat_s_long_fract '_Sat long _Fract'
+//CHECK-NEXT: |-VarDecl {{.*}} sat_u_short_fract '_Sat unsigned short _Fract'
+//CHECK-NEXT: |-VarDecl {{.*}} sat_u_fract '_Sat unsigned _Fract'
+//CHECK-NEXT: |-VarDecl {{.*}} sat_u_long_fract '_Sat unsigned long _Fract'
+//CHECK-NEXT: |-VarDecl {{.*}} sat_short_accum '_Sat short _Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} sat_accum '_Sat _Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} sat_long_accum '_Sat long _Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} sat_short_fract '_Sat short _Fract'
+//CHECK-NEXT: |-VarDecl {{.*}} sat_fract '_Sat _Fract'
+//CHECK-NEXT: |-VarDecl {{.*}} sat_long_fract '_Sat long _Fract'
#define MIX_TYPE_SPEC(SPEC, SIGN, SIZE, ID) \
SPEC SIGN SIZE _Accum ID; \
@@ -54,4 +112,128 @@ MIX_CONST(signed, short, const_s_short_accum)
// CHECK-NEXT: |-VarDecl {{.*}} const_s_short_accum 'const short _Accum'
// CHECK-NEXT: |-VarDecl {{.*}} const_s_short_accum2 'const short _Accum'
// CHECK-NEXT: |-VarDecl {{.*}} const_s_short_accum3 'const short _Accum'
-// CHECK-NEXT: `-VarDecl {{.*}} const_s_short_accum4 'const short _Accum'
+// CHECK-NEXT: |-VarDecl {{.*}} const_s_short_accum4 'const short _Accum'
+
+/* Typedefs */
+
+// Primary fixed point types
+typedef signed short _Accum SsA_t;
+typedef signed _Accum SA_t;
+typedef signed long _Accum SlA_t;
+typedef unsigned short _Accum UsA_t;
+typedef unsigned _Accum UA_t;
+typedef unsigned long _Accum UlA_t;
+typedef signed short _Fract SsF_t;
+typedef signed _Fract SF_t;
+typedef signed long _Fract SlF_t;
+typedef unsigned short _Fract UsF_t;
+typedef unsigned _Fract UF_t;
+typedef unsigned long _Fract UlF_t;
+
+// Aliased fixed point types
+typedef short _Accum sA_t;
+typedef _Accum A_t;
+typedef long _Accum lA_t;
+typedef short _Fract sF_t;
+typedef _Fract F_t;
+typedef long _Fract lF_t;
+
+// Saturated fixed point types
+typedef _Sat signed short _Accum SatSsA_t;
+typedef _Sat signed _Accum SatSA_t;
+typedef _Sat signed long _Accum SatSlA_t;
+typedef _Sat unsigned short _Accum SatUsA_t;
+typedef _Sat unsigned _Accum SatUA_t;
+typedef _Sat unsigned long _Accum SatUlA_t;
+typedef _Sat signed short _Fract SatSsF_t;
+typedef _Sat signed _Fract SatSF_t;
+typedef _Sat signed long _Fract SatSlF_t;
+typedef _Sat unsigned short _Fract SatUsF_t;
+typedef _Sat unsigned _Fract SatUF_t;
+typedef _Sat unsigned long _Fract SatUlF_t;
+
+// Aliased saturated fixed point types
+typedef _Sat short _Accum SatsA_t;
+typedef _Sat _Accum SatA_t;
+typedef _Sat long _Accum SatlA_t;
+typedef _Sat short _Fract SatsF_t;
+typedef _Sat _Fract SatF_t;
+typedef _Sat long _Fract SatlF_t;
+
+SsA_t SsA_type;
+SA_t SA_type;
+SlA_t SlA_type;
+UsA_t UsA_type;
+UA_t UA_type;
+UlA_t UlA_type;
+SsF_t SsF_type;
+SF_t SF_type;
+SlF_t SlF_type;
+UsF_t UsF_type;
+UF_t UF_type;
+UlF_t UlF_type;
+
+sA_t sA_type;
+A_t A_type;
+lA_t lA_type;
+sF_t sF_type;
+F_t F_type;
+lF_t lF_type;
+
+SatSsA_t SatSsA_type;
+SatSA_t SatSA_type;
+SatSlA_t SatSlA_type;
+SatUsA_t SatUsA_type;
+SatUA_t SatUA_type;
+SatUlA_t SatUlA_type;
+SatSsF_t SatSsF_type;
+SatSF_t SatSF_type;
+SatSlF_t SatSlF_type;
+SatUsF_t SatUsF_type;
+SatUF_t SatUF_type;
+SatUlF_t SatUlF_type;
+
+SatsA_t SatsA_type;
+SatA_t SatA_type;
+SatlA_t SatlA_type;
+SatsF_t SatsF_type;
+SatF_t SatF_type;
+SatlF_t SatlF_type;
+
+//CHECK: |-VarDecl {{.*}} SsA_type 'SsA_t':'short _Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} SA_type 'SA_t':'_Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} SlA_type 'SlA_t':'long _Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} UsA_type 'UsA_t':'unsigned short _Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} UA_type 'UA_t':'unsigned _Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} UlA_type 'UlA_t':'unsigned long _Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} SsF_type 'SsF_t':'short _Fract'
+//CHECK-NEXT: |-VarDecl {{.*}} SF_type 'SF_t':'_Fract'
+//CHECK-NEXT: |-VarDecl {{.*}} SlF_type 'SlF_t':'long _Fract'
+//CHECK-NEXT: |-VarDecl {{.*}} UsF_type 'UsF_t':'unsigned short _Fract'
+//CHECK-NEXT: |-VarDecl {{.*}} UF_type 'UF_t':'unsigned _Fract'
+//CHECK-NEXT: |-VarDecl {{.*}} UlF_type 'UlF_t':'unsigned long _Fract'
+//CHECK-NEXT: |-VarDecl {{.*}} sA_type 'sA_t':'short _Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} A_type 'A_t':'_Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} lA_type 'lA_t':'long _Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} sF_type 'sF_t':'short _Fract'
+//CHECK-NEXT: |-VarDecl {{.*}} F_type 'F_t':'_Fract'
+//CHECK-NEXT: |-VarDecl {{.*}} lF_type 'lF_t':'long _Fract'
+
+//CHECK-NEXT: |-VarDecl {{.*}} SatSsA_type 'SatSsA_t':'_Sat short _Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} SatSA_type 'SatSA_t':'_Sat _Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} SatSlA_type 'SatSlA_t':'_Sat long _Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} SatUsA_type 'SatUsA_t':'_Sat unsigned short _Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} SatUA_type 'SatUA_t':'_Sat unsigned _Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} SatUlA_type 'SatUlA_t':'_Sat unsigned long _Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} SatSsF_type 'SatSsF_t':'_Sat short _Fract'
+//CHECK-NEXT: |-VarDecl {{.*}} SatSF_type 'SatSF_t':'_Sat _Fract'
+//CHECK-NEXT: |-VarDecl {{.*}} SatSlF_type 'SatSlF_t':'_Sat long _Fract'
+//CHECK-NEXT: |-VarDecl {{.*}} SatUsF_type 'SatUsF_t':'_Sat unsigned short _Fract'
+//CHECK-NEXT: |-VarDecl {{.*}} SatUF_type 'SatUF_t':'_Sat unsigned _Fract'
+//CHECK-NEXT: |-VarDecl {{.*}} SatUlF_type 'SatUlF_t':'_Sat unsigned long _Fract'
+//CHECK-NEXT: |-VarDecl {{.*}} SatsA_type 'SatsA_t':'_Sat short _Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} SatA_type 'SatA_t':'_Sat _Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} SatlA_type 'SatlA_t':'_Sat long _Accum'
+//CHECK-NEXT: |-VarDecl {{.*}} SatsF_type 'SatsF_t':'_Sat short _Fract'
+//CHECK-NEXT: |-VarDecl {{.*}} SatF_type 'SatF_t':'_Sat _Fract'
+//CHECK-NEXT: `-VarDecl {{.*}} SatlF_type 'SatlF_t':'_Sat long _Fract'
diff --git a/clang/test/Frontend/fixed_point_bit_widths.c b/clang/test/Frontend/fixed_point_bit_widths.c
index 6b4eea90e67..8973a336660 100644
--- a/clang/test/Frontend/fixed_point_bit_widths.c
+++ b/clang/test/Frontend/fixed_point_bit_widths.c
@@ -3,6 +3,8 @@
// RUN: %clang -x c -ffixed-point -S -emit-llvm -o - --target=ppc64 %s | FileCheck %s
// RUN: %clang -x c -ffixed-point -S -emit-llvm -o - --target=x86_64-scei-ps4-windows10pro-fast %s | FileCheck %s
+/* Primary signed _Accum */
+
int size_SsA = sizeof(signed short _Accum);
int size_SA = sizeof(signed _Accum);
int size_SlA = sizeof(signed long _Accum);
@@ -10,20 +12,6 @@ int align_SsA = __alignof(signed short _Accum);
int align_SA = __alignof(signed _Accum);
int align_SlA = __alignof(signed long _Accum);
-int size_UsA = sizeof(unsigned short _Accum);
-int size_UA = sizeof(unsigned _Accum);
-int size_UlA = sizeof(unsigned long _Accum);
-int align_UsA = __alignof(unsigned short _Accum);
-int align_UA = __alignof(unsigned _Accum);
-int align_UlA = __alignof(unsigned long _Accum);
-
-int size_sA = sizeof(short _Accum);
-int size_A = sizeof(_Accum);
-int size_lA = sizeof(long _Accum);
-int align_sA = __alignof(short _Accum);
-int align_A = __alignof(_Accum);
-int align_lA = __alignof(long _Accum);
-
// CHECK: @size_SsA = {{.*}}global i{{[0-9]+}} 2
// CHECK-NEXT: @size_SA = {{.*}}global i{{[0-9]+}} 4
// CHECK-NEXT: @size_SlA = {{.*}}global i{{[0-9]+}} 8
@@ -31,6 +19,15 @@ int align_lA = __alignof(long _Accum);
// CHECK-NEXT: @align_SA = {{.*}}global i{{[0-9]+}} 4
// CHECK-NEXT: @align_SlA = {{.*}}global i{{[0-9]+}} 8
+/* Primary unsigned _Accum */
+
+int size_UsA = sizeof(unsigned short _Accum);
+int size_UA = sizeof(unsigned _Accum);
+int size_UlA = sizeof(unsigned long _Accum);
+int align_UsA = __alignof(unsigned short _Accum);
+int align_UA = __alignof(unsigned _Accum);
+int align_UlA = __alignof(unsigned long _Accum);
+
// CHECK-NEXT: @size_UsA = {{.*}}global i{{[0-9]+}} 2
// CHECK-NEXT: @size_UA = {{.*}}global i{{[0-9]+}} 4
// CHECK-NEXT: @size_UlA = {{.*}}global i{{[0-9]+}} 8
@@ -38,9 +35,162 @@ int align_lA = __alignof(long _Accum);
// CHECK-NEXT: @align_UA = {{.*}}global i{{[0-9]+}} 4
// CHECK-NEXT: @align_UlA = {{.*}}global i{{[0-9]+}} 8
+/* Primary signed _Fract */
+
+int size_SsF = sizeof(signed short _Fract);
+int size_SF = sizeof(signed _Fract);
+int size_SlF = sizeof(signed long _Fract);
+int align_SsF = __alignof(signed short _Fract);
+int align_SF = __alignof(signed _Fract);
+int align_SlF = __alignof(signed long _Fract);
+
+// CHECK-NEXT: @size_SsF = {{.*}}global i{{[0-9]+}} 2
+// CHECK-NEXT: @size_SF = {{.*}}global i{{[0-9]+}} 4
+// CHECK-NEXT: @size_SlF = {{.*}}global i{{[0-9]+}} 8
+// CHECK-NEXT: @align_SsF = {{.*}}global i{{[0-9]+}} 2
+// CHECK-NEXT: @align_SF = {{.*}}global i{{[0-9]+}} 4
+// CHECK-NEXT: @align_SlF = {{.*}}global i{{[0-9]+}} 8
+
+/* Primary unsigned _Fract */
+
+int size_UsF = sizeof(unsigned short _Fract);
+int size_UF = sizeof(unsigned _Fract);
+int size_UlF = sizeof(unsigned long _Fract);
+int align_UsF = __alignof(unsigned short _Fract);
+int align_UF = __alignof(unsigned _Fract);
+int align_UlF = __alignof(unsigned long _Fract);
+
+// CHECK-NEXT: @size_UsF = {{.*}}global i{{[0-9]+}} 2
+// CHECK-NEXT: @size_UF = {{.*}}global i{{[0-9]+}} 4
+// CHECK-NEXT: @size_UlF = {{.*}}global i{{[0-9]+}} 8
+// CHECK-NEXT: @align_UsF = {{.*}}global i{{[0-9]+}} 2
+// CHECK-NEXT: @align_UF = {{.*}}global i{{[0-9]+}} 4
+// CHECK-NEXT: @align_UlF = {{.*}}global i{{[0-9]+}} 8
+
+/* Aliased _Accum */
+
+int size_sA = sizeof(short _Accum);
+int size_A = sizeof(_Accum);
+int size_lA = sizeof(long _Accum);
+int align_sA = __alignof(short _Accum);
+int align_A = __alignof(_Accum);
+int align_lA = __alignof(long _Accum);
+
// CHECK-NEXT: @size_sA = {{.*}}global i{{[0-9]+}} 2
// CHECK-NEXT: @size_A = {{.*}}global i{{[0-9]+}} 4
// CHECK-NEXT: @size_lA = {{.*}}global i{{[0-9]+}} 8
// CHECK-NEXT: @align_sA = {{.*}}global i{{[0-9]+}} 2
// CHECK-NEXT: @align_A = {{.*}}global i{{[0-9]+}} 4
// CHECK-NEXT: @align_lA = {{.*}}global i{{[0-9]+}} 8
+
+/* Aliased _Fract */
+
+int size_sF = sizeof(short _Fract);
+int size_F = sizeof(_Fract);
+int size_lF = sizeof(long _Fract);
+int align_sF = __alignof(short _Fract);
+int align_F = __alignof(_Fract);
+int align_lF = __alignof(long _Fract);
+
+// CHECK-NEXT: @size_sF = {{.*}}global i{{[0-9]+}} 2
+// CHECK-NEXT: @size_F = {{.*}}global i{{[0-9]+}} 4
+// CHECK-NEXT: @size_lF = {{.*}}global i{{[0-9]+}} 8
+// CHECK-NEXT: @align_sF = {{.*}}global i{{[0-9]+}} 2
+// CHECK-NEXT: @align_F = {{.*}}global i{{[0-9]+}} 4
+// CHECK-NEXT: @align_lF = {{.*}}global i{{[0-9]+}} 8
+
+/* Saturated signed _Accum */
+
+int size_SatSsA = sizeof(_Sat signed short _Accum);
+int size_SatSA = sizeof(_Sat signed _Accum);
+int size_SatSlA = sizeof(_Sat signed long _Accum);
+int align_SatSsA = __alignof(_Sat signed short _Accum);
+int align_SatSA = __alignof(_Sat signed _Accum);
+int align_SatSlA = __alignof(_Sat signed long _Accum);
+
+// CHECK: @size_SatSsA = {{.*}}global i{{[0-9]+}} 2
+// CHECK-NEXT: @size_SatSA = {{.*}}global i{{[0-9]+}} 4
+// CHECK-NEXT: @size_SatSlA = {{.*}}global i{{[0-9]+}} 8
+// CHECK-NEXT: @align_SatSsA = {{.*}}global i{{[0-9]+}} 2
+// CHECK-NEXT: @align_SatSA = {{.*}}global i{{[0-9]+}} 4
+// CHECK-NEXT: @align_SatSlA = {{.*}}global i{{[0-9]+}} 8
+
+/* Saturated unsigned _Accum */
+
+int size_SatUsA = sizeof(_Sat unsigned short _Accum);
+int size_SatUA = sizeof(_Sat unsigned _Accum);
+int size_SatUlA = sizeof(_Sat unsigned long _Accum);
+int align_SatUsA = __alignof(_Sat unsigned short _Accum);
+int align_SatUA = __alignof(_Sat unsigned _Accum);
+int align_SatUlA = __alignof(_Sat unsigned long _Accum);
+
+// CHECK-NEXT: @size_SatUsA = {{.*}}global i{{[0-9]+}} 2
+// CHECK-NEXT: @size_SatUA = {{.*}}global i{{[0-9]+}} 4
+// CHECK-NEXT: @size_SatUlA = {{.*}}global i{{[0-9]+}} 8
+// CHECK-NEXT: @align_SatUsA = {{.*}}global i{{[0-9]+}} 2
+// CHECK-NEXT: @align_SatUA = {{.*}}global i{{[0-9]+}} 4
+// CHECK-NEXT: @align_SatUlA = {{.*}}global i{{[0-9]+}} 8
+
+/* Saturated signed _Fract */
+
+int size_SatSsF = sizeof(_Sat signed short _Fract);
+int size_SatSF = sizeof(_Sat signed _Fract);
+int size_SatSlF = sizeof(_Sat signed long _Fract);
+int align_SatSsF = __alignof(_Sat signed short _Fract);
+int align_SatSF = __alignof(_Sat signed _Fract);
+int align_SatSlF = __alignof(_Sat signed long _Fract);
+
+// CHECK-NEXT: @size_SatSsF = {{.*}}global i{{[0-9]+}} 2
+// CHECK-NEXT: @size_SatSF = {{.*}}global i{{[0-9]+}} 4
+// CHECK-NEXT: @size_SatSlF = {{.*}}global i{{[0-9]+}} 8
+// CHECK-NEXT: @align_SatSsF = {{.*}}global i{{[0-9]+}} 2
+// CHECK-NEXT: @align_SatSF = {{.*}}global i{{[0-9]+}} 4
+// CHECK-NEXT: @align_SatSlF = {{.*}}global i{{[0-9]+}} 8
+
+/* Saturated unsigned _Fract */
+
+int size_SatUsF = sizeof(_Sat unsigned short _Fract);
+int size_SatUF = sizeof(_Sat unsigned _Fract);
+int size_SatUlF = sizeof(_Sat unsigned long _Fract);
+int align_SatUsF = __alignof(_Sat unsigned short _Fract);
+int align_SatUF = __alignof(_Sat unsigned _Fract);
+int align_SatUlF = __alignof(_Sat unsigned long _Fract);
+
+// CHECK-NEXT: @size_SatUsF = {{.*}}global i{{[0-9]+}} 2
+// CHECK-NEXT: @size_SatUF = {{.*}}global i{{[0-9]+}} 4
+// CHECK-NEXT: @size_SatUlF = {{.*}}global i{{[0-9]+}} 8
+// CHECK-NEXT: @align_SatUsF = {{.*}}global i{{[0-9]+}} 2
+// CHECK-NEXT: @align_SatUF = {{.*}}global i{{[0-9]+}} 4
+// CHECK-NEXT: @align_SatUlF = {{.*}}global i{{[0-9]+}} 8
+
+/* Aliased saturated signed _Accum */
+
+int size_SatsA = sizeof(_Sat short _Accum);
+int size_SatA = sizeof(_Sat _Accum);
+int size_SatlA = sizeof(_Sat long _Accum);
+int align_SatsA = __alignof(_Sat short _Accum);
+int align_SatA = __alignof(_Sat _Accum);
+int align_SatlA = __alignof(_Sat long _Accum);
+
+// CHECK-NEXT: @size_SatsA = {{.*}}global i{{[0-9]+}} 2
+// CHECK-NEXT: @size_SatA = {{.*}}global i{{[0-9]+}} 4
+// CHECK-NEXT: @size_SatlA = {{.*}}global i{{[0-9]+}} 8
+// CHECK-NEXT: @align_SatsA = {{.*}}global i{{[0-9]+}} 2
+// CHECK-NEXT: @align_SatA = {{.*}}global i{{[0-9]+}} 4
+// CHECK-NEXT: @align_SatlA = {{.*}}global i{{[0-9]+}} 8
+
+/* Aliased saturated _Fract */
+
+int size_SatsF = sizeof(_Sat short _Fract);
+int size_SatF = sizeof(_Sat _Fract);
+int size_SatlF = sizeof(_Sat long _Fract);
+int align_SatsF = __alignof(_Sat short _Fract);
+int align_SatF = __alignof(_Sat _Fract);
+int align_SatlF = __alignof(_Sat long _Fract);
+
+// CHECK-NEXT: @size_SatsF = {{.*}}global i{{[0-9]+}} 2
+// CHECK-NEXT: @size_SatF = {{.*}}global i{{[0-9]+}} 4
+// CHECK-NEXT: @size_SatlF = {{.*}}global i{{[0-9]+}} 8
+// CHECK-NEXT: @align_SatsF = {{.*}}global i{{[0-9]+}} 2
+// CHECK-NEXT: @align_SatF = {{.*}}global i{{[0-9]+}} 4
+// CHECK-NEXT: @align_SatlF = {{.*}}global i{{[0-9]+}} 8
diff --git a/clang/test/Frontend/fixed_point_errors.c b/clang/test/Frontend/fixed_point_errors.c
index 0158dc68c42..7f0e0099576 100644
--- a/clang/test/Frontend/fixed_point_errors.c
+++ b/clang/test/Frontend/fixed_point_errors.c
@@ -5,6 +5,14 @@
long long _Accum longlong_accum; // expected-error{{'long long _Accum' is invalid}}
unsigned long long _Accum u_longlong_accum; // expected-error{{'long long _Accum' is invalid}}
+long long _Fract longlong_fract; // expected-error{{'long long _Fract' is invalid}}
+unsigned long long _Fract u_longlong_fract; // expected-error{{'long long _Fract' is invalid}}
+
+_Sat long long _Accum sat_longlong_accum; // expected-error{{'long long _Accum' is invalid}}
+_Sat unsigned long long _Accum sat_u_longlong_accum; // expected-error{{'long long _Accum' is invalid}}
+_Sat long long _Fract sat_longlong_fract; // expected-error{{'long long _Fract' is invalid}}
+_Sat unsigned long long _Fract sat_u_longlong_fract; // expected-error{{'long long _Fract' is invalid}}
+
/* Although _Complex types work with floating point numbers, the extension
* provides no info for complex fixed point types. */
@@ -19,9 +27,67 @@ _Complex short _Accum cmplx_s_short_accum; // expected-error{{'_Complex
_Complex _Accum cmplx_s_accum; // expected-error{{'_Complex _Accum' is invalid}}
_Complex long _Accum cmplx_s_long_accum; // expected-error{{'_Complex _Accum' is invalid}}
+_Complex signed short _Fract cmplx_s_short_fract; // expected-error{{'_Complex _Fract' is invalid}}
+_Complex signed _Fract cmplx_s_fract; // expected-error{{'_Complex _Fract' is invalid}}
+_Complex signed long _Fract cmplx_s_long_fract; // expected-error{{'_Complex _Fract' is invalid}}
+_Complex unsigned short _Fract cmplx_u_short_fract; // expected-error{{'_Complex _Fract' is invalid}}
+_Complex unsigned _Fract cmplx_u_fract; // expected-error{{'_Complex _Fract' is invalid}}
+_Complex unsigned long _Fract cmplx_u_long_fract; // expected-error{{'_Complex _Fract' is invalid}}
+_Complex short _Fract cmplx_s_short_fract; // expected-error{{'_Complex _Fract' is invalid}}
+_Complex _Fract cmplx_s_fract; // expected-error{{'_Complex _Fract' is invalid}}
+_Complex long _Fract cmplx_s_long_fract; // expected-error{{'_Complex _Fract' is invalid}}
+
+_Complex _Sat signed short _Accum cmplx_sat_s_short_accum; // expected-error{{'_Complex _Accum' is invalid}}
+_Complex _Sat signed _Accum cmplx_sat_s_accum; // expected-error{{'_Complex _Accum' is invalid}}
+_Complex _Sat signed long _Accum cmplx_sat_s_long_accum; // expected-error{{'_Complex _Accum' is invalid}}
+_Complex _Sat unsigned short _Accum cmplx_sat_u_short_accum; // expected-error{{'_Complex _Accum' is invalid}}
+_Complex _Sat unsigned _Accum cmplx_sat_u_accum; // expected-error{{'_Complex _Accum' is invalid}}
+_Complex _Sat unsigned long _Accum cmplx_sat_u_long_accum; // expected-error{{'_Complex _Accum' is invalid}}
+_Complex _Sat short _Accum cmplx_sat_s_short_accum; // expected-error{{'_Complex _Accum' is invalid}}
+_Complex _Sat _Accum cmplx_sat_s_accum; // expected-error{{'_Complex _Accum' is invalid}}
+_Complex _Sat long _Accum cmplx_sat_s_long_accum; // expected-error{{'_Complex _Accum' is invalid}}
+
+_Complex signed short _Fract cmplx_sat_s_short_fract; // expected-error{{'_Complex _Fract' is invalid}}
+_Complex signed _Fract cmplx_sat_s_fract; // expected-error{{'_Complex _Fract' is invalid}}
+_Complex signed long _Fract cmplx_sat_s_long_fract; // expected-error{{'_Complex _Fract' is invalid}}
+_Complex unsigned short _Fract cmplx_sat_u_short_fract; // expected-error{{'_Complex _Fract' is invalid}}
+_Complex unsigned _Fract cmplx_sat_u_fract; // expected-error{{'_Complex _Fract' is invalid}}
+_Complex unsigned long _Fract cmplx_sat_u_long_fract; // expected-error{{'_Complex _Fract' is invalid}}
+_Complex short _Fract cmplx_sat_s_short_fract; // expected-error{{'_Complex _Fract' is invalid}}
+_Complex _Fract cmplx_sat_s_fract; // expected-error{{'_Complex _Fract' is invalid}}
+_Complex long _Fract cmplx_sat_s_long_fract; // expected-error{{'_Complex _Fract' is invalid}}
+
/* Bad combinations */
float _Accum f_accum; // expected-error{{cannot combine with previous 'float' declaration specifier}}
double _Accum d_accum; // expected-error{{cannot combine with previous 'double' declaration specifier}}
_Bool _Accum b_accum; // expected-error{{cannot combine with previous '_Bool' declaration specifier}}
char _Accum c_accum; // expected-error{{cannot combine with previous 'char' declaration specifier}}
int _Accum i_accum; // expected-error{{cannot combine with previous 'int' declaration specifier}}
+
+float _Fract f_fract; // expected-error{{cannot combine with previous 'float' declaration specifier}}
+double _Fract d_fract; // expected-error{{cannot combine with previous 'double' declaration specifier}}
+_Bool _Fract b_fract; // expected-error{{cannot combine with previous '_Bool' declaration specifier}}
+char _Fract c_fract; // expected-error{{cannot combine with previous 'char' declaration specifier}}
+int _Fract i_fract; // expected-error{{cannot combine with previous 'int' declaration specifier}}
+
+/* Bad saturated combinations */
+_Sat float f; // expected-error{{'_Sat' specifier is only valid on '_Fract' or '_Accum', not 'float'}}
+_Sat double d; // expected-error{{'_Sat' specifier is only valid on '_Fract' or '_Accum', not 'double'}}
+_Sat _Bool b; // expected-error{{'_Sat' specifier is only valid on '_Fract' or '_Accum', not '_Bool'}}
+_Sat char c; // expected-error{{'_Sat' specifier is only valid on '_Fract' or '_Accum', not 'char'}}
+_Sat int i; // expected-error{{'_Sat' specifier is only valid on '_Fract' or '_Accum', not 'int'}}
+_Sat _Sat _Fract fract; // expected-warning{{duplicate '_Sat' declaration specifier}}
+
+/* Do not allow typedef to be used with typedef'd types */
+typedef short _Fract shortfract_t;
+typedef short _Accum shortaccum_t;
+typedef _Fract fract_t;
+typedef _Accum accum_t;
+typedef long _Fract longfract_t;
+typedef long _Accum longaccum_t;
+_Sat shortfract_t td_sat_short_fract; // expected-error{{'_Sat' specifier is only valid on '_Fract' or '_Accum', not 'type-name'}}
+_Sat shortaccum_t td_sat_short_accum; // expected-error{{'_Sat' specifier is only valid on '_Fract' or '_Accum', not 'type-name'}}
+_Sat fract_t td_sat_fract; // expected-error{{'_Sat' specifier is only valid on '_Fract' or '_Accum', not 'type-name'}}
+_Sat accum_t td_sat_accum; // expected-error{{'_Sat' specifier is only valid on '_Fract' or '_Accum', not 'type-name'}}
+_Sat longfract_t td_sat_long_fract; // expected-error{{'_Sat' specifier is only valid on '_Fract' or '_Accum', not 'type-name'}}
+_Sat longaccum_t td_sat_long_accum; // expected-error{{'_Sat' specifier is only valid on '_Fract' or '_Accum', not 'type-name'}}
diff --git a/clang/test/Frontend/fixed_point_errors.cpp b/clang/test/Frontend/fixed_point_errors.cpp
index aa95bb10c5d..37027b4ef05 100644
--- a/clang/test/Frontend/fixed_point_errors.cpp
+++ b/clang/test/Frontend/fixed_point_errors.cpp
@@ -1,5 +1,9 @@
+// RUN: %clang_cc1 -x c++ %s -verify
// RUN: %clang_cc1 -x c++ -ffixed-point %s -verify
// Name namgling is not provided for fixed point types in c++
_Accum accum; // expected-error{{unknown type name '_Accum'}}
+_Fract fract; // expected-error{{unknown type name '_Fract'}}
+_Sat _Accum sat_accum; // expected-error{{unknown type name '_Sat'}}
+ // expected-error@-1{{expected ';' after top level declarator}}
OpenPOWER on IntegriCloud