This is an archive of the discontinued LLVM Phabricator instance.

Improve format member detection in llvm::formatv
ClosedPublic

Authored by labath on Dec 7 2016, 8:40 AM.

Details

Summary

The existing detection of a format member function has a couple of deficiencies:

  • the member function does not get detected if one calls formatv with an lvalue, because the template parameter gets deduced as T&, which fails the is_class check.
  • it also did not work if the function was called with a const variable because the template parameter would get deduced as const T&, again failing the is_class check.

This fixes the problem by stripping the references in the uses_format_member
template, to make sure the type is correctly detected as class. It also provides
specializations of the has_FormatMember template for const and non-const members
of the types in order to enable declaring the format member as a "const"
function. I have added tests that verify that formatv can be now called in these
scenarios. As some scenarios could not be verified at runtime (e.g. making sure
that calling a non-const format member on a const object does *not* compile), I
have also added some static_asserts which test the behaviour of the template
classes used internally by formatv().

Diff Detail

Repository
rL LLVM

Event Timeline

labath updated this revision to Diff 80602.Dec 7 2016, 8:40 AM
labath retitled this revision from to Improve format member detection in llvm::formatv.
labath updated this object.
labath added a reviewer: zturner.
labath added a subscriber: llvm-commits.
zturner accepted this revision.Dec 7 2016, 8:48 AM
zturner edited edge metadata.

Looks good, thanks!

This revision is now accepted and ready to land.Dec 7 2016, 8:48 AM
This revision was automatically updated to reflect the committed changes.