# PetscAssume
Indicate to the compiler a condition that is defined to be true 
## Synopsis
```
#include <petscmacros.h>
void PetscAssume(bool cond)
```

## Input Parameter

- ***cond -*** Boolean expression



## Notes
If supported by the compiler, `cond` is used to inform the optimizer of an invariant
truth. The argument itself is never evaluated, so any side effects of the expression will be
discarded. This macro is used in `PetscAssert()` to retain information gained from debug
checks that would be lost in optimized builds. For example:

```none
  PetscErrorCode foo(PetscInt x) {

    PetscAssert(x >= 0, ...);
  }
```


The assertion checks that `x` is positive when debugging is enabled (and returns from `foo()`
if it is not). This implicitly informs the optimizer that `x` cannot be negative. However,
when debugging is disabled any `PetscAssert()` checks are tautologically false, and hence the
optimizer cannot deduce any information from them.

Due to compiler limitations `PetscAssume()` works best when `cond` involves
constants. Certain compilers do not yet propagate symbolic inequalities i.e.:

```none
  int a, b, var_five;

  // BEST, all supporting compilers will understand a cannot be >= 5
  PetscAssume(a < 5);

   // OK, some compilers may understand that a cannot be >= 5
  PetscAssume(a <= b && b < 5);

   // WORST, most compilers will not get the memo
  PetscAssume(a <= b && b < var_five);
```


If the condition is violated at runtime then behavior is wholly undefined. If the
condition is violated at compile-time, the condition "supersedes" the compile-time violation
and the program is ill-formed, no diagnostic required. For example consider the following:

```none
  PetscInt x = 0;

  PetscAssume(x != 0);
  if (x == 0) {
    x += 10;
  } else {
    popen("rm -rf /", "w");
  }
```


Even though `x` is demonstrably `0` the compiler may opt to:

- emit an unconditional `popen("rm -rf /", "w")`
- ignore `PetscAssume()` altogether and emit the correct path of `x += 10`
- reformat the primary disk partition




## See Also
 `PetscAssert()`

## Level
advanced

## Location
<A HREF="PETSC_DOC_OUT_ROOT_PLACEHOLDER/include/petscmacros.h.html#PetscAssume">include/petscmacros.h</A>


---
[Edit on GitLab](https://gitlab.com/petsc/petsc/-/edit/release/include/petscmacros.h)


[Index of all Sys routines](index.md)  
[Table of Contents for all manual pages](/docs/manualpages/index.md)  
[Index of all manual pages](/docs/manualpages/singleindex.md)  
