Allow optional to tolerate being used with a nested class.
authorEric Fiselier <eric@efcs.ca>
Mon, 11 Mar 2019 22:55:21 +0000 (22:55 +0000)
committerEric Fiselier <eric@efcs.ca>
Mon, 11 Mar 2019 22:55:21 +0000 (22:55 +0000)
commit86af6f5088b16c98e7033a6a5cf3c889c5d95e57
tree5958b1c9af6bb3ca7b6bbe834a7a126b15ca9fda
parentf92e59cbba59793b301f0874fcd9046872c5e4c3
Allow optional to tolerate being used with a nested class.

When Clang tries to complete a type containing `std::optional` it
considers the `in_place_t` constructor with no arguments which checks
if the value type is default constructible. If the value type is a
nested class type, then this check occurs too early and poisons the
is_default_constructible trait.

This patch makes optional deduce `in_place_t` so we can prevent
this early SFINAE evaluation. Technically this could break people
doing weird things with the in_place_t tag, but that seems less
important than making the nested class case work.

llvm-svn: 355877
libcxx/include/optional
libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/empty_in_place_t_does_not_clobber.pass.cpp [new file with mode: 0644]