rjmccall added inline comments.
================
Comment at: lib/CodeGen/CodeGenFunction.cpp:1078
+ QualType T = FD->getReturnType();
+ if (T.isTriviallyCopyableType(Context)) {
+ // Avoid the optimization for functions that return trivially copyable
----------------
arphaman wrote:
> Quuxplusone wrote:
> > Peanut-gallery question: Does `isTriviallyCopyableType` also check that the
> > type is trivially destructible and/or default-constructible? Do those
> > things matter?
> Yes for trivially destructible, since it calls
> `CXXRecordDecl::isTriviallyCopyable()` which checks. No for trivially
> default-constructible, I fixed that.
>
> I think that for us it doesn't really matter that much, since we're mostly
> worried about C code compiled in C++ mode.
The right condition is just hasTrivialDestructor(). The goal of
-fno-strict-return is to not treat falling off the end of a function as
undefined behavior in itself: it might still be a *problem* if users don't
ignore the result, but we shouldn't escalate to UB in the callee because they
legitimately might ignore the result. The argument for having an exception
around non-trivial types is that callers never *really* ignore the result when
there's a non-trivial destructor. Calling a destructor on storage that doesn't
have a valid object of that type constructed there is already definitely U.B.
in the caller, so it's fine to also treat it as U.B. on the callee side. That
reasoning is entirely based on the behavior of the destructor, though, not any
of the copy/move constructors, and definitely not the presence or absence of a
trivial default constructor.
In practice, all of these things tend to vary together, of course, except that
sometimes trivial types do have non-trivial default constructors. We should
not treat that as a UB case.
Repository:
rL LLVM
https://reviews.llvm.org/D27163
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits