From 1e5cff601d364be53bfb18c5c8ad3159e23696f3 Mon Sep 17 00:00:00 2001 From: Ehab Maali <107338078+71iq@users.noreply.github.com> Date: Sun, 1 Nov 2026 10:45:36 +0200 Subject: [PATCH 1/3] Reject unsafe deep pointer qualification conversions [EDGcpfe/28967] --- src/types.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/types.c b/src/types.c index 3e8a3aed1b..4384a9ca85 100644 --- a/src/types.c +++ b/src/types.c @@ -11689,6 +11689,7 @@ operators), 3.3.15 (?: operator), and 3.3.16.1 (simple assignment). std_conv->warning_suggested = warning_suggested; qualifiers_checked = TRUE; } else if ((!suppress_extensions || any_cfront_mode()) && + !gpp_mode && same_type_with_added_qualifiers( source_type_pointed_to, dest_type_pointed_to, From e82dc1c6b783e850f8bd179b29c2d519f8d18852 Mon Sep 17 00:00:00 2001 From: Ehab Maali <107338078+71iq@users.noreply.github.com> Date: Sun, 1 Nov 2026 10:45:45 +0200 Subject: [PATCH 2/3] Add deep pointer qualification regression tests [EDGcpfe/28967] --- tests/tests/regressions/edg-28967-positive.sft.cpp | 9 +++++++++ tests/tests/regressions/edg-28967.sft.cpp | 9 +++++++++ 2 files changed, 18 insertions(+) create mode 100644 tests/tests/regressions/edg-28967-positive.sft.cpp create mode 100644 tests/tests/regressions/edg-28967.sft.cpp diff --git a/tests/tests/regressions/edg-28967-positive.sft.cpp b/tests/tests/regressions/edg-28967-positive.sft.cpp new file mode 100644 index 0000000000..1b29beb7ff --- /dev/null +++ b/tests/tests/regressions/edg-28967-positive.sft.cpp @@ -0,0 +1,9 @@ +//type:fp +//options_all:--c++20 +//options:--g++ --gnu_version=130300:--strict +void allow(char **p, char ***q) { + char *const *a = p; + const char *const *b = p; + const char *const *const *c = q; + (void)a; (void)b; (void)c; +} diff --git a/tests/tests/regressions/edg-28967.sft.cpp b/tests/tests/regressions/edg-28967.sft.cpp new file mode 100644 index 0000000000..a0b2c939c2 --- /dev/null +++ b/tests/tests/regressions/edg-28967.sft.cpp @@ -0,0 +1,9 @@ +//type:fn +//options_all:--c++20 +//options:--g++ --gnu_version=130300:--g++ --gnu_version=150200:--strict +void reject(char **p, char ***q) { + const char **bad = p; + const char ***also_bad = q; + (void)bad; + (void)also_bad; +} From 1aa33fa2edc6c9786b97c9eef51c37005e87b578 Mon Sep 17 00:00:00 2001 From: Ehab Maali <107338078+71iq@users.noreply.github.com> Date: Sun, 1 Nov 2026 10:49:04 +0200 Subject: [PATCH 3/3] Document pointer qualification conversion fix [GH #455] --- src/pending_changes/edg-28967-deep-pointer-qualification.txt | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 src/pending_changes/edg-28967-deep-pointer-qualification.txt diff --git a/src/pending_changes/edg-28967-deep-pointer-qualification.txt b/src/pending_changes/edg-28967-deep-pointer-qualification.txt new file mode 100644 index 0000000000..f497b1ab30 --- /dev/null +++ b/src/pending_changes/edg-28967-deep-pointer-qualification.txt @@ -0,0 +1,5 @@ +[GH #455] +Reject unsafe deep pointer qualification conversions + +GNU C++ mode now rejects pointer qualification conversions that add const +at a deeper level without adding const at the required intermediate levels.