[llvm-dev] Adding [[nodiscard]] to Compiler.h

Sanjoy Das via llvm-dev llvm-dev at lists.llvm.org
Sun Sep 4 14:55:20 PDT 2016

Hi Justin,

Justin Bogner wrote:
 > Sanjoy Das<sanjoy at playingwithpointers.com>  writes:
 >> Hi Justin,
 >> This SGTM generally, but please make the difference between
 >> LLVM_NODISCARD and LLVM_UNUSED_RESULT clear in the code. :)
 > Right, this is where it gets a little weird. LLVM_NODISCARD would be for
 > types, whereas LLVM_UNUSED_RESULT would be for functions. Depending on
 > your host compiler, using the wrong one might DTRT, but it won't across
 > all compilers.
 > Do you think documenting this is sufficient, or should we try to name
 > these to better represent where they should be used?

Firstly, perhaps "LLVM_NODISCARD_TYPE" would be a better name?

Secondly, if we define the following when the host compiler is clang,

#define LLVM_UNUSED_RESULT __attribute__((warn_unused_result))
#define LLVM_NODISCARD_TYPE [[clang::warn_unused_result]]

via some shallow manual testing, it looks like using
LLVM_NODISCARD_TYPE on a function should break the build (though I'd
love it if someone more familiar with clang chimed in on this). So, is
the problem that we can accidentally use LLVM_UNUSED_RESULT on a type
and not know it?

I think there is a dirty trick here -- we could:

#define LLVM_UNUSED_RESULT __attribute__((warn_unused_result, enable_if(true, "")))
#define LLVM_NODISCARD_TYPE [[clang::warn_unused_result]]

This breaks the (clang) build if LLVM_UNUSED_RESULT is used on a type.

It would still be possible to not do the right thing on GCC or MSVC
and be able to build a binary, but I think as long as the clang bots
catch bad uses we're okay.

-- Sanjoy`

More information about the llvm-dev mailing list