Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Revert "[libc++][NFC] Simplify pair a bit" #97003

Merged
merged 1 commit into from
Jun 28, 2024
Merged

Conversation

jyknight
Copy link
Member

Reverts #96165

The change broke code like

#include <utility>
#include <vector>

struct Test {
  std::vector<std::pair<int, Test>> v;
};

std::pair<int, Test> p;

under -std=c++20, apparently by triggering certain template evaluations too eagerly.

@jyknight jyknight requested a review from a team as a code owner June 28, 2024 05:07
@llvmbot llvmbot added the libc++ libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi. label Jun 28, 2024
@llvmbot
Copy link
Collaborator

llvmbot commented Jun 28, 2024

@llvm/pr-subscribers-libcxx

Author: James Y Knight (jyknight)

Changes

Reverts llvm/llvm-project#96165

The change broke code like

#include &lt;utility&gt;
#include &lt;vector&gt;

struct Test {
  std::vector&lt;std::pair&lt;int, Test&gt;&gt; v;
};

std::pair&lt;int, Test&gt; p;

under -std=c++20, apparently by triggering certain template evaluations too eagerly.


Full diff: https://github.com/llvm/llvm-project/pull/97003.diff

1 Files Affected:

  • (modified) libcxx/include/__utility/pair.h (+11-5)
diff --git a/libcxx/include/__utility/pair.h b/libcxx/include/__utility/pair.h
index 1b0d9241886f9..0afbebcdc9f2a 100644
--- a/libcxx/include/__utility/pair.h
+++ b/libcxx/include/__utility/pair.h
@@ -16,6 +16,8 @@
 #include <__fwd/array.h>
 #include <__fwd/pair.h>
 #include <__fwd/tuple.h>
+#include <__tuple/sfinae_helpers.h>
+#include <__tuple/tuple_element.h>
 #include <__tuple/tuple_indices.h>
 #include <__tuple/tuple_like_no_subrange.h>
 #include <__tuple/tuple_size.h>
@@ -128,15 +130,19 @@ struct _LIBCPP_TEMPLATE_VIS pair
     }
   };
 
-  template <bool _Dummy = true, __enable_if_t<_Dummy && _CheckArgs::__enable_default(), int> = 0>
-  explicit(!_CheckArgs::__enable_implicit_default()) _LIBCPP_HIDE_FROM_ABI constexpr pair() noexcept(
+  template <bool _MaybeEnable>
+  using _CheckArgsDep _LIBCPP_NODEBUG =
+      typename conditional< _MaybeEnable, _CheckArgs, __check_tuple_constructor_fail>::type;
+
+  template <bool _Dummy = true, __enable_if_t<_CheckArgsDep<_Dummy>::__enable_default(), int> = 0>
+  explicit(!_CheckArgsDep<_Dummy>::__enable_implicit_default()) _LIBCPP_HIDE_FROM_ABI constexpr pair() noexcept(
       is_nothrow_default_constructible<first_type>::value && is_nothrow_default_constructible<second_type>::value)
       : first(), second() {}
 
-  template <bool _Dummy                                                                                          = true,
-            __enable_if_t<_Dummy && _CheckArgs::template __is_pair_constructible<_T1 const&, _T2 const&>(), int> = 0>
+  template <bool _Dummy = true,
+            __enable_if_t<_CheckArgsDep<_Dummy>::template __is_pair_constructible<_T1 const&, _T2 const&>(), int> = 0>
   _LIBCPP_HIDE_FROM_ABI
-  _LIBCPP_CONSTEXPR_SINCE_CXX14 explicit(!_CheckArgs::template __is_implicit<_T1 const&, _T2 const&>())
+  _LIBCPP_CONSTEXPR_SINCE_CXX14 explicit(!_CheckArgsDep<_Dummy>::template __is_implicit<_T1 const&, _T2 const&>())
       pair(_T1 const& __t1, _T2 const& __t2) noexcept(is_nothrow_copy_constructible<first_type>::value &&
                                                       is_nothrow_copy_constructible<second_type>::value)
       : first(__t1), second(__t2) {}

@philnik777
Copy link
Contributor

Could you add the test case to avoid regressing on this again?

Copy link
Contributor

@alexfh alexfh left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LG. I think, it's better to add a test separately from the revert.

@ldionne
Copy link
Member

ldionne commented Jun 28, 2024

LGTM. I'll merge this to get back to a clean state ASAP, but @jyknight can you please submit a PR to add this regression test?

@ldionne ldionne merged commit 5e1de27 into main Jun 28, 2024
50 of 59 checks passed
@ldionne ldionne deleted the revert-96165-simplify_pair branch June 28, 2024 13:42
@jyknight
Copy link
Member Author

jyknight commented Jul 1, 2024

Created PR #97355 with a test.

lravenclaw pushed a commit to lravenclaw/llvm-project that referenced this pull request Jul 3, 2024
Reverts llvm#96165

The change broke code like

  #include <utility>
  #include <vector>

  struct Test {
    std::vector<std::pair<int, Test>> v;
  };

  std::pair<int, Test> p;

under `-std=c++20`, apparently by triggering certain template
evaluations too eagerly.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
libc++ libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants