Author: rsmith Date: Tue Feb 13 18:07:53 2018 New Revision: 325095 URL: http://llvm.org/viewvc/llvm-project?rev=325095&view=rev Log: Fix a couple of places where we assumed that non-type template parameters are always rvalues.
Added: cfe/trunk/test/SemaTemplate/sizeof-pack.cpp Modified: cfe/trunk/include/clang/AST/ExprCXX.h cfe/trunk/lib/AST/ExprCXX.cpp cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp cfe/trunk/lib/Sema/TreeTransform.h cfe/trunk/test/SemaTemplate/nested-template.cpp Modified: cfe/trunk/include/clang/AST/ExprCXX.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ExprCXX.h?rev=325095&r1=325094&r2=325095&view=diff ============================================================================== --- cfe/trunk/include/clang/AST/ExprCXX.h (original) +++ cfe/trunk/include/clang/AST/ExprCXX.h Tue Feb 13 18:07:53 2018 @@ -3916,6 +3916,7 @@ class SubstNonTypeTemplateParmPackExpr : public: SubstNonTypeTemplateParmPackExpr(QualType T, + ExprValueKind ValueKind, NonTypeTemplateParmDecl *Param, SourceLocation NameLoc, const TemplateArgument &ArgPack); Modified: cfe/trunk/lib/AST/ExprCXX.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprCXX.cpp?rev=325095&r1=325094&r2=325095&view=diff ============================================================================== --- cfe/trunk/lib/AST/ExprCXX.cpp (original) +++ cfe/trunk/lib/AST/ExprCXX.cpp Tue Feb 13 18:07:53 2018 @@ -1330,10 +1330,11 @@ SizeOfPackExpr *SizeOfPackExpr::CreateDe 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) {} Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp?rev=325095&r1=325094&r2=325095&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp (original) +++ cfe/trunk/lib/Sema/SemaTemplateInstantiate.cpp Tue Feb 13 18:07:53 2018 @@ -1212,11 +1212,11 @@ TemplateInstantiator::TransformTemplateP 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); Modified: cfe/trunk/lib/Sema/TreeTransform.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=325095&r1=325094&r2=325095&view=diff ============================================================================== --- cfe/trunk/lib/Sema/TreeTransform.h (original) +++ cfe/trunk/lib/Sema/TreeTransform.h Tue Feb 13 18:07:53 2018 @@ -11392,8 +11392,10 @@ TreeTransform<Derived>::TransformSizeOfP 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( Modified: cfe/trunk/test/SemaTemplate/nested-template.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/nested-template.cpp?rev=325095&r1=325094&r2=325095&view=diff ============================================================================== --- cfe/trunk/test/SemaTemplate/nested-template.cpp (original) +++ cfe/trunk/test/SemaTemplate/nested-template.cpp Tue Feb 13 18:07:53 2018 @@ -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); } +} Added: cfe/trunk/test/SemaTemplate/sizeof-pack.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/sizeof-pack.cpp?rev=325095&view=auto ============================================================================== --- cfe/trunk/test/SemaTemplate/sizeof-pack.cpp (added) +++ cfe/trunk/test/SemaTemplate/sizeof-pack.cpp Tue Feb 13 18:07:53 2018 @@ -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<>(); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits