<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jun 15, 2016 at 11:45 AM, Craig, Ben via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor="#FFFFFF" text="#000000">
<p>Does this change (and the paper) permit declarations like the
following?</p>
<p> lock_guard<> guard();</p>
<p>If that syntax is allowed, then this is also likely allowed...</p>
<p> lock_guard<>(guard);</p>
<p>I would really like the prior two examples to not compile. Here
is a common bug that I see in the wild...</p>
<p> unique_guard<mutex>(some_member_mutex);</p>
<p>That defines a new, default constructed unique_guard named
"some_member_mutex", that likely shadows the member variable
some_member_mutex. It is almost never what users want.<br></p></div></blockquote><div><br></div><div>I had no idea that syntax did that. I would have assumed it created an unnamed temporary. I can see how that would cause bugs.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div bgcolor="#FFFFFF" text="#000000"><p>
</p>
<p>Is it possible to have the empty template remain undefined, and
let the one element lock_guard be the base case of the recursion?
Does that help any with the mangling?<br></p></div></blockquote><div>Nothing in the spec says the empty template should be undefined. The default constructor on the empty template is technically implementing "lock_guard(MutexTypes...)" for an empty pack.</div><div>However your example provides ample motivation to make it undefined. I'll go ahead and make that change and I'll file a LWG defect to change the standard.</div><div><br></div><div>There is actually no recursion in the variadic lock_guard implementation, so the change is trivial.</div><div><br></div><div>As for mangling I'm not sure what you mean? It definitely doesn't change the fact that this change is ABI breaking. (Note this change is not enabled by default for that reason).</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div bgcolor="#FFFFFF" text="#000000"><p>
</p><div><div class="h5">
<br>
<div>On 6/14/2016 8:24 PM, Eric Fiselier via
cfe-commits wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">
<div>Update on the bot failures:</div>
<div><br>
</div>
I've spoken to the owner of the bots and they are planning to
upgrade their Clang versions.
<div>This will get the bots green again.</div>
<div><br>
</div>
<div>/Eric</div>
</div>
<div class="gmail_extra"><br>
<div class="gmail_quote">On Mon, Jun 13, 2016 at 11:49 PM, Eric
Fiselier <span dir="ltr"><<a href="mailto:eric@efcs.ca" target="_blank">eric@efcs.ca</a>></span>
wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr">This is causing some of the libc++ bots to go
red. `variadic_copy.fail.cpp` is encountering an error,
which seems to be a clang bug which temporarily existed in
3.9.
<div>The test passes against current ToT and older clang
releases and GCC.</div>
<div><br>
</div>
<div>Please do not revert this commit due to that specific
failure. I am aware of it and I am working to fix it.</div>
</div>
<div>
<div>
<div class="gmail_extra"><br>
<div class="gmail_quote">On Mon, Jun 13, 2016 at 9:48
PM, Eric Fiselier via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank"></a><a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span>
wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author:
ericwf<br>
Date: Mon Jun 13 22:48:09 2016<br>
New Revision: 272634<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=272634&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=272634&view=rev</a><br>
Log:<br>
Implement variadic lock_guard.<br>
<br>
Summary:<br>
This patch implements the variadic `lock_guard`
paper.<br>
<br>
Making `lock_guard` variadic is a ABI breaking
change because the specialization
`lock_guard<_Mutex>` mangles differently
then when it was the primary template. This change
only provides variadic `lock_guard` in ABI V2 or
when `_LIBCPP_ABI_VARIADIC_LOCK_GUARD` is defined.<br>
<br>
Note that in ABI V2 `lock_guard` must always be
declared as a variadic template, even in C++03, in
order to keep the ABI consistent. For this reason
`lock_guard` is forward declared as a variadic
template in all standard dialects and therefore
depends on variadic templates being provided as an
extension in C++03. All supported versions of
Clang and GCC provide this extension.<br>
<br>
<br>
<br>
<br>
Reviewers: mclow.lists<br>
<br>
Subscribers: K-ballo, mclow.lists, cfe-commits<br>
<br>
Differential Revision: <a href="http://reviews.llvm.org/D21260" rel="noreferrer" target="_blank">http://reviews.llvm.org/D21260</a><br>
<br>
Added:<br>
libcxx/trunk/test/libcxx/thread/thread.mutex/thread.lock/<br>
libcxx/trunk/test/libcxx/thread/thread.mutex/thread.lock/thread.lock.guard/<br>
libcxx/trunk/test/libcxx/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_mutex_mangling.pass.cpp<br>
libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_adopt_lock.pass.cpp<br>
libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_assign.fail.cpp<br>
libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_copy.fail.cpp<br>
libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_mutex.fail.cpp<br>
libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_mutex.pass.cpp<br>
libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_mutex_cxx03.pass.cpp<br>
libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_types.pass.cpp<br>
Modified:<br>
libcxx/trunk/include/__config<br>
libcxx/trunk/include/__mutex_base<br>
libcxx/trunk/include/mutex<br>
libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/mutex.fail.cpp<br>
libcxx/trunk/www/cxx1z_status.html<br>
<br>
Modified: libcxx/trunk/include/__config<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/__config?rev=272634&r1=272633&r2=272634&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/__config?rev=272634&r1=272633&r2=272634&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/include/__config (original)<br>
+++ libcxx/trunk/include/__config Mon Jun 13
22:48:09 2016<br>
@@ -43,6 +43,7 @@<br>
#define _LIBCPP_ABI_LIST_REMOVE_NODE_POINTER_UB<br>
#define
_LIBCPP_ABI_FORWARD_LIST_REMOVE_NODE_POINTER_UB<br>
#define
_LIBCPP_ABI_FIX_UNORDERED_CONTAINER_SIZE_TYPE<br>
+#define _LIBCPP_ABI_VARIADIC_LOCK_GUARD<br>
#endif<br>
<br>
#define _LIBCPP_CONCAT1(_LIBCPP_X,_LIBCPP_Y)
_LIBCPP_X##_LIBCPP_Y<br>
<br>
Modified: libcxx/trunk/include/__mutex_base<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/__mutex_base?rev=272634&r1=272633&r2=272634&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/__mutex_base?rev=272634&r1=272633&r2=272634&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/include/__mutex_base (original)<br>
+++ libcxx/trunk/include/__mutex_base Mon Jun 13
22:48:09 2016<br>
@@ -76,8 +76,21 @@ constexpr adopt_lock_t
adopt_lock = ad<br>
<br>
#endif<br>
<br>
+<br>
+// Forward declare lock_guard as a variadic
template even in C++03 to keep<br>
+// the mangling consistent between dialects.<br>
+#if defined(_LIBCPP_ABI_VARIADIC_LOCK_GUARD)<br>
+template <class ..._Mutexes><br>
+class _LIBCPP_TYPE_VIS_ONLY lock_guard;<br>
+#endif<br>
+<br>
template <class _Mutex><br>
-class _LIBCPP_TYPE_VIS_ONLY
_LIBCPP_THREAD_SAFETY_ANNOTATION(scoped_lockable)
lock_guard<br>
+class _LIBCPP_TYPE_VIS_ONLY
_LIBCPP_THREAD_SAFETY_ANNOTATION(scoped_lockable)<br>
+#if !defined(_LIBCPP_ABI_VARIADIC_LOCK_GUARD)<br>
+lock_guard<br>
+#else<br>
+lock_guard<_Mutex><br>
+#endif<br>
{<br>
public:<br>
typedef _Mutex mutex_type;<br>
@@ -96,8 +109,8 @@ public:<br>
~lock_guard()
_LIBCPP_THREAD_SAFETY_ANNOTATION(release_capability())
{__m_.unlock();}<br>
<br>
private:<br>
- lock_guard(lock_guard const&);// =
delete;<br>
- lock_guard& operator=(lock_guard
const&);// = delete;<br>
+ lock_guard(lock_guard const&)
_LIBCPP_EQUAL_DELETE;<br>
+ lock_guard& operator=(lock_guard
const&) _LIBCPP_EQUAL_DELETE;<br>
};<br>
<br>
template <class _Mutex><br>
<br>
Modified: libcxx/trunk/include/mutex<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/mutex?rev=272634&r1=272633&r2=272634&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/mutex?rev=272634&r1=272633&r2=272634&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/include/mutex (original)<br>
+++ libcxx/trunk/include/mutex Mon Jun 13 22:48:09
2016<br>
@@ -109,6 +109,19 @@ public:<br>
lock_guard& operator=(lock_guard
const&) = delete;<br>
};<br>
<br>
+template <class... MutexTypes> // Variadic
lock_guard only provided in ABI V2.<br>
+class lock_guard<br>
+{<br>
+public:<br>
+ explicit lock_guard(MutexTypes&... m);<br>
+ lock_guard(MutexTypes&... m,
adopt_lock_t);<br>
+ ~lock_guard();<br>
+ lock_guard(lock_guard const&) = delete;<br>
+ lock_guard& operator=(lock_guard
const&) = delete;<br>
+private:<br>
+ tuple<MutexTypes&...> pm; //
exposition only<br>
+};<br>
+<br>
template <class Mutex><br>
class unique_lock<br>
{<br>
@@ -427,6 +440,27 @@ lock(_L0& __l0, _L1&
__l1, _L2& __l2, _L<br>
__lock_first(0, __l0, __l1, __l2, __l3...);<br>
}<br>
<br>
+template <class _L0><br>
+inline _LIBCPP_INLINE_VISIBILITY<br>
+void __unlock(_L0& __l0) {<br>
+ __l0.unlock();<br>
+}<br>
+<br>
+template <class _L0, class _L1><br>
+inline _LIBCPP_INLINE_VISIBILITY<br>
+void __unlock(_L0& __l0, _L1& __l1) {<br>
+ __l0.unlock();<br>
+ __l1.unlock();<br>
+}<br>
+<br>
+template <class _L0, class _L1, class _L2,
class ..._L3><br>
+inline _LIBCPP_INLINE_VISIBILITY<br>
+void __unlock(_L0& __l0, _L1& __l1,
_L2& __l2, _L3&... __l3) {<br>
+ __l0.unlock();<br>
+ __l1.unlock();<br>
+ _VSTD::__unlock(__l2, __l3...);<br>
+}<br>
+<br>
#endif // _LIBCPP_HAS_NO_VARIADICS<br>
<br>
#endif // !_LIBCPP_HAS_NO_THREADS<br>
@@ -577,6 +611,63 @@ call_once(once_flag&
__flag, const _Call<br>
<br>
#endif // _LIBCPP_HAS_NO_VARIADICS<br>
<br>
+<br>
+#if defined(_LIBCPP_ABI_VARIADIC_LOCK_GUARD) \<br>
+ && !defined(_LIBCPP_CXX03_LANG)<br>
+template <><br>
+class _LIBCPP_TYPE_VIS_ONLY lock_guard<> {<br>
+public:<br>
+ explicit lock_guard() = default;<br>
+ ~lock_guard() = default;<br>
+<br>
+ _LIBCPP_INLINE_VISIBILITY<br>
+ explicit lock_guard(adopt_lock_t) {}<br>
+<br>
+ lock_guard(lock_guard const&) = delete;<br>
+ lock_guard& operator=(lock_guard
const&) = delete;<br>
+};<br>
+<br>
+template <class ..._MArgs><br>
+class _LIBCPP_TYPE_VIS_ONLY lock_guard<br>
+{<br>
+ static_assert(sizeof...(_MArgs) >= 2, "At
least 2 lock types required");<br>
+ typedef tuple<_MArgs&...>
_MutexTuple;<br>
+<br>
+public:<br>
+ _LIBCPP_INLINE_VISIBILITY<br>
+ explicit lock_guard(_MArgs&... __margs)<br>
+ : __t_(__margs...)<br>
+ {<br>
+ _VSTD::lock(__margs...);<br>
+ }<br>
+<br>
+ _LIBCPP_INLINE_VISIBILITY<br>
+ lock_guard(_MArgs&... __margs,
adopt_lock_t)<br>
+ : __t_(__margs...)<br>
+ {<br>
+ }<br>
+<br>
+ _LIBCPP_INLINE_VISIBILITY<br>
+ ~lock_guard() {<br>
+ typedef typename
__make_tuple_indices<sizeof...(_MArgs)>::type
_Indices;<br>
+ __unlock_unpack(_Indices{}, __t_);<br>
+ }<br>
+<br>
+ lock_guard(lock_guard const&) = delete;<br>
+ lock_guard& operator=(lock_guard
const&) = delete;<br>
+<br>
+private:<br>
+ template <size_t ..._Indx><br>
+ _LIBCPP_INLINE_VISIBILITY<br>
+ static void
__unlock_unpack(__tuple_indices<_Indx...>,
_MutexTuple& __mt) {<br>
+
_VSTD::__unlock(_VSTD::get<_Indx>(__mt)...);<br>
+ }<br>
+<br>
+ _MutexTuple __t_;<br>
+};<br>
+<br>
+#endif // _LIBCPP_ABI_VARIADIC_LOCK_GUARD<br>
+<br>
_LIBCPP_END_NAMESPACE_STD<br>
<br>
#endif // _LIBCPP_MUTEX<br>
<br>
Added:
libcxx/trunk/test/libcxx/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_mutex_mangling.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_mutex_mangling.pass.cpp?rev=272634&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_mutex_mangling.pass.cpp?rev=272634&view=auto</a><br>
==============================================================================<br>
---
libcxx/trunk/test/libcxx/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_mutex_mangling.pass.cpp
(added)<br>
+++
libcxx/trunk/test/libcxx/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_mutex_mangling.pass.cpp
Mon Jun 13 22:48:09 2016<br>
@@ -0,0 +1,31 @@<br>
+//===----------------------------------------------------------------------===//<br>
+//<br>
+// The LLVM Compiler
Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and
the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+//<br>
+// UNSUPPORTED: libcpp-has-no-threads<br>
+<br>
+// THIS TESTS C++03 EXTENSIONS.<br>
+<br>
+// <mutex><br>
+<br>
+// template <class ...Mutex> class
lock_guard;<br>
+<br>
+// Test that the the variadic lock guard
implementation mangles the same in<br>
+// C++11 and C++03. This is important since the
mangling of `lock_guard` depends<br>
+// on it being declared as a variadic template,
even in C++03.<br>
+<br>
+#define _LIBCPP_ABI_VARIADIC_LOCK_GUARD<br>
+#include <mutex><br>
+#include <typeinfo><br>
+#include <cassert><br>
+#include <iostream><br>
+<br>
+int main() {<br>
+ const std::string expect =
"NSt3__110lock_guardIJNS_5mutexEEEE";<br>
+
assert(typeid(std::lock_guard<std::mutex>).name()
== expect);<br>
+}<br>
<br>
Modified:
libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/mutex.fail.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/mutex.fail.cpp?rev=272634&r1=272633&r2=272634&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/mutex.fail.cpp?rev=272634&r1=272633&r2=272634&view=diff</a><br>
==============================================================================<br>
---
libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/mutex.fail.cpp
(original)<br>
+++
libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/mutex.fail.cpp
Mon Jun 13 22:48:09 2016<br>
@@ -7,6 +7,8 @@<br>
//<br>
//===----------------------------------------------------------------------===//<br>
<br>
+// UNSUPPORTED: libcpp-has-no-threads<br>
+<br>
// <mutex><br>
<br>
// template <class Mutex> class lock_guard;<br>
@@ -14,35 +16,9 @@<br>
// explicit lock_guard(mutex_type& m);<br>
<br>
#include <mutex><br>
-#include <thread><br>
-#include <cstdlib><br>
-#include <cassert><br>
-<br>
-std::mutex m;<br>
-<br>
-typedef std::chrono::system_clock Clock;<br>
-typedef Clock::time_point time_point;<br>
-typedef Clock::duration duration;<br>
-typedef std::chrono::milliseconds ms;<br>
-typedef std::chrono::nanoseconds ns;<br>
-<br>
-void f()<br>
-{<br>
- time_point t0 = Clock::now();<br>
- time_point t1;<br>
- {<br>
- std::lock_guard<std::mutex> lg = m;<br>
- t1 = Clock::now();<br>
- }<br>
- ns d = t1 - t0 - ms(250);<br>
- assert(d < ns(2500000)); // within 2.5ms<br>
-}<br>
<br>
int main()<br>
{<br>
- m.lock();<br>
- std::thread t(f);<br>
- std::this_thread::sleep_for(ms(250));<br>
- m.unlock();<br>
- t.join();<br>
+ std::mutex m;<br>
+ std::lock_guard<std::mutex> lg = m; //
expected-error{{no viable conversion}}<br>
}<br>
<br>
Added:
libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_adopt_lock.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_adopt_lock.pass.cpp?rev=272634&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_adopt_lock.pass.cpp?rev=272634&view=auto</a><br>
==============================================================================<br>
---
libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_adopt_lock.pass.cpp
(added)<br>
+++
libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_adopt_lock.pass.cpp
Mon Jun 13 22:48:09 2016<br>
@@ -0,0 +1,62 @@<br>
+//===----------------------------------------------------------------------===//<br>
+//<br>
+// The LLVM Compiler
Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and
the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+//<br>
+// UNSUPPORTED: libcpp-has-no-threads<br>
+// UNSUPPORTED: c++98, c++03<br>
+<br>
+// <mutex><br>
+<br>
+// template <class ...Mutex> class
lock_guard;<br>
+<br>
+// lock_guard(Mutex&..., adopt_lock_t);<br>
+<br>
+#define _LIBCPP_ABI_VARIADIC_LOCK_GUARD<br>
+#include <mutex><br>
+#include <cassert><br>
+<br>
+struct TestMutex {<br>
+ bool locked = false;<br>
+ TestMutex() = default;<br>
+<br>
+ void lock() { assert(!locked); locked = true;
}<br>
+ bool try_lock() { if (locked) return false;
return locked = true; }<br>
+ void unlock() { assert(locked); locked =
false; }<br>
+<br>
+ TestMutex(TestMutex const&) = delete;<br>
+ TestMutex& operator=(TestMutex
const&) = delete;<br>
+};<br>
+<br>
+int main()<br>
+{<br>
+ {<br>
+ using LG = std::lock_guard<>;<br>
+ LG lg(std::adopt_lock);<br>
+ }<br>
+ {<br>
+ TestMutex m1, m2;<br>
+ using LG = std::lock_guard<TestMutex,
TestMutex>;<br>
+ m1.lock(); m2.lock();<br>
+ {<br>
+ LG lg(m1, m2, std::adopt_lock);<br>
+ assert(m1.locked &&
m2.locked);<br>
+ }<br>
+ assert(!m1.locked && !m2.locked);<br>
+ }<br>
+ {<br>
+ TestMutex m1, m2, m3;<br>
+ using LG = std::lock_guard<TestMutex,
TestMutex, TestMutex>;<br>
+ m1.lock(); m2.lock(); m3.lock();<br>
+ {<br>
+ LG lg(m1, m2, m3, std::adopt_lock);<br>
+ assert(m1.locked && m2.locked
&& m3.locked);<br>
+ }<br>
+ assert(!m1.locked && !m2.locked
&& !m3.locked);<br>
+ }<br>
+<br>
+}<br>
<br>
Added:
libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_assign.fail.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_assign.fail.cpp?rev=272634&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_assign.fail.cpp?rev=272634&view=auto</a><br>
==============================================================================<br>
---
libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_assign.fail.cpp
(added)<br>
+++
libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_assign.fail.cpp
Mon Jun 13 22:48:09 2016<br>
@@ -0,0 +1,44 @@<br>
+//===----------------------------------------------------------------------===//<br>
+//<br>
+// The LLVM Compiler
Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and
the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+// UNSUPPORTED: libcpp-has-no-threads<br>
+// UNSUPPORTED: c++98, c++03<br>
+<br>
+// <mutex><br>
+<br>
+// template <class ...Mutex> class
lock_guard;<br>
+<br>
+// lock_guard& operator=(lock_guard
const&) = delete;<br>
+<br>
+#define _LIBCPP_ABI_VARIADIC_LOCK_GUARD<br>
+#include <mutex><br>
+<br>
+int main()<br>
+{<br>
+ using M = std::mutex;<br>
+ M m0, m1, m2;<br>
+ M om0, om1, om2;<br>
+ {<br>
+ using LG = std::lock_guard<>;<br>
+ LG lg1, lg2;<br>
+ lg1 = lg2; // expected-error{{overload
resolution selected deleted operator '='}}<br>
+ }<br>
+ {<br>
+ using LG = std::lock_guard<M, M>;<br>
+ LG lg1(m0, m1);<br>
+ LG lg2(om0, om1);<br>
+ lg1 = lg2; // expected-error{{overload
resolution selected deleted operator '='}}<br>
+ }<br>
+ {<br>
+ using LG = std::lock_guard<M, M,
M>;<br>
+ LG lg1(m0, m1, m2);<br>
+ LG lg2(om0, om1, om2);<br>
+ lg1 = lg2; // expected-error{{overload
resolution selected deleted operator '='}}<br>
+ }<br>
+}<br>
<br>
Added:
libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_copy.fail.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_copy.fail.cpp?rev=272634&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_copy.fail.cpp?rev=272634&view=auto</a><br>
==============================================================================<br>
---
libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_copy.fail.cpp
(added)<br>
+++
libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_copy.fail.cpp
Mon Jun 13 22:48:09 2016<br>
@@ -0,0 +1,41 @@<br>
+//===----------------------------------------------------------------------===//<br>
+//<br>
+// The LLVM Compiler
Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and
the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+// UNSUPPORTED: libcpp-has-no-threads<br>
+// UNSUPPORTED: c++98, c++03<br>
+<br>
+// <mutex><br>
+<br>
+// template <class ...Mutex> class
lock_guard;<br>
+<br>
+// lock_guard(lock_guard const&) = delete;<br>
+<br>
+#define _LIBCPP_ABI_VARIADIC_LOCK_GUARD<br>
+#include <mutex><br>
+<br>
+int main()<br>
+{<br>
+ using M = std::mutex;<br>
+ M m0, m1, m2;<br>
+ {<br>
+ using LG = std::lock_guard<>;<br>
+ const LG Orig;<br>
+ LG Copy(Orig); // expected-error{{call to
deleted constructor of 'LG'}}<br>
+ }<br>
+ {<br>
+ using LG = std::lock_guard<M, M>;<br>
+ const LG Orig(m0, m1);<br>
+ LG Copy(Orig); // expected-error{{call to
deleted constructor of 'LG'}}<br>
+ }<br>
+ {<br>
+ using LG = std::lock_guard<M, M,
M>;<br>
+ const LG Orig(m0, m1, m2);<br>
+ LG Copy(Orig); // expected-error{{call to
deleted constructor of 'LG'}}<br>
+ }<br>
+}<br>
<br>
Added:
libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_mutex.fail.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_mutex.fail.cpp?rev=272634&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_mutex.fail.cpp?rev=272634&view=auto</a><br>
==============================================================================<br>
---
libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_mutex.fail.cpp
(added)<br>
+++
libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_mutex.fail.cpp
Mon Jun 13 22:48:09 2016<br>
@@ -0,0 +1,47 @@<br>
+//===----------------------------------------------------------------------===//<br>
+//<br>
+// The LLVM Compiler
Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and
the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+// UNSUPPORTED: libcpp-has-no-threads<br>
+// UNSUPPORTED: c++98, c++03<br>
+<br>
+// <mutex><br>
+<br>
+// template <class ...Mutex> class
lock_guard;<br>
+<br>
+// explicit lock_guard(Mutex&...);<br>
+<br>
+#define _LIBCPP_ABI_VARIADIC_LOCK_GUARD<br>
+#include <mutex><br>
+<br>
+template <class LG><br>
+void test_conversion(LG) {}<br>
+<br>
+int main()<br>
+{<br>
+ using M = std::mutex;<br>
+ M m0, m1, m2;<br>
+ M n0, n1, n2;<br>
+ {<br>
+ using LG = std::lock_guard<>;<br>
+ LG lg = {}; // expected-error{{chosen
constructor is explicit in copy-initialization}}<br>
+ test_conversion<LG>({}); //
expected-error{{no matching function for call}}<br>
+ ((void)lg);<br>
+ }<br>
+ {<br>
+ using LG = std::lock_guard<M, M>;<br>
+ LG lg = {m0, m1}; //
expected-error{{chosen constructor is explicit in
copy-initialization}}<br>
+ test_conversion<LG>({n0, n1}); //
expected-error{{no matching function for call}}<br>
+ ((void)lg);<br>
+ }<br>
+ {<br>
+ using LG = std::lock_guard<M, M,
M>;<br>
+ LG lg = {m0, m1, m2}; //
expected-error{{chosen constructor is explicit in
copy-initialization}}<br>
+ test_conversion<LG>({n0, n1, n2});
// expected-error{{no matching function for call}}<br>
+ }<br>
+}<br>
<br>
Added:
libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_mutex.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_mutex.pass.cpp?rev=272634&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_mutex.pass.cpp?rev=272634&view=auto</a><br>
==============================================================================<br>
---
libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_mutex.pass.cpp
(added)<br>
+++
libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_mutex.pass.cpp
Mon Jun 13 22:48:09 2016<br>
@@ -0,0 +1,113 @@<br>
+//===----------------------------------------------------------------------===//<br>
+//<br>
+// The LLVM Compiler
Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and
the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+//<br>
+// UNSUPPORTED: libcpp-has-no-threads<br>
+// UNSUPPORTED: c++98, c++03<br>
+<br>
+// <mutex><br>
+<br>
+// template <class ...Mutex> class
lock_guard;<br>
+<br>
+// explicit lock_guard(mutex_type& m);<br>
+<br>
+#define _LIBCPP_ABI_VARIADIC_LOCK_GUARD<br>
+#include <mutex><br>
+#include <cassert><br>
+<br>
+struct TestMutex {<br>
+ bool locked = false;<br>
+ TestMutex() = default;<br>
+ ~TestMutex() { assert(!locked); }<br>
+<br>
+ void lock() { assert(!locked); locked = true;
}<br>
+ bool try_lock() { if (locked) return false;
return locked = true; }<br>
+ void unlock() { assert(locked); locked =
false; }<br>
+<br>
+ TestMutex(TestMutex const&) = delete;<br>
+ TestMutex& operator=(TestMutex
const&) = delete;<br>
+};<br>
+<br>
+#if !defined(TEST_HAS_NO_EXCEPTIONS)<br>
+struct TestMutexThrows {<br>
+ bool locked = false;<br>
+ bool throws_on_lock = false;<br>
+<br>
+ TestMutexThrows() = default;<br>
+ ~TestMutexThrows() { assert(!locked); }<br>
+<br>
+ void lock() {<br>
+ assert(!locked);<br>
+ if (throws_on_lock) {<br>
+ throw 42;<br>
+ }<br>
+ locked = true;<br>
+ }<br>
+<br>
+ bool try_lock() {<br>
+ if (locked) return false;<br>
+ lock();<br>
+ return true;<br>
+ }<br>
+<br>
+ void unlock() { assert(locked); locked =
false; }<br>
+<br>
+ TestMutexThrows(TestMutexThrows const&) =
delete;<br>
+ TestMutexThrows&
operator=(TestMutexThrows const&) = delete;<br>
+};<br>
+#endif // !defined(TEST_HAS_NO_EXCEPTIONS)<br>
+<br>
+int main()<br>
+{<br>
+ {<br>
+ using LG = std::lock_guard<>;<br>
+ LG lg;<br>
+ }<br>
+ {<br>
+ using LG = std::lock_guard<TestMutex,
TestMutex>;<br>
+ TestMutex m1, m2;<br>
+ {<br>
+ LG lg(m1, m2);<br>
+ assert(m1.locked &&
m2.locked);<br>
+ }<br>
+ assert(!m1.locked && !m2.locked);<br>
+ }<br>
+ {<br>
+ using LG = std::lock_guard<TestMutex,
TestMutex, TestMutex>;<br>
+ TestMutex m1, m2, m3;<br>
+ {<br>
+ LG lg(m1, m2, m3);<br>
+ assert(m1.locked && m2.locked
&& m3.locked);<br>
+ }<br>
+ assert(!m1.locked && !m2.locked
&& !m3.locked);<br>
+ }<br>
+#if !defined(TEST_HAS_NO_EXCEPTIONS)<br>
+ {<br>
+ using MT = TestMutexThrows;<br>
+ using LG = std::lock_guard<MT, MT>;<br>
+ MT m1, m2;<br>
+ m1.throws_on_lock = true;<br>
+ try {<br>
+ LG lg(m1, m2);<br>
+ assert(false);<br>
+ } catch (int) {}<br>
+ assert(!m1.locked && !m2.locked);<br>
+ }<br>
+ {<br>
+ using MT = TestMutexThrows;<br>
+ using LG = std::lock_guard<MT, MT,
MT>;<br>
+ MT m1, m2, m3;<br>
+ m2.throws_on_lock = true;<br>
+ try {<br>
+ LG lg(m1, m2, m3);<br>
+ assert(false);<br>
+ } catch (int) {}<br>
+ assert(!m1.locked && !m2.locked
&& !m3.locked);<br>
+ }<br>
+#endif<br>
+}<br>
<br>
Added:
libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_mutex_cxx03.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_mutex_cxx03.pass.cpp?rev=272634&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_mutex_cxx03.pass.cpp?rev=272634&view=auto</a><br>
==============================================================================<br>
---
libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_mutex_cxx03.pass.cpp
(added)<br>
+++
libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_mutex_cxx03.pass.cpp
Mon Jun 13 22:48:09 2016<br>
@@ -0,0 +1,21 @@<br>
+//===----------------------------------------------------------------------===//<br>
+//<br>
+// The LLVM Compiler
Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and
the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+//<br>
+// UNSUPPORTED: libcpp-has-no-threads<br>
+<br>
+// <mutex><br>
+<br>
+// template <class ...Mutex> class
lock_guard;<br>
+<br>
+// Test that the variadic lock guard
implementation compiles in all standard<br>
+// dialects, including C++03, even though it is
forward declared using<br>
+// variadic templates.<br>
+<br>
+#define _LIBCPP_ABI_VARIADIC_LOCK_GUARD<br>
+#include "mutex.pass.cpp" // Use the existing
non-variadic test<br>
<br>
Added:
libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_types.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_types.pass.cpp?rev=272634&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_types.pass.cpp?rev=272634&view=auto</a><br>
==============================================================================<br>
---
libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_types.pass.cpp
(added)<br>
+++
libcxx/trunk/test/std/thread/thread.mutex/thread.lock/thread.lock.guard/variadic_types.pass.cpp
Mon Jun 13 22:48:09 2016<br>
@@ -0,0 +1,78 @@<br>
+//===----------------------------------------------------------------------===//<br>
+//<br>
+// The LLVM Compiler
Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and
the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+//<br>
+// UNSUPPORTED: libcpp-has-no-threads<br>
+// UNSUPPORTED: c++98, c++03<br>
+<br>
+// <mutex><br>
+<br>
+// template <class Mutex><br>
+// class lock_guard<br>
+// {<br>
+// public:<br>
+// typedef Mutex mutex_type;<br>
+// ...<br>
+// };<br>
+<br>
+#define _LIBCPP_ABI_VARIADIC_LOCK_GUARD<br>
+#include <mutex><br>
+#include <type_traits><br>
+<br>
+struct NAT {};<br>
+<br>
+template <class LG><br>
+auto test_typedef(int) -> typename
LG::mutex_type;<br>
+<br>
+template <class LG><br>
+auto test_typedef(...) -> NAT;<br>
+<br>
+template <class LG><br>
+constexpr bool has_mutex_type() {<br>
+ return
!std::is_same<decltype(test_typedef<LG>(0)),
NAT>::value;<br>
+}<br>
+<br>
+int main()<br>
+{<br>
+ {<br>
+ using T = std::lock_guard<>;<br>
+ static_assert(!has_mutex_type<T>(),
"");<br>
+ }<br>
+ {<br>
+ using M1 = std::mutex;<br>
+ using T = std::lock_guard<M1>;<br>
+
static_assert(std::is_same<T::mutex_type,
M1>::value, "");<br>
+ }<br>
+ {<br>
+ using M1 = std::recursive_mutex;<br>
+ using T = std::lock_guard<M1>;<br>
+
static_assert(std::is_same<T::mutex_type,
M1>::value, "");<br>
+ }<br>
+ {<br>
+ using M1 = std::mutex;<br>
+ using M2 = std::recursive_mutex;<br>
+ using T = std::lock_guard<M1, M2>;<br>
+ static_assert(!has_mutex_type<T>(),
"");<br>
+ }<br>
+ {<br>
+ using M1 = std::mutex;<br>
+ using M2 = std::recursive_mutex;<br>
+ using T = std::lock_guard<M1, M1,
M2>;<br>
+ static_assert(!has_mutex_type<T>(),
"");<br>
+ }<br>
+ {<br>
+ using M1 = std::mutex;<br>
+ using T = std::lock_guard<M1, M1>;<br>
+ static_assert(!has_mutex_type<T>(),
"");<br>
+ }<br>
+ {<br>
+ using M1 = std::recursive_mutex;<br>
+ using T = std::lock_guard<M1, M1,
M1>;<br>
+ static_assert(!has_mutex_type<T>(),
"");<br>
+ }<br>
+}<br>
<br>
Modified: libcxx/trunk/www/cxx1z_status.html<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/www/cxx1z_status.html?rev=272634&r1=272633&r2=272634&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/www/cxx1z_status.html?rev=272634&r1=272633&r2=272634&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/www/cxx1z_status.html (original)<br>
+++ libcxx/trunk/www/cxx1z_status.html Mon Jun 13
22:48:09 2016<br>
@@ -74,7 +74,7 @@<br>
<tr><td><a href="<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/P0006R0.html" rel="noreferrer" target="_blank"></a><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/P0006R0.html" target="_blank">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/P0006R0.html</a>">P0006R0</a></td><td>LWG</td><td>Adopt
Type Traits Variable Templates for
C++17.</td><td>Kona</td><td>Complete</td><td>3.8</td></tr><br>
<tr><td><a href="<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/P0092R1.html" rel="noreferrer" target="_blank"></a><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/P0092R1.html" target="_blank">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/P0092R1.html</a>">P0092R1</a></td><td>LWG</td><td>Polishing
<chrono></td><td>Kona</td><td>Complete</td><td>3.8</td></tr><br>
<tr><td><a href="<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/P0007R1.html" rel="noreferrer" target="_blank"></a><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/P0007R1.html" target="_blank">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/P0007R1.html</a>">P0007R1</a></td><td>LWG</td><td>Constant
View: A proposal for a
<tt>std::as_const</tt> helper function
template.</td><td>Kona</td><td>Complete</td><td>3.8</td></tr><br>
- <tr><td><a href="<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/P0156R0.htm" rel="noreferrer" target="_blank"></a><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/P0156R0.htm" target="_blank">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/P0156R0.htm</a>"
>P0156R0</a></td><td>LWG</td><td>Variadic
lock_guard(rev
3).</td><td>Kona</td><td></td><td></td></tr><br>
+ <tr><td><a href="<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0156r0.html" rel="noreferrer" target="_blank"></a><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0156r0.html" target="_blank">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0156r0.html</a>"
>P0156R0</a></td><td>LWG</td><td>Variadic
lock_guard(rev
3).</td><td>Kona</td><td>Complete
(ABI V2
Only)</td><td>3.9</td></tr><br>
<tr><td><a href="<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/P0074R0.html" rel="noreferrer" target="_blank"></a><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/P0074R0.html" target="_blank">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/P0074R0.html</a>">P0074R0</a></td><td>LWG</td><td>Making
<tt>std::owner_less</tt> more
flexible</td><td>Kona</td><td>Complete</td><td>3.8</td></tr><br>
<tr><td><a href="<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/P0013R1.html" rel="noreferrer" target="_blank"></a><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/P0013R1.html" target="_blank">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/P0013R1.html</a>">P0013R1</a></td><td>LWG</td><td>Logical
type traits rev
2</td><td>Kona</td><td>Complete</td><td>3.8</td></tr><br>
<tr><td></td><td></td><td></td><td></td><td></td><td></td></tr><br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote>
</div>
<br>
</div>
</div>
</div>
</blockquote>
</div>
<br>
</div>
<br>
<fieldset></fieldset>
<br>
<pre>_______________________________________________
cfe-commits mailing list
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a>
</pre>
</blockquote>
<br>
</div></div><span class="HOEnZb"><font color="#888888"><pre cols="72">--
Employee of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project
</pre>
</font></span></div>
<br>_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
<br></blockquote></div><br></div></div>