mirror of https://github.com/microsoft/clang.git
Fix a couple of places where we assumed that non-type template parameters are always rvalues.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@325095 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
789b385fd1
commit
d0f176e8eb
|
@ -3916,6 +3916,7 @@ class SubstNonTypeTemplateParmPackExpr : public Expr {
|
|||
|
||||
public:
|
||||
SubstNonTypeTemplateParmPackExpr(QualType T,
|
||||
ExprValueKind ValueKind,
|
||||
NonTypeTemplateParmDecl *Param,
|
||||
SourceLocation NameLoc,
|
||||
const TemplateArgument &ArgPack);
|
||||
|
|
|
@ -1330,10 +1330,11 @@ SizeOfPackExpr *SizeOfPackExpr::CreateDeserialized(ASTContext &Context,
|
|||
|
||||
SubstNonTypeTemplateParmPackExpr::
|
||||
SubstNonTypeTemplateParmPackExpr(QualType T,
|
||||
ExprValueKind ValueKind,
|
||||
NonTypeTemplateParmDecl *Param,
|
||||
SourceLocation NameLoc,
|
||||
const TemplateArgument &ArgPack)
|
||||
: Expr(SubstNonTypeTemplateParmPackExprClass, T, VK_RValue, OK_Ordinary,
|
||||
: Expr(SubstNonTypeTemplateParmPackExprClass, T, ValueKind, OK_Ordinary,
|
||||
true, true, true, true),
|
||||
Param(Param), Arguments(ArgPack.pack_begin()),
|
||||
NumArguments(ArgPack.pack_size()), NameLoc(NameLoc) {}
|
||||
|
|
|
@ -1212,11 +1212,11 @@ TemplateInstantiator::TransformTemplateParmRefExpr(DeclRefExpr *E,
|
|||
NTTP->getDeclName());
|
||||
if (TargetType.isNull())
|
||||
return ExprError();
|
||||
|
||||
return new (SemaRef.Context) SubstNonTypeTemplateParmPackExpr(TargetType,
|
||||
NTTP,
|
||||
E->getLocation(),
|
||||
Arg);
|
||||
|
||||
return new (SemaRef.Context) SubstNonTypeTemplateParmPackExpr(
|
||||
TargetType.getNonLValueExprType(SemaRef.Context),
|
||||
TargetType->isReferenceType() ? VK_LValue : VK_RValue, NTTP,
|
||||
E->getLocation(), Arg);
|
||||
}
|
||||
|
||||
Arg = getPackSubstitutedTemplateArgument(getSema(), Arg);
|
||||
|
|
|
@ -11392,8 +11392,10 @@ TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
|
|||
ArgStorage = TemplateArgument(TemplateName(TTPD), None);
|
||||
} else {
|
||||
auto *VD = cast<ValueDecl>(Pack);
|
||||
ExprResult DRE = getSema().BuildDeclRefExpr(VD, VD->getType(),
|
||||
VK_RValue, E->getPackLoc());
|
||||
ExprResult DRE = getSema().BuildDeclRefExpr(
|
||||
VD, VD->getType().getNonLValueExprType(getSema().Context),
|
||||
VD->getType()->isReferenceType() ? VK_LValue : VK_RValue,
|
||||
E->getPackLoc());
|
||||
if (DRE.isInvalid())
|
||||
return ExprError();
|
||||
ArgStorage = new (getSema().Context) PackExpansionExpr(
|
||||
|
|
|
@ -161,3 +161,10 @@ class Outer1 {
|
|||
template <typename T> struct X;
|
||||
template <typename T> int X<T>::func() {} // expected-error{{out-of-line definition of 'func' from class 'X<T>' without definition}}
|
||||
};
|
||||
|
||||
namespace RefPack {
|
||||
template<const int &...N> struct A { template<typename ...T> void f(T (&...t)[N]); };
|
||||
constexpr int k = 10;
|
||||
int arr[10];
|
||||
void g() { A<k>().f(arr); }
|
||||
}
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
// RUN: %clang_cc1 -std=c++11 -verify %s
|
||||
// expected-no-diagnostics
|
||||
|
||||
template<int &...Ns> int f() {
|
||||
return sizeof...(Ns);
|
||||
}
|
||||
template int f<>();
|
Loading…
Reference in New Issue