manmanren created this revision. manmanren added reviewers: rsmith, EricWF, faisalv. manmanren added a subscriber: cfe-commits.
In VisitNonTypeTemplateParamDecl, before SubstExpr with the default argument, we should create a ConstantEvaluated ExpressionEvaluationContext. Without this, it is possible to use a PotentiallyEvaluated ExpressionEvaluationContext; and MaybeODRUseExprs will not be cleared when popping the context, causing assertion failure. This is similar to how we handle the context before SubstExpr with the default argument, in SubstDefaultTemplateArgument. Part of PR13986. rdar://24480205 http://reviews.llvm.org/D17576 Files: lib/Sema/SemaTemplateInstantiateDecl.cpp test/SemaTemplate/default-arguments-cxx0x.cpp Index: test/SemaTemplate/default-arguments-cxx0x.cpp =================================================================== --- test/SemaTemplate/default-arguments-cxx0x.cpp +++ test/SemaTemplate/default-arguments-cxx0x.cpp @@ -75,3 +75,13 @@ g<int>(); } } + +// rdar://problem/24480205 +namespace PR13986 { + constexpr unsigned Dynamic = 0; + template <unsigned> class A { template <unsigned = Dynamic> void m_fn1(); }; + class Test { + ~Test() {} + A<1> m_target; + }; +} Index: lib/Sema/SemaTemplateInstantiateDecl.cpp =================================================================== --- lib/Sema/SemaTemplateInstantiateDecl.cpp +++ lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -2110,6 +2110,8 @@ Param->setInvalidDecl(); if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited()) { + EnterExpressionEvaluationContext ConstantEvaluated(SemaRef, + Sema::ConstantEvaluated); ExprResult Value = SemaRef.SubstExpr(D->getDefaultArgument(), TemplateArgs); if (!Value.isInvalid()) Param->setDefaultArgument(Value.get());
Index: test/SemaTemplate/default-arguments-cxx0x.cpp =================================================================== --- test/SemaTemplate/default-arguments-cxx0x.cpp +++ test/SemaTemplate/default-arguments-cxx0x.cpp @@ -75,3 +75,13 @@ g<int>(); } } + +// rdar://problem/24480205 +namespace PR13986 { + constexpr unsigned Dynamic = 0; + template <unsigned> class A { template <unsigned = Dynamic> void m_fn1(); }; + class Test { + ~Test() {} + A<1> m_target; + }; +} Index: lib/Sema/SemaTemplateInstantiateDecl.cpp =================================================================== --- lib/Sema/SemaTemplateInstantiateDecl.cpp +++ lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -2110,6 +2110,8 @@ Param->setInvalidDecl(); if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited()) { + EnterExpressionEvaluationContext ConstantEvaluated(SemaRef, + Sema::ConstantEvaluated); ExprResult Value = SemaRef.SubstExpr(D->getDefaultArgument(), TemplateArgs); if (!Value.isInvalid()) Param->setDefaultArgument(Value.get());
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits