Author: ericwf Date: Wed Apr 12 20:11:58 2017 New Revision: 300158 URL: http://llvm.org/viewvc/llvm-project?rev=300158&view=rev Log: Add tests that std::unique_ptr's default constructor is constexpr.
std::unique_ptr's default constructor must be constexpr in order to allow constant initialization to take place for static objects; Even though we can never have a constexpr unique_ptr variable since it's not a literal type. This patch adds tests that constant initialization takes place by using the __attribute__((require_constant_initialization)) macro. Added: libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default.pass.cpp - copied, changed from r300156, libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default01.pass.cpp libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default_allows_incomplete.pass.cpp - copied, changed from r300156, libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default02.pass.cpp Removed: libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default01.pass.cpp libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default02.pass.cpp Modified: libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/default.pass.cpp Copied: libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default.pass.cpp (from r300156, libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default01.pass.cpp) URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default.pass.cpp?p2=libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default.pass.cpp&p1=libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default01.pass.cpp&r1=300156&r2=300158&rev=300158&view=diff ============================================================================== --- libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default01.pass.cpp (original) +++ libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default.pass.cpp Wed Apr 12 20:11:58 2017 @@ -17,31 +17,34 @@ #include <memory> #include <cassert> +#include "test_macros.h" -class Deleter -{ - int state_; +#if defined(_LIBCPP_VERSION) +_LIBCPP_SAFE_STATIC std::unique_ptr<int[]> global_static_unique_ptr; +#endif - Deleter(Deleter&); - Deleter& operator=(Deleter&); +class Deleter { + int state_; + + Deleter(Deleter&); + Deleter& operator=(Deleter&); public: - Deleter() : state_(5) {} + Deleter() : state_(5) {} - int state() const {return state_;} + int state() const { return state_; } - void operator()(void*) {} + void operator()(void*) {} }; -int main() -{ - { +int main() { + { std::unique_ptr<int[]> p; assert(p.get() == 0); - } - { + } + { std::unique_ptr<int[], Deleter> p; assert(p.get() == 0); assert(p.get_deleter().state() == 5); - } + } } Removed: libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default01.pass.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default01.pass.cpp?rev=300157&view=auto ============================================================================== --- libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default01.pass.cpp (original) +++ libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default01.pass.cpp (removed) @@ -1,47 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -// <memory> - -// unique_ptr - -// Test unique_ptr default ctor - -// default unique_ptr ctor should only require default Deleter ctor - -#include <memory> -#include <cassert> - -class Deleter -{ - int state_; - - Deleter(Deleter&); - Deleter& operator=(Deleter&); - -public: - Deleter() : state_(5) {} - - int state() const {return state_;} - - void operator()(void*) {} -}; - -int main() -{ - { - std::unique_ptr<int[]> p; - assert(p.get() == 0); - } - { - std::unique_ptr<int[], Deleter> p; - assert(p.get() == 0); - assert(p.get_deleter().state() == 5); - } -} Removed: libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default02.pass.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default02.pass.cpp?rev=300157&view=auto ============================================================================== --- libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default02.pass.cpp (original) +++ libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default02.pass.cpp (removed) @@ -1,87 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is dual licensed under the MIT and the University of Illinois Open -// Source Licenses. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -// <memory> - -// unique_ptr - -// Test default unique_ptr<T[]> ctor - -// default unique_ptr<T[]> ctor shouldn't require complete type - -#include <memory> -#include <cassert> - -struct A; - -class Deleter -{ - int state_; - - Deleter(Deleter&); - Deleter& operator=(Deleter&); - -public: - Deleter() : state_(5) {} - - int state() const {return state_;} - - void operator()(A* p); -}; - -void check(int i); - -template <class D = std::default_delete<A> > -struct B -{ - std::unique_ptr<A[], D> a_; - B(); - ~B(); - - A* get() const {return a_.get();} - D& get_deleter() {return a_.get_deleter();} -}; - -int main() -{ - { - B<> s; - assert(s.get() == 0); - } - check(0); - { - B<Deleter> s; - assert(s.get() == 0); - assert(s.get_deleter().state() == 5); - } - check(0); -} - -struct A -{ - static int count; - A() {++count;} - A(const A&) {++count;} - ~A() {--count;} -}; - -int A::count = 0; - -void Deleter::operator()(A* p) {delete p;} - -void check(int i) -{ - assert(A::count == i); -} - -template <class D> -B<D>::B() {} - -template <class D> -B<D>::~B() {} Copied: libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default_allows_incomplete.pass.cpp (from r300156, libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default02.pass.cpp) URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default_allows_incomplete.pass.cpp?p2=libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default_allows_incomplete.pass.cpp&p1=libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default02.pass.cpp&r1=300156&r2=300158&rev=300158&view=diff ============================================================================== --- libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default02.pass.cpp (original) +++ libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.runtime/unique.ptr.runtime.ctor/default_allows_incomplete.pass.cpp Wed Apr 12 20:11:58 2017 @@ -20,65 +20,58 @@ struct A; -class Deleter -{ - int state_; +class Deleter { + int state_; - Deleter(Deleter&); - Deleter& operator=(Deleter&); + Deleter(Deleter&); + Deleter& operator=(Deleter&); public: - Deleter() : state_(5) {} + Deleter() : state_(5) {} - int state() const {return state_;} + int state() const { return state_; } - void operator()(A* p); + void operator()(A* p); }; void check(int i); -template <class D = std::default_delete<A> > -struct B -{ - std::unique_ptr<A[], D> a_; - B(); - ~B(); +template <class D = std::default_delete<A>> +struct B { + std::unique_ptr<A[], D> a_; + B(); + ~B(); - A* get() const {return a_.get();} - D& get_deleter() {return a_.get_deleter();} + A* get() const { return a_.get(); } + D& get_deleter() { return a_.get_deleter(); } }; -int main() -{ - { +int main() { + { B<> s; assert(s.get() == 0); - } - check(0); - { + } + check(0); + { B<Deleter> s; assert(s.get() == 0); assert(s.get_deleter().state() == 5); - } - check(0); + } + check(0); } -struct A -{ - static int count; - A() {++count;} - A(const A&) {++count;} - ~A() {--count;} +struct A { + static int count; + A() { ++count; } + A(const A&) { ++count; } + ~A() { --count; } }; int A::count = 0; -void Deleter::operator()(A* p) {delete p;} +void Deleter::operator()(A* p) { delete p; } -void check(int i) -{ - assert(A::count == i); -} +void check(int i) { assert(A::count == i); } template <class D> B<D>::B() {} Modified: libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/default.pass.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/default.pass.cpp?rev=300158&r1=300157&r2=300158&view=diff ============================================================================== --- libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/default.pass.cpp (original) +++ libcxx/trunk/test/std/utilities/memory/unique.ptr/unique.ptr.single/unique.ptr.single.ctor/default.pass.cpp Wed Apr 12 20:11:58 2017 @@ -25,9 +25,14 @@ #include <memory> #include <cassert> +#include "test_macros.h" #include "deleter_types.h" +#if defined(_LIBCPP_VERSION) +_LIBCPP_SAFE_STATIC std::unique_ptr<int> global_static_unique_ptr; +#endif + struct IncompleteT; void checkNumIncompleteTypeAlive(int i); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits