diff options
author | Bill Wendling <isanbard@gmail.com> | 2012-04-25 20:21:37 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2012-04-25 20:21:37 +0000 |
commit | 584eaadb4ae75e7297c381398b6cb7be1dbb2c53 (patch) | |
tree | 5696ee71a3b5db9a89ee26901ea6e1c8c30543e3 | |
parent | Merging r155536: (diff) | |
download | llvm-project-584eaadb4ae75e7297c381398b6cb7be1dbb2c53.tar.gz llvm-project-584eaadb4ae75e7297c381398b6cb7be1dbb2c53.tar.bz2 llvm-project-584eaadb4ae75e7297c381398b6cb7be1dbb2c53.zip |
Merging r155576:
------------------------------------------------------------------------
r155576 | akirtzidis | 2012-04-25 11:39:17 -0700 (Wed, 25 Apr 2012) | 4 lines
When resolving default template arguments, it should be done in the declaration context
of the template what we are going to instantiate.
Fixes various crashes of rdar://11242625 & http://llvm.org/PR11421.
------------------------------------------------------------------------
llvm-svn: 155582
-rw-r--r-- | clang/lib/Sema/SemaTemplate.cpp | 3 | ||||
-rw-r--r-- | clang/test/SemaTemplate/dependent-names.cpp | 32 |
2 files changed, 35 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index ff8c4dacc246..d5488563d358 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -2496,6 +2496,7 @@ SubstDefaultTemplateArgument(Sema &SemaRef, Converted.size(), SourceRange(TemplateLoc, RAngleLoc)); + Sema::ContextRAII SavedContext(SemaRef, Template->getDeclContext()); ArgType = SemaRef.SubstType(ArgType, AllTemplateArgs, Param->getDefaultArgumentLoc(), Param->getDeclName()); @@ -2544,6 +2545,7 @@ SubstDefaultTemplateArgument(Sema &SemaRef, Converted.size(), SourceRange(TemplateLoc, RAngleLoc)); + Sema::ContextRAII SavedContext(SemaRef, Template->getDeclContext()); return SemaRef.SubstExpr(Param->getDefaultArgument(), AllTemplateArgs); } @@ -2591,6 +2593,7 @@ SubstDefaultTemplateArgument(Sema &SemaRef, Converted.size(), SourceRange(TemplateLoc, RAngleLoc)); + Sema::ContextRAII SavedContext(SemaRef, Template->getDeclContext()); // Substitute into the nested-name-specifier first, QualifierLoc = Param->getDefaultArgument().getTemplateQualifierLoc(); if (QualifierLoc) { diff --git a/clang/test/SemaTemplate/dependent-names.cpp b/clang/test/SemaTemplate/dependent-names.cpp index 36e1ad8f17f0..924bad9257b9 100644 --- a/clang/test/SemaTemplate/dependent-names.cpp +++ b/clang/test/SemaTemplate/dependent-names.cpp @@ -292,3 +292,35 @@ namespace PR10187 { template void f<S>(); // expected-note {{here}} } } + +namespace rdar11242625 { + +template <typename T> +struct Main { + struct default_names { + typedef int id; + }; + + template <typename T2 = typename default_names::id> + struct TS { + T2 q; + }; +}; + +struct Sub : public Main<int> { + TS<> ff; +}; + +int arr[sizeof(Sub)]; + +} + +namespace PR11421 { +template < unsigned > struct X { + static const unsigned dimension = 3; + template<unsigned dim=dimension> + struct Y: Y<dim> { }; // expected-error {{incomplete type}} expected-note {{is not complete until the closing}} +}; +typedef X<3> X3; +X3::Y<>::iterator it; // expected-note {{requested here}} +} |