[cfe-users] Anyway to prevent this code from compiling?

don hinton via cfe-users cfe-users at lists.llvm.org
Mon Feb 29 09:38:57 PST 2016


Try using initialization list syntax.  That way the parser won't think you
are declaring a function.

OELock lock{mutex};



On Mon, Feb 29, 2016 at 12:02 PM, Brian Cole via cfe-users <
cfe-users at lists.llvm.org> wrote:

> 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:
>
> OELock lock(mutex);
>
> 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:
>
> #include <mutex>
>
> using namespace std;
>
> struct OEMutex
> {
>   void Acquire() {}
>   void Release() {}
> };
>
> static OEMutex _mutex;
>
> class OELock
> {
>   OEMutex &_mutex;
>   OELock();
>   OELock(const OELock&);
>   OELock& operator=(const OELock&);
>
> public:
>   OELock(OEMutex &mutex) : _mutex(mutex) { _mutex.Acquire(); }
>   ~OELock() { _mutex.Release(); }
> };
>
> int main()
> {
>   OELock lock(mutex);
> }
>
> 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?).
>
> Thanks,
> Brian
>
>
> _______________________________________________
> cfe-users mailing list
> cfe-users at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-users/attachments/20160229/845f5a03/attachment.html>


More information about the cfe-users mailing list