<font size=2 face="sans-serif">I recently learned that I should not be
using types such as 'uint32_t' for atomics, but instead should use the
"fast" versions of these types, such as 'uint_fast32_t'. However,
when I use these "fast" types with clang and the std::atomic::operator=
overload I get a nasty ICE.</font>
<br>
<br><font size=2 face="sans-serif">I get the same ICE with 'uint64_t',
so I'm guessing that 'uint_fast*_t' is a typedef to 'uint64_t'...</font>
<br>
<br><font size=2 face="sans-serif">----</font>
<br>
<br><font size=2 face="sans-serif">$> cat atomic_store.cc</font>
<br>
<br><font size=2 face="sans-serif">#include <atomic></font>
<br>
<br><font size=2 face="sans-serif">int main ()</font>
<br><font size=2 face="sans-serif">{</font>
<br><font size=2 face="sans-serif">  // this works fine ...</font>
<br><font size=2 face="sans-serif">  std::atomic<uint_fast16_t>
a(0);</font>
<br><font size=2 face="sans-serif">  a++;</font>
<br>
<br><font size=2 face="sans-serif">  std::atomic<uint_fast16_t>
b;</font>
<br><font size=2 face="sans-serif">  b = 0; // fail</font>
<br>
<br><font size=2 face="sans-serif">  std::atomic<uint16_t> c;</font>
<br><font size=2 face="sans-serif">  c = 0; // success</font>
<br>
<br><font size=2 face="sans-serif">  std::atomic<uint32_t> d;</font>
<br><font size=2 face="sans-serif">  d = 0; // success</font>
<br><font size=2 face="sans-serif">  </font>
<br><font size=2 face="sans-serif">  std::atomic<uint64_t> e;</font>
<br><font size=2 face="sans-serif">  e = 0; // fail</font>
<br>
<br><font size=2 face="sans-serif">  std::atomic<uint_fast32_t>
f;</font>
<br><font size=2 face="sans-serif">  f = 0; // fail</font>
<br>
<br><font size=2 face="sans-serif">  return 0;</font>
<br><font size=2 face="sans-serif">};</font>
<br>
<br><font size=2 face="sans-serif">$> /bghome/blocksom/development/c++11/bgclang++
-ferror-limit=10 -I /bghome/blocksom/development/c++11/install/libc++/include
-std=c++11 -stdlib=libc++ -g -c atomic_store.cc -o atomic_store.o</font>
<br><font size=2 face="sans-serif">fatal error: error in backend: Cannot
select: 0x10005b64a80: ch = AtomicStore 0x10005b67ac0, 0x10005b66ca0, 0x10005b679c0<Volatile
ST8[%__a_.i.i62]> [ID=10]</font>
<br><font size=2 face="sans-serif">      dbg:/bghome/blocksom/development/c++11/install/libc++/include/atomic:571</font>
<br><font size=2 face="sans-serif">  0x10005b66ca0: i64,ch = CopyFromReg
0x10005ac0660, 0x10005b60c30 [ID=8] dbg:/bghome/blocksom/development/c++11/install/libc++/include/atomic:571</font>
<br><font size=2 face="sans-serif">    0x10005b60c30: i64 = Register
%vreg1 [ID=5]</font>
<br><font size=2 face="sans-serif">  0x10005b679c0: i64,ch = load
0x10005ac0660, 0x10005b65390, 0x10005b61230<LD8[%.atomictmp.i.i57]>
[ORD=98] [ID=7] dbg:/bghome/blocksom/development/c++11/install/libc++/include/atomic:571</font>
<br><font size=2 face="sans-serif">    0x10005b65390: i64 = FrameIndex<14>
[ORD=98] [ID=1]</font>
<br><font size=2 face="sans-serif">    0x10005b61230: i64 = undef
[ORD=98] [ID=2]</font>
<br><font size=2 face="sans-serif">In function: main</font>
<br><font size=2 face="sans-serif">clang: error: clang frontend command
failed with exit code 70 (use -v to see invocation)</font>
<br><font size=2 face="sans-serif">clang version 3.3 (trunk 170456)</font>
<br><font size=2 face="sans-serif">Target: powerpc64-bgq-linux</font>
<br><font size=2 face="sans-serif">Thread model: posix</font>
<br><font size=2 face="sans-serif">clang: note: diagnostic msg: PLEASE
submit a bug report to </font><a href=http://llvm.org/bugs/><font size=2 face="sans-serif">http://llvm.org/bugs/</font></a><font size=2 face="sans-serif">
and include the crash backtrace, preprocessed source, and associated run
script.</font>
<br><font size=2 face="sans-serif">clang: note: diagnostic msg: </font>
<br><font size=2 face="sans-serif">********************</font>
<br>
<br><font size=2 face="sans-serif">PLEASE ATTACH THE FOLLOWING FILES TO
THE BUG REPORT:</font>
<br><font size=2 face="sans-serif">Preprocessed source(s) and associated
run script(s) are located at:</font>
<br><font size=2 face="sans-serif">clang: note: diagnostic msg: /tmp/atomic_store-j00aLw.cpp</font>
<br><font size=2 face="sans-serif">clang: note: diagnostic msg: /tmp/atomic_store-j00aLw.sh</font>
<br><font size=2 face="sans-serif">clang: note: diagnostic msg: </font>
<br>
<br><font size=2 face="sans-serif">********************</font>
<br>
<br><font size=2 face="sans-serif">Any ideas?</font>
<br>
<br>
<br><font size=2 face="sans-serif">--> </font><a href=http://en.cppreference.com/w/c/types/integer><font size=2 face="sans-serif">http://en.cppreference.com/w/c/types/integer</font></a>
<br><font size=2 face="sans-serif">--> </font><a href=http://en.cppreference.com/w/cpp/atomic/atomic/operator%3D><font size=2 face="sans-serif">http://en.cppreference.com/w/cpp/atomic/atomic/operator%3D</font></a>
<br>
<br><font size=2 face="sans-serif">Thanks,</font>
<br><font size=2 face="sans-serif"><br>
Michael Blocksome<br>
Blue Gene Messaging<br>
blocksom@us.ibm.com<br>
</font>