forked from OSchip/llvm-project
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:
parent
87585d72a5
commit
900d980cd8
|
@ -1316,7 +1316,7 @@ FunctionDecl::setDependentTemplateSpecialization(ASTContext &Context,
|
||||||
assert(TemplateOrSpecialization.isNull());
|
assert(TemplateOrSpecialization.isNull());
|
||||||
size_t Size = sizeof(DependentFunctionTemplateSpecializationInfo);
|
size_t Size = sizeof(DependentFunctionTemplateSpecializationInfo);
|
||||||
Size += Templates.size() * sizeof(FunctionTemplateDecl*);
|
Size += Templates.size() * sizeof(FunctionTemplateDecl*);
|
||||||
Size += TemplateArgs.size();
|
Size += TemplateArgs.size() * sizeof(TemplateArgumentLoc);
|
||||||
void *Buffer = Context.Allocate(Size);
|
void *Buffer = Context.Allocate(Size);
|
||||||
DependentFunctionTemplateSpecializationInfo *Info =
|
DependentFunctionTemplateSpecializationInfo *Info =
|
||||||
new (Buffer) DependentFunctionTemplateSpecializationInfo(Templates,
|
new (Buffer) DependentFunctionTemplateSpecializationInfo(Templates,
|
||||||
|
|
|
@ -251,3 +251,28 @@ namespace test11 {
|
||||||
template struct Foo::IteratorImpl<int>;
|
template struct Foo::IteratorImpl<int>;
|
||||||
template struct Foo::IteratorImpl<long>;
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue