From e47590e17725cd37e84bd959d42ea0505b5f1b0d Mon Sep 17 00:00:00 2001 From: Sebastian Redl Date: Fri, 29 May 2009 16:43:59 +0000 Subject: [PATCH] Fix usage of placement new. Placement new is not actually declared implicitly. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72576 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/SemaTemplate/example-dynarray.cpp | 28 ++++++++++++++------------ 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/test/SemaTemplate/example-dynarray.cpp b/test/SemaTemplate/example-dynarray.cpp index 51eece9e6f..dd2488fc38 100644 --- a/test/SemaTemplate/example-dynarray.cpp +++ b/test/SemaTemplate/example-dynarray.cpp @@ -1,7 +1,15 @@ // RUN: clang-cc -fsyntax-only -verify %s +#include #include #include +// Placement new requires to be included, but we don't support that yet. +void* operator new(size_t, void* ptr) throw() { + return ptr; +} +void operator delete(void*, void*) throw() { +} + template class dynarray { public: @@ -11,10 +19,8 @@ public: Start = (T*)malloc(sizeof(T) * other.size()); Last = End = Start + other.size(); - // FIXME: Use placement new, below for (unsigned I = 0, N = other.size(); I != N; ++I) - Start[I] = other[I]; - // new (Start + I) T(other[I]); + new (Start + I) T(other[I]); } ~dynarray() { @@ -24,11 +30,9 @@ public: dynarray &operator=(const dynarray &other) { T* NewStart = (T*)malloc(sizeof(T) * other.size()); - // FIXME: Use placement new, below for (unsigned I = 0, N = other.size(); I != N; ++I) - NewStart[I] = other[I]; - // new (Start + I) T(other[I]); - + new (Start + I) T(other[I]); + // FIXME: destroy everything in Start free(Start); Start = NewStart; @@ -49,8 +53,7 @@ public: unsigned Size = size(); for (unsigned I = 0; I != Size; ++I) - // FIXME: new (NewStart + I) T(Start[I]) - NewStart[I] = Start[I]; + new (NewStart + I) T(Start[I]); // FIXME: destruct old values free(Start); @@ -60,8 +63,7 @@ public: End = Start + NewCapacity; } - // FIXME: new (Last) T(value); - *Last = value; + new (Last) T(value); ++Last; } @@ -100,8 +102,8 @@ struct Point { // FIXME: remove these when we have implicit instantiation for member // functions of class templates. -template struct dynarray; -template struct dynarray; +template class dynarray; +template class dynarray; int main() { dynarray di; -- 2.40.0