Test template instantiation for member functions of class templates defined
authorDouglas Gregor <dgregor@apple.com>
Wed, 22 Jul 2009 15:45:39 +0000 (15:45 +0000)
committerDouglas Gregor <dgregor@apple.com>
Wed, 22 Jul 2009 15:45:39 +0000 (15:45 +0000)
out of line.

llvm-svn: 76740

clang/test/CXX/temp/temp.decls/temp.class/temp.mem.func/p1inst.cpp [new file with mode: 0644]
clang/test/SemaTemplate/example-dynarray.cpp

diff --git a/clang/test/CXX/temp/temp.decls/temp.class/temp.mem.func/p1inst.cpp b/clang/test/CXX/temp/temp.decls/temp.class/temp.mem.func/p1inst.cpp
new file mode 100644 (file)
index 0000000..c505823
--- /dev/null
@@ -0,0 +1,17 @@
+// RUN: clang-cc -fsyntax-only -verify %s
+// Test instantiation of member functions of class templates defined out-of-line
+template<typename T, typename U>
+struct X0 {
+  void f(T *t, const U &u);
+  void f(T *);
+};
+
+template<typename T, typename U>
+void X0<T, U>::f(T *t, const U &u) {
+  *t = u; // expected-error{{not assignable}}
+}
+
+void test_f(X0<float, int> xfi, X0<void, int> xvi, float *fp, void *vp, int i) {
+  xfi.f(fp, i);
+  xvi.f(vp, i); // expected-note{{instantiation}}
+}
\ No newline at end of file
index 680ee04..7dcc508 100644 (file)
@@ -43,30 +43,8 @@ public:
   unsigned size() const { return Last - Start; }
   unsigned capacity() const { return End - Start; }
 
-  void push_back(const T& value) {
-    if (Last == End) {
-      unsigned NewCapacity = capacity() * 2;
-      if (NewCapacity == 0)
-        NewCapacity = 4;
-
-      T* NewStart = (T*)malloc(sizeof(T) * NewCapacity);
-
-      unsigned Size = size();
-      for (unsigned I = 0; I != Size; ++I)
-        new (NewStart + I) T(Start[I]);
-
-      // FIXME: destruct old values
-      free(Start);
-
-      Start = NewStart;
-      Last = Start + Size;
-      End = Start + NewCapacity;
-    }
-
-    new (Last) T(value);
-    ++Last;
-  }
-
+  void push_back(const T& value);
+  
   void pop_back() {
     // FIXME: destruct old value
     --Last;
@@ -108,6 +86,31 @@ public:
   T* Start, *Last, *End;
 };
 
+template<typename T>
+void dynarray<T>::push_back(const T& value) {
+  if (Last == End) {
+    unsigned NewCapacity = capacity() * 2;
+    if (NewCapacity == 0)
+      NewCapacity = 4;
+    
+    T* NewStart = (T*)malloc(sizeof(T) * NewCapacity);
+    
+    unsigned Size = size();
+    for (unsigned I = 0; I != Size; ++I)
+      new (NewStart + I) T(Start[I]);
+    
+    // FIXME: destruct old values
+    free(Start);
+    
+    Start = NewStart;
+    Last = Start + Size;
+    End = Start + NewCapacity;
+  }
+  
+  new (Last) T(value);
+  ++Last;
+}
+
 struct Point { 
   Point() { x = y = z = 0.0; }
   Point(const Point& other) : x(other.x), y(other.y), z(other.z) { }