On 11/07/2012 10:29 AM, Jakub Jelinek wrote:
On Wed, Nov 07, 2012 at 10:22:57AM -0500, Jason Merrill wrote:
I thought about that.  We'd need some machinery that would allow cpp to query 
what has been declared already.
Or alternately, always treat them as user-defined in C++ mode and
have the front end decide to use the built-in interpretation if no
literal operator is declared.
Yeah, I think that would be best.

        Jakub

OK, this passes x86_64-linux.  This is my first rodeo with *.texi.

I just have one flag: -fext-numeric-literals.
It leaves gnu extension suffixes for std=gnu++*, and std=c++98.
I sets the flag off (use suffixes for user-defined literals) for std=c++11+.

Ed

libcpp

2012-11-09  Ed Smith-Rowland  <3dw...@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.


gcc/c-family

2012-11-09  Ed Smith-Rowland  <3dw...@verizon.net>

        PR c++/54413
        * c-opts.c (c_common_handle_option): Set new flags.
        * c.opt: Describe new flags.


gcc/cp

2012-11-09  Ed Smith-Rowland  <3dw...@verizon.net>

        PR c++/54413
        * decl.c (grokfndecl): Adjust calls to interpret_x_suffix.


gcc/testsuite

2012-11-09  Ed Smith-Rowland  <3dw...@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.


gcc

2012-11-09  Ed Smith-Rowland  <3dw...@verizon.net>

        PR c++/54413
        * doc/invoke.texi: Document f[no-]ext-numeric-literals flag.

Index: libcpp/include/cpplib.h
===================================================================
--- libcpp/include/cpplib.h     (revision 193296)
+++ libcpp/include/cpplib.h     (working copy)
@@ -431,6 +431,10 @@
      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 @@
                                     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 *,
Index: libcpp/init.c
===================================================================
--- libcpp/init.c       (revision 193296)
+++ libcpp/init.c       (working copy)
@@ -182,6 +182,7 @@
   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.  */
Index: libcpp/expr.c
===================================================================
--- libcpp/expr.c       (revision 193296)
+++ libcpp/expr.c       (working copy)
@@ -61,8 +61,8 @@
 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 @@
    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 @@
       }
     }
 
-  /* 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 @@
   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 @@
 
 /* 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 @@
   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 @@
 
 /* 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 @@
   /* 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 @@
        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 @@
     }
   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))
Index: gcc/c-family/c-opts.c
===================================================================
--- gcc/c-family/c-opts.c       (revision 193296)
+++ gcc/c-family/c-opts.c       (working copy)
@@ -629,6 +629,10 @@
       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;
@@ -715,13 +719,21 @@
     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:
Index: gcc/c-family/c.opt
===================================================================
--- gcc/c-family/c.opt  (revision 193296)
+++ gcc/c-family/c.opt  (working copy)
@@ -1197,6 +1197,11 @@
 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
Index: gcc/cp/decl.c
===================================================================
--- gcc/cp/decl.c       (revision 193296)
+++ gcc/cp/decl.c       (working copy)
@@ -7563,13 +7563,13 @@
          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);
            }
Index: gcc/testsuite/g++.dg/cpp0x/gnu_fext-numeric-literals.C
===================================================================
--- gcc/testsuite/g++.dg/cpp0x/gnu_fext-numeric-literals.C      (revision 0)
+++ gcc/testsuite/g++.dg/cpp0x/gnu_fext-numeric-literals.C      (revision 0)
@@ -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 }
Index: gcc/testsuite/g++.dg/cpp0x/std_fext-numeric-literals.C
===================================================================
--- gcc/testsuite/g++.dg/cpp0x/std_fext-numeric-literals.C      (revision 0)
+++ gcc/testsuite/g++.dg/cpp0x/std_fext-numeric-literals.C      (revision 0)
@@ -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 }
Index: gcc/testsuite/g++.dg/cpp0x/gnu_fno-ext-numeric-literals.C
===================================================================
--- gcc/testsuite/g++.dg/cpp0x/gnu_fno-ext-numeric-literals.C   (revision 0)
+++ gcc/testsuite/g++.dg/cpp0x/gnu_fno-ext-numeric-literals.C   (revision 0)
@@ -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 }
Index: gcc/testsuite/g++.dg/cpp0x/std_fno-ext-numeric-literals.C
===================================================================
--- gcc/testsuite/g++.dg/cpp0x/std_fno-ext-numeric-literals.C   (revision 0)
+++ gcc/testsuite/g++.dg/cpp0x/std_fno-ext-numeric-literals.C   (revision 0)
@@ -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 }
Index: gcc/doc/invoke.texi
===================================================================
--- gcc/doc/invoke.texi (revision 193296)
+++ gcc/doc/invoke.texi (working copy)
@@ -197,6 +197,7 @@
 -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 @@
 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}.

Reply via email to