mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-25 23:46:05 +00:00

Currently, if the argument to `__builtin_assume` and friends contains side-effects, we issue the following diagnostic: ``` <source>:1:34: warning: the argument to '__builtin_assume' has side effects that will be discarded [-Wassume] 1 | void f(int x) { __builtin_assume(x++); } | ``` The issue here is that this diagnostic misrepresents what is actually happening: not only do we discard the side-effects of the expression, but we also don’t even emit any assumption information at all because the backend is not equipped to deal with eliminating side-effects in cases such as this. This has caused some confusion (see #91612) beacuse the current wording of the warning suggests that, sensibly, only the side-effects of the expression, and not the assumption itself, will be discarded. This pr updates the diagnostic to state what is actually happening: that the assumption has no effect at all because its argument contains side-effects: ``` <source>:1:34: warning: assumption is ignored because it contains (potential) side-effects [-Wassume] 1 | void f(int x) { __builtin_assume(x++); } | ``` I’ve deliberately included ‘(potential)’ here because even expressions that only contain potential side-effects (e.g. `true ? x : x++` or a call to a function that is pure, but we don’t know that it is) cause the assumption to be discarded. This, too, has caused some confusion because it was erroneously assumed that Clang would e.g. infer that a function call is pure and not discard the assumption as a result when that isn’t the case. This is intended to be temporary; we should revert back to the original diagnostic once we have proper support for assumptions with side-effects in the backend (in which case the side-effects will still be discarded, but the assumption won’t) This fixes #91612.
10 lines
447 B
C
10 lines
447 B
C
// RUN: %clang_cc1 %s -verify -pedantic -fsyntax-only -Wno-gnu-statement-expression
|
|
|
|
int stmtexpr_fn(void);
|
|
void stmtexprs(int i) {
|
|
__builtin_assume( ({ 1; }) ); // no warning about "side effects"
|
|
__builtin_assume( ({ if (i) { (void)0; }; 42; }) ); // no warning about "side effects"
|
|
// expected-warning@+1 {{assumption is ignored because it contains (potential) side-effects}}
|
|
__builtin_assume( ({ if (i) ({ stmtexpr_fn(); }); 1; }) );
|
|
}
|