<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">
<div>
<div>
<div style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 14px;">
Since switching over to clang C++11 on OS X, we had this weird C++ oddity surface while writing some new code. The problem is that ‘mutex’ is no longer a variable, it is a class type that can be interpreted as a function argument. That is, the following line
 of code can be interpreted as a function declaration now:</div>
<div style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 14px;">
<br>
</div>
<div style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 14px;">
OELock lock(mutex);</div>
<div style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 14px;">
<br>
</div>
<div style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 14px;">
Instead of a scoped lock acquisition as has been convention for some time now. The full code to recreate the subtle bug is as follows: </div>
<div style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 14px;">
<br>
</div>
<div>
<div><font face="Calibri,sans-serif">#include <mutex></font></div>
<div><font face="Calibri,sans-serif"><br>
</font></div>
<div><font face="Calibri,sans-serif">using namespace std;</font></div>
<div><font face="Calibri,sans-serif"><br>
</font></div>
<div><font face="Calibri,sans-serif">struct OEMutex</font></div>
<div><font face="Calibri,sans-serif">{</font></div>
<div><font face="Calibri,sans-serif">  void Acquire() {}</font></div>
<div><font face="Calibri,sans-serif">  void Release() {}</font></div>
<div><font face="Calibri,sans-serif">};</font></div>
<div><font face="Calibri,sans-serif"><br>
</font></div>
<div><font face="Calibri,sans-serif">static OEMutex _mutex;</font></div>
<div><font face="Calibri,sans-serif"><br>
</font></div>
<div><font face="Calibri,sans-serif">class OELock</font></div>
<div><font face="Calibri,sans-serif">{</font></div>
<div><font face="Calibri,sans-serif">  OEMutex &_mutex;</font></div>
<div><font face="Calibri,sans-serif">  OELock();</font></div>
<div><font face="Calibri,sans-serif">  OELock(const OELock&);</font></div>
<div><font face="Calibri,sans-serif">  OELock& operator=(const OELock&);</font></div>
<div><font face="Calibri,sans-serif"><br>
</font></div>
<div><font face="Calibri,sans-serif">public:</font></div>
<div><font face="Calibri,sans-serif">  OELock(OEMutex &mutex) : _mutex(mutex) { _mutex.Acquire(); }</font></div>
<div><font face="Calibri,sans-serif">  ~OELock() { _mutex.Release(); }</font></div>
<div><font face="Calibri,sans-serif">};</font></div>
<div><font face="Calibri,sans-serif"><br>
</font></div>
<div><font face="Calibri,sans-serif">int main()</font></div>
<div><font face="Calibri,sans-serif">{</font></div>
<div><font face="Calibri,sans-serif">  OELock lock(mutex);</font></div>
<div><font face="Calibri,sans-serif">}</font></div>
</div>
<div><font face="Calibri,sans-serif"><br>
</font></div>
<div>Ideally, we would like the compilation to fail and tell the user the ‘mutex’ variable can not be found. Any clever C++ trick to do that? We’ve tried declaring the move constructors of OELock to be private, but it still compiles (maybe that’s SFINAE?). </div>
<div><br>
</div>
<div>Thanks,</div>
<div>Brian</div>
<div style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 14px;">
<br>
</div>
<div style="color: rgb(0, 0, 0); font-family: Calibri, sans-serif; font-size: 14px;">
<div id="MAC_OUTLOOK_SIGNATURE"></div>
</div>
</div>
</div>
</body>
</html>