Make delegating initializers use a similar codepath to base initializers in dependent contexts. PR12890.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@157136 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Eli Friedman 2012-05-19 23:35:23 +00:00
Родитель 2b309fb125
Коммит d21016f0b6
2 изменённых файлов: 28 добавлений и 0 удалений

Просмотреть файл

@ -2234,6 +2234,16 @@ Sema::BuildDelegatingInitializer(TypeSourceInfo *TInfo, Expr *Init,
if (DelegationInit.isInvalid()) if (DelegationInit.isInvalid())
return true; return true;
// If we are in a dependent context, template instantiation will
// perform this type-checking again. Just save the arguments that we
// received in a ParenListExpr.
// FIXME: This isn't quite ideal, since our ASTs don't capture all
// of the information that we have about the base
// initializer. However, deconstructing the ASTs is a dicey process,
// and this approach is far more likely to get the corner cases right.
if (CurContext->isDependentContext())
DelegationInit = Owned(Init);
return new (Context) CXXCtorInitializer(Context, TInfo, InitRange.getBegin(), return new (Context) CXXCtorInitializer(Context, TInfo, InitRange.getBegin(),
DelegationInit.takeAs<Expr>(), DelegationInit.takeAs<Expr>(),
InitRange.getEnd()); InitRange.getEnd());

Просмотреть файл

@ -29,3 +29,21 @@ namespace PR10457 {
Foo f(1, 1); Foo f(1, 1);
} }
} }
namespace PR12890 {
class Document
{
public:
Document() = default;
template <class T>
explicit
Document(T&& t) : Document()
{
}
};
void f()
{
Document d(1);
}
}