[cfe-commits] r101184 - in /cfe/trunk: lib/AST/Decl.cpp test/CXX/temp/temp.decls/temp.friend/p1.cpp

John McCall rjmccall at apple.com
Tue Apr 13 15:18:28 PDT 2010


Author: rjmccall
Date: Tue Apr 13 17:18:28 2010
New Revision: 101184

URL: http://llvm.org/viewvc/llvm-project?rev=101184&view=rev
Log:
Fix an embarrasing memory error.  I was apparently very tired when I wrote this
code the first time.

Fixes PR6827.


Modified:
    cfe/trunk/lib/AST/Decl.cpp
    cfe/trunk/test/CXX/temp/temp.decls/temp.friend/p1.cpp

Modified: cfe/trunk/lib/AST/Decl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Decl.cpp?rev=101184&r1=101183&r2=101184&view=diff
==============================================================================
--- cfe/trunk/lib/AST/Decl.cpp (original)
+++ cfe/trunk/lib/AST/Decl.cpp Tue Apr 13 17:18:28 2010
@@ -1316,7 +1316,7 @@
   assert(TemplateOrSpecialization.isNull());
   size_t Size = sizeof(DependentFunctionTemplateSpecializationInfo);
   Size += Templates.size() * sizeof(FunctionTemplateDecl*);
-  Size += TemplateArgs.size();
+  Size += TemplateArgs.size() * sizeof(TemplateArgumentLoc);
   void *Buffer = Context.Allocate(Size);
   DependentFunctionTemplateSpecializationInfo *Info =
     new (Buffer) DependentFunctionTemplateSpecializationInfo(Templates,

Modified: cfe/trunk/test/CXX/temp/temp.decls/temp.friend/p1.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/temp/temp.decls/temp.friend/p1.cpp?rev=101184&r1=101183&r2=101184&view=diff
==============================================================================
--- cfe/trunk/test/CXX/temp/temp.decls/temp.friend/p1.cpp (original)
+++ cfe/trunk/test/CXX/temp/temp.decls/temp.friend/p1.cpp Tue Apr 13 17:18:28 2010
@@ -251,3 +251,28 @@
   template struct Foo::IteratorImpl<int>;
   template struct Foo::IteratorImpl<long>;  
 }
+
+// PR6827
+namespace test12 {
+  template <typename T> class Foo;
+  template <typename T> Foo<T> foo(T* t){ return Foo<T>(t, true); }
+
+  template <typename T> class Foo {
+  public:
+    Foo(T*);
+    friend Foo<T> foo<T>(T*);
+  private:
+    Foo(T*, bool); // expected-note {{declared private here}}
+  };
+
+  // Should work.
+  int globalInt;
+  Foo<int> f = foo(&globalInt);
+
+  // Shouldn't work.
+  long globalLong;
+  template <> Foo<long> foo(long *t) {
+    Foo<int> s(&globalInt, false); // expected-error {{calling a private constructor}}
+    return Foo<long>(t, true);
+  }
+}





More information about the cfe-commits mailing list