rsmith added inline comments.
================ Comment at: lib/CodeGen/CGBuiltin.cpp:1674 + Value *Ptr = EmitScalarExpr(E->getArg(0)); + Ptr = Builder.CreateInvariantGroupBarrier(Ptr); + return RValue::get(Ptr); ---------------- It would be nice to avoid this for types that contain no const subobjects / reference subobjects / vptrs. I think we can also omit this entirely if `-fstrict-vtable-ptrs` is disabled, since in that case we don't generate any `invariant.group` metadata. I'd be OK with the former being left to a future change, but the latter should be part of this change so we don't generate unnecessarily-inefficient code in the default mode for uses of `std::launder`. ================ Comment at: lib/Sema/SemaChecking.cpp:860-864 + if (!ArgTy->isPointerType()) { + S.Diag(TheCall->getLocStart(), diag::err_builtin_launder_non_pointer_arg) + << TheCall->getSourceRange(); + return ExprError(); + } ---------------- Please also check that the pointee type is an object type -- per [ptr.launder]p3, "the program is ill-formed if T is a function type or cv void", and we don't want our builtin to need to deal with such cases. https://reviews.llvm.org/D40218 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits