summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/lib/Lex/LiteralSupport.cpp15
-rw-r--r--clang/test/Frontend/fixed_point_errors.c84
-rw-r--r--clang/test/Frontend/fixed_point_errors.cpp5
-rw-r--r--clang/test/Frontend/fixed_point_not_enabled.c6
4 files changed, 105 insertions, 5 deletions
diff --git a/clang/lib/Lex/LiteralSupport.cpp b/clang/lib/Lex/LiteralSupport.cpp
index c1be3b2a97e..e695b2ba376 100644
--- a/clang/lib/Lex/LiteralSupport.cpp
+++ b/clang/lib/Lex/LiteralSupport.cpp
@@ -572,10 +572,12 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling,
checkSeparator(TokLoc, s, CSK_AfterDigits);
// Initial scan to lookahead for fixed point suffix.
- for (const char *c = s; c != ThisTokEnd; ++c) {
- if (*c == 'r' || *c == 'k' || *c == 'R' || *c == 'K') {
- saw_fixed_point_suffix = true;
- break;
+ if (PP.getLangOpts().FixedPoint) {
+ for (const char *c = s; c != ThisTokEnd; ++c) {
+ if (*c == 'r' || *c == 'k' || *c == 'R' || *c == 'K') {
+ saw_fixed_point_suffix = true;
+ break;
+ }
}
}
@@ -589,12 +591,16 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling,
switch (*s) {
case 'R':
case 'r':
+ if (!PP.getLangOpts().FixedPoint) break;
if (isFract || isAccum) break;
+ if (!(saw_period || saw_exponent)) break;
isFract = true;
continue;
case 'K':
case 'k':
+ if (!PP.getLangOpts().FixedPoint) break;
if (isFract || isAccum) break;
+ if (!(saw_period || saw_exponent)) break;
isAccum = true;
continue;
case 'h': // FP Suffix for "half".
@@ -734,7 +740,6 @@ NumericLiteralParser::NumericLiteralParser(StringRef TokSpelling,
if (!hadError && saw_fixed_point_suffix) {
assert(isFract || isAccum);
- //assert(radix == 16 || radix == 10);
}
}
diff --git a/clang/test/Frontend/fixed_point_errors.c b/clang/test/Frontend/fixed_point_errors.c
index f55fc82f917..41427e34315 100644
--- a/clang/test/Frontend/fixed_point_errors.c
+++ b/clang/test/Frontend/fixed_point_errors.c
@@ -148,3 +148,87 @@ _Accum dec_with_hex_exp1 = 0.1p10k; // expected-error{{invalid suffix 'p10k'
_Accum dec_with_hex_exp2 = 0.1P10k; // expected-error{{invalid suffix 'P10k' on integer constant}}
_Accum hex_with_dex_exp1 = 0x0.1e10k; // expected-error{{hexadecimal floating constant requires an exponent}}
_Accum hex_with_dex_exp2 = 0x0.1E10k; // expected-error{{hexadecimal floating constant requires an exponent}}
+
+void CheckSuffixOnIntegerLiterals() {
+ _Accum short_acc_int;
+ _Accum acc_int;
+ _Accum long_acc_int;
+
+ _Accum u_short_acc_int;
+ _Accum u_acc_int;
+ _Accum u_long_acc_int;
+
+ _Fract short_fract_int;
+ _Fract fract_int;
+ _Fract long_fract_int;
+
+ _Fract u_short_fract_int;
+ _Fract u_fract_int;
+ _Fract u_long_fract_int;
+
+ // Decimal integer literals (non-zero)
+ short_acc_int = 10hk; // expected-error{{invalid suffix 'hk' on integer constant}}
+ acc_int = 10k; // expected-error{{invalid suffix 'k' on integer constant}}
+ long_acc_int = 10lk; // expected-error{{invalid suffix 'lk' on integer constant}}
+
+ u_short_acc_int = 10uhk; // expected-error{{invalid suffix 'uhk' on integer constant}}
+ u_acc_int = 10uk; // expected-error{{invalid suffix 'uk' on integer constant}}
+ u_long_acc_int = 10ulk; // expected-error{{invalid suffix 'ulk' on integer constant}}
+
+ short_fract_int = 10hr; // expected-error{{invalid suffix 'hr' on integer constant}}
+ fract_int = 10r; // expected-error{{invalid suffix 'r' on integer constant}}
+ long_fract_int = 10lr; // expected-error{{invalid suffix 'lr' on integer constant}}
+
+ u_short_fract_int = 10uhr; // expected-error{{invalid suffix 'uhr' on integer constant}}
+ u_fract_int = 10ur; // expected-error{{invalid suffix 'ur' on integer constant}}
+ u_long_fract_int = 10ulr; // expected-error{{invalid suffix 'ulr' on integer constant}}
+
+ // Decimal integer literals (0)
+ short_acc_int = 0hk; // expected-error{{invalid suffix 'hk' on integer constant}}
+ acc_int = 0k; // expected-error{{invalid suffix 'k' on integer constant}}
+ long_acc_int = 0lk; // expected-error{{invalid suffix 'lk' on integer constant}}
+
+ // Decimal integer literals (large number)
+ acc_int = 999999999999999999k; // expected-error{{invalid suffix 'k' on integer constant}}
+ fract_int = 999999999999999999r; // expected-error{{invalid suffix 'r' on integer constant}}
+
+ // Octal integer literals
+ short_acc_int = 010hk; // expected-error{{invalid suffix 'hk' on integer constant}}
+ acc_int = 010k; // expected-error{{invalid suffix 'k' on integer constant}}
+ long_acc_int = 010lk; // expected-error{{invalid suffix 'lk' on integer constant}}
+
+ u_short_acc_int = 010uhk; // expected-error{{invalid suffix 'uhk' on integer constant}}
+ u_acc_int = 010uk; // expected-error{{invalid suffix 'uk' on integer constant}}
+ u_long_acc_int = 010ulk; // expected-error{{invalid suffix 'ulk' on integer constant}}
+
+ short_fract_int = 010hr; // expected-error{{invalid suffix 'hr' on integer constant}}
+ fract_int = 010r; // expected-error{{invalid suffix 'r' on integer constant}}
+ long_fract_int = 010lr; // expected-error{{invalid suffix 'lr' on integer constant}}
+
+ u_short_fract_int = 010uhr; // expected-error{{invalid suffix 'uhr' on integer constant}}
+ u_fract_int = 010ur; // expected-error{{invalid suffix 'ur' on integer constant}}
+ u_long_fract_int = 010ulr; // expected-error{{invalid suffix 'ulr' on integer constant}}
+
+ // Hexadecimal integer literals
+ short_acc_int = 0x10hk; // expected-error{{invalid suffix 'hk' on integer constant}}
+ acc_int = 0x10k; // expected-error{{invalid suffix 'k' on integer constant}}
+ long_acc_int = 0x10lk; // expected-error{{invalid suffix 'lk' on integer constant}}
+
+ u_short_acc_int = 0x10uhk; // expected-error{{invalid suffix 'uhk' on integer constant}}
+ u_acc_int = 0x10uk; // expected-error{{invalid suffix 'uk' on integer constant}}
+ u_long_acc_int = 0x10ulk; // expected-error{{invalid suffix 'ulk' on integer constant}}
+
+ short_fract_int = 0x10hr; // expected-error{{invalid suffix 'hr' on integer constant}}
+ fract_int = 0x10r; // expected-error{{invalid suffix 'r' on integer constant}}
+ long_fract_int = 0x10lr; // expected-error{{invalid suffix 'lr' on integer constant}}
+
+ u_short_fract_int = 0x10uhr; // expected-error{{invalid suffix 'uhr' on integer constant}}
+ u_fract_int = 0x10ur; // expected-error{{invalid suffix 'ur' on integer constant}}
+ u_long_fract_int = 0x10ulr; // expected-error{{invalid suffix 'ulr' on integer constant}}
+
+ // Using auto
+ auto auto_fract = 0r; // expected-error{{invalid suffix 'r' on integer constant}}
+ // expected-warning@-1{{type specifier missing, defaults to 'int'}}
+ auto auto_accum = 0k; // expected-error{{invalid suffix 'k' on integer constant}}
+ // expected-warning@-1{{type specifier missing, defaults to 'int'}}
+}
diff --git a/clang/test/Frontend/fixed_point_errors.cpp b/clang/test/Frontend/fixed_point_errors.cpp
index 37027b4ef05..cdd90ceb754 100644
--- a/clang/test/Frontend/fixed_point_errors.cpp
+++ b/clang/test/Frontend/fixed_point_errors.cpp
@@ -7,3 +7,8 @@ _Accum accum; // expected-error{{unknown type name '_A
_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}}
+
+int accum_int = 10k; // expected-error{{invalid suffix 'k' on integer constant}}
+int fract_int = 10r; // expected-error{{invalid suffix 'r' on integer constant}}
+float accum_flt = 10.0k; // expected-error{{invalid suffix 'k' on floating constant}}
+float fract_flt = 10.0r; // expected-error{{invalid suffix 'r' on floating constant}}
diff --git a/clang/test/Frontend/fixed_point_not_enabled.c b/clang/test/Frontend/fixed_point_not_enabled.c
index e5c82f54b62..e7522213f98 100644
--- a/clang/test/Frontend/fixed_point_not_enabled.c
+++ b/clang/test/Frontend/fixed_point_not_enabled.c
@@ -13,3 +13,9 @@ short _Accum short_accum; // expected-error{{compile with '-ffixed-p
_Accum accum; // expected-error{{compile with '-ffixed-point' to enable fixed point types}}
// expected-warning@-1{{type specifier missing, defaults to 'int'}}
long _Accum long_accum; // expected-error{{compile with '-ffixed-point' to enable fixed point types}}
+
+// Cannot use fixed point suffixes
+int accum_int = 10k; // expected-error{{invalid suffix 'k' on integer constant}}
+int fract_int = 10r; // expected-error{{invalid suffix 'r' on integer constant}}
+float accum_flt = 10.0k; // expected-error{{invalid suffix 'k' on floating constant}}
+float fract_flt = 10.0r; // expected-error{{invalid suffix 'r' on floating constant}}
OpenPOWER on IntegriCloud