diff mbox series

[1/2] c++: add -Wdeprecated-literal-operator [CWG2521]

Message ID 20241003164057.1087609-1-jason@redhat.com
State New
Headers show
Series [1/2] c++: add -Wdeprecated-literal-operator [CWG2521] | expand

Commit Message

Jason Merrill Oct. 3, 2024, 4:39 p.m. UTC
Tested x86_64-pc-linux-gnu, applying to trunk.

-- 8< --

C++23 CWG issue 2521 (https://wg21.link/cwg2521) deprecates user-defined
literal operators declared with the optional space between "" and the
suffix.

Many testcases used that syntax; I removed the space from most of them, and
added C++23 warning tests to a few.

	CWG 2521

gcc/ChangeLog:

	* doc/invoke.texi: Document -Wdeprecated-literal-operator.

gcc/c-family/ChangeLog:

	* c.opt: Add -Wdeprecated-literal-operator.
	* c-opts.cc (c_common_post_options): Default on in C++23.
	* c.opt.urls: Regenerate.

gcc/cp/ChangeLog:

	* parser.cc (location_between): New.
	(cp_parser_operator): Handle -Wdeprecated-literal-operator.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp0x/udlit-string-literal.h
	* g++.dg/cpp0x/Wliteral-suffix2.C
	* g++.dg/cpp0x/constexpr-55708.C
	* g++.dg/cpp0x/gnu_fext-numeric-literals.C
	* g++.dg/cpp0x/gnu_fno-ext-numeric-literals.C
	* g++.dg/cpp0x/pr51420.C
	* g++.dg/cpp0x/pr60209-neg.C
	* g++.dg/cpp0x/pr60209.C
	* g++.dg/cpp0x/pr61038.C
	* g++.dg/cpp0x/std_fext-numeric-literals.C
	* g++.dg/cpp0x/std_fno-ext-numeric-literals.C
	* g++.dg/cpp0x/udlit-addr.C
	* g++.dg/cpp0x/udlit-args-neg.C
	* g++.dg/cpp0x/udlit-args.C
	* g++.dg/cpp0x/udlit-args2.C
	* g++.dg/cpp0x/udlit-clink-neg.C
	* g++.dg/cpp0x/udlit-concat-neg.C
	* g++.dg/cpp0x/udlit-concat.C
	* g++.dg/cpp0x/udlit-constexpr.C
	* g++.dg/cpp0x/udlit-cpp98-neg.C
	* g++.dg/cpp0x/udlit-declare-neg.C
	* g++.dg/cpp0x/udlit-embed-quote.C
	* g++.dg/cpp0x/udlit-extended-id-1.C
	* g++.dg/cpp0x/udlit-extended-id-3.C
	* g++.dg/cpp0x/udlit-extern-c.C
	* g++.dg/cpp0x/udlit-friend.C
	* g++.dg/cpp0x/udlit-general.C
	* g++.dg/cpp0x/udlit-implicit-conv-neg-char8_t.C
	* g++.dg/cpp0x/udlit-implicit-conv-neg.C
	* g++.dg/cpp0x/udlit-inline.C
	* g++.dg/cpp0x/udlit-mangle.C
	* g++.dg/cpp0x/udlit-member-neg.C
	* g++.dg/cpp0x/udlit-namespace.C
	* g++.dg/cpp0x/udlit-nofunc-neg.C
	* g++.dg/cpp0x/udlit-nonempty-str-neg.C
	* g++.dg/cpp0x/udlit-nosuffix-neg.C
	* g++.dg/cpp0x/udlit-nounder-neg.C
	* g++.dg/cpp0x/udlit-operator-neg.C
	* g++.dg/cpp0x/udlit-overflow-neg.C
	* g++.dg/cpp0x/udlit-overflow.C
	* g++.dg/cpp0x/udlit-preproc-neg.C
	* g++.dg/cpp0x/udlit-raw-length.C
	* g++.dg/cpp0x/udlit-raw-op-string-neg.C
	* g++.dg/cpp0x/udlit-raw-op.C
	* g++.dg/cpp0x/udlit-raw-str.C
	* g++.dg/cpp0x/udlit-resolve-char8_t.C
	* g++.dg/cpp0x/udlit-resolve.C
	* g++.dg/cpp0x/udlit-shadow-neg.C
	* g++.dg/cpp0x/udlit-string-length.C
	* g++.dg/cpp0x/udlit-suffix-neg.C
	* g++.dg/cpp0x/udlit-template.C
	* g++.dg/cpp0x/udlit-tmpl-arg-neg.C
	* g++.dg/cpp0x/udlit-tmpl-arg-neg2.C
	* g++.dg/cpp0x/udlit-tmpl-arg.C
	* g++.dg/cpp0x/udlit-tmpl-parms-neg.C
	* g++.dg/cpp0x/udlit-tmpl-parms.C
	* g++.dg/cpp1y/pr57640.C
	* g++.dg/cpp1y/pr88872.C
	* g++.dg/cpp26/unevalstr1.C
	* g++.dg/cpp2a/concepts-pr60391.C
	* g++.dg/cpp2a/consteval-prop21.C
	* g++.dg/cpp2a/nontype-class6.C
	* g++.dg/cpp2a/udlit-class-nttp-ctad-neg.C
	* g++.dg/cpp2a/udlit-class-nttp-ctad-neg2.C
	* g++.dg/cpp2a/udlit-class-nttp-ctad.C
	* g++.dg/cpp2a/udlit-class-nttp-neg.C
	* g++.dg/cpp2a/udlit-class-nttp-neg2.C
	* g++.dg/cpp2a/udlit-class-nttp.C
	* g++.dg/ext/is_convertible2.C
	* g++.dg/lookup/pr87269.C
	* g++.dg/cpp0x/udlit_system_header: Adjust for C++23 deprecated
	operator "" _suffix.
	* g++.dg/DRs/dr2521.C: New test.
---
 gcc/doc/invoke.texi                           | 12 ++++++
 gcc/c-family/c.opt                            |  4 ++
 .../g++.dg/cpp0x/udlit-string-literal.h       | 10 ++---
 gcc/c-family/c-opts.cc                        |  5 +++
 gcc/cp/parser.cc                              | 33 +++++++++++++--
 gcc/testsuite/g++.dg/DRs/dr2521.C             |  5 +++
 gcc/testsuite/g++.dg/cpp0x/Wliteral-suffix2.C |  5 ++-
 gcc/testsuite/g++.dg/cpp0x/constexpr-55708.C  |  2 +-
 .../g++.dg/cpp0x/gnu_fext-numeric-literals.C  | 32 +++++++--------
 .../cpp0x/gnu_fno-ext-numeric-literals.C      | 32 +++++++--------
 gcc/testsuite/g++.dg/cpp0x/pr51420.C          |  4 +-
 gcc/testsuite/g++.dg/cpp0x/pr60209-neg.C      | 16 ++++----
 gcc/testsuite/g++.dg/cpp0x/pr60209.C          |  2 +
 gcc/testsuite/g++.dg/cpp0x/pr61038.C          |  4 +-
 .../g++.dg/cpp0x/std_fext-numeric-literals.C  | 32 +++++++--------
 .../cpp0x/std_fno-ext-numeric-literals.C      | 32 +++++++--------
 gcc/testsuite/g++.dg/cpp0x/udlit-addr.C       |  4 +-
 gcc/testsuite/g++.dg/cpp0x/udlit-args-neg.C   | 24 +++++------
 gcc/testsuite/g++.dg/cpp0x/udlit-args.C       | 22 +++++-----
 gcc/testsuite/g++.dg/cpp0x/udlit-args2.C      |  8 ++--
 gcc/testsuite/g++.dg/cpp0x/udlit-clink-neg.C  |  2 +-
 gcc/testsuite/g++.dg/cpp0x/udlit-concat-neg.C |  4 +-
 gcc/testsuite/g++.dg/cpp0x/udlit-concat.C     |  6 +--
 gcc/testsuite/g++.dg/cpp0x/udlit-constexpr.C  |  2 +-
 gcc/testsuite/g++.dg/cpp0x/udlit-cpp98-neg.C  |  4 +-
 .../g++.dg/cpp0x/udlit-declare-neg.C          |  8 ++--
 .../g++.dg/cpp0x/udlit-embed-quote.C          |  4 +-
 .../g++.dg/cpp0x/udlit-extended-id-1.C        | 10 ++---
 .../g++.dg/cpp0x/udlit-extended-id-3.C        |  1 +
 gcc/testsuite/g++.dg/cpp0x/udlit-extern-c.C   |  2 +-
 gcc/testsuite/g++.dg/cpp0x/udlit-friend.C     | 12 +++---
 gcc/testsuite/g++.dg/cpp0x/udlit-general.C    | 22 +++++-----
 .../cpp0x/udlit-implicit-conv-neg-char8_t.C   | 24 +++++------
 .../g++.dg/cpp0x/udlit-implicit-conv-neg.C    | 20 +++++-----
 gcc/testsuite/g++.dg/cpp0x/udlit-inline.C     | 10 ++---
 gcc/testsuite/g++.dg/cpp0x/udlit-mangle.C     |  2 +-
 gcc/testsuite/g++.dg/cpp0x/udlit-member-neg.C |  6 +--
 gcc/testsuite/g++.dg/cpp0x/udlit-namespace.C  | 10 ++---
 gcc/testsuite/g++.dg/cpp0x/udlit-nofunc-neg.C |  4 +-
 .../g++.dg/cpp0x/udlit-nonempty-str-neg.C     |  2 +-
 .../g++.dg/cpp0x/udlit-nosuffix-neg.C         |  2 +-
 .../g++.dg/cpp0x/udlit-nounder-neg.C          |  4 +-
 .../g++.dg/cpp0x/udlit-operator-neg.C         | 12 +++---
 .../g++.dg/cpp0x/udlit-overflow-neg.C         |  4 +-
 gcc/testsuite/g++.dg/cpp0x/udlit-overflow.C   |  4 +-
 .../g++.dg/cpp0x/udlit-preproc-neg.C          |  2 +-
 gcc/testsuite/g++.dg/cpp0x/udlit-raw-length.C |  2 +-
 .../g++.dg/cpp0x/udlit-raw-op-string-neg.C    |  2 +-
 gcc/testsuite/g++.dg/cpp0x/udlit-raw-op.C     |  2 +-
 gcc/testsuite/g++.dg/cpp0x/udlit-raw-str.C    |  2 +-
 .../g++.dg/cpp0x/udlit-resolve-char8_t.C      | 30 +++++++-------
 gcc/testsuite/g++.dg/cpp0x/udlit-resolve.C    | 26 ++++++------
 gcc/testsuite/g++.dg/cpp0x/udlit-shadow-neg.C | 40 +++++++++----------
 .../g++.dg/cpp0x/udlit-string-length.C        | 10 ++---
 gcc/testsuite/g++.dg/cpp0x/udlit-suffix-neg.C |  2 +-
 gcc/testsuite/g++.dg/cpp0x/udlit-template.C   | 18 ++++-----
 .../g++.dg/cpp0x/udlit-tmpl-arg-neg.C         |  2 +-
 .../g++.dg/cpp0x/udlit-tmpl-arg-neg2.C        |  4 +-
 gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg.C   |  2 +-
 .../g++.dg/cpp0x/udlit-tmpl-parms-neg.C       |  6 +--
 gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-parms.C |  2 +-
 gcc/testsuite/g++.dg/cpp1y/pr57640.C          |  2 +-
 gcc/testsuite/g++.dg/cpp1y/pr88872.C          |  2 +-
 gcc/testsuite/g++.dg/cpp26/unevalstr1.C       | 34 ++++++++--------
 gcc/testsuite/g++.dg/cpp2a/concepts-pr60391.C |  2 +-
 gcc/testsuite/g++.dg/cpp2a/consteval-prop21.C |  2 +-
 gcc/testsuite/g++.dg/cpp2a/nontype-class6.C   |  2 +-
 .../g++.dg/cpp2a/udlit-class-nttp-ctad-neg.C  |  2 +-
 .../g++.dg/cpp2a/udlit-class-nttp-ctad-neg2.C |  2 +-
 .../g++.dg/cpp2a/udlit-class-nttp-ctad.C      |  2 +-
 .../g++.dg/cpp2a/udlit-class-nttp-neg.C       |  2 +-
 .../g++.dg/cpp2a/udlit-class-nttp-neg2.C      |  2 +-
 gcc/testsuite/g++.dg/cpp2a/udlit-class-nttp.C |  2 +-
 gcc/testsuite/g++.dg/ext/is_convertible2.C    |  2 +-
 gcc/testsuite/g++.dg/lookup/pr87269.C         |  4 +-
 gcc/c-family/c.opt.urls                       |  3 ++
 .../g++.dg/cpp0x/udlit_system_header          |  2 +-
 77 files changed, 373 insertions(+), 315 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/DRs/dr2521.C


base-commit: 5b08ae503dd4aef2789a667daaf1984e7cc94aaa

Comments

Jakub Jelinek Oct. 4, 2024, 10:19 a.m. UTC | #1
On Thu, Oct 03, 2024 at 12:39:59PM -0400, Jason Merrill wrote:
> 	* g++.dg/cpp26/unevalstr1.C

This patch didn't touch unevalstr2.C which now FAILs because of the new
warnings in C++23 mode (the testcase is target { c++11 && c++23_down }, so
isn't run in C++26).

The intent in both of those tests was to test the separate (now deprecated)
syntax, so instead of removing the space between closing " and _ I've
adjusted the testcase to expect those 17 extra warnings.  And I've also
adjusted the unevalstr1.C testcase to do the same, when it is removed from
C++29 or whatever, that can be just guarded by #if.
Though, maybe the tests should have both the deprecated syntax and the
non-deprecated one...

Tested on x86_64-linux and i686-linux, ok for trunk?

2024-10-04  Jakub Jelinek  <jakub@redhat.com>

	* g++.dg/cpp26/unevalstr1.C: Revert the 2024-10-03 changes, instead expect
	extra warnings.
	* g++.dg/cpp26/unevalstr2.C: Expect extra warnings for C++23.

--- gcc/testsuite/g++.dg/cpp26/unevalstr1.C.jj	2024-10-03 20:10:07.392515277 +0200
+++ gcc/testsuite/g++.dg/cpp26/unevalstr1.C	2024-10-04 11:04:18.309736501 +0200
@@ -83,21 +83,38 @@ extern "\o{0103}" { int f14 (); }	// { d
 [[nodiscard ("\x{20}")]] int h19 ();	// { dg-error "numeric escape sequence in unevaluated string" }
 [[nodiscard ("\h")]] int h20 ();	// { dg-error "unknown escape sequence" }
 
-float operator ""_my0 (const char *);
-float operator "" ""_my1 (const char *);
-float operator L""_my2 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator u""_my3 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator U""_my4 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator u8""_my5 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator L"" ""_my6 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator u"" ""_my7 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator U"" ""_my8 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator u8"" ""_my9 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator "" L""_my10 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator "" u""_my11 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator "" U""_my12 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator "" u8""_my13 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator "\0"_my14 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
-float operator "\x00"_my15 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
-float operator "\h"_my16 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
+float operator "" _my0 (const char *);
+float operator "" "" _my1 (const char *);
+float operator L"" _my2 (const char *);		// { dg-error "invalid encoding prefix in literal operator" }
+float operator u"" _my3 (const char *);		// { dg-error "invalid encoding prefix in literal operator" }
+float operator U"" _my4 (const char *);		// { dg-error "invalid encoding prefix in literal operator" }
+float operator u8"" _my5 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator L"" "" _my6 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator u"" "" _my7 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator U"" "" _my8 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator u8"" "" _my9 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator "" L"" _my10 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator "" u"" _my11 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator "" U"" _my12 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator "" u8"" _my13 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator "\0" _my14 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
+float operator "\x00" _my15 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
+float operator "\h" _my16 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
 						// { dg-error "unknown escape sequence" "" { target *-*-* } .-1 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
--- gcc/testsuite/g++.dg/cpp26/unevalstr2.C.jj	2023-11-02 07:44:04.447219871 +0100
+++ gcc/testsuite/g++.dg/cpp26/unevalstr2.C	2024-10-04 11:01:17.909245007 +0200
@@ -108,3 +108,20 @@ float operator "\0" _my14 (const char *)
 float operator "\x00" _my15 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
 float operator "\h" _my16 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
 						// { dg-warning "unknown escape sequence" "" { target *-*-* } .-1 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }


	Jakub
Jakub Jelinek Oct. 4, 2024, 12:22 p.m. UTC | #2
On Fri, Oct 04, 2024 at 12:19:03PM +0200, Jakub Jelinek wrote:
> Though, maybe the tests should have both the deprecated syntax and the
> non-deprecated one...

Here is a variant of the patch which does that.

Tested on x86_64-linux and i686-linux, ok for trunk?

2024-10-04  Jakub Jelinek  <jakub@redhat.com>

	* g++.dg/cpp26/unevalstr1.C: Revert the 2024-10-03 changes, instead
	expect extra warnings.  Add another set of tests without space
	between " and _.
	* g++.dg/cpp26/unevalstr2.C: Expect extra warnings for C++23.  Add
	another set of tests without space between " and _.

--- gcc/testsuite/g++.dg/cpp26/unevalstr1.C.jj	2024-10-04 12:28:08.820899177 +0200
+++ gcc/testsuite/g++.dg/cpp26/unevalstr1.C	2024-10-04 14:15:35.563531334 +0200
@@ -83,21 +83,57 @@ extern "\o{0103}" { int f14 (); }	// { d
 [[nodiscard ("\x{20}")]] int h19 ();	// { dg-error "numeric escape sequence in unevaluated string" }
 [[nodiscard ("\h")]] int h20 ();	// { dg-error "unknown escape sequence" }
 
-float operator ""_my0 (const char *);
-float operator "" ""_my1 (const char *);
-float operator L""_my2 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator u""_my3 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator U""_my4 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator u8""_my5 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator L"" ""_my6 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator u"" ""_my7 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator U"" ""_my8 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator u8"" ""_my9 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator "" L""_my10 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator "" u""_my11 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator "" U""_my12 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator "" u8""_my13 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator "\0"_my14 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
-float operator "\x00"_my15 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
-float operator "\h"_my16 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
+float operator "" _my0 (const char *);
+float operator "" "" _my1 (const char *);
+float operator L"" _my2 (const char *);		// { dg-error "invalid encoding prefix in literal operator" }
+float operator u"" _my3 (const char *);		// { dg-error "invalid encoding prefix in literal operator" }
+float operator U"" _my4 (const char *);		// { dg-error "invalid encoding prefix in literal operator" }
+float operator u8"" _my5 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator L"" "" _my6 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator u"" "" _my7 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator U"" "" _my8 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator u8"" "" _my9 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator "" L"" _my10 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator "" u"" _my11 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator "" U"" _my12 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator "" u8"" _my13 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator "\0" _my14 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
+float operator "\x00" _my15 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
+float operator "\h" _my16 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
+						// { dg-error "unknown escape sequence" "" { target *-*-* } .-1 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
+
+float operator ""_my20 (const char *);
+float operator "" ""_my21 (const char *);
+float operator L""_my22 (const char *);		// { dg-error "invalid encoding prefix in literal operator" }
+float operator u""_my23 (const char *);		// { dg-error "invalid encoding prefix in literal operator" }
+float operator U""_my24 (const char *);		// { dg-error "invalid encoding prefix in literal operator" }
+float operator u8""_my25 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator L"" ""_my26 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator u"" ""_my27 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator U"" ""_my28 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator u8"" ""_my29 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator "" L""_my30 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator "" u""_my31 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator "" U""_my32 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator "" u8""_my33 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator "\0"_my34 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
+float operator "\x00"_my35 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
+float operator "\h"_my36 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
 						// { dg-error "unknown escape sequence" "" { target *-*-* } .-1 }
--- gcc/testsuite/g++.dg/cpp26/unevalstr2.C.jj	2023-11-02 07:49:18.266848975 +0100
+++ gcc/testsuite/g++.dg/cpp26/unevalstr2.C	2024-10-04 14:16:47.709529527 +0200
@@ -92,9 +92,9 @@ extern "\o{0103}" { int f14 (); }	// { d
 
 float operator "" _my0 (const char *);
 float operator "" "" _my1 (const char *);
-float operator L"" _my2 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator u"" _my3 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator U"" _my4 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator L"" _my2 (const char *);		// { dg-error "invalid encoding prefix in literal operator" }
+float operator u"" _my3 (const char *);		// { dg-error "invalid encoding prefix in literal operator" }
+float operator U"" _my4 (const char *);		// { dg-error "invalid encoding prefix in literal operator" }
 float operator u8"" _my5 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
 float operator L"" "" _my6 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
 float operator u"" "" _my7 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
@@ -108,3 +108,39 @@ float operator "\0" _my14 (const char *)
 float operator "\x00" _my15 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
 float operator "\h" _my16 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
 						// { dg-warning "unknown escape sequence" "" { target *-*-* } .-1 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
+// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
+
+float operator ""_my20 (const char *);
+float operator "" ""_my21 (const char *);
+float operator L""_my22 (const char *);		// { dg-error "invalid encoding prefix in literal operator" }
+float operator u""_my23 (const char *);		// { dg-error "invalid encoding prefix in literal operator" }
+float operator U""_my24 (const char *);		// { dg-error "invalid encoding prefix in literal operator" }
+float operator u8""_my25 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator L"" ""_my26 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator u"" ""_my27 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator U"" ""_my28 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator u8"" ""_my29 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator "" L""_my30 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator "" u""_my31 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator "" U""_my32 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator "" u8""_my33 (const char *);	// { dg-error "invalid encoding prefix in literal operator" "" { target c++20 } }
+float operator "\0"_my34 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
+float operator "\x00"_my35 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
+float operator "\h"_my36 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
+						// { dg-warning "unknown escape sequence" "" { target *-*-* } .-1 }

	Jakub
Jason Merrill Oct. 4, 2024, 12:51 p.m. UTC | #3
On 10/4/24 8:22 AM, Jakub Jelinek wrote:
> On Fri, Oct 04, 2024 at 12:19:03PM +0200, Jakub Jelinek wrote:
>> Though, maybe the tests should have both the deprecated syntax and the
>> non-deprecated one...
> 
> Here is a variant of the patch which does that.
> 
> Tested on x86_64-linux and i686-linux, ok for trunk?

OK.

> 2024-10-04  Jakub Jelinek  <jakub@redhat.com>
> 
> 	* g++.dg/cpp26/unevalstr1.C: Revert the 2024-10-03 changes, instead
> 	expect extra warnings.  Add another set of tests without space
> 	between " and _.
> 	* g++.dg/cpp26/unevalstr2.C: Expect extra warnings for C++23.  Add
> 	another set of tests without space between " and _.
> 
> --- gcc/testsuite/g++.dg/cpp26/unevalstr1.C.jj	2024-10-04 12:28:08.820899177 +0200
> +++ gcc/testsuite/g++.dg/cpp26/unevalstr1.C	2024-10-04 14:15:35.563531334 +0200
> @@ -83,21 +83,57 @@ extern "\o{0103}" { int f14 (); }	// { d
>   [[nodiscard ("\x{20}")]] int h19 ();	// { dg-error "numeric escape sequence in unevaluated string" }
>   [[nodiscard ("\h")]] int h20 ();	// { dg-error "unknown escape sequence" }
>   
> -float operator ""_my0 (const char *);
> -float operator "" ""_my1 (const char *);
> -float operator L""_my2 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> -float operator u""_my3 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> -float operator U""_my4 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> -float operator u8""_my5 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> -float operator L"" ""_my6 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> -float operator u"" ""_my7 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> -float operator U"" ""_my8 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> -float operator u8"" ""_my9 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> -float operator "" L""_my10 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> -float operator "" u""_my11 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> -float operator "" U""_my12 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> -float operator "" u8""_my13 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> -float operator "\0"_my14 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
> -float operator "\x00"_my15 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
> -float operator "\h"_my16 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
> +float operator "" _my0 (const char *);
> +float operator "" "" _my1 (const char *);
> +float operator L"" _my2 (const char *);		// { dg-error "invalid encoding prefix in literal operator" }
> +float operator u"" _my3 (const char *);		// { dg-error "invalid encoding prefix in literal operator" }
> +float operator U"" _my4 (const char *);		// { dg-error "invalid encoding prefix in literal operator" }
> +float operator u8"" _my5 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> +float operator L"" "" _my6 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> +float operator u"" "" _my7 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> +float operator U"" "" _my8 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> +float operator u8"" "" _my9 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> +float operator "" L"" _my10 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> +float operator "" u"" _my11 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> +float operator "" U"" _my12 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> +float operator "" u8"" _my13 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> +float operator "\0" _my14 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
> +float operator "\x00" _my15 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
> +float operator "\h" _my16 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
> +						// { dg-error "unknown escape sequence" "" { target *-*-* } .-1 }
> +// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
> +// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
> +// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
> +// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
> +// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
> +// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
> +// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
> +// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
> +// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
> +// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
> +// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
> +// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
> +// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
> +// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
> +// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
> +// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
> +// { dg-warning "space between quotes and suffix is deprecated" "" { target *-*-* } .-18 }
> +
> +float operator ""_my20 (const char *);
> +float operator "" ""_my21 (const char *);
> +float operator L""_my22 (const char *);		// { dg-error "invalid encoding prefix in literal operator" }
> +float operator u""_my23 (const char *);		// { dg-error "invalid encoding prefix in literal operator" }
> +float operator U""_my24 (const char *);		// { dg-error "invalid encoding prefix in literal operator" }
> +float operator u8""_my25 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> +float operator L"" ""_my26 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> +float operator u"" ""_my27 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> +float operator U"" ""_my28 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> +float operator u8"" ""_my29 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> +float operator "" L""_my30 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> +float operator "" u""_my31 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> +float operator "" U""_my32 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> +float operator "" u8""_my33 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> +float operator "\0"_my34 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
> +float operator "\x00"_my35 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
> +float operator "\h"_my36 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
>   						// { dg-error "unknown escape sequence" "" { target *-*-* } .-1 }
> --- gcc/testsuite/g++.dg/cpp26/unevalstr2.C.jj	2023-11-02 07:49:18.266848975 +0100
> +++ gcc/testsuite/g++.dg/cpp26/unevalstr2.C	2024-10-04 14:16:47.709529527 +0200
> @@ -92,9 +92,9 @@ extern "\o{0103}" { int f14 (); }	// { d
>   
>   float operator "" _my0 (const char *);
>   float operator "" "" _my1 (const char *);
> -float operator L"" _my2 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> -float operator u"" _my3 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> -float operator U"" _my4 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> +float operator L"" _my2 (const char *);		// { dg-error "invalid encoding prefix in literal operator" }
> +float operator u"" _my3 (const char *);		// { dg-error "invalid encoding prefix in literal operator" }
> +float operator U"" _my4 (const char *);		// { dg-error "invalid encoding prefix in literal operator" }
>   float operator u8"" _my5 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
>   float operator L"" "" _my6 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
>   float operator u"" "" _my7 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> @@ -108,3 +108,39 @@ float operator "\0" _my14 (const char *)
>   float operator "\x00" _my15 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
>   float operator "\h" _my16 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
>   						// { dg-warning "unknown escape sequence" "" { target *-*-* } .-1 }
> +// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
> +// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
> +// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
> +// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
> +// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
> +// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
> +// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
> +// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
> +// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
> +// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
> +// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
> +// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
> +// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
> +// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
> +// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
> +// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
> +// { dg-warning "space between quotes and suffix is deprecated" "" { target c++23 } .-18 }
> +
> +float operator ""_my20 (const char *);
> +float operator "" ""_my21 (const char *);
> +float operator L""_my22 (const char *);		// { dg-error "invalid encoding prefix in literal operator" }
> +float operator u""_my23 (const char *);		// { dg-error "invalid encoding prefix in literal operator" }
> +float operator U""_my24 (const char *);		// { dg-error "invalid encoding prefix in literal operator" }
> +float operator u8""_my25 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> +float operator L"" ""_my26 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> +float operator u"" ""_my27 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> +float operator U"" ""_my28 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> +float operator u8"" ""_my29 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> +float operator "" L""_my30 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> +float operator "" u""_my31 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> +float operator "" U""_my32 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
> +float operator "" u8""_my33 (const char *);	// { dg-error "invalid encoding prefix in literal operator" "" { target c++20 } }
> +float operator "\0"_my34 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
> +float operator "\x00"_my35 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
> +float operator "\h"_my36 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
> +						// { dg-warning "unknown escape sequence" "" { target *-*-* } .-1 }
> 
> 	Jakub
>
diff mbox series

Patch

diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index e199522f62c..c90f5b4d58e 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -4032,6 +4032,18 @@  bool b = e <= 3.7;
 @option{-std=c++20}.  In pre-C++20 dialects, this warning can be enabled
 by @option{-Wenum-conversion}.
 
+@opindex Wdeprecated-literal-operator
+@opindex Wno-deprecated-literal-operator
+@item -Wdeprecated-literal-operator @r{(C++ and Objective-C++ only)}
+Warn that the declaration of a user-defined literal operator with a
+space before the suffix is deprecated.  This warning is enabled by
+default in C++23.
+
+@smallexample
+string operator "" _i18n(const char*, std::size_t); // deprecated
+string operator ""_i18n(const char*, std::size_t); // preferred
+@end smallexample
+
 @opindex Welaborated-enum-base
 @opindex Wno-elaborated-enum-base
 @item -Wno-elaborated-enum-base
diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt
index 77fe1b02bd2..9d1fccadbf9 100644
--- a/gcc/c-family/c.opt
+++ b/gcc/c-family/c.opt
@@ -664,6 +664,10 @@  C++ ObjC++ Var(warn_deprecated_enum_float_conv) Warning
 Warn about deprecated arithmetic conversions on operands where one is of enumeration
 type and the other is of a floating-point type.
 
+Wdeprecated-literal-operator
+C++ ObjC++ Var(warn_deprecated_literal_operator) Warning
+Warn about deprecated space between "" and suffix in a user-defined literal operator.
+
 Wdesignated-init
 C ObjC Var(warn_designated_init) Init(1) Warning
 Warn about positional initialization of structs requiring designated initializers.
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-string-literal.h b/gcc/testsuite/g++.dg/cpp0x/udlit-string-literal.h
index c8725fa9f46..529d5b7e6dc 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-string-literal.h
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-string-literal.h
@@ -5,24 +5,24 @@ 
 inline namespace my_string_literals
 {
   std::string
-  operator"" s(const char* str, std::size_t len)
+  operator ""s(const char* str, std::size_t len)
   { return std::string{str, len}; }
 
 #if __cpp_lib_char8_t
   std::u8string
-  operator"" s(const char8_t* str, std::size_t len)
+  operator ""s(const char8_t* str, std::size_t len)
   { return std::u8string{str, len}; }
 #endif
 
   std::wstring
-  operator"" s(const wchar_t* str, std::size_t len)
+  operator ""s(const wchar_t* str, std::size_t len)
   { return std::wstring{str, len}; }
 
   std::u16string
-  operator"" s(const char16_t* str, std::size_t len)
+  operator ""s(const char16_t* str, std::size_t len)
   { return std::u16string{str, len}; }
 
   std::u32string
-  operator"" s(const char32_t* str, std::size_t len)
+  operator ""s(const char32_t* str, std::size_t len)
   { return std::u32string{str, len}; }
 }
diff --git a/gcc/c-family/c-opts.cc b/gcc/c-family/c-opts.cc
index 86163ddb4ed..8ff3d966bb6 100644
--- a/gcc/c-family/c-opts.cc
+++ b/gcc/c-family/c-opts.cc
@@ -1016,6 +1016,11 @@  c_common_post_options (const char **pfilename)
 		       warn_deprecated_enum_float_conv,
 		       cxx_dialect >= cxx20 && warn_deprecated);
 
+  /* -Wdeprecated-literal-operator is enabled by default in C++23.  */
+  SET_OPTION_IF_UNSET (&global_options, &global_options_set,
+		       warn_deprecated_literal_operator,
+		       cxx_dialect >= cxx23 && warn_deprecated);
+
   /* -Wtemplate-id-cdtor is enabled by default in C++20.  */
   SET_OPTION_IF_UNSET (&global_options, &global_options_set,
 		       warn_template_id_cdtor,
diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
index 0944827d777..08f9c89f1f0 100644
--- a/gcc/cp/parser.cc
+++ b/gcc/cp/parser.cc
@@ -943,6 +943,18 @@  make_location (cp_token *caret, cp_token *start, cp_token *end)
   return make_location (caret->location, start->location, end->location);
 }
 
+/* Location for the whitespace between two tokens.  */
+
+static location_t
+location_between (cp_token *stok, cp_token *etok)
+{
+  location_t s = get_finish (stok->location);
+  s = linemap_position_for_loc_and_offset (line_table, s, 1);
+  location_t e = get_start (etok->location);
+  e = linemap_position_for_loc_and_offset (line_table, e, -1);
+  return make_location (s, s, e);
+}
+
 /* nonzero if we are presently saving tokens.  */
 
 static inline int
@@ -18325,6 +18337,8 @@  cp_parser_operator (cp_parser* parser, location_t start_loc)
 	if (cxx_dialect == cxx98)
 	  maybe_warn_cpp0x (CPP0X_USER_DEFINED_LITERALS);
 
+	token = cp_lexer_peek_token (parser->lexer);
+
 	/* Consume the string.  */
 	cp_expr str = cp_parser_userdef_string_literal (parser,
 							/*lookup_udlit=*/false);
@@ -18340,13 +18354,24 @@  cp_parser_operator (cp_parser* parser, location_t start_loc)
 	  {
 	    string_tree = str;
 	    /* Look for the suffix identifier.  */
-	    token = cp_lexer_peek_token (parser->lexer);
-	    if (token->type == CPP_NAME)
+	    cp_token *id_tok = cp_lexer_peek_token (parser->lexer);
+	    if (id_tok->type == CPP_NAME)
 	      {
 		id = cp_parser_identifier (parser);
-		end_loc = token->location;
+		end_loc = id_tok->location;
+
+		/* Deprecated by CWG2521 in C++23.  */
+		if (warn_deprecated_literal_operator)
+		  {
+		    gcc_rich_location
+		      space (location_between (token, id_tok));
+		    space.add_fixit_remove ();
+		    warning_at (&space, OPT_Wdeprecated_literal_operator,
+				"space between quotes and suffix is "
+				"deprecated in C++23");
+		  }
 	      }
-	    else if (token->type == CPP_KEYWORD)
+	    else if (id_tok->type == CPP_KEYWORD)
 	      {
 		error ("unexpected keyword;"
 		       " remove space between quotes and suffix identifier");
diff --git a/gcc/testsuite/g++.dg/DRs/dr2521.C b/gcc/testsuite/g++.dg/DRs/dr2521.C
new file mode 100644
index 00000000000..bce70421bd3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/DRs/dr2521.C
@@ -0,0 +1,5 @@ 
+// CWG2521
+// { dg-do compile { target c++11 } }
+
+void operator "" _foo(const char *); // { dg-warning "deprecated" "" { target c++23 } }
+void operator ""_bar(const char *);
diff --git a/gcc/testsuite/g++.dg/cpp0x/Wliteral-suffix2.C b/gcc/testsuite/g++.dg/cpp0x/Wliteral-suffix2.C
index 129947d86b3..e93e2720662 100644
--- a/gcc/testsuite/g++.dg/cpp0x/Wliteral-suffix2.C
+++ b/gcc/testsuite/g++.dg/cpp0x/Wliteral-suffix2.C
@@ -5,7 +5,8 @@ 
 // Test "-Wno-literal-suffix" suppresses warnings on declaration without
 // leading underscore.
 
-long double operator"" nounder(long double); // { dg-bogus "" }
+long double operator"" nounder(long double); // { dg-bogus "reserved" }
+// { dg-warning "space" "" { target c++23 } .-1 }
 
 template<char...>
-  int operator"" nounder(); // { dg-bogus "" }
+  int operator ""nounder(); // { dg-bogus "reserved" }
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-55708.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-55708.C
index ffbefbbac46..9d1bd196126 100644
--- a/gcc/testsuite/g++.dg/cpp0x/constexpr-55708.C
+++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-55708.C
@@ -11,7 +11,7 @@  constexpr unsigned long long mymax(A && a,const B& b){
 }
 
 template<char... List>
-constexpr long long operator"" _y() noexcept
+constexpr long long operator ""_y() noexcept
 {
   return AA<1, mymax(1,2)>::val; // <-- crashes gcc
   // return mymax(1,2);   // <-- compiles
diff --git a/gcc/testsuite/g++.dg/cpp0x/gnu_fext-numeric-literals.C b/gcc/testsuite/g++.dg/cpp0x/gnu_fext-numeric-literals.C
index 7a467a154b0..46bf419adb2 100644
--- a/gcc/testsuite/g++.dg/cpp0x/gnu_fext-numeric-literals.C
+++ b/gcc/testsuite/g++.dg/cpp0x/gnu_fext-numeric-literals.C
@@ -4,73 +4,73 @@ 
 //  Integer imaginary...
 
 constexpr unsigned long long
-operator"" i(unsigned long long n) // { dg-warning "1:integer suffix .i. shadowed by implementation" "" { target c++11_only } }
+operator ""i(unsigned long long n) // { dg-warning "1:integer suffix .i. shadowed by implementation" "" { target c++11_only } }
 { return 4 * n + 0; }
 
 constexpr unsigned long long
-operator"" I(unsigned long long n) // { dg-warning "1:integer suffix .I. shadowed by implementation" }
+operator ""I(unsigned long long n) // { dg-warning "1:integer suffix .I. shadowed by implementation" }
 { return 4 * n + 1; }
 
 constexpr unsigned long long
-operator"" j(unsigned long long n) // { dg-warning "1:integer suffix .j. shadowed by implementation" }
+operator ""j(unsigned long long n) // { dg-warning "1:integer suffix .j. shadowed by implementation" }
 { return 4 * n + 2; }
 
 constexpr unsigned long long
-operator"" J(unsigned long long n) // { dg-warning "1:integer suffix .J. shadowed by implementation" }
+operator ""J(unsigned long long n) // { dg-warning "1:integer suffix .J. shadowed by implementation" }
 { return 4 * n + 3; }
 
 //  Floating-point imaginary...
 
 constexpr long double
-operator"" i(long double n) // { dg-warning "1:floating-point suffix .i. shadowed by implementation" "" { target c++11_only } }
+operator ""i(long double n) // { dg-warning "1:floating-point suffix .i. shadowed by implementation" "" { target c++11_only } }
 { return 4.0L * n + 0.0L; }
 
 constexpr long double
-operator"" I(long double n) // { dg-warning "1:floating-point suffix .I. shadowed by implementation" }
+operator ""I(long double n) // { dg-warning "1:floating-point suffix .I. shadowed by implementation" }
 { return 4.0L * n + 1.0L; }
 
 constexpr long double
-operator"" j(long double n) // { dg-warning "1:floating-point suffix .j. shadowed by implementation" }
+operator ""j(long double n) // { dg-warning "1:floating-point suffix .j. shadowed by implementation" }
 { return 4.0L * n + 2.0L; }
 
 constexpr long double
-operator"" J(long double n) // { dg-warning "1:floating-point suffix .J. shadowed by implementation" }
+operator ""J(long double n) // { dg-warning "1:floating-point suffix .J. shadowed by implementation" }
 { return 4.0L * n + 3.0L; }
 
 //  Fixed-point...
 
 constexpr long double
-operator"" k(long double n) // { dg-warning "1:floating-point suffix .k. shadowed by implementation" }
+operator ""k(long double n) // { dg-warning "1:floating-point suffix .k. shadowed by implementation" }
 { return 4 * (n + 1) + 0; }
 
 constexpr long double
-operator"" K(long double n) // { dg-warning "1:floating-point suffix .K. shadowed by implementation" }
+operator ""K(long double n) // { dg-warning "1:floating-point suffix .K. shadowed by implementation" }
 { return 4 * (n + 1) + 1; }
 
 constexpr long double
-operator"" r(long double n) // { dg-warning "1:floating-point suffix .r. shadowed by implementation" }
+operator ""r(long double n) // { dg-warning "1:floating-point suffix .r. shadowed by implementation" }
 { return 4 * (n + 1) + 2; }
 
 constexpr long double
-operator"" R(long double n) // { dg-warning "1:floating-point suffix .R. shadowed by implementation" }
+operator ""R(long double n) // { dg-warning "1:floating-point suffix .R. shadowed by implementation" }
 { return 4 * (n + 1) + 3; }
 
 //  Machine-defined...
 
 constexpr long double
-operator"" w(long double n) // { dg-warning "1:floating-point suffix .w. shadowed by implementation" }
+operator ""w(long double n) // { dg-warning "1:floating-point suffix .w. shadowed by implementation" }
 { return 4 * (n + 2) + 0; }
 
 constexpr long double
-operator"" W(long double n) // { dg-warning "1:floating-point suffix .W. shadowed by implementation" }
+operator ""W(long double n) // { dg-warning "1:floating-point suffix .W. shadowed by implementation" }
 { return 4 * (n + 2) + 1; }
 
 constexpr long double
-operator"" q(long double n) // { dg-warning "1:floating-point suffix .q. shadowed by implementation" }
+operator ""q(long double n) // { dg-warning "1:floating-point suffix .q. shadowed by implementation" }
 { return 4 * (n + 2) + 2; }
 
 constexpr long double
-operator"" Q(long double n) // { dg-warning "1:floating-point suffix .Q. shadowed by implementation" }
+operator ""Q(long double n) // { dg-warning "1:floating-point suffix .Q. shadowed by implementation" }
 { return 4 * (n + 2) + 3; }
 
 int
diff --git a/gcc/testsuite/g++.dg/cpp0x/gnu_fno-ext-numeric-literals.C b/gcc/testsuite/g++.dg/cpp0x/gnu_fno-ext-numeric-literals.C
index c738a484da6..7ee35d4c42c 100644
--- a/gcc/testsuite/g++.dg/cpp0x/gnu_fno-ext-numeric-literals.C
+++ b/gcc/testsuite/g++.dg/cpp0x/gnu_fno-ext-numeric-literals.C
@@ -4,73 +4,73 @@ 
 //  Integer imaginary...
 
 constexpr unsigned long long
-operator"" i(unsigned long long n)
+operator ""i(unsigned long long n)
 { return 4 * n + 0; }
 
 constexpr unsigned long long
-operator"" I(unsigned long long n)
+operator ""I(unsigned long long n)
 { return 4 * n + 1; }
 
 constexpr unsigned long long
-operator"" j(unsigned long long n)
+operator ""j(unsigned long long n)
 { return 4 * n + 2; }
 
 constexpr unsigned long long
-operator"" J(unsigned long long n)
+operator ""J(unsigned long long n)
 { return 4 * n + 3; }
 
 //  Floating-point imaginary...
 
 constexpr long double
-operator"" i(long double n)
+operator ""i(long double n)
 { return 4.0L * n + 0.0L; }
 
 constexpr long double
-operator"" I(long double n)
+operator ""I(long double n)
 { return 4.0L * n + 1.0L; }
 
 constexpr long double
-operator"" j(long double n)
+operator ""j(long double n)
 { return 4.0L * n + 2.0L; }
 
 constexpr long double
-operator"" J(long double n)
+operator ""J(long double n)
 { return 4.0L * n + 3.0L; }
 
 //  Fixed-point...
 
 constexpr long double
-operator"" k(long double n)
+operator ""k(long double n)
 { return 4 * (n + 1) + 0; }
 
 constexpr long double
-operator"" K(long double n)
+operator ""K(long double n)
 { return 4 * (n + 1) + 1; }
 
 constexpr long double
-operator"" r(long double n)
+operator ""r(long double n)
 { return 4 * (n + 1) + 2; }
 
 constexpr long double
-operator"" R(long double n)
+operator ""R(long double n)
 { return 4 * (n + 1) + 3; }
 
 //  Machine-defined...
 
 constexpr long double
-operator"" w(long double n)
+operator ""w(long double n)
 { return 4 * (n + 2) + 0; }
 
 constexpr long double
-operator"" W(long double n)
+operator ""W(long double n)
 { return 4 * (n + 2) + 1; }
 
 constexpr long double
-operator"" q(long double n)
+operator ""q(long double n)
 { return 4 * (n + 2) + 2; }
 
 constexpr long double
-operator"" Q(long double n)
+operator ""Q(long double n)
 { return 4 * (n + 2) + 3; }
 
 int
diff --git a/gcc/testsuite/g++.dg/cpp0x/pr51420.C b/gcc/testsuite/g++.dg/cpp0x/pr51420.C
index 1612cef9ee2..a06d62788cd 100644
--- a/gcc/testsuite/g++.dg/cpp0x/pr51420.C
+++ b/gcc/testsuite/g++.dg/cpp0x/pr51420.C
@@ -4,9 +4,9 @@ 
 void
 foo()
 {
-  float x = operator"" _F();  //  { dg-error  "13:'operator\"\"_F' was not declared in this scope" }
+  float x = operator ""_F();  //  { dg-error  "13:'operator\"\"_F' was not declared in this scope" }
   /* { dg-begin-multiline-output "" }
-   float x = operator"" _F();
+   float x = operator ""_F();
              ^~~~~~~~~~~~~
      { dg-end-multiline-output "" } */
 
diff --git a/gcc/testsuite/g++.dg/cpp0x/pr60209-neg.C b/gcc/testsuite/g++.dg/cpp0x/pr60209-neg.C
index 6c3ad0c9016..1d87207a106 100644
--- a/gcc/testsuite/g++.dg/cpp0x/pr60209-neg.C
+++ b/gcc/testsuite/g++.dg/cpp0x/pr60209-neg.C
@@ -4,25 +4,25 @@ 
 // http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1473
 
 void operator "" "boo" _ya(unsigned long long); // { dg-error "expected empty string after" }
+// { dg-warning "space" "" { target c++23 } .-1 }
 
 void operator "" "boo"_ya(unsigned long long); // { dg-error "expected empty string after" }
 
-void operator "" u"" _u(unsigned long long); // { dg-error "invalid encoding prefix in literal operator" }
+void operator "" u""_u(unsigned long long); // { dg-error "invalid encoding prefix in literal operator" }
 
-void operator u"" "" _v(unsigned long long); // { dg-error "invalid encoding prefix in literal operator" }
+void operator u"" ""_v(unsigned long long); // { dg-error "invalid encoding prefix in literal operator" }
 
-void operator U"" "" _w(unsigned long long); // { dg-error "invalid encoding prefix in literal operator" }
+void operator U"" ""_w(unsigned long long); // { dg-error "invalid encoding prefix in literal operator" }
 
-void operator L"" "" _x(unsigned long long); // { dg-error "invalid encoding prefix in literal operator" }
+void operator L"" ""_x(unsigned long long); // { dg-error "invalid encoding prefix in literal operator" }
 
-void operator u8"" "" _y(unsigned long long); // { dg-error "invalid encoding prefix in literal operator" }
+void operator u8"" ""_y(unsigned long long); // { dg-error "invalid encoding prefix in literal operator" }
 
-void operator u"" L"" _z(unsigned long long); // { dg-error "concatenation of string literals with conflicting encoding prefixes" }
+void operator u"" L""_z(unsigned long long); // { dg-error "concatenation of string literals with conflicting encoding prefixes" }
+// { dg-error "invalid encoding prefix in literal operator" "invalid" { target *-*-* } .-1 }
 
 void operator ""_p ""_q(unsigned long long); // { dg-error "inconsistent user-defined literal suffixes" }
 
 void operator "" "" while(unsigned long long); // { dg-error "unexpected keyword; remove space between quotes and suffix identifier" }
 
 void operator "" ""(unsigned long long); // { dg-error "expected suffix identifier" }
-
-// { dg-error "invalid encoding prefix in literal operator" "invalid" { target *-*-* } 20 }
diff --git a/gcc/testsuite/g++.dg/cpp0x/pr60209.C b/gcc/testsuite/g++.dg/cpp0x/pr60209.C
index 6ed26e9bcc6..2ecb7ed0c82 100644
--- a/gcc/testsuite/g++.dg/cpp0x/pr60209.C
+++ b/gcc/testsuite/g++.dg/cpp0x/pr60209.C
@@ -4,8 +4,10 @@ 
 // http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1473
 
 void operator "" "" _x(unsigned long long);
+// { dg-warning "space" "" { target c++23 } .-1 }
 
 void operator "" "" "" _x(unsigned long long);
+// { dg-warning "space" "" { target c++23 } .-1 }
 
 void operator "" ""_w(unsigned long long);
 
diff --git a/gcc/testsuite/g++.dg/cpp0x/pr61038.C b/gcc/testsuite/g++.dg/cpp0x/pr61038.C
index 96aabe554b8..3030defe94d 100644
--- a/gcc/testsuite/g++.dg/cpp0x/pr61038.C
+++ b/gcc/testsuite/g++.dg/cpp0x/pr61038.C
@@ -6,11 +6,11 @@ 
 #include <cstdlib>
 
 void
-operator "" _s(const char *, size_t)
+operator ""_s(const char *, size_t)
 { }
 
 void
-operator "" _t(const char)
+operator ""_t(const char)
 { }
 
 #define QUOTE(s) #s
diff --git a/gcc/testsuite/g++.dg/cpp0x/std_fext-numeric-literals.C b/gcc/testsuite/g++.dg/cpp0x/std_fext-numeric-literals.C
index d251c744999..192383d104a 100644
--- a/gcc/testsuite/g++.dg/cpp0x/std_fext-numeric-literals.C
+++ b/gcc/testsuite/g++.dg/cpp0x/std_fext-numeric-literals.C
@@ -4,73 +4,73 @@ 
 //  Integer imaginary...
 
 constexpr unsigned long long
-operator"" i(unsigned long long n) // { dg-warning "1:integer suffix .i. shadowed by implementation" "" { target c++11_only } }
+operator ""i(unsigned long long n) // { dg-warning "1:integer suffix .i. shadowed by implementation" "" { target c++11_only } }
 { return 4 * n + 0; }
 
 constexpr unsigned long long
-operator"" I(unsigned long long n) // { dg-warning "1:integer suffix .I. shadowed by implementation" }
+operator ""I(unsigned long long n) // { dg-warning "1:integer suffix .I. shadowed by implementation" }
 { return 4 * n + 1; }
 
 constexpr unsigned long long
-operator"" j(unsigned long long n) // { dg-warning "1:integer suffix .j. shadowed by implementation" }
+operator ""j(unsigned long long n) // { dg-warning "1:integer suffix .j. shadowed by implementation" }
 { return 4 * n + 2; }
 
 constexpr unsigned long long
-operator"" J(unsigned long long n) // { dg-warning "1:integer suffix .J. shadowed by implementation" }
+operator ""J(unsigned long long n) // { dg-warning "1:integer suffix .J. shadowed by implementation" }
 { return 4 * n + 3; }
 
 //  Floating-point imaginary...
 
 constexpr long double
-operator"" i(long double n) // { dg-warning "1:floating-point suffix .i. shadowed by implementation" "" { target c++11_only } }
+operator ""i(long double n) // { dg-warning "1:floating-point suffix .i. shadowed by implementation" "" { target c++11_only } }
 { return 4.0L * n + 0.0L; }
 
 constexpr long double
-operator"" I(long double n) // { dg-warning "1:floating-point suffix .I. shadowed by implementation" }
+operator ""I(long double n) // { dg-warning "1:floating-point suffix .I. shadowed by implementation" }
 { return 4.0L * n + 1.0L; }
 
 constexpr long double
-operator"" j(long double n) // { dg-warning "1:floating-point suffix .j. shadowed by implementation" }
+operator ""j(long double n) // { dg-warning "1:floating-point suffix .j. shadowed by implementation" }
 { return 4.0L * n + 2.0L; }
 
 constexpr long double
-operator"" J(long double n) // { dg-warning "1:floating-point suffix .J. shadowed by implementation" }
+operator ""J(long double n) // { dg-warning "1:floating-point suffix .J. shadowed by implementation" }
 { return 4.0L * n + 3.0L; }
 
 //  Fixed-point...
 
 constexpr long double
-operator"" k(long double n) // { dg-warning "1:floating-point suffix .k. shadowed by implementation" }
+operator ""k(long double n) // { dg-warning "1:floating-point suffix .k. shadowed by implementation" }
 { return 4 * (n + 1) + 0; }
 
 constexpr long double
-operator"" K(long double n) // { dg-warning "1:floating-point suffix .K. shadowed by implementation" }
+operator ""K(long double n) // { dg-warning "1:floating-point suffix .K. shadowed by implementation" }
 { return 4 * (n + 1) + 1; }
 
 constexpr long double
-operator"" r(long double n) // { dg-warning "1:floating-point suffix .r. shadowed by implementation" }
+operator ""r(long double n) // { dg-warning "1:floating-point suffix .r. shadowed by implementation" }
 { return 4 * (n + 1) + 2; }
 
 constexpr long double
-operator"" R(long double n) // { dg-warning "1:floating-point suffix .R. shadowed by implementation" }
+operator ""R(long double n) // { dg-warning "1:floating-point suffix .R. shadowed by implementation" }
 { return 4 * (n + 1) + 3; }
 
 //  Machine-defined...
 
 constexpr long double
-operator"" w(long double n) // { dg-warning "1:floating-point suffix .w. shadowed by implementation" }
+operator ""w(long double n) // { dg-warning "1:floating-point suffix .w. shadowed by implementation" }
 { return 4 * (n + 2) + 0; }
 
 constexpr long double
-operator"" W(long double n) // { dg-warning "1:floating-point suffix .W. shadowed by implementation" }
+operator ""W(long double n) // { dg-warning "1:floating-point suffix .W. shadowed by implementation" }
 { return 4 * (n + 2) + 1; }
 
 constexpr long double
-operator"" q(long double n) // { dg-warning "1:floating-point suffix .q. shadowed by implementation" }
+operator ""q(long double n) // { dg-warning "1:floating-point suffix .q. shadowed by implementation" }
 { return 4 * (n + 2) + 2; }
 
 constexpr long double
-operator"" Q(long double n) // { dg-warning "1:floating-point suffix .Q. shadowed by implementation" }
+operator ""Q(long double n) // { dg-warning "1:floating-point suffix .Q. shadowed by implementation" }
 { return 4 * (n + 2) + 3; }
 
 int
diff --git a/gcc/testsuite/g++.dg/cpp0x/std_fno-ext-numeric-literals.C b/gcc/testsuite/g++.dg/cpp0x/std_fno-ext-numeric-literals.C
index b4f9d457d98..23b988ea6b5 100644
--- a/gcc/testsuite/g++.dg/cpp0x/std_fno-ext-numeric-literals.C
+++ b/gcc/testsuite/g++.dg/cpp0x/std_fno-ext-numeric-literals.C
@@ -4,73 +4,73 @@ 
 //  Integer imaginary...
 
 constexpr unsigned long long
-operator"" i(unsigned long long n)
+operator ""i(unsigned long long n)
 { return 4 * n + 0; }
 
 constexpr unsigned long long
-operator"" I(unsigned long long n)
+operator ""I(unsigned long long n)
 { return 4 * n + 1; }
 
 constexpr unsigned long long
-operator"" j(unsigned long long n)
+operator ""j(unsigned long long n)
 { return 4 * n + 2; }
 
 constexpr unsigned long long
-operator"" J(unsigned long long n)
+operator ""J(unsigned long long n)
 { return 4 * n + 3; }
 
 //  Floating-point imaginary...
 
 constexpr long double
-operator"" i(long double n)
+operator ""i(long double n)
 { return 4.0L * n + 0.0L; }
 
 constexpr long double
-operator"" I(long double n)
+operator ""I(long double n)
 { return 4.0L * n + 1.0L; }
 
 constexpr long double
-operator"" j(long double n)
+operator ""j(long double n)
 { return 4.0L * n + 2.0L; }
 
 constexpr long double
-operator"" J(long double n)
+operator ""J(long double n)
 { return 4.0L * n + 3.0L; }
 
 //  Fixed-point...
 
 constexpr long double
-operator"" k(long double n)
+operator ""k(long double n)
 { return 4 * (n + 1) + 0; }
 
 constexpr long double
-operator"" K(long double n)
+operator ""K(long double n)
 { return 4 * (n + 1) + 1; }
 
 constexpr long double
-operator"" r(long double n)
+operator ""r(long double n)
 { return 4 * (n + 1) + 2; }
 
 constexpr long double
-operator"" R(long double n)
+operator ""R(long double n)
 { return 4 * (n + 1) + 3; }
 
 //  Machine-defined...
 
 constexpr long double
-operator"" w(long double n)
+operator ""w(long double n)
 { return 4 * (n + 2) + 0; }
 
 constexpr long double
-operator"" W(long double n)
+operator ""W(long double n)
 { return 4 * (n + 2) + 1; }
 
 constexpr long double
-operator"" q(long double n)
+operator ""q(long double n)
 { return 4 * (n + 2) + 2; }
 
 constexpr long double
-operator"" Q(long double n)
+operator ""Q(long double n)
 { return 4 * (n + 2) + 3; }
 
 int
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-addr.C b/gcc/testsuite/g++.dg/cpp0x/udlit-addr.C
index 11389bfbc28..3c62524f1d6 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-addr.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-addr.C
@@ -2,9 +2,9 @@ 
 
 #include <cstddef>
 
-bool operator"" _yn(const char*, size_t);
+bool operator ""_yn(const char*, size_t);
 
 typedef bool (*pfunk)(const char*, size_t);
-pfunk p = &operator"" _yn;
+pfunk p = &operator ""_yn;
 
 bool tf = p("Hello,\0 World!", 14);
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-args-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-args-neg.C
index b22fddd0403..72cb4b4c4cb 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-args-neg.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-args-neg.C
@@ -5,37 +5,37 @@ 
 class Foo { };
 
 int
-operator"" _Foo();	// { dg-error "1:.int operator\"\"_Foo\\(\\). has invalid argument list" }
+operator ""_Foo();	// { dg-error "1:.int operator\"\"_Foo\\(\\). has invalid argument list" }
 
 Foo
-operator"" _Foo(int *);	// { dg-error "1:.Foo operator\"\"_Foo\\(int\\*\\). has invalid argument list" }
+operator ""_Foo(int *);	// { dg-error "1:.Foo operator\"\"_Foo\\(int\\*\\). has invalid argument list" }
 
 Foo
-operator"" _Foo(unsigned long int);	// { dg-error "1:.Foo operator\"\"_Foo\\(long unsigned int\\). has invalid argument list" }
+operator ""_Foo(unsigned long int);	// { dg-error "1:.Foo operator\"\"_Foo\\(long unsigned int\\). has invalid argument list" }
 
 Foo
-operator"" _Foo(double);	// { dg-error "1:.Foo operator\"\"_Foo\\(double\\). has invalid argument list" }
+operator ""_Foo(double);	// { dg-error "1:.Foo operator\"\"_Foo\\(double\\). has invalid argument list" }
 
 Foo
-operator"" _Foo(const float *, std::size_t);	// { dg-error "1:.Foo operator\"\"_Foo\\(const float\\*, std::size_t\\). has invalid argument list" }
+operator ""_Foo(const float *, std::size_t);	// { dg-error "1:.Foo operator\"\"_Foo\\(const float\\*, std::size_t\\). has invalid argument list" }
 
 Foo
-operator"" _Foo(const wchar_t *, int);	// { dg-error "1:.Foo operator\"\"_Foo\\(const wchar_t\\*, int\\). has invalid argument list" }
+operator ""_Foo(const wchar_t *, int);	// { dg-error "1:.Foo operator\"\"_Foo\\(const wchar_t\\*, int\\). has invalid argument list" }
 
 Foo
-operator"" _Foo(const char16_t *);	// { dg-error "1:.Foo operator\"\"_Foo\\(const char16_t\\*\\). has invalid argument list" }
+operator ""_Foo(const char16_t *);	// { dg-error "1:.Foo operator\"\"_Foo\\(const char16_t\\*\\). has invalid argument list" }
 
 Foo
-operator"" _Foo(char...);	// { dg-error "1:.Foo operator\"\"_Foo\\(char, \\.\\.\\.\\). has invalid argument list" }
+operator ""_Foo(char...);	// { dg-error "1:.Foo operator\"\"_Foo\\(char, \\.\\.\\.\\). has invalid argument list" }
 
 Foo
-operator"" _Foo(unsigned long long int, char);	// { dg-error "1:.Foo operator\"\"_Foo\\(long long unsigned int, char\\). has invalid argument list" }
+operator ""_Foo(unsigned long long int, char);	// { dg-error "1:.Foo operator\"\"_Foo\\(long long unsigned int, char\\). has invalid argument list" }
 
 Foo
-operator"" _Foo(const char *, std::size_t, int);	// { dg-error "1:.Foo operator\"\"_Foo\\(const char\\*, std::size_t, int\\). has invalid argument list" }
+operator ""_Foo(const char *, std::size_t, int);	// { dg-error "1:.Foo operator\"\"_Foo\\(const char\\*, std::size_t, int\\). has invalid argument list" }
 
 Foo
-operator"" _Foo(long double &);	// { dg-error "1:.Foo operator\"\"_Foo\\(long double&\\). has invalid argument list" }
+operator ""_Foo(long double &);	// { dg-error "1:.Foo operator\"\"_Foo\\(long double&\\). has invalid argument list" }
 
 Foo
-operator"" _Foo(std::size_t, const char16_t *);	// { dg-error "1:.Foo operator\"\"_Foo\\(std::size_t, const char16_t\\*\\). has invalid argument list" }
+operator ""_Foo(std::size_t, const char16_t *);	// { dg-error "1:.Foo operator\"\"_Foo\\(std::size_t, const char16_t\\*\\). has invalid argument list" }
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-args.C b/gcc/testsuite/g++.dg/cpp0x/udlit-args.C
index 4680288d20c..2c1058ec344 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-args.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-args.C
@@ -5,34 +5,34 @@ 
 class Foo { };
 
 Foo
-operator"" _Foo(const char *);
+operator ""_Foo(const char *);
 
 Foo
-operator"" _Foo(unsigned long long int);
+operator ""_Foo(unsigned long long int);
 
 Foo
-operator"" _Foo(long double);
+operator ""_Foo(long double);
 
 Foo
-operator"" _Foo(char);
+operator ""_Foo(char);
 
 Foo
-operator"" _Foo(wchar_t);
+operator ""_Foo(wchar_t);
 
 Foo
-operator"" _Foo(char16_t);
+operator ""_Foo(char16_t);
 
 Foo
-operator"" _Foo(char32_t);
+operator ""_Foo(char32_t);
 
 Foo
-operator"" _Foo(const char *, std::size_t);
+operator ""_Foo(const char *, std::size_t);
 
 Foo
-operator"" _Foo(const wchar_t *, std::size_t);
+operator ""_Foo(const wchar_t *, std::size_t);
 
 Foo
-operator"" _Foo(const char16_t *, std::size_t);
+operator ""_Foo(const char16_t *, std::size_t);
 
 Foo
-operator"" _Foo(const char32_t *, std::size_t);
+operator ""_Foo(const char32_t *, std::size_t);
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-args2.C b/gcc/testsuite/g++.dg/cpp0x/udlit-args2.C
index b9cb8e093a9..faf6ca533ff 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-args2.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-args2.C
@@ -3,12 +3,12 @@ 
 
 #include <cstddef>
 
-int operator "" _a (const char *);
-int operator "" _a (const char *, std::size_t);
+int operator ""_a (const char *);
+int operator ""_a (const char *, std::size_t);
 int a = 123_a;
 int a2 = "abc"_a;
 
-int operator "" _b (const char *, std::size_t);
-int operator "" _b (const char *);
+int operator ""_b (const char *, std::size_t);
+int operator ""_b (const char *);
 int b = 123_b;
 int b2 = "abc"_b;
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-clink-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-clink-neg.C
index eb7ae8c0b17..f20b755b715 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-clink-neg.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-clink-neg.C
@@ -3,6 +3,6 @@ 
 extern "C" {
 
 int
-operator"" _badclinkage(unsigned long long);	// { dg-error "1:literal operator with C linkage" }
+operator ""_badclinkage(unsigned long long);	// { dg-error "1:literal operator with C linkage" }
 
 }
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-concat-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-concat-neg.C
index 95d49271b81..4b7e33d80fc 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-concat-neg.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-concat-neg.C
@@ -3,8 +3,8 @@ 
 
 #include <string>
 
-std::string operator"" _xxx(const char*, size_t);
+std::string operator ""_xxx(const char*, size_t);
 
-std::string operator"" _yyy(const char*, size_t);
+std::string operator ""_yyy(const char*, size_t);
 
 std::string concat = "Hello, "_xxx "World!"_yyy;	// { dg-error "inconsistent user-defined literal suffixes" }
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-concat.C b/gcc/testsuite/g++.dg/cpp0x/udlit-concat.C
index 208aaeea55d..b513e738ab9 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-concat.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-concat.C
@@ -3,7 +3,7 @@ 
 
 #include <string>
 
-std::string operator"" _www(const char*, size_t);
+std::string operator ""_www(const char*, size_t);
 
 std::string concat01 = "Hello, " "World!"_www;
 
@@ -14,9 +14,9 @@  std::string concat11 = "Hello, "_www "World!"_www;
 
 class Tachyon { };
 
-Tachyon operator"" _fast(const char*, size_t);
+Tachyon operator ""_fast(const char*, size_t);
 
-int operator"" _fast(const char32_t*, size_t);
+int operator ""_fast(const char32_t*, size_t);
 
 int speedy01 = "Hello, " U"World!"_fast;
 
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-constexpr.C b/gcc/testsuite/g++.dg/cpp0x/udlit-constexpr.C
index 4c2f7eda371..f91bf147eb1 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-constexpr.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-constexpr.C
@@ -1,7 +1,7 @@ 
 // { dg-do compile { target c++11 } }
 
 constexpr unsigned long long
-operator"" _grow(unsigned long long n)
+operator ""_grow(unsigned long long n)
 { return 2 * n; }
 
 double buffer[25_grow];
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-cpp98-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-cpp98-neg.C
index cb4c359658c..a68505d62a2 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-cpp98-neg.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-cpp98-neg.C
@@ -3,13 +3,13 @@ 
 #include <cstddef>
 
 int
-operator"" _mm(long double m)	// { dg-warning "user-defined literals only available with" }
+operator ""_mm(long double m)	// { dg-warning "user-defined literals only available with" }
 { return int(1000.0L * m); }
 
 int in = 0.0254_mm;	// { dg-error "invalid suffix" }
 
 int
-operator"" _Q(const char *, std::size_t)	// { dg-warning "user-defined literals only available with" }
+operator ""_Q(const char *, std::size_t)	// { dg-warning "user-defined literals only available with" }
 { return 42; }
 
 int x = "Hello"_Q;	// { dg-error "invalid conversion from" "invalid" }
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-declare-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-declare-neg.C
index 721f87d4e66..7d06e42c4dc 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-declare-neg.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-declare-neg.C
@@ -2,14 +2,14 @@ 
 
 //  Check that undeclared literal operator calls and literals give appropriate errors.
 
-int i = operator"" _Bar('x');  // { dg-error "9:'operator\"\"_Bar' was not declared in this scope" }
+int i = operator ""_Bar('x');  // { dg-error "9:'operator\"\"_Bar' was not declared in this scope" }
 int j = 'x'_Bar;  // { dg-error "unable to find character literal operator|with|argument" }
 
-int ii = operator"" _BarCharStr("Howdy, Pardner!");  // { dg-error "10:'operator\"\"_BarCharStr' was not declared in this scope" }
+int ii = operator ""_BarCharStr("Howdy, Pardner!");  // { dg-error "10:'operator\"\"_BarCharStr' was not declared in this scope" }
 int jj = "Howdy, Pardner!"_BarCharStr;  // { dg-error "unable to find string literal operator|Possible missing length argument" }
 
-unsigned long long iULL = operator"" _BarULL(666ULL);  // { dg-error "27:'operator\"\"_BarULL' was not declared in this scope" }
+unsigned long long iULL = operator ""_BarULL(666ULL);  // { dg-error "27:'operator\"\"_BarULL' was not declared in this scope" }
 unsigned long long jULL = 666_BarULL;  // { dg-error "unable to find numeric literal operator" }
 
-long double iLD = operator"" _BarLD(666.0L);  // { dg-error "19:'operator\"\"_BarLD' was not declared in this scope" }
+long double iLD = operator ""_BarLD(666.0L);  // { dg-error "19:'operator\"\"_BarLD' was not declared in this scope" }
 long double jLD = 666.0_BarLD;  // { dg-error "unable to find numeric literal operator" }
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-embed-quote.C b/gcc/testsuite/g++.dg/cpp0x/udlit-embed-quote.C
index 27f7c990a12..ddadef48a92 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-embed-quote.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-embed-quote.C
@@ -6,10 +6,10 @@ 
 #include <cstdint>
 #include <cassert>
 
-int operator"" _embedchar(char)
+int operator ""_embedchar(char)
 { return 41; }
 
-int operator"" _embedstr(const char*, std::size_t len)
+int operator ""_embedstr(const char*, std::size_t len)
 { return 42 + len; }
 
 void
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-extended-id-1.C b/gcc/testsuite/g++.dg/cpp0x/udlit-extended-id-1.C
index e9373e563d9..29a5e92938f 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-extended-id-1.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-extended-id-1.C
@@ -1,5 +1,5 @@ 
 // { dg-do run { target c++11 } }
-// { dg-additional-options "-Wno-error=normalized" }
+// { dg-additional-options "-Wno-error=normalized -Wno-deprecated-literal-operator" }
 // { dg-require-effective-target ucn }
 // { dg-skip-if "requires hosted libstdc++ for cstring" { ! hostedlib } }
 
@@ -7,7 +7,7 @@ 
 #include <cstddef>
 using namespace std;
 
-constexpr unsigned long long operator "" _Ï€ (unsigned long long x)
+constexpr unsigned long long operator ""_Ï€ (unsigned long long x)
 {
   return 3 * x;
 }
@@ -25,7 +25,7 @@  char x2[2_Π2];
 static_assert (sizeof x1 == 3, "test1");
 static_assert (sizeof x2 == 8, "test2");
 
-const char * operator "" _1σ (const char *s, size_t)
+const char * operator ""_1σ (const char *s, size_t)
 {
   return s + 1;
 }
@@ -35,7 +35,7 @@  const char * operator ""_Σ2 (const char *s, size_t)
   return s + 2;
 }
 
-const char * operator "" _\U000000e61 (const char *s, size_t)
+const char * operator ""_\U000000e61 (const char *s, size_t)
 {
   return "ae";
 }
@@ -45,7 +45,7 @@  const char* operator ""_\u01532 (const char *s, size_t)
   return "oe";
 }
 
-bool operator "" _\u0BC7\u0BBE (unsigned long long); // { dg-warning "not in NFC" }
+bool operator ""_\u0BC7\u0BBE (unsigned long long); // { dg-warning "not in NFC" }
 bool operator ""_\u0B47\U00000B3E (unsigned long long); // { dg-warning "not in NFC" }
 
 #define xτy
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-extended-id-3.C b/gcc/testsuite/g++.dg/cpp0x/udlit-extended-id-3.C
index cb8a957947a..e3d92857b3b 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-extended-id-3.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-extended-id-3.C
@@ -14,4 +14,5 @@  const char *x = "hbar"_ħ; // { dg-bogus "poisoned" }
    syntax has been deprecated for C++23.  */
 #pragma GCC poison _ħ2
 const char * operator "" _ħ2 (const char *, size_t); // { dg-bogus "poisoned" "" { xfail *-*-*} }
+// { dg-warning "space" "" { target c++23 } .-1 }
 const char *x2 = "hbar2"_ħ2; // { dg-bogus "poisoned" }
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-extern-c.C b/gcc/testsuite/g++.dg/cpp0x/udlit-extern-c.C
index 7a38e12dcd0..a0eed21f24f 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-extern-c.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-extern-c.C
@@ -2,6 +2,6 @@ 
 
 extern "C" { // { dg-message "1: 'extern .C.' linkage started here" }
 
-constexpr double operator"" _deg ( double degrees ); // { dg-error "18:literal operator with C linkage" }
+constexpr double operator ""_deg ( double degrees ); // { dg-error "18:literal operator with C linkage" }
 
 }
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-friend.C b/gcc/testsuite/g++.dg/cpp0x/udlit-friend.C
index 54d7b7a1f11..235dfc9b25d 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-friend.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-friend.C
@@ -1,28 +1,28 @@ 
 // { dg-do compile { target c++11 } }
 
 long double
-operator"" _Hertz(long double);
+operator ""_Hertz(long double);
 
 class Foo
 {
 public:
   Foo() { }
 
-  friend Foo operator"" _Bar(char);
+  friend Foo operator ""_Bar(char);
 
   friend long double
-  operator"" _Hertz(long double omega)
+  operator ""_Hertz(long double omega)
   { return omega / 6.28318530717958648; }
 };
 
 Foo
-operator"" _Bar(char)
+operator ""_Bar(char)
 { return Foo(); }
 
-Foo f1 = operator"" _Bar('x');
+Foo f1 = operator ""_Bar('x');
 
 Foo f2 = 'x'_Bar;
 
-long double fm1 = operator"" _Hertz(552.92L);
+long double fm1 = operator ""_Hertz(552.92L);
 
 long double fm2 = 552.92_Hertz;
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-general.C b/gcc/testsuite/g++.dg/cpp0x/udlit-general.C
index 28732d86212..7e5bfd0a275 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-general.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-general.C
@@ -9,27 +9,27 @@ 
 #include <complex>
 #include <cassert>
 
-long double operator"" _v(long double);
-std::string operator"" _w(const char16_t*, size_t);
-unsigned operator"" _w(const char*);
+long double operator ""_v(long double);
+std::string operator ""_w(const char16_t*, size_t);
+unsigned operator ""_w(const char*);
 
 std::complex<double>
-operator"" _i(long double y)
+operator ""_i(long double y)
 { return std::complex<double>(0.0L, y); }
 
 void
 test1()
 {
-  long double x = operator"" _v(1.2L);
+  long double x = operator ""_v(1.2L);
   assert(x == 2.2L);
 
-  std::string s = operator"" _w(u"one", 3);
+  std::string s = operator ""_w(u"one", 3);
   assert(s == "boo");
 
-  unsigned u = operator"" _w("Hello, World!");
+  unsigned u = operator ""_w("Hello, World!");
   assert(u == 13U);
 
-  std::complex<double> i = operator"" _i(2.0);
+  std::complex<double> i = operator ""_i(2.0);
   assert(i == std::complex<double>(0.0, 2.0));
 }
 
@@ -40,13 +40,13 @@  main()
 }
 
 long double
-operator"" _v(long double x)
+operator ""_v(long double x)
 { return x + 1.0L; }
 
 std::string
-operator"" _w(const char16_t*, size_t)
+operator ""_w(const char16_t*, size_t)
 { return std::string("boo"); }
 
 unsigned
-operator"" _w(const char* str)
+operator ""_w(const char* str)
 { return strlen(str); }
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-implicit-conv-neg-char8_t.C b/gcc/testsuite/g++.dg/cpp0x/udlit-implicit-conv-neg-char8_t.C
index b917b5f6b90..a224c1094e5 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-implicit-conv-neg-char8_t.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-implicit-conv-neg-char8_t.C
@@ -2,23 +2,23 @@ 
 
 #include <cstdint>
 
-int operator"" _bar (long double);
+int operator ""_bar (long double);
 
-double operator"" _foo (long long unsigned);
+double operator ""_foo (long long unsigned);
 
 int i = 12_bar; // { dg-error "unable to find numeric literal operator|with|argument" }
 
 double d = 1.2_foo; // { dg-error "unable to find numeric literal operator|with|argument" }
 
-int operator"" _char(char);
+int operator ""_char(char);
 
-int operator"" _char8_t(char8_t);
+int operator ""_char8_t(char8_t);
 
-int operator"" _wchar_t(wchar_t);
+int operator ""_wchar_t(wchar_t);
 
-int operator"" _char16_t(char16_t);
+int operator ""_char16_t(char16_t);
 
-int operator"" _char32_t(char32_t);
+int operator ""_char32_t(char32_t);
 
 int cwcx = 'c'_wchar_t; // { dg-error "unable to find character literal operator|with|argument" }
 int cc8  = 'c'_char8_t; // { dg-error "unable to find character literal operator|with|argument" }
@@ -45,15 +45,15 @@  int c32c8 = U'c'_char8_t; // { dg-error "unable to find character literal operat
 int c32wc = U'c'_wchar_t; // { dg-error "unable to find character literal operator|with|argument" }
 int c32c16 = U'c'_char16_t; // { dg-error "unable to find character literal operator|with|argument" }
 
-int operator"" _char_str(const char*, std::size_t);
+int operator ""_char_str(const char*, std::size_t);
 
-int operator"" _wchar_t_str(const wchar_t*, std::size_t);
+int operator ""_wchar_t_str(const wchar_t*, std::size_t);
 
-int operator"" _char8_t_str(const char8_t*, std::size_t);
+int operator ""_char8_t_str(const char8_t*, std::size_t);
 
-int operator"" _char16_t_str(const char16_t*, std::size_t);
+int operator ""_char16_t_str(const char16_t*, std::size_t);
 
-int operator"" _char32_t_str(const char32_t*, std::size_t);
+int operator ""_char32_t_str(const char32_t*, std::size_t);
 
 int strwstr = "str"_wchar_t_str; // { dg-error "unable to find string literal operator|with|arguments" }
 int strstr8 = "str"_char8_t_str; // { dg-error "unable to find string literal operator|with|arguments" }
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-implicit-conv-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-implicit-conv-neg.C
index ea6095d14e9..92eae54372b 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-implicit-conv-neg.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-implicit-conv-neg.C
@@ -2,21 +2,21 @@ 
 
 #include <cstdint>
 
-int operator"" _bar (long double);
+int operator ""_bar (long double);
 
-double operator"" _foo (long long unsigned);
+double operator ""_foo (long long unsigned);
 
 int i = 12_bar; // { dg-error "unable to find numeric literal operator|with|argument" }
 
 double d = 1.2_foo; // { dg-error "unable to find numeric literal operator|with|argument" }
 
-int operator"" _char(char);
+int operator ""_char(char);
 
-int operator"" _wchar_t(wchar_t);
+int operator ""_wchar_t(wchar_t);
 
-int operator"" _char16_t(char16_t);
+int operator ""_char16_t(char16_t);
 
-int operator"" _char32_t(char32_t);
+int operator ""_char32_t(char32_t);
 
 int cwcx = 'c'_wchar_t; // { dg-error "unable to find character literal operator|with|argument" }
 int cc16 = 'c'_char16_t; // { dg-error "unable to find character literal operator|with|argument" }
@@ -34,13 +34,13 @@  int c32c = U'c'_char; // { dg-error "unable to find character literal operator|w
 int c32wc = U'c'_wchar_t; // { dg-error "unable to find character literal operator|with|argument" }
 int c32c16 = U'c'_char16_t; // { dg-error "unable to find character literal operator|with|argument" }
 
-int operator"" _char_str(const char*, std::size_t);
+int operator ""_char_str(const char*, std::size_t);
 
-int operator"" _wchar_t_str(const wchar_t*, std::size_t);
+int operator ""_wchar_t_str(const wchar_t*, std::size_t);
 
-int operator"" _char16_t_str(const char16_t*, std::size_t);
+int operator ""_char16_t_str(const char16_t*, std::size_t);
 
-int operator"" _char32_t_str(const char32_t*, std::size_t);
+int operator ""_char32_t_str(const char32_t*, std::size_t);
 
 int strwstr = "str"_wchar_t_str; // { dg-error "unable to find string literal operator|with|arguments" }
 int strstr16 = "str"_char16_t_str; // { dg-error "unable to find string literal operator|with|arguments" }
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-inline.C b/gcc/testsuite/g++.dg/cpp0x/udlit-inline.C
index fd8b9a05b38..4092d071bf2 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-inline.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-inline.C
@@ -3,20 +3,20 @@ 
 //  Literal operators can be inline.
 
 inline int
-operator"" _thing1(char cc)
+operator ""_thing1(char cc)
 { return 42 * cc; }
 
-int operator"" _thing2(char cc);
+int operator ""_thing2(char cc);
 
 class Foo
 {
   int
-  friend operator"" _thing2(char cc)
+  friend operator ""_thing2(char cc)
   { return 42 * cc; }
 };
 
-int i = operator"" _thing1('x');
+int i = operator ""_thing1('x');
 int j = 'x'_thing1;
 
-int iF = operator"" _thing2('x');
+int iF = operator ""_thing2('x');
 int jF = 'x'_thing2;
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-mangle.C b/gcc/testsuite/g++.dg/cpp0x/udlit-mangle.C
index 8840dcdce28..94143a1a0cd 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-mangle.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-mangle.C
@@ -2,7 +2,7 @@ 
 // { dg-do compile { target c++11 } }
 // { dg-final { scan-assembler "_Zli2_wPKc" } }
 
-int operator "" _w(const char*);
+int operator ""_w(const char*);
 int main() {
   123_w;
 }
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-member-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-member-neg.C
index f2eef0f52a2..4b69a27ff1d 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-member-neg.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-member-neg.C
@@ -4,12 +4,12 @@  class Foo
 {
 public:
   Foo() { }
-  int operator"" _Bar(char32_t);  // { dg-error "7:.int Foo::operator\"\"_Bar\\(char32_t\\). must be a non-member function" }
+  int operator ""_Bar(char32_t);  // { dg-error "7:.int Foo::operator\"\"_Bar\\(char32_t\\). must be a non-member function" }
 };
 
-int i = operator"" _Bar(U'x');  // { dg-error "9:'operator\"\"_Bar' was not declared in this scope" }
+int i = operator ""_Bar(U'x');  // { dg-error "9:'operator\"\"_Bar' was not declared in this scope" }
 int j = U'x'_Bar;  // { dg-error "unable to find character literal operator" }
 
 int
-Foo::operator"" _Bar(char32_t)  // { dg-error "must be a non-member function" }
+Foo::operator ""_Bar(char32_t)  // { dg-error "must be a non-member function" }
 { return 42; }
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-namespace.C b/gcc/testsuite/g++.dg/cpp0x/udlit-namespace.C
index a2e4e414319..fcaa41a4da8 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-namespace.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-namespace.C
@@ -9,23 +9,23 @@ 
 
 namespace Long
 {
-  long double operator"" _LL(long double);
+  long double operator ""_LL(long double);
 }
 
 namespace Short
 {
   short
-  operator"" _SS(long double x)
+  operator ""_SS(long double x)
   { return std::fmod(x, static_cast<long double>(std::numeric_limits<short>::max())); }
 }
 
 void
 test1()
 {
-  long double x = Long::operator "" _LL(1.2L);
+  long double x = Long::operator ""_LL(1.2L);
 
   using namespace Short;
-  short s = operator"" _SS(1.2L);
+  short s = operator ""_SS(1.2L);
   short s2 = 1.2_SS;
 }
 
@@ -38,6 +38,6 @@  main()
 namespace Long
 {
   long double
-  operator"" _LL(long double x)
+  operator ""_LL(long double x)
   { return x + 2.0L; }
 }
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-nofunc-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-nofunc-neg.C
index 861a77ce7bf..ae32d11dd95 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-nofunc-neg.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-nofunc-neg.C
@@ -3,7 +3,7 @@ 
 // Test user-defined literals.
 // Test error on non-function declaration.
 
-double operator"" _baddecl; // { dg-error "8:declaration of .operator\"\"_baddecl. as non-function" }
+double operator ""_baddecl; // { dg-error "8:declaration of .operator\"\"_baddecl. as non-function" }
 
 template<char...>
-  int operator"" _badtmpldecl; // { dg-error "7:declaration of .operator\"\"_badtmpldecl. as non-function" }
+  int operator ""_badtmpldecl; // { dg-error "7:declaration of .operator\"\"_badtmpldecl. as non-function" }
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-nonempty-str-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-nonempty-str-neg.C
index ddaa1aa6c3e..06f5642ceaf 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-nonempty-str-neg.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-nonempty-str-neg.C
@@ -3,4 +3,4 @@ 
 // Test user-defined literals.
 // Test error on non-empty string after 'operator' keyword.
 
-double operator"hi" _badword(long double); // { dg-error "expected empty string after" }
+double operator "hi"_badword(long double); // { dg-error "expected empty string after" }
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-nosuffix-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-nosuffix-neg.C
index 790726fb71d..e89b9f5a689 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-nosuffix-neg.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-nosuffix-neg.C
@@ -1,5 +1,5 @@ 
 // { dg-do compile { target c++11 } }
 
 char32_t
-operator"" (char32_t C)	// { dg-error "expected suffix identifier" }
+operator ""(char32_t C)	// { dg-error "expected suffix identifier" }
 { return C; }
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-nounder-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-nounder-neg.C
index 9120ae45dfa..21d6c475ef8 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-nounder-neg.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-nounder-neg.C
@@ -3,7 +3,7 @@ 
 // Test user-defined literals.
 // Test warning on declaration without leading underscore.
 
-long double operator"" nounder(long double); // { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" }
+long double operator ""nounder(long double); // { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" }
 
 template<char...>
-  int operator"" nounder(); // { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" }
+  int operator ""nounder(); // { dg-warning "literal operator suffixes not preceded by|are reserved for future standardization" }
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-operator-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-operator-neg.C
index d71f4a240e8..49761ca1631 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-operator-neg.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-operator-neg.C
@@ -3,40 +3,40 @@ 
 //  Can't have *both* literal operator template and raw literal operator.
 
 int
-operator"" _abc(const char*)
+operator ""_abc(const char*)
   {
     return 42;
   }
 
 template<char...>
   int
-  operator"" _abc() // { dg-error "literal operator template|conflicts with raw literal operator" }
+  operator ""_abc() // { dg-error "literal operator template|conflicts with raw literal operator" }
   {
     return 13;
   }
 
 template<char...>
   int
-  operator"" _def()
+  operator ""_def()
   {
     return 12;
   }
 
 int
-operator"" _def(const char*) // { dg-error "raw literal operator|conflicts with literal operator template" }
+operator ""_def(const char*) // { dg-error "raw literal operator|conflicts with literal operator template" }
   {
     return 43;
   }
 
 int
-operator"" _ghi(long double)
+operator ""_ghi(long double)
   {
     return 42;
   }
 
 template<char...>
   int
-  operator"" _ghi() // OK
+  operator ""_ghi() // OK
   {
     return 13;
   }
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-overflow-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-overflow-neg.C
index d7e5e4b1f99..93ed5379243 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-overflow-neg.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-overflow-neg.C
@@ -2,11 +2,11 @@ 
 // { dg-options "-Woverflow" }
 // PR c++/52654
 int
-operator"" _w(unsigned long long)
+operator ""_w(unsigned long long)
 { return 0; }
 
 int
-operator"" _w(long double)
+operator ""_w(long double)
 { return 0.0L; }
 
 int i = 12345678901234567890123456789012345678901234567890_w;
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-overflow.C b/gcc/testsuite/g++.dg/cpp0x/udlit-overflow.C
index 1b9888b7159..be4dddbb632 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-overflow.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-overflow.C
@@ -2,12 +2,12 @@ 
 // PR c++/52654
 
 int
-operator"" _w(const char*)
+operator ""_w(const char*)
 { return 0; }
 
 template<char...>
   int
-  operator"" _tw()
+  operator ""_tw()
   { return 0; }
 
 int i = 12345678901234567890123456789012345678901234567890_w;
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-preproc-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-preproc-neg.C
index 64b6f8266bf..0ae90d9aaa1 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-preproc-neg.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-preproc-neg.C
@@ -1,7 +1,7 @@ 
 // { dg-do compile { target c++11 } }
 
 int
-operator"" _badpreproc(const char *str)
+operator ""_badpreproc(const char *str)
 { return 0; }
 
 #if 123_badpreproc  //  { dg-error "user-defined literal in preprocessor expression" }
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-raw-length.C b/gcc/testsuite/g++.dg/cpp0x/udlit-raw-length.C
index 8969c96d8c1..73548409580 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-raw-length.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-raw-length.C
@@ -16,7 +16,7 @@  cstrlen(const char* s)
 }
 
 constexpr size_type
-operator "" _lenraw(const char* digits)
+operator ""_lenraw(const char* digits)
 {
   return cstrlen(digits);
 }
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-raw-op-string-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-raw-op-string-neg.C
index be68333f509..76a0e556554 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-raw-op-string-neg.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-raw-op-string-neg.C
@@ -2,7 +2,7 @@ 
 
 //  Make sure handing a string to a raw literal generates a sensible error message.
 
-int operator"" _embedraw(const char*)
+int operator ""_embedraw(const char*)
 { return 41; }
 
 int k = "Boo!"_embedraw;  //  { dg-error "unable to find string literal operator" }
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-raw-op.C b/gcc/testsuite/g++.dg/cpp0x/udlit-raw-op.C
index 9f57ac56596..d49e42642c9 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-raw-op.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-raw-op.C
@@ -5,7 +5,7 @@ 
 #include <cstring>
 
 int
-operator"" _raw_umber(const char * str)
+operator ""_raw_umber(const char * str)
 {
   return strlen(str);
 }
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-raw-str.C b/gcc/testsuite/g++.dg/cpp0x/udlit-raw-str.C
index 1991de1150f..7e43a22345f 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-raw-str.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-raw-str.C
@@ -3,7 +3,7 @@ 
 
 #include <string>
 
-std::string operator"" _i18n(const char*, std::size_t);
+std::string operator ""_i18n(const char*, std::size_t);
 
 std::string vogon_poem = R"V0G0N(
                 O freddled gruntbuggly thy micturations are to me
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-resolve-char8_t.C b/gcc/testsuite/g++.dg/cpp0x/udlit-resolve-char8_t.C
index 5a264c24833..25d94c18845 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-resolve-char8_t.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-resolve-char8_t.C
@@ -4,21 +4,21 @@ 
 #include <cstdint>
 #include <cassert>
 
-int operator"" _foo(const char*)                  { return 0; }
-int operator"" _foo(unsigned long long int)       { return 1; }
-int operator"" _foo(long double)                  { return 2; }
-int operator"" _foo(char)                         { return 3; }
-int operator"" _foo(wchar_t)                      { return 4; }
-int operator"" _foo(char8_t)                      { return 5; }
-int operator"" _foo(char16_t)                     { return 6; }
-int operator"" _foo(char32_t)                     { return 7; }
-int operator"" _foo(const char*, std::size_t)     { return 8; }
-int operator"" _foo(const wchar_t*, std::size_t)  { return 9; }
-int operator"" _foo(const char8_t*, std::size_t)  { return 10; }
-int operator"" _foo(const char16_t*, std::size_t) { return 11; }
-int operator"" _foo(const char32_t*, std::size_t) { return 12; }
-template<char...> int operator"" _foo2()          { return 20; }
-int operator"" _foo2(unsigned long long int)      { return 21; }
+int operator ""_foo(const char*)                  { return 0; }
+int operator ""_foo(unsigned long long int)       { return 1; }
+int operator ""_foo(long double)                  { return 2; }
+int operator ""_foo(char)                         { return 3; }
+int operator ""_foo(wchar_t)                      { return 4; }
+int operator ""_foo(char8_t)                      { return 5; }
+int operator ""_foo(char16_t)                     { return 6; }
+int operator ""_foo(char32_t)                     { return 7; }
+int operator ""_foo(const char*, std::size_t)     { return 8; }
+int operator ""_foo(const wchar_t*, std::size_t)  { return 9; }
+int operator ""_foo(const char8_t*, std::size_t)  { return 10; }
+int operator ""_foo(const char16_t*, std::size_t) { return 11; }
+int operator ""_foo(const char32_t*, std::size_t) { return 12; }
+template<char...> int operator ""_foo2()          { return 20; }
+int operator ""_foo2(unsigned long long int)      { return 21; }
 
 int
 main()
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-resolve.C b/gcc/testsuite/g++.dg/cpp0x/udlit-resolve.C
index c311cfb8db7..5496d5b583c 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-resolve.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-resolve.C
@@ -4,19 +4,19 @@ 
 #include <cstdint>
 #include <cassert>
 
-int operator"" _foo(const char*)                  { return 0; }
-int operator"" _foo(unsigned long long int)       { return 1; }
-int operator"" _foo(long double)                  { return 2; }
-int operator"" _foo(char)                         { return 3; }
-int operator"" _foo(wchar_t)                      { return 4; }
-int operator"" _foo(char16_t)                     { return 5; }
-int operator"" _foo(char32_t)                     { return 6; }
-int operator"" _foo(const char*, std::size_t)     { return 7; }
-int operator"" _foo(const wchar_t*, std::size_t)  { return 8; }
-int operator"" _foo(const char16_t*, std::size_t) { return 9; }
-int operator"" _foo(const char32_t*, std::size_t) { return 10; }
-template<char...> int operator"" _foo2()          { return 20; }
-int operator"" _foo2(unsigned long long int)      { return 21; }
+int operator ""_foo(const char*)                  { return 0; }
+int operator ""_foo(unsigned long long int)       { return 1; }
+int operator ""_foo(long double)                  { return 2; }
+int operator ""_foo(char)                         { return 3; }
+int operator ""_foo(wchar_t)                      { return 4; }
+int operator ""_foo(char16_t)                     { return 5; }
+int operator ""_foo(char32_t)                     { return 6; }
+int operator ""_foo(const char*, std::size_t)     { return 7; }
+int operator ""_foo(const wchar_t*, std::size_t)  { return 8; }
+int operator ""_foo(const char16_t*, std::size_t) { return 9; }
+int operator ""_foo(const char32_t*, std::size_t) { return 10; }
+template<char...> int operator ""_foo2()          { return 20; }
+int operator ""_foo2(unsigned long long int)      { return 21; }
 
 int
 main()
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-shadow-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-shadow-neg.C
index a30ec0f4f7e..802d1224bed 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-shadow-neg.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-shadow-neg.C
@@ -2,43 +2,43 @@ 
 
 //  Test that the standard suffixes shadow any user-defined suffixes of the same name.
 long double
-operator"" L(long double x)  // { dg-warning "floating-point suffix|shadowed by implementation" }
+operator ""L(long double x)  // { dg-warning "floating-point suffix|shadowed by implementation" }
 { return x; }
 
 unsigned long long int
-operator"" ULL(unsigned long long int k)  // { dg-warning "integer suffix|shadowed by implementation" }
+operator ""ULL(unsigned long long int k)  // { dg-warning "integer suffix|shadowed by implementation" }
 { return k; }
 
 long double
-operator"" l(long double x)  // { dg-warning "floating-point suffix|shadowed by implementation" }
+operator ""l(long double x)  // { dg-warning "floating-point suffix|shadowed by implementation" }
 { return x; }
 
 unsigned long long int
-operator"" ull(unsigned long long int k)  // { dg-warning "integer suffix|shadowed by implementation" }
+operator ""ull(unsigned long long int k)  // { dg-warning "integer suffix|shadowed by implementation" }
 { return k; }
 
 unsigned long long int
-operator"" z(unsigned long long int k)  // { dg-warning "integer suffix|shadowed by implementation" }
+operator ""z(unsigned long long int k)  // { dg-warning "integer suffix|shadowed by implementation" }
 { return k; }
 
 unsigned long long int
-operator"" uz(unsigned long long int k)  // { dg-warning "integer suffix|shadowed by implementation" }
+operator ""uz(unsigned long long int k)  // { dg-warning "integer suffix|shadowed by implementation" }
 { return k; }
 
 unsigned long long int
-operator"" zu(unsigned long long int k)  // { dg-warning "integer suffix|shadowed by implementation" }
+operator ""zu(unsigned long long int k)  // { dg-warning "integer suffix|shadowed by implementation" }
 { return k; }
 
 unsigned long long int
-operator"" Z(unsigned long long int k)  // { dg-warning "integer suffix|shadowed by implementation" }
+operator ""Z(unsigned long long int k)  // { dg-warning "integer suffix|shadowed by implementation" }
 { return k; }
 
 unsigned long long int
-operator"" UZ(unsigned long long int k)  // { dg-warning "integer suffix|shadowed by implementation" }
+operator ""UZ(unsigned long long int k)  // { dg-warning "integer suffix|shadowed by implementation" }
 { return k; }
 
 unsigned long long int
-operator"" ZU(unsigned long long int k)  // { dg-warning "integer suffix|shadowed by implementation" }
+operator ""ZU(unsigned long long int k)  // { dg-warning "integer suffix|shadowed by implementation" }
 { return k; }
 
 //  Namespaces are no hiding place.
@@ -46,43 +46,43 @@  namespace Long
 {
 
 long double
-operator"" L(long double x)  // { dg-warning "integer suffix|shadowed by implementation" }
+operator ""L(long double x)  // { dg-warning "integer suffix|shadowed by implementation" }
 { return x; }
 
 unsigned long long int
-operator"" ULL(unsigned long long int k)  // { dg-warning "integer suffix|shadowed by implementation" }
+operator ""ULL(unsigned long long int k)  // { dg-warning "integer suffix|shadowed by implementation" }
 { return k; }
 
 long double
-operator"" l(long double x)  // { dg-warning "integer suffix|shadowed by implementation" }
+operator ""l(long double x)  // { dg-warning "integer suffix|shadowed by implementation" }
 { return x; }
 
 unsigned long long int
-operator"" ull(unsigned long long int k)  // { dg-warning "integer suffix|shadowed by implementation" }
+operator ""ull(unsigned long long int k)  // { dg-warning "integer suffix|shadowed by implementation" }
 { return k; }
 
 unsigned long long int
-operator"" z(unsigned long long int k)  // { dg-warning "integer suffix|shadowed by implementation" }
+operator ""z(unsigned long long int k)  // { dg-warning "integer suffix|shadowed by implementation" }
 { return k; }
 
 unsigned long long int
-operator"" uz(unsigned long long int k)  // { dg-warning "integer suffix|shadowed by implementation" }
+operator ""uz(unsigned long long int k)  // { dg-warning "integer suffix|shadowed by implementation" }
 { return k; }
 
 unsigned long long int
-operator"" zu(unsigned long long int k)  // { dg-warning "integer suffix|shadowed by implementation" }
+operator ""zu(unsigned long long int k)  // { dg-warning "integer suffix|shadowed by implementation" }
 { return k; }
 
 unsigned long long int
-operator"" Z(unsigned long long int k)  // { dg-warning "integer suffix|shadowed by implementation" }
+operator ""Z(unsigned long long int k)  // { dg-warning "integer suffix|shadowed by implementation" }
 { return k; }
 
 unsigned long long int
-operator"" UZ(unsigned long long int k)  // { dg-warning "integer suffix|shadowed by implementation" }
+operator ""UZ(unsigned long long int k)  // { dg-warning "integer suffix|shadowed by implementation" }
 { return k; }
 
 unsigned long long int
-operator"" ZU(unsigned long long int k)  // { dg-warning "integer suffix|shadowed by implementation" }
+operator ""ZU(unsigned long long int k)  // { dg-warning "integer suffix|shadowed by implementation" }
 { return k; }
 
 }
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-string-length.C b/gcc/testsuite/g++.dg/cpp0x/udlit-string-length.C
index c76b0af9a28..34e3d3f4021 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-string-length.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-string-length.C
@@ -4,33 +4,33 @@ 
 typedef decltype(sizeof(0)) size_type;
 
 constexpr size_type
-operator"" _len(const char*, size_type len)
+operator ""_len(const char*, size_type len)
 {
   return len;
 }
 
 #if __cpp_char8_t
 constexpr size_type
-operator"" _len(const char8_t*, size_type len)
+operator ""_len(const char8_t*, size_type len)
 {
   return len;
 }
 #endif
 
 constexpr size_type
-operator"" _len(const wchar_t*, size_type len)
+operator ""_len(const wchar_t*, size_type len)
 {
   return len;
 }
 
 constexpr size_type
-operator"" _len(const char16_t*, size_type len)
+operator ""_len(const char16_t*, size_type len)
 {
   return len;
 }
 
 constexpr size_type
-operator"" _len(const char32_t*, size_type len)
+operator ""_len(const char32_t*, size_type len)
 {
   return len;
 }
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-suffix-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-suffix-neg.C
index 8f3cc87825a..f6b74fe45ea 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-suffix-neg.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-suffix-neg.C
@@ -3,4 +3,4 @@ 
 
 #include <string>
 
-std::string operator"" 5X(const char*, std::size_t);	// { dg-error "expected suffix identifier" }
+std::string operator ""5X(const char*, std::size_t);	// { dg-error "expected suffix identifier" }
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-template.C b/gcc/testsuite/g++.dg/cpp0x/udlit-template.C
index b5306b9962f..b740ca7c1e2 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-template.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-template.C
@@ -7,32 +7,32 @@ 
 #include <cassert>
 
 template<char...>
-  int operator"" _abc();
+  int operator ""_abc();
 
 template<>
   int
-  operator"" _abc<>()
+  operator ""_abc<>()
   { return -1; }
 
 template<>
   int
-  operator"" _abc<'L','U','E'>()
+  operator ""_abc<'L','U','E'>()
   { return 42; }
 
 template<>
   int
-  operator"" _abc<'6','6','6'>()
+  operator ""_abc<'6','6','6'>()
   { return 21; }
 
 void
 test1()
 {
-  int i = operator"" _abc<'1','2','3'>();
+  int i = operator ""_abc<'1','2','3'>();
   assert(i == 45);
-  int universal_meaning = operator"" _abc<'L','U','E'>();
+  int universal_meaning = operator ""_abc<'L','U','E'>();
   assert(universal_meaning == 42);
-  int b = operator"" _abc<'6','6','6'>();
-  int z = operator"" _abc<>();
+  int b = operator ""_abc<'6','6','6'>();
+  int z = operator ""_abc<>();
   assert(z == -1);
   int j = 123_abc;
   assert(j == i);
@@ -47,5 +47,5 @@  main()
 }
 
 template<char... Chars>
-  int operator"" _abc()
+  int operator ""_abc()
   { return 42 + sizeof...(Chars); }
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg-neg.C
index 678a53e3f4f..fa6ec4889ef 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg-neg.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg-neg.C
@@ -1,4 +1,4 @@ 
 // { dg-do compile { target c++11 } }
 
 template<char...>
-  int operator"" _xyz(unsigned long long);	// { dg-error "has invalid argument list" }
+  int operator ""_xyz(unsigned long long);	// { dg-error "has invalid argument list" }
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg-neg2.C b/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg-neg2.C
index f2db95d3ead..2aae8a1667b 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg-neg2.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg-neg2.C
@@ -2,6 +2,6 @@ 
 // { dg-do compile { target c++11 } }
 
 template <T, T... U>		// { dg-error "'T' has not been declared" }
-int operator"" _foo ();		// { dg-error "5:literal operator template .int operator\"\"_foo\\(\\). has invalid parameter list" }
+int operator ""_foo ();		// { dg-error "5:literal operator template .int operator\"\"_foo\\(\\). has invalid parameter list" }
 template <T... U>		// { dg-error "'T' has not been declared" }
-int operator"" _bar ();		// { dg-error "5:literal operator template .int operator\"\"_bar\\(\\). has invalid parameter list" }
+int operator ""_bar ();		// { dg-error "5:literal operator template .int operator\"\"_bar\\(\\). has invalid parameter list" }
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg.C
index cec79a5ffb4..04752d4a96c 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-arg.C
@@ -1,4 +1,4 @@ 
 // { dg-do compile { target c++11 } }
 
 template<char...>
-  int operator"" _abc();
+  int operator ""_abc();
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-parms-neg.C b/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-parms-neg.C
index 167d871a005..33486fa7d60 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-parms-neg.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-parms-neg.C
@@ -3,10 +3,10 @@ 
 class Foo { };
 
 template<wchar_t...>
-  Foo operator"" _Foo(); // { dg-error "7:literal operator template .Foo operator\"\"_Foo\\(\\). has invalid parameter list" }
+  Foo operator ""_Foo(); // { dg-error "7:literal operator template .Foo operator\"\"_Foo\\(\\). has invalid parameter list" }
 
 template<char>
-  Foo operator"" _Bar(); // { dg-error "7:literal operator template .Foo operator\"\"_Bar\\(\\). has invalid parameter list" }
+  Foo operator ""_Bar(); // { dg-error "7:literal operator template .Foo operator\"\"_Bar\\(\\). has invalid parameter list" }
 
 template<typename... Type>
-  Foo operator"" _Bar(); // { dg-error "7:literal operator template .Foo operator\"\"_Bar\\(\\). has invalid parameter list" }
+  Foo operator ""_Bar(); // { dg-error "7:literal operator template .Foo operator\"\"_Bar\\(\\). has invalid parameter list" }
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-parms.C b/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-parms.C
index bc7eaf66fb9..c0b9a23f300 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-parms.C
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit-tmpl-parms.C
@@ -3,4 +3,4 @@ 
 class Foo { };
 
 template<char...>
-  Foo operator"" _Foo();
+  Foo operator ""_Foo();
diff --git a/gcc/testsuite/g++.dg/cpp1y/pr57640.C b/gcc/testsuite/g++.dg/cpp1y/pr57640.C
index 6a79ea239d6..f6400408047 100644
--- a/gcc/testsuite/g++.dg/cpp1y/pr57640.C
+++ b/gcc/testsuite/g++.dg/cpp1y/pr57640.C
@@ -5,4 +5,4 @@ 
 
 using namespace std::literals::chrono_literals;
 
-auto blooper = operator"" min(45.0L);
+auto blooper = operator ""min(45.0L);
diff --git a/gcc/testsuite/g++.dg/cpp1y/pr88872.C b/gcc/testsuite/g++.dg/cpp1y/pr88872.C
index 3719e395c0e..be856098418 100644
--- a/gcc/testsuite/g++.dg/cpp1y/pr88872.C
+++ b/gcc/testsuite/g++.dg/cpp1y/pr88872.C
@@ -6,7 +6,7 @@  struct a {
   int c;
 };
 void d();
-template <char...> constexpr a operator"" _n() { return d; }
+template <char...> constexpr a operator ""_n() { return d; }
 struct e;
 struct f {
   e operator[](int);
diff --git a/gcc/testsuite/g++.dg/cpp26/unevalstr1.C b/gcc/testsuite/g++.dg/cpp26/unevalstr1.C
index 3220cf04937..5317d696de8 100644
--- a/gcc/testsuite/g++.dg/cpp26/unevalstr1.C
+++ b/gcc/testsuite/g++.dg/cpp26/unevalstr1.C
@@ -83,21 +83,21 @@  extern "\o{0103}" { int f14 (); }	// { dg-error "numeric escape sequence in unev
 [[nodiscard ("\x{20}")]] int h19 ();	// { dg-error "numeric escape sequence in unevaluated string" }
 [[nodiscard ("\h")]] int h20 ();	// { dg-error "unknown escape sequence" }
 
-float operator "" _my0 (const char *);
-float operator "" "" _my1 (const char *);
-float operator L"" _my2 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator u"" _my3 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator U"" _my4 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator u8"" _my5 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator L"" "" _my6 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator u"" "" _my7 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator U"" "" _my8 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator u8"" "" _my9 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator "" L"" _my10 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator "" u"" _my11 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator "" U"" _my12 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator "" u8"" _my13 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
-float operator "\0" _my14 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
-float operator "\x00" _my15 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
-float operator "\h" _my16 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
+float operator ""_my0 (const char *);
+float operator "" ""_my1 (const char *);
+float operator L""_my2 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator u""_my3 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator U""_my4 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator u8""_my5 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator L"" ""_my6 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator u"" ""_my7 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator U"" ""_my8 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator u8"" ""_my9 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator "" L""_my10 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator "" u""_my11 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator "" U""_my12 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator "" u8""_my13 (const char *);	// { dg-error "invalid encoding prefix in literal operator" }
+float operator "\0"_my14 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
+float operator "\x00"_my15 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
+float operator "\h"_my16 (const char *);	// { dg-error "expected empty string after 'operator' keyword" }
 						// { dg-error "unknown escape sequence" "" { target *-*-* } .-1 }
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-pr60391.C b/gcc/testsuite/g++.dg/cpp2a/concepts-pr60391.C
index 5c5ca2c2381..0926d41d12e 100644
--- a/gcc/testsuite/g++.dg/cpp2a/concepts-pr60391.C
+++ b/gcc/testsuite/g++.dg/cpp2a/concepts-pr60391.C
@@ -3,7 +3,7 @@ 
 
 namespace N
 {
-  int operator"" _X(auto) {} // { dg-error "auto|invalid" }
+  int operator ""_X(auto) {} // { dg-error "auto|invalid" }
 }
 
 namespace N {}
diff --git a/gcc/testsuite/g++.dg/cpp2a/consteval-prop21.C b/gcc/testsuite/g++.dg/cpp2a/consteval-prop21.C
index 36da1bd91f3..b081e3688a2 100644
--- a/gcc/testsuite/g++.dg/cpp2a/consteval-prop21.C
+++ b/gcc/testsuite/g++.dg/cpp2a/consteval-prop21.C
@@ -11,7 +11,7 @@  __uint128_t
 #else
 unsigned long long
 #endif
-operator"" _c(const char*) { return 0; }
+operator ""_c(const char*) { return 0; }
 constexpr char e() {
   long f = true ? 0 : b(long(1));
   return b(f);
diff --git a/gcc/testsuite/g++.dg/cpp2a/nontype-class6.C b/gcc/testsuite/g++.dg/cpp2a/nontype-class6.C
index 377a151d343..af632be0055 100644
--- a/gcc/testsuite/g++.dg/cpp2a/nontype-class6.C
+++ b/gcc/testsuite/g++.dg/cpp2a/nontype-class6.C
@@ -11,7 +11,7 @@  struct A {
   // auto operator<=> (const A&) = default;
 };
 
-template <A a> constexpr A operator "" _sh() { return a; }
+template <A a> constexpr A operator ""_sh() { return a; }
 
 constexpr auto a = "foo"_sh;
 static_assert (a.ar[0] == 'f');
diff --git a/gcc/testsuite/g++.dg/cpp2a/udlit-class-nttp-ctad-neg.C b/gcc/testsuite/g++.dg/cpp2a/udlit-class-nttp-ctad-neg.C
index b91e01ce0b3..6066255aaf8 100644
--- a/gcc/testsuite/g++.dg/cpp2a/udlit-class-nttp-ctad-neg.C
+++ b/gcc/testsuite/g++.dg/cpp2a/udlit-class-nttp-ctad-neg.C
@@ -16,7 +16,7 @@  struct fixed_string {
 // Missing deduction guide.
 
 template <fixed_string fs>
-constexpr std::size_t operator"" _udl() {
+constexpr std::size_t operator ""_udl() {
   return decltype(fs)::length;
 }
 
diff --git a/gcc/testsuite/g++.dg/cpp2a/udlit-class-nttp-ctad-neg2.C b/gcc/testsuite/g++.dg/cpp2a/udlit-class-nttp-ctad-neg2.C
index 067fdbac81e..8c36d700d93 100644
--- a/gcc/testsuite/g++.dg/cpp2a/udlit-class-nttp-ctad-neg2.C
+++ b/gcc/testsuite/g++.dg/cpp2a/udlit-class-nttp-ctad-neg2.C
@@ -17,4 +17,4 @@  template <typename CharT, std::size_t N>
 fixed_string(const CharT (&str)[N]) -> fixed_string<CharT, N>;
 
 template <fixed_string...>
-int operator"" _udl();     // { dg-error "5:literal operator template .int operator\"\"_udl\\(\\). has invalid parameter list" }
+int operator ""_udl();     // { dg-error "5:literal operator template .int operator\"\"_udl\\(\\). has invalid parameter list" }
diff --git a/gcc/testsuite/g++.dg/cpp2a/udlit-class-nttp-ctad.C b/gcc/testsuite/g++.dg/cpp2a/udlit-class-nttp-ctad.C
index e9421bc4072..cea52ba7bae 100644
--- a/gcc/testsuite/g++.dg/cpp2a/udlit-class-nttp-ctad.C
+++ b/gcc/testsuite/g++.dg/cpp2a/udlit-class-nttp-ctad.C
@@ -17,7 +17,7 @@  template <typename CharT, std::size_t N>
 fixed_string(const CharT (&str)[N]) -> fixed_string<CharT, N>;
 
 template <fixed_string fs>
-constexpr std::size_t operator"" _udl() {
+constexpr std::size_t operator ""_udl() {
   return decltype(fs)::length;
 }
 
diff --git a/gcc/testsuite/g++.dg/cpp2a/udlit-class-nttp-neg.C b/gcc/testsuite/g++.dg/cpp2a/udlit-class-nttp-neg.C
index 85b3fe7fc61..d45527a211d 100644
--- a/gcc/testsuite/g++.dg/cpp2a/udlit-class-nttp-neg.C
+++ b/gcc/testsuite/g++.dg/cpp2a/udlit-class-nttp-neg.C
@@ -9,4 +9,4 @@  struct literal_class {
 };
 
 template <literal_class...>
-int operator"" _udl();      // { dg-error "5:literal operator template .int operator\"\"_udl\\(\\). has invalid parameter list" }
+int operator ""_udl();      // { dg-error "5:literal operator template .int operator\"\"_udl\\(\\). has invalid parameter list" }
diff --git a/gcc/testsuite/g++.dg/cpp2a/udlit-class-nttp-neg2.C b/gcc/testsuite/g++.dg/cpp2a/udlit-class-nttp-neg2.C
index ab7c012f5f4..872829fcbd8 100644
--- a/gcc/testsuite/g++.dg/cpp2a/udlit-class-nttp-neg2.C
+++ b/gcc/testsuite/g++.dg/cpp2a/udlit-class-nttp-neg2.C
@@ -10,4 +10,4 @@  struct non_literal_class {
 };
 
 template <non_literal_class> // { dg-error "11:is not a valid type for a template non-type parameter because it is not structural" "" { target { ! implicit_constexpr } } }
-int operator"" _udl();       // { dg-error "5:literal operator template .int operator\"\"_udl\\(\\). has invalid parameter list" "" { target { ! implicit_constexpr } } }
+int operator ""_udl();       // { dg-error "5:literal operator template .int operator\"\"_udl\\(\\). has invalid parameter list" "" { target { ! implicit_constexpr } } }
diff --git a/gcc/testsuite/g++.dg/cpp2a/udlit-class-nttp.C b/gcc/testsuite/g++.dg/cpp2a/udlit-class-nttp.C
index b7ef79d68a0..b753d7dcc09 100644
--- a/gcc/testsuite/g++.dg/cpp2a/udlit-class-nttp.C
+++ b/gcc/testsuite/g++.dg/cpp2a/udlit-class-nttp.C
@@ -9,7 +9,7 @@  struct literal_class {
 };
 
 template <literal_class>
-constexpr int operator"" _udl() {
+constexpr int operator ""_udl() {
   return 1;
 }
 
diff --git a/gcc/testsuite/g++.dg/ext/is_convertible2.C b/gcc/testsuite/g++.dg/ext/is_convertible2.C
index 3dd90bdafb9..1e8425571f0 100644
--- a/gcc/testsuite/g++.dg/ext/is_convertible2.C
+++ b/gcc/testsuite/g++.dg/ext/is_convertible2.C
@@ -23,7 +23,7 @@  int main()
     SA(!__is_convertible(B*, C*));
     SA(__is_convertible(A, E));
 
-    using std::operator "" s, std::operator "" sv;
+    using std::operator ""s, std::operator ""sv;
 
     auto stringify = []<typename T>(T x) {
         if constexpr (std::is_convertible_v<T, std::string> or
diff --git a/gcc/testsuite/g++.dg/lookup/pr87269.C b/gcc/testsuite/g++.dg/lookup/pr87269.C
index 0c87ee5aef5..253bad1a14b 100644
--- a/gcc/testsuite/g++.dg/lookup/pr87269.C
+++ b/gcc/testsuite/g++.dg/lookup/pr87269.C
@@ -6,10 +6,10 @@  namespace std {
 }
 
 namespace {
-  void  operator"" _a (const char *, std::size_t) {}
+  void  operator ""_a (const char *, std::size_t) {}
 }
 
-void operator"" _a (unsigned long long);
+void operator ""_a (unsigned long long);
 
 template <typename> void f () { ""_a; }
 
diff --git a/gcc/c-family/c.opt.urls b/gcc/c-family/c.opt.urls
index 4cd9a75b950..b77575bc896 100644
--- a/gcc/c-family/c.opt.urls
+++ b/gcc/c-family/c.opt.urls
@@ -301,6 +301,9 @@  UrlSuffix(gcc/C_002b_002b-Dialect-Options.html#index-Wdeprecated-enum-enum-conve
 Wdeprecated-enum-float-conversion
 UrlSuffix(gcc/C_002b_002b-Dialect-Options.html#index-Wdeprecated-enum-float-conversion)
 
+Wdeprecated-literal-operator
+UrlSuffix(gcc/C_002b_002b-Dialect-Options.html#index-Wdeprecated-literal-operator)
+
 Wdesignated-init
 UrlSuffix(gcc/Warning-Options.html#index-Wdesignated-init)
 
diff --git a/gcc/testsuite/g++.dg/cpp0x/udlit_system_header b/gcc/testsuite/g++.dg/cpp0x/udlit_system_header
index d541f24f62a..7bb54df8f89 100644
--- a/gcc/testsuite/g++.dg/cpp0x/udlit_system_header
+++ b/gcc/testsuite/g++.dg/cpp0x/udlit_system_header
@@ -2,5 +2,5 @@ 
 #pragma GCC system_header
 
 char
-operator"" stdsuffix(char __c)
+operator ""stdsuffix(char __c)
 { return __c/2; }