sgatev added a comment.

I see that the declaration of `operator*` in `std::unique_ptr` is `typename 
add_lvalue_reference<T>::type operator*() const;`. I managed to reproduce the 
crash with the following snippet:

  #include <optional>
  
  namespace detail {
   
  template <class T>
  struct type_identity { using type = T; };
  
  template <class T>
  auto try_add_lvalue_reference(int) -> type_identity<T&>;
  
  template <class T>
  auto try_add_lvalue_reference(...) -> type_identity<T>;
  
  template <class T>
  auto try_add_rvalue_reference(int) -> type_identity<T&&>;
  
  template <class T>
  auto try_add_rvalue_reference(...) -> type_identity<T>;
  
  }  // namespace detail
  
  template <class T>
  struct add_lvalue_reference : 
decltype(detail::try_add_lvalue_reference<T>(0)) {};
  
  template <class T>
  struct add_rvalue_reference : 
decltype(detail::try_add_rvalue_reference<T>(0)) {};
  
  template <typename T>
  struct smart_ptr {
    typename add_lvalue_reference<T>::type operator*() &;
  };
  
  void foo() {
    smart_ptr<std::optional<float>> x;
    *x = std::nullopt;
  }

I suggest adding the definition of `add_lvalue_reference` to 
StdTypeTraitsHeader 
<https://github.com/llvm/llvm-project/blob/f93dee10336a2361da528db0ff0f7188acba9627/clang/unittests/Analysis/FlowSensitive/UncheckedOptionalAccessModelTest.cpp#L48>
 and adding a test with the rest of the code above.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D127434/new/

https://reviews.llvm.org/D127434

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to