Special-case default argument expression in instantiation. This should fix PR4301. Doug, please double-check my assumptions. Read the PR for more details.
llvm-svn: 86465
This commit is contained in:
parent
b0a05f7ca1
commit
14236c8e82
|
|
@ -427,6 +427,9 @@ namespace {
|
||||||
Sema::OwningExprResult TransformDeclRefExpr(DeclRefExpr *E,
|
Sema::OwningExprResult TransformDeclRefExpr(DeclRefExpr *E,
|
||||||
bool isAddressOfOperand);
|
bool isAddressOfOperand);
|
||||||
|
|
||||||
|
Sema::OwningExprResult TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E,
|
||||||
|
bool isAddressOfOperand);
|
||||||
|
|
||||||
/// \brief Transforms a template type parameter type by performing
|
/// \brief Transforms a template type parameter type by performing
|
||||||
/// substitution of the corresponding template type argument.
|
/// substitution of the corresponding template type argument.
|
||||||
QualType TransformTemplateTypeParmType(TypeLocBuilder &TLB,
|
QualType TransformTemplateTypeParmType(TypeLocBuilder &TLB,
|
||||||
|
|
@ -648,6 +651,15 @@ TemplateInstantiator::TransformDeclRefExpr(DeclRefExpr *E,
|
||||||
isAddressOfOperand);
|
isAddressOfOperand);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Sema::OwningExprResult TemplateInstantiator::TransformCXXDefaultArgExpr(
|
||||||
|
CXXDefaultArgExpr *E, bool isAddressOfOperand) {
|
||||||
|
assert(!cast<FunctionDecl>(E->getParam()->getDeclContext())->
|
||||||
|
getDescribedFunctionTemplate() &&
|
||||||
|
"Default arg expressions are never formed in dependent cases.");
|
||||||
|
return SemaRef.Owned(E->Retain());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
QualType
|
QualType
|
||||||
TemplateInstantiator::TransformTemplateTypeParmType(TypeLocBuilder &TLB,
|
TemplateInstantiator::TransformTemplateTypeParmType(TypeLocBuilder &TLB,
|
||||||
TemplateTypeParmTypeLoc TL) {
|
TemplateTypeParmTypeLoc TL) {
|
||||||
|
|
|
||||||
|
|
@ -108,3 +108,26 @@ struct D {
|
||||||
};
|
};
|
||||||
D::D() { } // expected-note {{in instantiation of default function argument expression for 'A<int *>' required he}}
|
D::D() { } // expected-note {{in instantiation of default function argument expression for 'A<int *>' required he}}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// PR5301
|
||||||
|
namespace pr5301 {
|
||||||
|
void f(int, int = 0);
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void g(T, T = 0);
|
||||||
|
|
||||||
|
template <int I>
|
||||||
|
void i(int a = I);
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void h(T t) {
|
||||||
|
f(0);
|
||||||
|
g(1);
|
||||||
|
g(t);
|
||||||
|
i<2>();
|
||||||
|
}
|
||||||
|
|
||||||
|
void test() {
|
||||||
|
h(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue