7

I get the warning controlling expression is constant on assert statement like this:

assert(... && "error message");

Why this warning on this assert? How can I suppress this warning?

NVCC is the NVIDIA cuda compiler, I think it is based on LLVM. Why does it give this warning, when the same compiles fine with GCC or Visual C++ compilers?

Ashwin Nanjappa
  • 76,204
  • 83
  • 211
  • 292
Anycorn
  • 50,217
  • 42
  • 167
  • 261

5 Answers5

3

I ran into this exact problem and finally found a way to disable warnings on the device. Here are the details...

To disable a specific warning, you need to use the -Xcudafe flag combined with a token listed on this page (http://www.ssl.berkeley.edu/~jimm/grizzly_docs/SSL/opt/intel/cc/9.0/lib/locale/en_US/mcpcom.msg). For example, to disable the "controlling expression is constant" warning, pass the following to NVCC:

-Xcudafe "--diag_suppress=boolean_controlling_expr_is_constant"

This worked for me! For other warnings, see the above link.

user2333829
  • 1,301
  • 1
  • 15
  • 25
3

A portable alternative (possibly wrapped in a macro) would be something like:

 {
     const bool error_message = true;
     assert([...] && error_message);
 }

To clear up what i meant:

#define myAssert(msg, exp) { const bool msg(true); assert(msg && (exp)); }
// usage:
myAssert(ouch, a && b);

... gives e.g.:

assertion "ouch && (a && b)" failed [...]

Georg Fritzsche
  • 97,545
  • 26
  • 194
  • 236
3

Add the following somewhere near the beginning of your code:

#pragma diag_suppress boolean_controlling_expr_is_constant

Note that this will suppress all compiler warnings for "controlling expression is constant", not just the warning associated with your assertions.

I sometimes get this warning when checking constants or properties that are defined (or can be derived) at compile time, so in my experience the warning has been generally benign and OK to ignore.

Kevin Holt
  • 775
  • 9
  • 15
  • 1
    You can also turn the warning back on with `#pragma diag_warning boolean_controlling_expr_is_constant`. However, these `pragma`s cannot be in device code. They are also completely undocumented as far as the CUDA toolkit goes, so I would not be surprised if they one day stopped functioning... – Sam Sep 24 '15 at 16:22
0

If it is LLVM based, then you can use something like this:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wmultichar"

char b = 'df'; // no warning.

#pragma clang diagnostic pop

From Controlling Diagnostics via Pragmas.

Frank Krueger
  • 69,552
  • 46
  • 163
  • 208
0

Try #pragma warning.

Crashworks
  • 40,496
  • 12
  • 101
  • 170