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}.
