Implement a flag -fext-numeric-literals that allows control of whether GNU...
Implement a flag -fext-numeric-literals that allows control of whether GNU numeric suffix extensions are parsed or passed to C++ as user-defined literals. From-SVN: r193382
This commit is contained in:
parent
97996ede57
commit
a4a0016d60
16 changed files with 605 additions and 59 deletions
|
@ -1,3 +1,8 @@
|
|||
2012-11-09 Ed Smith-Rowland <3dw4rd@verizon.net>
|
||||
|
||||
PR c++/54413
|
||||
* doc/invoke.texi: Document f[no-]ext-numeric-literals flag.
|
||||
|
||||
2012-11-09 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
* doc/install.texi (sparc64-x-solaris2): Mention MPC as well.
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2012-11-09 Ed Smith-Rowland <3dw4rd@verizon.net>
|
||||
|
||||
PR c++/54413
|
||||
* c-opts.c (c_common_handle_option): Set new flags.
|
||||
* c.opt: Describe new flags.
|
||||
|
||||
2012-11-09 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* c.opt (Wabi-tag): New.
|
||||
|
|
|
@ -578,6 +578,10 @@ c_common_handle_option (size_t scode, const char *arg, int value,
|
|||
set_struct_debug_option (&global_options, loc, arg);
|
||||
break;
|
||||
|
||||
case OPT_fext_numeric_literals:
|
||||
cpp_opts->ext_numeric_literals = value;
|
||||
break;
|
||||
|
||||
case OPT_idirafter:
|
||||
add_path (xstrdup (arg), AFTER, 0, true);
|
||||
break;
|
||||
|
@ -660,13 +664,21 @@ c_common_handle_option (size_t scode, const char *arg, int value,
|
|||
case OPT_std_c__11:
|
||||
case OPT_std_gnu__11:
|
||||
if (!preprocessing_asm_p)
|
||||
set_std_cxx11 (code == OPT_std_c__11 /* ISO */);
|
||||
{
|
||||
set_std_cxx11 (code == OPT_std_c__11 /* ISO */);
|
||||
if (code == OPT_std_c__11)
|
||||
cpp_opts->ext_numeric_literals = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case OPT_std_c__1y:
|
||||
case OPT_std_gnu__1y:
|
||||
if (!preprocessing_asm_p)
|
||||
set_std_cxx1y (code == OPT_std_c__11 /* ISO */);
|
||||
{
|
||||
set_std_cxx1y (code == OPT_std_c__1y /* ISO */);
|
||||
if (code == OPT_std_c__1y)
|
||||
cpp_opts->ext_numeric_literals = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case OPT_std_c90:
|
||||
|
|
|
@ -1234,6 +1234,11 @@ femit-struct-debug-detailed=
|
|||
C ObjC C++ ObjC++ Joined
|
||||
-femit-struct-debug-detailed=<spec-list> Detailed reduced debug info for structs
|
||||
|
||||
fext-numeric-literals
|
||||
C++ ObjC++
|
||||
Interpret imaginary, fixed-point, or other gnu number suffix as the corresponding
|
||||
number literal rather than a user-defined number literal.
|
||||
|
||||
idirafter
|
||||
C ObjC C++ ObjC++ Joined Separate MissingArgError(missing path after %qs)
|
||||
-idirafter <dir> Add <dir> to the end of the system include path
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2012-11-09 Ed Smith-Rowland <3dw4rd@verizon.net>
|
||||
|
||||
PR c++/54413
|
||||
* decl.c (grokfndecl): Adjust calls to interpret_x_suffix.
|
||||
|
||||
2012-11-09 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/54859
|
||||
|
|
|
@ -7567,13 +7567,13 @@ grokfndecl (tree ctype,
|
|||
suffix = UDLIT_OP_SUFFIX (DECL_NAME (decl));
|
||||
if (long_long_unsigned_p)
|
||||
{
|
||||
if (cpp_interpret_int_suffix (suffix, strlen (suffix)))
|
||||
if (cpp_interpret_int_suffix (parse_in, suffix, strlen (suffix)))
|
||||
warning (0, "integer suffix %<%s%>"
|
||||
" shadowed by implementation", suffix);
|
||||
}
|
||||
else if (long_double_p)
|
||||
{
|
||||
if (cpp_interpret_float_suffix (suffix, strlen (suffix)))
|
||||
if (cpp_interpret_float_suffix (parse_in, suffix, strlen (suffix)))
|
||||
warning (0, "floating point suffix %<%s%>"
|
||||
" shadowed by implementation", suffix);
|
||||
}
|
||||
|
|
|
@ -197,6 +197,7 @@ in the following sections.
|
|||
-fno-threadsafe-statics -fuse-cxa-atexit -fno-weak -nostdinc++ @gol
|
||||
-fno-default-inline -fvisibility-inlines-hidden @gol
|
||||
-fvisibility-ms-compat @gol
|
||||
-fext-numeric-literals @gol
|
||||
-Wabi -Wconversion-null -Wctor-dtor-privacy @gol
|
||||
-Wdelete-non-virtual-dtor -Wliteral-suffix -Wnarrowing @gol
|
||||
-Wnoexcept -Wnon-virtual-dtor -Wreorder @gol
|
||||
|
@ -2515,6 +2516,19 @@ struct A @{
|
|||
The compiler rearranges the member initializers for @samp{i}
|
||||
and @samp{j} to match the declaration order of the members, emitting
|
||||
a warning to that effect. This warning is enabled by @option{-Wall}.
|
||||
|
||||
@item -fext-numeric-literals @r{(C++ and Objective-C++ only)}
|
||||
@opindex fext-numeric-literals
|
||||
@opindex fno-ext-numeric-literals
|
||||
Accept imaginary, fixed-point, or machine-defined
|
||||
literal number suffixes as GNU extensions.
|
||||
When this option is turned off these suffixes are treated
|
||||
as C++11 user-defined literal numeric suffixes.
|
||||
This is on by default for all pre-C++11 dialects and all GNU dialects:
|
||||
@option{-std=c++98}, @option{-std=gnu++98}, @option{-std=gnu++11},
|
||||
@option{-std=gnu++1y}.
|
||||
This option is off by default
|
||||
for ISO C++11 onwards (@option{-std=c++11}, ...).
|
||||
@end table
|
||||
|
||||
The following @option{-W@dots{}} options are not affected by @option{-Wall}.
|
||||
|
|
|
@ -1,3 +1,11 @@
|
|||
2012-11-09 Ed Smith-Rowland <3dw4rd@verizon.net>
|
||||
|
||||
PR c++/54413
|
||||
* g++.dg/cpp0x/gnu_fext-numeric-literals.C: New.
|
||||
* g++.dg/cpp0x/std_fext-numeric-literals.C: New.
|
||||
* g++.dg/cpp0x/gnu_fno-ext-numeric-literals.C: New.
|
||||
* g++.dg/cpp0x/std_fno-ext-numeric-literals.C: New.
|
||||
|
||||
2012-11-09 Siddhesh Poyarekar <siddhesh@redhat.com>
|
||||
|
||||
* gcc.dg/Warray-bounds-3.c (bar): Keep array access within
|
||||
|
|
115
gcc/testsuite/g++.dg/cpp0x/gnu_fext-numeric-literals.C
Normal file
115
gcc/testsuite/g++.dg/cpp0x/gnu_fext-numeric-literals.C
Normal file
|
@ -0,0 +1,115 @@
|
|||
// { dg-do compile }
|
||||
// { dg-options "-std=gnu++11" }
|
||||
|
||||
// Integer imaginary...
|
||||
|
||||
constexpr unsigned long long
|
||||
operator"" i(unsigned long long n) // { dg-warning "shadowed by implementation" }
|
||||
{ return 4 * n + 0; }
|
||||
|
||||
constexpr unsigned long long
|
||||
operator"" I(unsigned long long n) // { dg-warning "shadowed by implementation" }
|
||||
{ return 4 * n + 1; }
|
||||
|
||||
constexpr unsigned long long
|
||||
operator"" j(unsigned long long n) // { dg-warning "shadowed by implementation" }
|
||||
{ return 4 * n + 2; }
|
||||
|
||||
constexpr unsigned long long
|
||||
operator"" J(unsigned long long n) // { dg-warning "shadowed by implementation" }
|
||||
{ return 4 * n + 3; }
|
||||
|
||||
// Floating-point imaginary...
|
||||
|
||||
constexpr long double
|
||||
operator"" i(long double n) // { dg-warning "shadowed by implementation" }
|
||||
{ return 4.0L * n + 0.0L; }
|
||||
|
||||
constexpr long double
|
||||
operator"" I(long double n) // { dg-warning "shadowed by implementation" }
|
||||
{ return 4.0L * n + 1.0L; }
|
||||
|
||||
constexpr long double
|
||||
operator"" j(long double n) // { dg-warning "shadowed by implementation" }
|
||||
{ return 4.0L * n + 2.0L; }
|
||||
|
||||
constexpr long double
|
||||
operator"" J(long double n) // { dg-warning "shadowed by implementation" }
|
||||
{ return 4.0L * n + 3.0L; }
|
||||
|
||||
// Fixed-point...
|
||||
|
||||
constexpr long double
|
||||
operator"" k(long double n) // { dg-warning "shadowed by implementation" }
|
||||
{ return 4 * (n + 1) + 0; }
|
||||
|
||||
constexpr long double
|
||||
operator"" K(long double n) // { dg-warning "shadowed by implementation" }
|
||||
{ return 4 * (n + 1) + 1; }
|
||||
|
||||
constexpr long double
|
||||
operator"" r(long double n) // { dg-warning "shadowed by implementation" }
|
||||
{ return 4 * (n + 1) + 2; }
|
||||
|
||||
constexpr long double
|
||||
operator"" R(long double n) // { dg-warning "shadowed by implementation" }
|
||||
{ return 4 * (n + 1) + 3; }
|
||||
|
||||
// Machine-defined...
|
||||
|
||||
constexpr long double
|
||||
operator"" w(long double n) // { dg-warning "shadowed by implementation" }
|
||||
{ return 4 * (n + 2) + 0; }
|
||||
|
||||
constexpr long double
|
||||
operator"" W(long double n) // { dg-warning "shadowed by implementation" }
|
||||
{ return 4 * (n + 2) + 1; }
|
||||
|
||||
constexpr long double
|
||||
operator"" q(long double n) // { dg-warning "shadowed by implementation" }
|
||||
{ return 4 * (n + 2) + 2; }
|
||||
|
||||
constexpr long double
|
||||
operator"" Q(long double n) // { dg-warning "shadowed by implementation" }
|
||||
{ return 4 * (n + 2) + 3; }
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
auto ii = 1i;
|
||||
auto Ii = 1I;
|
||||
auto ji = 1j;
|
||||
auto Ji = 1J;
|
||||
|
||||
auto ifp = 1.0i;
|
||||
auto Ifp = 1.0I;
|
||||
auto jfp = 1.0j;
|
||||
auto Jfp = 1.0J;
|
||||
|
||||
auto kfp = 1.0k; // { dg-error "fixed-point types not supported" }
|
||||
auto Kfp = 1.0K; // { dg-error "fixed-point types not supported" }
|
||||
auto rfp = 1.0r; // { dg-error "fixed-point types not supported" }
|
||||
auto Rfp = 1.0R; // { dg-error "fixed-point types not supported" }
|
||||
|
||||
auto wfp = 1.0w;
|
||||
auto Wfp = 1.0W;
|
||||
auto qfp = 1.0q;
|
||||
auto Qfp = 1.0Q;
|
||||
}
|
||||
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 7 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 11 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 15 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 19 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 25 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 29 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 33 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 37 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 43 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 47 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 51 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 55 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 61 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 65 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 69 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 73 }
|
115
gcc/testsuite/g++.dg/cpp0x/gnu_fno-ext-numeric-literals.C
Normal file
115
gcc/testsuite/g++.dg/cpp0x/gnu_fno-ext-numeric-literals.C
Normal file
|
@ -0,0 +1,115 @@
|
|||
// { dg-do compile }
|
||||
// { dg-options "-std=gnu++11 -fno-ext-numeric-literals" }
|
||||
|
||||
// Integer imaginary...
|
||||
|
||||
constexpr unsigned long long
|
||||
operator"" i(unsigned long long n)
|
||||
{ return 4 * n + 0; }
|
||||
|
||||
constexpr unsigned long long
|
||||
operator"" I(unsigned long long n)
|
||||
{ return 4 * n + 1; }
|
||||
|
||||
constexpr unsigned long long
|
||||
operator"" j(unsigned long long n)
|
||||
{ return 4 * n + 2; }
|
||||
|
||||
constexpr unsigned long long
|
||||
operator"" J(unsigned long long n)
|
||||
{ return 4 * n + 3; }
|
||||
|
||||
// Floating-point imaginary...
|
||||
|
||||
constexpr long double
|
||||
operator"" i(long double n)
|
||||
{ return 4.0L * n + 0.0L; }
|
||||
|
||||
constexpr long double
|
||||
operator"" I(long double n)
|
||||
{ return 4.0L * n + 1.0L; }
|
||||
|
||||
constexpr long double
|
||||
operator"" j(long double n)
|
||||
{ return 4.0L * n + 2.0L; }
|
||||
|
||||
constexpr long double
|
||||
operator"" J(long double n)
|
||||
{ return 4.0L * n + 3.0L; }
|
||||
|
||||
// Fixed-point...
|
||||
|
||||
constexpr long double
|
||||
operator"" k(long double n)
|
||||
{ return 4 * (n + 1) + 0; }
|
||||
|
||||
constexpr long double
|
||||
operator"" K(long double n)
|
||||
{ return 4 * (n + 1) + 1; }
|
||||
|
||||
constexpr long double
|
||||
operator"" r(long double n)
|
||||
{ return 4 * (n + 1) + 2; }
|
||||
|
||||
constexpr long double
|
||||
operator"" R(long double n)
|
||||
{ return 4 * (n + 1) + 3; }
|
||||
|
||||
// Machine-defined...
|
||||
|
||||
constexpr long double
|
||||
operator"" w(long double n)
|
||||
{ return 4 * (n + 2) + 0; }
|
||||
|
||||
constexpr long double
|
||||
operator"" W(long double n)
|
||||
{ return 4 * (n + 2) + 1; }
|
||||
|
||||
constexpr long double
|
||||
operator"" q(long double n)
|
||||
{ return 4 * (n + 2) + 2; }
|
||||
|
||||
constexpr long double
|
||||
operator"" Q(long double n)
|
||||
{ return 4 * (n + 2) + 3; }
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
auto ii = 1i;
|
||||
auto Ii = 1I;
|
||||
auto ji = 1j;
|
||||
auto Ji = 1J;
|
||||
|
||||
auto ifp = 1.0i;
|
||||
auto Ifp = 1.0I;
|
||||
auto jfp = 1.0j;
|
||||
auto Jfp = 1.0J;
|
||||
|
||||
auto kfp = 1.0k;
|
||||
auto Kfp = 1.0K;
|
||||
auto rfp = 1.0r;
|
||||
auto Rfp = 1.0R;
|
||||
|
||||
auto wfp = 1.0w;
|
||||
auto Wfp = 1.0W;
|
||||
auto qfp = 1.0q;
|
||||
auto Qfp = 1.0Q;
|
||||
}
|
||||
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 7 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 11 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 15 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 19 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 25 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 29 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 33 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 37 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 43 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 47 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 51 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 55 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 61 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 65 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 69 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 73 }
|
115
gcc/testsuite/g++.dg/cpp0x/std_fext-numeric-literals.C
Normal file
115
gcc/testsuite/g++.dg/cpp0x/std_fext-numeric-literals.C
Normal file
|
@ -0,0 +1,115 @@
|
|||
// { dg-do compile }
|
||||
// { dg-options "-std=c++11 -fext-numeric-literals" }
|
||||
|
||||
// Integer imaginary...
|
||||
|
||||
constexpr unsigned long long
|
||||
operator"" i(unsigned long long n) // { dg-warning "shadowed by implementation" }
|
||||
{ return 4 * n + 0; }
|
||||
|
||||
constexpr unsigned long long
|
||||
operator"" I(unsigned long long n) // { dg-warning "shadowed by implementation" }
|
||||
{ return 4 * n + 1; }
|
||||
|
||||
constexpr unsigned long long
|
||||
operator"" j(unsigned long long n) // { dg-warning "shadowed by implementation" }
|
||||
{ return 4 * n + 2; }
|
||||
|
||||
constexpr unsigned long long
|
||||
operator"" J(unsigned long long n) // { dg-warning "shadowed by implementation" }
|
||||
{ return 4 * n + 3; }
|
||||
|
||||
// Floating-point imaginary...
|
||||
|
||||
constexpr long double
|
||||
operator"" i(long double n) // { dg-warning "shadowed by implementation" }
|
||||
{ return 4.0L * n + 0.0L; }
|
||||
|
||||
constexpr long double
|
||||
operator"" I(long double n) // { dg-warning "shadowed by implementation" }
|
||||
{ return 4.0L * n + 1.0L; }
|
||||
|
||||
constexpr long double
|
||||
operator"" j(long double n) // { dg-warning "shadowed by implementation" }
|
||||
{ return 4.0L * n + 2.0L; }
|
||||
|
||||
constexpr long double
|
||||
operator"" J(long double n) // { dg-warning "shadowed by implementation" }
|
||||
{ return 4.0L * n + 3.0L; }
|
||||
|
||||
// Fixed-point...
|
||||
|
||||
constexpr long double
|
||||
operator"" k(long double n) // { dg-warning "shadowed by implementation" }
|
||||
{ return 4 * (n + 1) + 0; }
|
||||
|
||||
constexpr long double
|
||||
operator"" K(long double n) // { dg-warning "shadowed by implementation" }
|
||||
{ return 4 * (n + 1) + 1; }
|
||||
|
||||
constexpr long double
|
||||
operator"" r(long double n) // { dg-warning "shadowed by implementation" }
|
||||
{ return 4 * (n + 1) + 2; }
|
||||
|
||||
constexpr long double
|
||||
operator"" R(long double n) // { dg-warning "shadowed by implementation" }
|
||||
{ return 4 * (n + 1) + 3; }
|
||||
|
||||
// Machine-defined...
|
||||
|
||||
constexpr long double
|
||||
operator"" w(long double n) // { dg-warning "shadowed by implementation" }
|
||||
{ return 4 * (n + 2) + 0; }
|
||||
|
||||
constexpr long double
|
||||
operator"" W(long double n) // { dg-warning "shadowed by implementation" }
|
||||
{ return 4 * (n + 2) + 1; }
|
||||
|
||||
constexpr long double
|
||||
operator"" q(long double n) // { dg-warning "shadowed by implementation" }
|
||||
{ return 4 * (n + 2) + 2; }
|
||||
|
||||
constexpr long double
|
||||
operator"" Q(long double n) // { dg-warning "shadowed by implementation" }
|
||||
{ return 4 * (n + 2) + 3; }
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
auto ii = 1i;
|
||||
auto Ii = 1I;
|
||||
auto ji = 1j;
|
||||
auto Ji = 1J;
|
||||
|
||||
auto ifp = 1.0i;
|
||||
auto Ifp = 1.0I;
|
||||
auto jfp = 1.0j;
|
||||
auto Jfp = 1.0J;
|
||||
|
||||
auto kfp = 1.0k; // { dg-error "fixed-point types not supported" }
|
||||
auto Kfp = 1.0K; // { dg-error "fixed-point types not supported" }
|
||||
auto rfp = 1.0r; // { dg-error "fixed-point types not supported" }
|
||||
auto Rfp = 1.0R; // { dg-error "fixed-point types not supported" }
|
||||
|
||||
auto wfp = 1.0w;
|
||||
auto Wfp = 1.0W;
|
||||
auto qfp = 1.0q;
|
||||
auto Qfp = 1.0Q;
|
||||
}
|
||||
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 7 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 11 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 15 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 19 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 25 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 29 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 33 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 37 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 43 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 47 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 51 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 55 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 61 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 65 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 69 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 73 }
|
115
gcc/testsuite/g++.dg/cpp0x/std_fno-ext-numeric-literals.C
Normal file
115
gcc/testsuite/g++.dg/cpp0x/std_fno-ext-numeric-literals.C
Normal file
|
@ -0,0 +1,115 @@
|
|||
// { dg-do compile }
|
||||
// { dg-options "-std=c++11" }
|
||||
|
||||
// Integer imaginary...
|
||||
|
||||
constexpr unsigned long long
|
||||
operator"" i(unsigned long long n)
|
||||
{ return 4 * n + 0; }
|
||||
|
||||
constexpr unsigned long long
|
||||
operator"" I(unsigned long long n)
|
||||
{ return 4 * n + 1; }
|
||||
|
||||
constexpr unsigned long long
|
||||
operator"" j(unsigned long long n)
|
||||
{ return 4 * n + 2; }
|
||||
|
||||
constexpr unsigned long long
|
||||
operator"" J(unsigned long long n)
|
||||
{ return 4 * n + 3; }
|
||||
|
||||
// Floating-point imaginary...
|
||||
|
||||
constexpr long double
|
||||
operator"" i(long double n)
|
||||
{ return 4.0L * n + 0.0L; }
|
||||
|
||||
constexpr long double
|
||||
operator"" I(long double n)
|
||||
{ return 4.0L * n + 1.0L; }
|
||||
|
||||
constexpr long double
|
||||
operator"" j(long double n)
|
||||
{ return 4.0L * n + 2.0L; }
|
||||
|
||||
constexpr long double
|
||||
operator"" J(long double n)
|
||||
{ return 4.0L * n + 3.0L; }
|
||||
|
||||
// Fixed-point...
|
||||
|
||||
constexpr long double
|
||||
operator"" k(long double n)
|
||||
{ return 4 * (n + 1) + 0; }
|
||||
|
||||
constexpr long double
|
||||
operator"" K(long double n)
|
||||
{ return 4 * (n + 1) + 1; }
|
||||
|
||||
constexpr long double
|
||||
operator"" r(long double n)
|
||||
{ return 4 * (n + 1) + 2; }
|
||||
|
||||
constexpr long double
|
||||
operator"" R(long double n)
|
||||
{ return 4 * (n + 1) + 3; }
|
||||
|
||||
// Machine-defined...
|
||||
|
||||
constexpr long double
|
||||
operator"" w(long double n)
|
||||
{ return 4 * (n + 2) + 0; }
|
||||
|
||||
constexpr long double
|
||||
operator"" W(long double n)
|
||||
{ return 4 * (n + 2) + 1; }
|
||||
|
||||
constexpr long double
|
||||
operator"" q(long double n)
|
||||
{ return 4 * (n + 2) + 2; }
|
||||
|
||||
constexpr long double
|
||||
operator"" Q(long double n)
|
||||
{ return 4 * (n + 2) + 3; }
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
auto ii = 1i;
|
||||
auto Ii = 1I;
|
||||
auto ji = 1j;
|
||||
auto Ji = 1J;
|
||||
|
||||
auto ifp = 1.0i;
|
||||
auto Ifp = 1.0I;
|
||||
auto jfp = 1.0j;
|
||||
auto Jfp = 1.0J;
|
||||
|
||||
auto kfp = 1.0k;
|
||||
auto Kfp = 1.0K;
|
||||
auto rfp = 1.0r;
|
||||
auto Rfp = 1.0R;
|
||||
|
||||
auto wfp = 1.0w;
|
||||
auto Wfp = 1.0W;
|
||||
auto qfp = 1.0q;
|
||||
auto Qfp = 1.0Q;
|
||||
}
|
||||
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 7 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 11 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 15 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 19 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 25 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 29 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 33 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 37 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 43 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 47 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 51 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 55 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 61 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 65 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 69 }
|
||||
// { dg-warning "literal operator suffixes not preceded by" "" { target *-*-* } 73 }
|
|
@ -1,3 +1,15 @@
|
|||
2012-11-09 Ed Smith-Rowland <3dw4rd@verizon.net>
|
||||
|
||||
PR c++/54413
|
||||
* include/cpplib.h (cpp_interpret_float_suffix): Add cpp_reader* arg.
|
||||
(cpp_interpret_int_suffix): Add cpp_reader* arg.
|
||||
* init.c (cpp_create_reader): Iitialize new flags.
|
||||
* expr.c (interpret_float_suffix): Use new flags.
|
||||
(cpp_interpret_float_suffix): Add cpp_reader* arg.
|
||||
(interpret_int_suffix): Use new flags.
|
||||
(cpp_interpret_int_suffix): Add cpp_reader* arg.
|
||||
(cpp_classify_number): Adjust calls to interpret_x_suffix.
|
||||
|
||||
2012-10-23 Ian Bolton <ian.bolton@arm.com>
|
||||
Jim MacArthur <jim.macarthur@arm.com>
|
||||
Marcus Shawcroft <marcus.shawcroft@arm.com>
|
||||
|
|
118
libcpp/expr.c
118
libcpp/expr.c
|
@ -61,8 +61,8 @@ static cpp_num append_digit (cpp_num, int, int, size_t);
|
|||
static cpp_num parse_defined (cpp_reader *);
|
||||
static cpp_num eval_token (cpp_reader *, const cpp_token *, source_location);
|
||||
static struct op *reduce (cpp_reader *, struct op *, enum cpp_ttype);
|
||||
static unsigned int interpret_float_suffix (const uchar *, size_t);
|
||||
static unsigned int interpret_int_suffix (const uchar *, size_t);
|
||||
static unsigned int interpret_float_suffix (cpp_reader *, const uchar *, size_t);
|
||||
static unsigned int interpret_int_suffix (cpp_reader *, const uchar *, size_t);
|
||||
static void check_promotion (cpp_reader *, const struct op *);
|
||||
|
||||
/* Token type abuse to create unary plus and minus operators. */
|
||||
|
@ -87,7 +87,7 @@ static void check_promotion (cpp_reader *, const struct op *);
|
|||
length LEN, possibly zero. Returns 0 for an invalid suffix, or a
|
||||
flag vector describing the suffix. */
|
||||
static unsigned int
|
||||
interpret_float_suffix (const uchar *s, size_t len)
|
||||
interpret_float_suffix (cpp_reader *pfile, const uchar *s, size_t len)
|
||||
{
|
||||
size_t flags;
|
||||
size_t f, d, l, w, q, i;
|
||||
|
@ -115,55 +115,58 @@ interpret_float_suffix (const uchar *s, size_t len)
|
|||
}
|
||||
}
|
||||
|
||||
/* Recognize a fixed-point suffix. */
|
||||
if (len != 0)
|
||||
switch (s[len-1])
|
||||
{
|
||||
case 'k': case 'K': flags = CPP_N_ACCUM; break;
|
||||
case 'r': case 'R': flags = CPP_N_FRACT; break;
|
||||
default: break;
|
||||
}
|
||||
|
||||
/* Continue processing a fixed-point suffix. The suffix is case
|
||||
insensitive except for ll or LL. Order is significant. */
|
||||
if (flags)
|
||||
if (CPP_OPTION (pfile, ext_numeric_literals))
|
||||
{
|
||||
if (len == 1)
|
||||
return flags;
|
||||
len--;
|
||||
/* Recognize a fixed-point suffix. */
|
||||
if (len != 0)
|
||||
switch (s[len-1])
|
||||
{
|
||||
case 'k': case 'K': flags = CPP_N_ACCUM; break;
|
||||
case 'r': case 'R': flags = CPP_N_FRACT; break;
|
||||
default: break;
|
||||
}
|
||||
|
||||
if (*s == 'u' || *s == 'U')
|
||||
/* Continue processing a fixed-point suffix. The suffix is case
|
||||
insensitive except for ll or LL. Order is significant. */
|
||||
if (flags)
|
||||
{
|
||||
flags |= CPP_N_UNSIGNED;
|
||||
if (len == 1)
|
||||
return flags;
|
||||
len--;
|
||||
s++;
|
||||
}
|
||||
|
||||
switch (*s)
|
||||
{
|
||||
case 'h': case 'H':
|
||||
if (len == 1)
|
||||
return flags |= CPP_N_SMALL;
|
||||
break;
|
||||
case 'l':
|
||||
if (len == 1)
|
||||
return flags |= CPP_N_MEDIUM;
|
||||
if (len == 2 && s[1] == 'l')
|
||||
return flags |= CPP_N_LARGE;
|
||||
break;
|
||||
case 'L':
|
||||
if (len == 1)
|
||||
return flags |= CPP_N_MEDIUM;
|
||||
if (len == 2 && s[1] == 'L')
|
||||
return flags |= CPP_N_LARGE;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
/* Anything left at this point is invalid. */
|
||||
return 0;
|
||||
if (*s == 'u' || *s == 'U')
|
||||
{
|
||||
flags |= CPP_N_UNSIGNED;
|
||||
if (len == 1)
|
||||
return flags;
|
||||
len--;
|
||||
s++;
|
||||
}
|
||||
|
||||
switch (*s)
|
||||
{
|
||||
case 'h': case 'H':
|
||||
if (len == 1)
|
||||
return flags |= CPP_N_SMALL;
|
||||
break;
|
||||
case 'l':
|
||||
if (len == 1)
|
||||
return flags |= CPP_N_MEDIUM;
|
||||
if (len == 2 && s[1] == 'l')
|
||||
return flags |= CPP_N_LARGE;
|
||||
break;
|
||||
case 'L':
|
||||
if (len == 1)
|
||||
return flags |= CPP_N_MEDIUM;
|
||||
if (len == 2 && s[1] == 'L')
|
||||
return flags |= CPP_N_LARGE;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
/* Anything left at this point is invalid. */
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* In any remaining valid suffix, the case and order don't matter. */
|
||||
|
@ -184,6 +187,12 @@ interpret_float_suffix (const uchar *s, size_t len)
|
|||
if (f + d + l + w + q > 1 || i > 1)
|
||||
return 0;
|
||||
|
||||
if (i && !CPP_OPTION (pfile, ext_numeric_literals))
|
||||
return 0;
|
||||
|
||||
if ((w || q) && !CPP_OPTION (pfile, ext_numeric_literals))
|
||||
return 0;
|
||||
|
||||
return ((i ? CPP_N_IMAGINARY : 0)
|
||||
| (f ? CPP_N_SMALL :
|
||||
d ? CPP_N_MEDIUM :
|
||||
|
@ -194,16 +203,16 @@ interpret_float_suffix (const uchar *s, size_t len)
|
|||
|
||||
/* Return the classification flags for a float suffix. */
|
||||
unsigned int
|
||||
cpp_interpret_float_suffix (const char *s, size_t len)
|
||||
cpp_interpret_float_suffix (cpp_reader *pfile, const char *s, size_t len)
|
||||
{
|
||||
return interpret_float_suffix ((const unsigned char *)s, len);
|
||||
return interpret_float_suffix (pfile, (const unsigned char *)s, len);
|
||||
}
|
||||
|
||||
/* Subroutine of cpp_classify_number. S points to an integer suffix
|
||||
of length LEN, possibly zero. Returns 0 for an invalid suffix, or a
|
||||
flag vector describing the suffix. */
|
||||
static unsigned int
|
||||
interpret_int_suffix (const uchar *s, size_t len)
|
||||
interpret_int_suffix (cpp_reader *pfile, const uchar *s, size_t len)
|
||||
{
|
||||
size_t u, l, i;
|
||||
|
||||
|
@ -227,6 +236,9 @@ interpret_int_suffix (const uchar *s, size_t len)
|
|||
if (l > 2 || u > 1 || i > 1)
|
||||
return 0;
|
||||
|
||||
if (i && !CPP_OPTION (pfile, ext_numeric_literals))
|
||||
return 0;
|
||||
|
||||
return ((i ? CPP_N_IMAGINARY : 0)
|
||||
| (u ? CPP_N_UNSIGNED : 0)
|
||||
| ((l == 0) ? CPP_N_SMALL
|
||||
|
@ -235,9 +247,9 @@ interpret_int_suffix (const uchar *s, size_t len)
|
|||
|
||||
/* Return the classification flags for an int suffix. */
|
||||
unsigned int
|
||||
cpp_interpret_int_suffix (const char *s, size_t len)
|
||||
cpp_interpret_int_suffix (cpp_reader *pfile, const char *s, size_t len)
|
||||
{
|
||||
return interpret_int_suffix ((const unsigned char *)s, len);
|
||||
return interpret_int_suffix (pfile, (const unsigned char *)s, len);
|
||||
}
|
||||
|
||||
/* Return the string type corresponding to the the input user-defined string
|
||||
|
@ -455,7 +467,7 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token,
|
|||
/* The suffix may be for decimal fixed-point constants without exponent. */
|
||||
if (radix != 16 && float_flag == NOT_FLOAT)
|
||||
{
|
||||
result = interpret_float_suffix (str, limit - str);
|
||||
result = interpret_float_suffix (pfile, str, limit - str);
|
||||
if ((result & CPP_N_FRACT) || (result & CPP_N_ACCUM))
|
||||
{
|
||||
result |= CPP_N_FLOATING;
|
||||
|
@ -519,7 +531,7 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token,
|
|||
SYNTAX_ERROR_AT (virtual_location,
|
||||
"hexadecimal floating constants require an exponent");
|
||||
|
||||
result = interpret_float_suffix (str, limit - str);
|
||||
result = interpret_float_suffix (pfile, str, limit - str);
|
||||
if (result == 0)
|
||||
{
|
||||
if (CPP_OPTION (pfile, user_literals))
|
||||
|
@ -573,7 +585,7 @@ cpp_classify_number (cpp_reader *pfile, const cpp_token *token,
|
|||
}
|
||||
else
|
||||
{
|
||||
result = interpret_int_suffix (str, limit - str);
|
||||
result = interpret_int_suffix (pfile, str, limit - str);
|
||||
if (result == 0)
|
||||
{
|
||||
if (CPP_OPTION (pfile, user_literals))
|
||||
|
|
|
@ -431,6 +431,10 @@ struct cpp_options
|
|||
ud-suffix which does not beging with an underscore. */
|
||||
unsigned char warn_literal_suffix;
|
||||
|
||||
/* Nonzero means interpret imaginary, fixed-point, or other gnu extension
|
||||
literal number suffixes as user-defined literal number suffixes. */
|
||||
unsigned char ext_numeric_literals;
|
||||
|
||||
/* Holds the name of the target (execution) character set. */
|
||||
const char *narrow_charset;
|
||||
|
||||
|
@ -854,10 +858,12 @@ extern unsigned cpp_classify_number (cpp_reader *, const cpp_token *,
|
|||
const char **, source_location);
|
||||
|
||||
/* Return the classification flags for a float suffix. */
|
||||
extern unsigned int cpp_interpret_float_suffix (const char *, size_t);
|
||||
extern unsigned int cpp_interpret_float_suffix (cpp_reader *, const char *,
|
||||
size_t);
|
||||
|
||||
/* Return the classification flags for an int suffix. */
|
||||
extern unsigned int cpp_interpret_int_suffix (const char *, size_t);
|
||||
extern unsigned int cpp_interpret_int_suffix (cpp_reader *, const char *,
|
||||
size_t);
|
||||
|
||||
/* Evaluate a token classified as category CPP_N_INTEGER. */
|
||||
extern cpp_num cpp_interpret_integer (cpp_reader *, const cpp_token *,
|
||||
|
|
|
@ -182,6 +182,7 @@ cpp_create_reader (enum c_lang lang, cpp_hash_table *table,
|
|||
CPP_OPTION (pfile, track_macro_expansion) = 2;
|
||||
CPP_OPTION (pfile, warn_normalize) = normalized_C;
|
||||
CPP_OPTION (pfile, warn_literal_suffix) = 1;
|
||||
CPP_OPTION (pfile, ext_numeric_literals) = 1;
|
||||
|
||||
/* Default CPP arithmetic to something sensible for the host for the
|
||||
benefit of dumb users like fix-header. */
|
||||
|
|
Loading…
Add table
Reference in a new issue