diff options
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Sema/SemaTemplate.cpp | 1 | ||||
| -rw-r--r-- | clang/test/SemaTemplate/default-arguments.cpp | 28 |
2 files changed, 28 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 2f3309b0593..878243932c8 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -3281,7 +3281,6 @@ SubstDefaultTemplateArgument(Sema &SemaRef, for (unsigned i = 0, e = Param->getDepth(); i != e; ++i) TemplateArgLists.addOuterTemplateArguments(None); - Sema::ContextRAII SavedContext(SemaRef, Template->getDeclContext()); EnterExpressionEvaluationContext ConstantEvaluated(SemaRef, Sema::ConstantEvaluated); return SemaRef.SubstExpr(Param->getDefaultArgument(), TemplateArgLists); diff --git a/clang/test/SemaTemplate/default-arguments.cpp b/clang/test/SemaTemplate/default-arguments.cpp index 740a5a9d07b..d3e249db7ee 100644 --- a/clang/test/SemaTemplate/default-arguments.cpp +++ b/clang/test/SemaTemplate/default-arguments.cpp @@ -179,3 +179,31 @@ struct C { C(T t = ); // expected-error {{expected expression}} }; C<int> obj; + +namespace PR26134 { +// Make sure when substituting default template arguments we do it in the current context. +template<class T, bool Val = T::value> +struct X {}; + +template<bool B> struct Y { + void f() { X<Y> xy; } + static const bool value = B; +}; + +namespace ns1 { +template<class T0> +struct X { + template<bool B = T0::value> struct XInner { static const bool value = B; }; +}; +template<bool B> struct S { static const bool value = B; }; +#if __cplusplus > 199711L +template<bool B> struct Y { + static constexpr bool f() { return typename X<S<B>>::template XInner<>{}.value; } + static_assert(f() == B, ""); +}; +Y<true> y; +Y<false> y2; +#endif + +} // end ns1 +} // end ns PR26134 |

