<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/58163>58163</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Some macros cause -Wunused-value if -save-temps is used
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
tobiasbrunner
</td>
</tr>
</table>
<pre>
When compiling this simplified verifier
```c
#define a() 0
int main() { a(); }
```
with `clang -Werror -Wunused-value -save-temps` we get an error:
```
test-init.c:2:14: error: expression result unused [-Werror,-Wunused-value]
int main() { 0; }
^
1 error generated.
```
However, no error is produced for `clang -Werror -Wunused-value` (i.e. **without** `-save-temps`).
While that example is obviously not useful, a more realistic example would be a macro that uses a compound statement and evaluates to a value that is optional to consume. For instance the following:
```c
#include <stdlib.h>
typedef struct element_t element_t;
struct element_t {
void *value;
element_t *next;
};
#define INIT(this, ...) ({ (this) = malloc(sizeof(*(this))); \
*(this) = (typeof(*(this))){ __VA_ARGS__ }; (this); })
element_t *element_create(void *value)
{
element_t *this;
INIT(this,
.value = value,
);
return this;
}
int main(int argc, char **argv)
{
return 0;
}
```
That definition of the macro also allows `element_create()` to be written as:
```c
return INIT(this,
.value = value,
);
```
Again, only when compiling with `-save-temps` is there an error. The clang version doesn't matter (I tried 3.0 up to the current trunk, see [here for the above example on compiler explorer](https://godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(filename:'1',fontScale:14,fontUsePx:'0',j:1,lang:___c,selection:(endColumn:14,endLineNumber:5,positionColumn:14,positionLineNumber:5,selectionStartColumn:14,selectionStartLineNumber:5,startColumn:14,startLineNumber:5),source:'%23include+%3Cstdlib.h%3E%0A%0Atypedef+struct+element_t+element_t%3B%0Astruct+element_t+%7B%0A%09void+*value%3B%0A%09element_t+*next%3B%0A%7D%3B%0A%0A%23define+INIT(this,+...)+(%7B+(this)+%3D+malloc(sizeof(*(this)))%3B+%5C%0A%09%09%09%09%09%09+++*(this)+%3D+(typeof(*(this)))%7B+__VA_ARGS__+%7D%3B+(this)%3B+%7D)+%0A%0Aelement_t+*element_create(void+*value)%0A%7B%0A%09element_t+*this%3B%0A%09INIT(this,%0A%09%09.value+%3D+value,%0A%09)%3B%0A%09return+this%3B%0A%7D%0A%0Aint+main(int+argc,+char+**argv)%0A%7B%0A++++return+0%3B%0A%7D'),l:'5',n:'0',o:'C+source+%231',t:'0')),k:34.18113235186407,l:'4',m:100,n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:cclang_trunk,filters:(b:'0',binary:'1',commentOnly:'0',demangle:'0',directives:'0',execute:'1',intel:'0',libraryCode:'0',trim:'1'),flagsViewOpen:'1',fontScale:14,fontUsePx:'0',j:1,lang:___c,libs:!(),options:'-Werror+-Wunused-value+-save-temps',selection:(endColumn:1,endLineNumber:1,positionColumn:1,positionLineNumber:1,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),source:1,tree:'1'),l:'5',n:'0',o:'x86-64+clang+(trunk)+(C,+Editor+%231,+Compiler+%231)',t:'0')),k:32.48553431480261,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:output,i:(compilerName:'x86-64+gcc+8.3',editorid:1,fontScale:14,fontUsePx:'0',j:1,wrap:'1'),l:'5',n:'0',o:'Output+of+x86-64+clang+(trunk)+(Compiler+%231)',t:'0')),k:33.33333333333333,l:'4',n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4)).
Is this just something that's to be expected because the information about the original macro is lost due to `-save-temps`? Or could this be improved somehow?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJytWNuS2jgQ_RrzohqXL5jLAw_AZHZTtZVs7WSTR0rYApQ1FmXJMLNfv6cl29hcZpKtTDFgtVqtvp6WvFbZ6-zbThQsVfuDzGWxZWYnNdNyf8jlRoqMHUVJD6UXPHrBvP4eBe6T1uMozsRGFoJxL5p40ZQFbkIWhu25LGqqN140HF68wPDxQp4bnqTZMZKecyj08E2UpSrxWxWVFtnDkeeVYA-aH8WDEfuDBis7CbYVhvGCWW4vvlTVDY3Q5kEW0vgpWCL8h0N8tYuYeDmUQmupCobfKjfM7cq8ZFFr4kXLvi5e8njX3KBnKOv-eckHRw3d9jCgECU3IvNv6v67OglEA9uzQtVLEKtDqbIqhYYbjN_xGnmKQTvpCx-_CJx1tqqMG9D6vmNhh98N_bedzAWShBu4iiNLBOmg1kepKp2_QjN4TItNlZOenO1VKeBJnkttZNquOakqz9haEAdPS-UkYqEGhZJRVUXGtIE39qKguGZMkAkgaGYUuFwa2HWkwcEgZjynuVQVutrDwifyUAEpRUqcAi7Kc3VCmp_z415CyyLNq0wwL15qk-Vy7e-8-EN3kXk9CKQ9tCyrFO7IraqrzhNi71ivWJAajajpUcmMguEiFJ8nOuzRvBAvZ3mUUGfGfgl-_PTxC0JMdUwh8H3f5iJSEunYToASP8L38EcKopb_CrWxeTs_89QfyuBk2arlPpTAXV4rj4bwyl1J0GC1-jpfzf_67Xm1Ys6MjlJNsZC4jnE9RzSDFFllBNb2_QchtYvuONJu1fFy319dK32XYmRYLbszbZVth6UwVVmwvuwW3i7BgR55uU0pPumOl3UpgnS81p-gohYf3JDdx4gvVA42ESTVA1Mbm_euxniu6QsVoKnQrxxJewMgUEEozFMpjUFn4PoaS9NLu3-BD_t2uO_51vpryVQBaDn1G1XTJS4aAbAAFgN0mlbgsy_wgENFwKeF9kwJDcFjigispABMPjJTUsOL_YBVB_ICeS6typIACAVc_EOqaCGoF9gtCHGJia_VUbTYphotIRftJAcCltQiosnOmIN1Z_SEz1Zla5UbX5VbS4gtKkWhjcTk_gA4NE9VJj5k0thuJO3sZIMdC74XdjQG8xhzG1WY55TnwrU6R_hbiz9fHFvg2L7TNH7JS3hcrVaUnBopklIeuQ1EkS1VXu2LRhYIfwByPlX7taDumYB2UNqmXp-zoV6xt1s8G16a_qL-3PXSGytuMU5pQlVlWnvGi5IW3r1ogWEH4jH4gC8C1KSFeHA5BMfDGdx7z0m8sCtu8mFmvGilWsC31AaymsV2tr_Q4X6Xg-Cxu2Bu7XHgjyUXpRgtXAOwwia1IosuMFsHQObix5qB25sWoSW0Sr_xtWg-85u7vtcyao07baN26ONZlfOSVjnbRNxj7aYLv95sI72oTFuP34-O27gXv8sA9Fzk17Jb81tQ7PBNLyQ6kAXz1W7WCbV9aCo2iE2HwaDuMXiiLtMEoe0zl-a1kVq0OwZX241dQeWulhIHH0UPTJQb0b513Vl7o7jGJNPldvYu_wEtHvrhJAzjKE7CyWgYjM_7DN3KPRV6ENzb0Q0IYYMb2yxvA6lD6jOMthRM2q6xarAfAIte4QB8su4psJYFL197yAs5lCmf0bp6rJnYQ2gu-kRZEtQdhe6RxYtIK9NHdIRW5D0uIFeJ3ZfoCT06-tm-u5R8sMn5Vn-V4vT5IIpf1ymggu64lnZyJ_LanvbqtLi4kIDQ6d8ufm90nRtNJ7zZdO71nPCNnvN2ywmvW87NjhNedJzQRkKIy0j8QAW9TEYPoyGVr_W2gzqXjDWgL115N0eBtsyIuGxTuyVP3ynAyB9OkiQexuFwEkSj8KoAf1XZ4cZ5oEvnZdF9as8vre3bFAm2mPhxXRLWVEC18-xPZu2p5If_EYjPtboLalOLHwjLz7s-9uPe369wfce66F0htxbX52XMDB2t9y7go3Zvi75X2jCt9gIj-waJw1VjXV8kcARGSQm67acclW9PzLLA2RlnbzqM4_RcGUtFXLeSLvHuvgLRuYLojO756sa7ifiJfS5x2KZ3CVYTbCf3hxKn8cwqtFMnMPXuyXe-B2IWjkbD6TiZDpNBNouzaTzlAyNNLmbPEOV00szZcPEySm6676NIcZocVGU-uzjz49JSrX2kOwZ5fmx-HqD0d0EHxyepdYU2ED0lk3AUD3azUTDi62wabMQ04MMwjMYp58mY88lmM9yMg0HO1yLXM9xKvCgqxIlZEXjGrWMgZ1EQRWiaSRiH0yDxIWQyyqI0C9NQROnUGwboSDL3SQ-6jAzKmVVpXW01JunNjT5Pcq3lthDCbgf5vDI7Vc6MWkuu16iCQpQDq8DMGvAfuRLLVQ">