diff options
author | Patrick Palka <ppalka@redhat.com> | 2025-01-28 09:27:02 -0500 |
---|---|---|
committer | Patrick Palka <ppalka@redhat.com> | 2025-01-28 09:27:02 -0500 |
commit | ea578dd251eaf6304b0c95acc107f9a4d63bee8f (patch) | |
tree | 5fff703cc21a817419400813248a5936dc6f5213 | |
parent | 3ccbc8c9d182c380e396631b2b5a683de4fddba9 (diff) | |
download | gcc-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>
-rw-r--r-- | gcc/cp/cp-tree.h | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp23/class-deduction-inherited7.C | 12 |
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; |