[cfe-dev] [libc++] Diagnosing UB when instantiating containers with incomplete types
Eric Fiselier via cfe-dev
cfe-dev at lists.llvm.org
Fri Jun 29 17:50:03 PDT 2018
On Fri, Jun 29, 2018 at 11:18 AM, Louis Dionne via cfe-dev <
cfe-dev at lists.llvm.org> wrote:
> Hey folks,
>
> Before I ask my question, let me quickly introduce myself since this is my
> first post. My name's Louis Dionne and I just started a new job where my
> main focus will be on libc++. I'm also involved in Boost (Boost.Hana), the
> C++ Standards Committee, and I sometimes go to C++ conferences. I'm very
> excited about contributing to LLVM and I'm looking forward to interacting
> with members of the community.
>
> With that being said, I have a simple question about potentially
> diagnosing the use of incomplete types in standard library containers. As
> you may know, the Standard currently disallows instantiating most standard
> library components with incomplete types. If I'm reading this right, it's
> actually UB to do that. From [res.on.functions] 20.5.4.8/2:
>
> > In particular, the effects are undefined in the following cases:
> > [...]
> > - if an incomplete type is used as a template argument when
> > instantiating a template component, unless specifically allowed
> > for that component.
>
>
Note that some containers explicitly allow incomplete types. Specifically
forward_list, list, and vector. (See N4510).
IIRC the reason the other node based containers weren't added was because
some implementations were unable
to support such a change without taking an ABI break.
libc++ currently does not always warn or trigger a compilation error for
> such uses. Sometimes it "works", sometimes it doesn't. Does anybody know
> whether it would be harmful to diagnose this UB by triggering a compilation
> error when a standard library component that does not allow it is
> instantiated with an incomplete type?
> Specifically, what I'm wondering is whether libc++ actually supports this
> use case (despite it being banned from the Standard), and users are relying
> on it. If that were the case, I wouldn't want to break people's code for
> the sake of blindly sticking more closely to the spec, and we could instead
> change the Standard to make this use case implementation-defined or even
> well-defined.
>
Yes, libc++ explicitly attempts to support this case and there are users
relying on it. See the `incomplete_type.pass.cpp` tests under
`test/std/containers`.
Normally there is no need to eagerly diagnose incomplete types, as they'll
be diagnosed in their own time when a complete type is actually needed (in
the case of containers),
The problematic cases are those which result in ODR violations, such as
instantiating a type trait twice, with an incomplete type and then later
the completed type.
>
> Thoughts?
>
> Cheers,
> Louis
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20180629/c06489db/attachment.html>
More information about the cfe-dev
mailing list