diff options
author | Sebastian Redl <sebastian.redl@getdesigned.at> | 2009-05-29 16:43:59 +0000 |
---|---|---|
committer | Sebastian Redl <sebastian.redl@getdesigned.at> | 2009-05-29 16:43:59 +0000 |
commit | eed0ec5fdbe1896072e29c747fcd814be628dd73 (patch) | |
tree | 399b063fa959308d9ba0c0d87285c19124a7cf86 /clang/test/SemaTemplate/example-dynarray.cpp | |
parent | fc30bf9b16ba79d615730ad2caa319dd2d260f73 (diff) | |
download | bcm5719-llvm-eed0ec5fdbe1896072e29c747fcd814be628dd73.tar.gz bcm5719-llvm-eed0ec5fdbe1896072e29c747fcd814be628dd73.zip |
Fix usage of placement new. Placement new is not actually declared implicitly.
llvm-svn: 72576
Diffstat (limited to 'clang/test/SemaTemplate/example-dynarray.cpp')
-rw-r--r-- | clang/test/SemaTemplate/example-dynarray.cpp | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/clang/test/SemaTemplate/example-dynarray.cpp b/clang/test/SemaTemplate/example-dynarray.cpp index 51eece9e6f6..dd2488fc382 100644 --- a/clang/test/SemaTemplate/example-dynarray.cpp +++ b/clang/test/SemaTemplate/example-dynarray.cpp @@ -1,7 +1,15 @@ // RUN: clang-cc -fsyntax-only -verify %s +#include <stddef.h> #include <stdlib.h> #include <assert.h> +// Placement new requires <new> 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<typename T> 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<int>; -template struct dynarray<Point>; +template class dynarray<int>; +template class dynarray<Point>; int main() { dynarray<int> di; |