On Thu, Mar 19, 2026 at 9:14 AM Jakub Jelinek <[email protected]> wrote:
> On Wed, Mar 18, 2026 at 05:11:50PM +0100, Jakub Jelinek wrote:
> > Here is a new version of the plugin which also walks friends of classes
> > and has the whitelist for submdspan_mapping removed.
> > As before, the plugin tries to some extent not to diagnose stuff multiple
> > times, but doesn't 100% succeed in that, and I think it isn't a big deal.
> >
> > Also, because of the uglification.C tests which are expected to print
> > some of the messages, in order to find the best
> > summary of what failed if it FAILs (currently it doesn't) is:
> > grep note:.non-uglified.name testsuite/g++/g++.log | grep -v universe.h
> | sort -u | dos2unix | sed 's/^.*libstdc/libstdc/'
> > grep note:.badname testsuite/g++/g++.log | grep -v universe.h | sort -u
> | dos2unix | sed 's/^.*libstdc/libstdc/'
> > where the grep -v universe.h part is there because of the uglification.C
> > test.
>
> Unfortunately testing this on i686-linux (x86_64-linux worked fine)
> revealed
> one further problem.
>
> libstdc++-v3/include/bits/random.h:446:7: note: non-uglified name 'retval'
> where lines 445-446 are
> friend std::strong_ordering
> operator<=>(const type&, const type&) = default;
> There is no retval name in the source, but build_comparison_op
> introduces it artificially (and the decl is not DECL_ARTIFICIAL itself):
> tree var = create_temporary_var (rettype);
> DECL_NAME (var) = get_identifier ("retval");
> pushdecl (var);
> The following version of the patch fixes that by not walking bodies of
> DECL_DEFAULTED_FN functions.
>
Why not change the generation function body, to use a identifier reserved
for implementation instead? I think here we are not affected by any retval
macros defined by users, but it still seems better to use a reserved name
for them.
implementation generate variables.
>
> Tested on x86_64-linux and i686-linux, ok for trunk?
>
> 2026-03-19 Jakub Jelinek <[email protected]>
>
> * g++.dg/plugin/plugin.exp (plugin_test_list): Add uglification
> tests.
> * g++.dg/plugin/uglification_plugin.cc: New file.
> * g++.dg/plugin/uglification.C: New test.
> * g++.dg/plugin/uglification-c++98.C: New test.
> * g++.dg/plugin/uglification-c++11.C: New test.
> * g++.dg/plugin/uglification-c++14.C: New test.
> * g++.dg/plugin/uglification-c++17.C: New test.
> * g++.dg/plugin/uglification-c++20.C: New test.
> * g++.dg/plugin/uglification-c++23.C: New test.
> * g++.dg/plugin/uglification-c++26.C: New test.
>
> --- gcc/testsuite/g++.dg/plugin/plugin.exp.jj 2026-03-18
> 15:40:15.646008934 +0100
> +++ gcc/testsuite/g++.dg/plugin/plugin.exp 2026-03-18
> 16:48:34.395284889 +0100
> @@ -78,6 +78,15 @@ set plugin_test_list [list \
> show-template-tree-color-no-highlight-colors.C \
> show-template-tree-color-labels.C \
> show-template-tree-color-no-elide-type.C } \
> + { uglification_plugin.cc \
> + uglification.C \
> + uglification-c++98.C \
> + uglification-c++11.C \
> + uglification-c++14.C \
> + uglification-c++17.C \
> + uglification-c++20.C \
> + uglification-c++23.C \
> + uglification-c++26.C } \
> { comment_plugin.cc comments-1.C } \
> ]
>
> --- gcc/testsuite/g++.dg/plugin/uglification_plugin.cc.jj 2026-03-19
> 00:04:41.927231734 +0100
> +++ gcc/testsuite/g++.dg/plugin/uglification_plugin.cc 2026-03-19
> 09:00:06.741433015 +0100
> @@ -0,0 +1,353 @@
> +#include "gcc-plugin.h"
> +#include <stdlib.h>
> +#include "config.h"
> +#include "system.h"
> +#include "coretypes.h"
> +#include "tree.h"
> +#include "intl.h"
> +#include "cp/cp-tree.h"
> +#include "cp/name-lookup.h"
> +#include "diagnostic.h"
> +#include "stringpool.h"
> +
> +int plugin_is_GPL_compatible;
> +
> +void plugin_walk_ns (tree);
> +
> +const char *badnames[] = {
> + /* See libstdc++-v3/testsuite/17_intro/{,bad}names.cc. */
> + "_A", "_B", "_C", "_G", "_L", "_N", "_P", "_S", "_T", "_U", "_X",
> + "__deref", "__used", "__unused", "__inline", "_Complex",
> + "__istype", "__maskrune", "__tolower", "__toupper", "__wchar_t",
> + "__wint_t", "_res", "_res_ext", "_C2", "__lockable", "__null_sentinel",
> + "__packed", "__weak", "__strong", "_In_", "_Inout_", "_Out_",
> + "_Reserved_", "__inout", "__in_opt", "__out_opt"
> +};
> +
> +vec<tree> nonugly_names;
> +hash_set<tree> whitelist;
> +bool impl_ns;
> +
> +void
> +plugin_check_decl (tree decl)
> +{
> + if (decl == NULL_TREE)
> + return;
> +
> + if (VAR_OR_FUNCTION_DECL_P (decl)
> + && DECL_EXTERNAL (decl)
> + && DECL_CONTEXT (decl)
> + && TREE_CODE (DECL_CONTEXT (decl)) == FUNCTION_DECL)
> + return;
> +
> + tree name = DECL_NAME (decl);
> + if (name == NULL_TREE
> + || IDENTIFIER_ANON_P (name)
> + || name == this_identifier
> + || IDENTIFIER_ANY_OP_P (name))
> + return;
> +
> + const char *cname = IDENTIFIER_POINTER (name);
> + if (memcmp (cname, "auto:", 5) == 0)
> + return;
> +
> + if (cname[0] != '_'
> + || (cname[1] != '_'
> + && !ISUPPER (cname[1])
> + && cname[1]))
> + {
> + nonugly_names.safe_push (decl);
> + return;
> + }
> +
> + bool badname = false;
> + for (int i = 0; i < ARRAY_SIZE (badnames); ++i)
> + if (strcmp (badnames[i], cname) == 0)
> + {
> + badname = true;
> + break;
> + }
> + if (!badname && cname[1] == 'E' && ISDIGIT (cname[2]))
> + {
> + if (cname[2] != '0'
> + && (!cname[3] || ((cname[2] == '1' || cname[2] == '2')
> + && ISDIGIT (cname[3])
> + && !cname[4])))
> + badname = true;
> + }
> + else if (memcmp (cname + 1, "_tg_", 4) == 0)
> + badname = true;
> + if (badname)
> + inform (DECL_SOURCE_LOCATION (decl), "badname %qs", cname);
> +}
> +
> +tree
> +plugin_check_tree (tree *tp, int */*walk_subtrees*/, void */*data*/)
> +{
> + if (TREE_CODE (*tp) == BIND_EXPR)
> + for (tree var = BIND_EXPR_VARS (*tp); var; var = DECL_CHAIN (var))
> + plugin_check_decl (var);
> + if (TREE_CODE (*tp) == DECL_EXPR)
> + plugin_check_decl (DECL_EXPR_DECL (*tp));
> + return NULL_TREE;
> +}
> +
> +void
> +plugin_check_fn (tree decl)
> +{
> + for (tree arg = DECL_ARGUMENTS (decl); arg; arg = DECL_CHAIN (arg))
> + plugin_check_decl (arg);
> +
> + if (DECL_DEFAULTED_FN (decl))
> + return;
> + cp_walk_tree_without_duplicates (&DECL_SAVED_TREE (decl),
> plugin_check_tree,
> + NULL);
> +}
> +
> +bool
> +plugin_header_check (tree decl)
> +{
> + expanded_location eloc = expand_location (DECL_SOURCE_LOCATION (decl));
> + if (eloc.file == NULL)
> + return false;
> + if (strstr (eloc.file, "/libstdc++-v3/include/") == NULL
> + && strstr (eloc.file, "/libstdc++-v3/libsupc++/") == NULL)
> + return false;
> + return true;
> +}
> +
> +void
> +plugin_walk_decl (tree decl)
> +{
> + if (TREE_CODE (decl) == NAMESPACE_DECL)
> + {
> + if (impl_ns
> + || (DECL_NAME (decl)
> + && IDENTIFIER_POINTER (DECL_NAME (decl))[0] != '_'
> + && !IDENTIFIER_ANON_P (DECL_NAME (decl)))
> + || DECL_NAMESPACE_INLINE_P (decl))
> + plugin_walk_ns (decl);
> + else
> + {
> + impl_ns = true;
> + plugin_walk_ns (decl);
> + impl_ns = false;
> + }
> + return;
> + }
> +
> + if (!plugin_header_check (decl))
> + return;
> +
> + if (!impl_ns
> + && DECL_NAME (decl)
> + && !IDENTIFIER_ANON_P (DECL_NAME (decl))
> + && !IDENTIFIER_ANY_OP_P (DECL_NAME (decl))
> + && IDENTIFIER_POINTER (DECL_NAME (decl))[0] != '_')
> + whitelist.add (DECL_NAME (decl));
> + else if (impl_ns && DECL_NAME (decl))
> + plugin_check_decl (decl);
> +
> + if (TREE_CODE (decl) == TEMPLATE_DECL)
> + {
> + tree parms = DECL_INNERMOST_TEMPLATE_PARMS (decl);
> + for (tree node : tree_vec_range (parms))
> + plugin_check_decl (TREE_VALUE (node));
> + }
> +
> + if (DECL_FUNCTION_TEMPLATE_P (decl))
> + plugin_check_fn (DECL_TEMPLATE_RESULT (decl));
> + else if (TREE_CODE (decl) == FUNCTION_DECL
> + && DECL_LANG_SPECIFIC (decl)
> + && DECL_TEMPLATE_INFO (decl))
> + plugin_check_fn (decl);
> +
> + if (DECL_CLASS_TEMPLATE_P (decl))
> + decl = DECL_TEMPLATE_RESULT (decl);
> + if (TREE_CODE (decl) == TYPE_DECL
> + && DECL_IMPLICIT_TYPEDEF_P (decl))
> + {
> + bool save_impl_ns = impl_ns;
> + if (impl_ns
> + && DECL_NAME (decl)
> + && id_equal (DECL_NAME (decl), "_Promise_erased")
> + && DECL_CONTEXT (decl)
> + && TREE_CODE (DECL_CONTEXT (decl)) == NAMESPACE_DECL
> + && DECL_NAME (DECL_CONTEXT (decl))
> + && id_equal (DECL_NAME (DECL_CONTEXT (decl)), "__gen"))
> + /* Workaround: std::generator<R, V, A>::promise_type in
> + the standard is actually defined as std::__gen::_Promise_erased,
> + but we want to whitelist its members. Temporarily clear
> + impl_ns in that class. */
> + impl_ns = false;
> + if (RECORD_OR_UNION_TYPE_P (TREE_TYPE (decl)))
> + {
> + for (tree fld = TYPE_FIELDS (TREE_TYPE (decl));
> + fld; fld = DECL_CHAIN (fld))
> + plugin_walk_decl (fld);
> + for (tree f = DECL_FRIENDLIST (decl); f; f = TREE_CHAIN (f))
> + for (tree l = FRIEND_DECLS (f); l; l = TREE_CHAIN (l))
> + plugin_walk_decl (TREE_VALUE (l));
> + }
> + else if (TREE_CODE (TREE_TYPE (decl)) == ENUMERAL_TYPE)
> + for (tree en = TYPE_VALUES (TREE_TYPE (decl));
> + en; en = TREE_CHAIN (en))
> + plugin_walk_decl (TREE_VALUE (en));
> + impl_ns = save_impl_ns;
> + }
> +}
> +
> +void
> +plugin_walk_binding (tree binding)
> +{
> + tree value = NULL_TREE;
> +
> + if (STAT_HACK_P (binding))
> + {
> + if (!STAT_TYPE_HIDDEN_P (binding)
> + && STAT_TYPE (binding))
> + return plugin_walk_decl (STAT_TYPE (binding));
> + else if (!STAT_DECL_HIDDEN_P (binding))
> + value = STAT_DECL (binding);
> + }
> + else
> + value = binding;
> +
> + value = ovl_skip_hidden (value);
> + if (value)
> + {
> + value = OVL_FIRST (value);
> + return plugin_walk_decl (value);
> + }
> +}
> +
> +void
> +plugin_walk_ns (tree ns)
> +{
> + using itert = hash_table<named_decl_hash>::iterator;
> + itert end (DECL_NAMESPACE_BINDINGS (ns)->end ());
> + for (itert iter (DECL_NAMESPACE_BINDINGS (ns)->begin ());
> + iter != end; ++iter)
> + {
> + tree b = *iter;
> + gcc_assert (TREE_CODE (b) != BINDING_VECTOR);
> + plugin_walk_binding (b);
> + }
> +}
> +
> +int
> +plugin_ctx_check (tree decl)
> +{
> + int ret = 1;
> + tree ctx = DECL_CONTEXT (decl);
> + while (ctx)
> + {
> + if (ctx == std_node)
> + return ret;
> + if (TREE_CODE (ctx) == NAMESPACE_DECL
> + && DECL_NAME (ctx)
> + && id_equal (DECL_NAME (ctx), "__gnu_cxx")
> + && CP_DECL_CONTEXT (ctx) == global_namespace)
> + return 2;
> + if (TREE_CODE (ctx) == NAMESPACE_DECL
> + && (!DECL_NAME (ctx)
> + || IDENTIFIER_POINTER (DECL_NAME (ctx))[0] == '_'
> + || IDENTIFIER_ANON_P (DECL_NAME (ctx)))
> + && !DECL_NAMESPACE_INLINE_P (ctx))
> + ret = 2;
> + if (TYPE_P (ctx))
> + ctx = TYPE_CONTEXT (ctx);
> + else
> + ctx = DECL_CONTEXT (ctx);
> + }
> + return 0;
> +}
> +
> +void
> +plugin_finish_parse_function (void *event_data, void *)
> +{
> + tree decl = (tree) event_data;
> + if (!plugin_header_check (decl))
> + return;
> +
> + /* Only diagnose stuff nested in ::std or ::__gnu_cxx
> + namespaces. */
> + if (!plugin_ctx_check (decl))
> + return;
> +
> + /* Templates are handled from plugin_walk_ns. */
> + if (DECL_LANG_SPECIFIC (decl) && DECL_TEMPLATE_INFO (decl))
> + return;
> + plugin_check_fn (decl);
> +}
> +
> +void
> +plugin_walk_specialization (bool, spec_entry *entry, void *)
> +{
> + tree info;
> + if (TYPE_P (entry->spec))
> + info = TYPE_TEMPLATE_INFO (entry->spec);
> + else
> + info = DECL_TEMPLATE_INFO (entry->spec);
> + if (PRIMARY_TEMPLATE_P (TI_TEMPLATE (info)) && TI_PARTIAL_INFO (info))
> + info = TI_PARTIAL_INFO (info);
> + tree decl = TI_TEMPLATE (info);
> + if (int c = plugin_ctx_check (decl))
> + {
> + impl_ns = c == 2;
> + plugin_walk_decl (decl);
> + }
> +}
> +
> +void
> +plugin_finish_unit (void *, void *)
> +{
> + plugin_walk_ns (std_node);
> + tree gnucxx_ns = lookup_qualified_name (global_namespace, "__gnu_cxx");
> + if (gnucxx_ns && TREE_CODE (gnucxx_ns) == NAMESPACE_DECL)
> + plugin_walk_ns (gnucxx_ns);
> + walk_specializations (false, plugin_walk_specialization, NULL);
> + walk_specializations (true, plugin_walk_specialization, NULL);
> + unsigned int i;
> + tree decl;
> + FOR_EACH_VEC_ELT (nonugly_names, i, decl)
> + if (!whitelist.contains (DECL_NAME (decl)))
> + inform (DECL_SOURCE_LOCATION (decl), "non-uglified name %qs",
> + IDENTIFIER_POINTER (DECL_NAME (decl)));
> + else
> + inform (DECL_SOURCE_LOCATION (decl), "non-uglified whitelisted name
> %qs",
> + IDENTIFIER_POINTER (DECL_NAME (decl)));
> +}
> +
> +void
> +plugin_ggc_walker (void *)
> +{
> + unsigned int i;
> + tree decl;
> + FOR_EACH_VEC_ELT (nonugly_names, i, decl)
> + gt_ggc_m_9tree_node (decl);
> + for (hash_set<tree>::iterator it = whitelist.begin ();
> + it != whitelist.end (); ++it)
> + gt_ggc_m_9tree_node (*it);
> +}
> +
> +static const struct ggc_root_tab xtratab[] = {
> + { (void *) &xtratab, 1, 1, plugin_ggc_walker, NULL },
> + LAST_GGC_ROOT_TAB
> +};
> +
> +int
> +plugin_init (struct plugin_name_args *plugin_info,
> + struct plugin_gcc_version *version)
> +{
> + const char *plugin_name = plugin_info->base_name;
> +
> + register_callback (plugin_name, PLUGIN_FINISH_UNIT,
> + plugin_finish_unit, NULL);
> + register_callback (plugin_name, PLUGIN_FINISH_PARSE_FUNCTION,
> + plugin_finish_parse_function, NULL);
> + register_callback (plugin_name, PLUGIN_REGISTER_GGC_ROOTS,
> + NULL, (void *) xtratab);
> +
> + return 0;
> +}
> --- gcc/testsuite/g++.dg/plugin/uglification.C.jj 2026-03-18
> 16:48:34.395594980 +0100
> +++ gcc/testsuite/g++.dg/plugin/uglification.C 2026-03-18
> 16:59:12.929288908 +0100
> @@ -0,0 +1,151 @@
> +// Test that uglification_plugin.cc works properly.
> +// { dg-options "-O0 -std=c++20" }
> +
> +// Pretend this is in a libstdc++-v3 header.
> +#line 6 "gcc/libstdc++-v3/include/bits/universe.h"
> +
> +// Stuff outside of namespace std not reported.
> +int
> +foo (int a, int b) // { dg-bogus "note: non-uglified
> name '\[ab]'" }
> +{
> + int c = a + b; // { dg-bogus "note: non-uglified
> name 'c'" }
> + return c;
> +}
> +
> +namespace std {
> + struct foo {
> + int bar (int d, int __e) { // { dg-message "note:
> non-uglified name 'd'" }
> + int f = d + __e; // { dg-message "note:
> non-uglified name 'f'" }
> + int _E12 = f; // { dg-message "note: badname
> '_E12'" }
> + using g = int; // { dg-message "note:
> non-uglified name 'g'" }
> + return f + _E12;
> + }
> + template <typename T> // { dg-message "note:
> non-uglified name 'T'" }
> + int baz (int __h, int __tg_foo) { // { dg-message "note: badname
> '__tg_foo'" }
> + int i = __h; // { dg-message "note:
> non-uglified name 'i'" }
> + using j = int; // { dg-message "note:
> non-uglified name 'j'" }
> + return i;
> + }
> + template <double>
> + int baz (int aa) { // { dg-message "note:
> non-uglified name 'aa'" }
> + int ab = aa; // { dg-message "note:
> non-uglified name 'ab'" }
> + using ac = double; // { dg-message "note:
> non-uglified name 'ac'" }
> + return ab;
> + }
> + int zz; // { dg-bogus "note: non-uglified
> name 'zz'" }
> + };
> + template <typename _T> // { dg-message "note: badname
> '_T'" }
> + struct qux {
> + int corge (int k, int __l) { // { dg-message "note:
> non-uglified name 'k'" }
> + int __maskrune = k + __l; // { dg-message "note:
> badname '__maskrune'" }
> + typedef std::foo __in_opt; // { dg-message "note: badname
> '__in_opt'" }
> + return __maskrune;
> + }
> + template <typename _Tp>
> + int garply (int m) { // { dg-message "note:
> non-uglified name 'm'" }
> + int n = m; // { dg-message "note:
> non-uglified name 'n'" }
> + struct foo { int baz; } __o; // { dg-message "note:
> non-uglified whitelisted name 'foo'" }
> + __o.baz = n;
> + return __o.baz;
> + }
> + };
> + template <typename _Tp, typename _Up>
> + struct S {
> + S () = delete;
> + ~S () = delete;
> + };
> + template <typename _Tp>
> + struct S <_Tp, _Tp> {
> + int grault (int ad) { // { dg-message "note:
> non-uglified name 'ad'" }
> + int ae = ad; // { dg-message "note:
> non-uglified name 'ae'" }
> + return ae;
> + }
> + int quux () { return 0; }
> + };
> + template <>
> + struct S <int, long> {
> + int grault (int af) { // { dg-message "note:
> non-uglified name 'af'" }
> + int ag = af; // { dg-message "note:
> non-uglified name 'ag'" }
> + return ag;
> + }
> + };
> +
> + inline namespace __cxx11 {
> + enum freddy {
> + frog, waldo
> + };
> + struct fred {
> + int garply (int p) { // { dg-message "note:
> non-uglified name 'p'" }
> + int _res_ext = p; // { dg-message "note:
> non-uglified name '_res_ext'" }
> + return _res_ext;
> + }
> + };
> + }
> + namespace __gnu_cxx {
> + template <typename ...U> // { dg-message "note:
> non-uglified name 'U'" }
> + int foo (U... q) { // { dg-message "note:
> non-uglified name 'q'" }
> + return 0; // { dg-message "note:
> non-uglified whitelisted name 'foo'" "" { target *-*-* } .-1 }
> + }
> + enum blah { // { dg-message "note:
> non-uglified name 'blah'" }
> + plugh, // { dg-message "note:
> non-uglified name 'plugh'" }
> + thud, // { dg-message "note:
> non-uglified name 'thud'" }
> + _E5, // { dg-message "note: badname
> '_E5'" }
> + garply, // { dg-message "note:
> non-uglified whitelisted name 'garply'" }
> + grault, // { dg-message "note:
> non-uglified whitelisted name 'grault'" }
> + quux, // { dg-message "note:
> non-uglified whitelisted name 'quux'" }
> + lorem, // { dg-message "note:
> non-uglified whitelisted name 'lorem'" }
> + ipsum, // { dg-message "note:
> non-uglified whitelisted name 'ipsum'" }
> + dolor, // { dg-message "note:
> non-uglified whitelisted name 'dolor'" }
> + sit, // { dg-message "note:
> non-uglified whitelisted name 'sit'" }
> + amet, // { dg-message "note:
> non-uglified whitelisted name 'amet'" }
> + consectetur, // { dg-message "note:
> non-uglified whitelisted name 'consectetur'" }
> + adipiscing, // { dg-message "note:
> non-uglified whitelisted name 'adipiscing'" }
> + elit // { dg-message "note:
> non-uglified whitelisted name 'elit'" }
> + };
> + int waldo (int r) { // { dg-message "note:
> non-uglified name 'r'" }
> + using s = std::foo; // { dg-message "note:
> non-uglified name 's'" }
> + return r; // { dg-message "note:
> non-uglified whitelisted name 'waldo'" "" { target *-*-* } .-2 }
> + }
> + int xyzzy () { return 0; } // { dg-message "note:
> non-uglified whitelisted name 'xyzzy'" }
> + int barf () { return 0; } // { dg-message "note:
> non-uglified name 'barf'" }
> + int __foobar () { return 0; }
> + struct V { // { dg-message "note:
> non-uglified name 'V'" }
> + union {
> + int t; // { dg-message "note:
> non-uglified name 't'" }
> + };
> + int zz () { return 0; } // { dg-message "note:
> non-uglified whitelisted name 'zz'" }
> + int ww () { return 0; } // { dg-message "note:
> non-uglified name 'ww'" }
> + };
> + }
> + int xyzzy (int s) { // { dg-message "note:
> non-uglified name 's'" }
> + return s;
> + }
> + template <int _Idx>
> + struct lorem {
> + template <int _Idx2>
> + friend int ipsum (int ah) { // { dg-message "note:
> non-uglified name 'ah'" }
> + int ai = ah; // { dg-message "note:
> non-uglified name 'ai'" }
> + return ai;
> + }
> + };
> + template <int _Idx>
> + struct dolor {
> + friend int sit (int aj) { // { dg-message "note:
> non-uglified name 'aj'" }
> + int ak = aj; // { dg-message "note:
> non-uglified name 'ak'" }
> + return ak;
> + }
> + };
> + struct amet {
> + template <int _Idx>
> + friend int consectetur (int al) { // { dg-message "note:
> non-uglified name 'al'" }
> + int am = al; // { dg-message "note:
> non-uglified name 'am'" }
> + return am;
> + }
> + };
> + struct adipiscing {
> + friend int elit (int an) { // { dg-message "note:
> non-uglified name 'an'" }
> + int ao = an; // { dg-message "note:
> non-uglified name 'ao'" }
> + return ao;
> + }
> + };
> +}
> --- gcc/testsuite/g++.dg/plugin/uglification-c++98.C.jj 2026-03-18
> 16:48:34.395699755 +0100
> +++ gcc/testsuite/g++.dg/plugin/uglification-c++98.C 2026-03-18
> 16:48:34.395699755 +0100
> @@ -0,0 +1,9 @@
> +// Verify template parameter names, names of arguments and block scope
> decls
> +// in functions and function templates are uglified and don't contain
> +// badnames.
> +// { dg-options "-O0 -std=c++98" }
> +
> +#include <bits/stdc++.h>
> +
> +// { dg-bogus "note: non-uglified name" "" { target *-*-* } 0 }
> +// { dg-bogus "note: badname" "" { target *-*-* } 0 }
> --- gcc/testsuite/g++.dg/plugin/uglification-c++11.C.jj 2026-03-18
> 16:48:34.395778236 +0100
> +++ gcc/testsuite/g++.dg/plugin/uglification-c++11.C 2026-03-18
> 16:48:34.395778236 +0100
> @@ -0,0 +1,9 @@
> +// Verify template parameter names, names of arguments and block scope
> decls
> +// in functions and function templates are uglified and don't contain
> +// badnames.
> +// { dg-options "-O0 -std=c++11" }
> +
> +#include <bits/stdc++.h>
> +
> +// { dg-bogus "note: non-uglified name" "" { target *-*-* } 0 }
> +// { dg-bogus "note: badname" "" { target *-*-* } 0 }
> --- gcc/testsuite/g++.dg/plugin/uglification-c++14.C.jj 2026-03-18
> 16:48:34.395852292 +0100
> +++ gcc/testsuite/g++.dg/plugin/uglification-c++14.C 2026-03-18
> 16:48:34.395852292 +0100
> @@ -0,0 +1,9 @@
> +// Verify template parameter names, names of arguments and block scope
> decls
> +// in functions and function templates are uglified and don't contain
> +// badnames.
> +// { dg-options "-O0 -std=c++14" }
> +
> +#include <bits/stdc++.h>
> +
> +// { dg-bogus "note: non-uglified name" "" { target *-*-* } 0 }
> +// { dg-bogus "note: badname" "" { target *-*-* } 0 }
> --- gcc/testsuite/g++.dg/plugin/uglification-c++17.C.jj 2026-03-18
> 16:48:34.395946403 +0100
> +++ gcc/testsuite/g++.dg/plugin/uglification-c++17.C 2026-03-18
> 16:48:34.395946403 +0100
> @@ -0,0 +1,9 @@
> +// Verify template parameter names, names of arguments and block scope
> decls
> +// in functions and function templates are uglified and don't contain
> +// badnames.
> +// { dg-options "-O0 -std=c++17" }
> +
> +#include <bits/stdc++.h>
> +
> +// { dg-bogus "note: non-uglified name" "" { target *-*-* } 0 }
> +// { dg-bogus "note: badname" "" { target *-*-* } 0 }
> --- gcc/testsuite/g++.dg/plugin/uglification-c++20.C.jj 2026-03-18
> 16:48:34.396022165 +0100
> +++ gcc/testsuite/g++.dg/plugin/uglification-c++20.C 2026-03-18
> 16:48:34.396022165 +0100
> @@ -0,0 +1,9 @@
> +// Verify template parameter names, names of arguments and block scope
> decls
> +// in functions and function templates are uglified and don't contain
> +// badnames.
> +// { dg-options "-O0 -std=c++20" }
> +
> +#include <bits/stdc++.h>
> +
> +// { dg-bogus "note: non-uglified name" "" { target *-*-* } 0 }
> +// { dg-bogus "note: badname" "" { target *-*-* } 0 }
> --- gcc/testsuite/g++.dg/plugin/uglification-c++23.C.jj 2026-03-18
> 16:48:34.396096554 +0100
> +++ gcc/testsuite/g++.dg/plugin/uglification-c++23.C 2026-03-18
> 16:48:34.396096554 +0100
> @@ -0,0 +1,9 @@
> +// Verify template parameter names, names of arguments and block scope
> decls
> +// in functions and function templates are uglified and don't contain
> +// badnames.
> +// { dg-options "-O0 -std=c++23" }
> +
> +#include <bits/stdc++.h>
> +
> +// { dg-bogus "note: non-uglified name" "" { target *-*-* } 0 }
> +// { dg-bogus "note: badname" "" { target *-*-* } 0 }
> --- gcc/testsuite/g++.dg/plugin/uglification-c++26.C.jj 2026-03-18
> 16:48:34.396169901 +0100
> +++ gcc/testsuite/g++.dg/plugin/uglification-c++26.C 2026-03-18
> 16:48:34.396169901 +0100
> @@ -0,0 +1,9 @@
> +// Verify template parameter names, names of arguments and block scope
> decls
> +// in functions and function templates are uglified and don't contain
> +// badnames.
> +// { dg-options "-O0 -std=c++26 -freflection -fcontracts" }
> +
> +#include <bits/stdc++.h>
> +
> +// { dg-bogus "note: non-uglified name" "" { target *-*-* } 0 }
> +// { dg-bogus "note: badname" "" { target *-*-* } 0 }
>
>
> Jakub
>
>