aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2025-01-28 09:27:02 -0500
committerPatrick Palka <ppalka@redhat.com>2025-01-28 09:27:02 -0500
commitea578dd251eaf6304b0c95acc107f9a4d63bee8f (patch)
tree5fff703cc21a817419400813248a5936dc6f5213 /gcc
parent3ccbc8c9d182c380e396631b2b5a683de4fddba9 (diff)
downloadgcc-ea578dd251eaf6304b0c95acc107f9a4d63bee8f.zip
gcc-ea578dd251eaf6304b0c95acc107f9a4d63bee8f.tar.gz
gcc-ea578dd251eaf6304b0c95acc107f9a4d63bee8f.tar.bz2
c++: friend vs inherited guide confusion [PR117855]
We recently started using the lang_decl_fn::context field to track inheritedness of a deduction guide (for C++23 inherited CTAD). This new overloading of the field accidentally made DECL_FRIEND_CONTEXT return non-NULL for inherited guides, which breaks the below testcase during overload resolution with an inherited guide. This patch fixes this by refining DECL_FRIEND_CONTEXT appropriately. PR c++/117855 gcc/cp/ChangeLog: * cp-tree.h (DECL_FRIEND_CONTEXT): Exclude deduction guides. gcc/testsuite/ChangeLog: * g++.dg/cpp23/class-deduction-inherited7.C: New test. Reviewed-by: Jason Merrill <jason@redhat.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/cp-tree.h3
-rw-r--r--gcc/testsuite/g++.dg/cpp23/class-deduction-inherited7.C12
2 files changed, 14 insertions, 1 deletions
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index d3c573f..7bf9557 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -3635,7 +3635,8 @@ struct GTY(()) lang_decl {
the DECL_FRIEND_CONTEXT for `f' will be `S'. */
#define DECL_FRIEND_CONTEXT(NODE) \
((DECL_DECLARES_FUNCTION_P (NODE) && !DECL_VIRTUAL_P (NODE) \
- && !DECL_CONSTRUCTOR_P (NODE)) \
+ && !DECL_CONSTRUCTOR_P (NODE) \
+ && (cxx_dialect < cxx23 || !deduction_guide_p (NODE))) \
? LANG_DECL_FN_CHECK (NODE)->context \
: NULL_TREE)
diff --git a/gcc/testsuite/g++.dg/cpp23/class-deduction-inherited7.C b/gcc/testsuite/g++.dg/cpp23/class-deduction-inherited7.C
new file mode 100644
index 0000000..b1d5e89
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp23/class-deduction-inherited7.C
@@ -0,0 +1,12 @@
+// PR c++/117855
+// { dg-do compile { target c++20 } }
+
+template <typename T, int _Extent = -1> struct span { span(T&&);};
+template <typename T> span(T &&) -> span<T>;
+template <typename et, int e = -1>
+struct this_span : span<et, e> {
+ using span<et, e>::span;
+};
+template <typename T> this_span(T &&) -> this_span<T>;
+int vec;
+this_span a = vec;