Fix an embarrasing memory error. I was apparently very tired when I wrote this

code the first time.

Fixes PR6827.

llvm-svn: 101184
This commit is contained in:
John McCall 2010-04-13 22:18:28 +00:00
parent 87585d72a5
commit 900d980cd8
2 changed files with 26 additions and 1 deletions

View File

@ -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,

View File

@ -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);
}
}