diff options
author | John McCall <rjmccall@apple.com> | 2010-04-13 22:18:28 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2010-04-13 22:18:28 +0000 |
commit | 21c0160959961b3a6ab3308608ee3fde182ecb49 (patch) | |
tree | 7d096b22cb7ff0f6197ff87cd090dcbf5814e2a8 | |
parent | ab970f90ce31a53fe7e6375a37536bf0832fd922 (diff) |
Fix an embarrasing memory error. I was apparently very tired when I wrote this
code the first time.
Fixes PR6827.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@101184 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/AST/Decl.cpp | 2 | ||||
-rw-r--r-- | test/CXX/temp/temp.decls/temp.friend/p1.cpp | 25 |
2 files changed, 26 insertions, 1 deletions
diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index 965f32da28..d4cc945b1b 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -1316,7 +1316,7 @@ FunctionDecl::setDependentTemplateSpecialization(ASTContext &Context, 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, diff --git a/test/CXX/temp/temp.decls/temp.friend/p1.cpp b/test/CXX/temp/temp.decls/temp.friend/p1.cpp index 03e51321bb..41cf3632b1 100644 --- a/test/CXX/temp/temp.decls/temp.friend/p1.cpp +++ b/test/CXX/temp/temp.decls/temp.friend/p1.cpp @@ -251,3 +251,28 @@ namespace test11 { 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); + } +} |