summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2012-04-25 20:21:37 +0000
committerBill Wendling <isanbard@gmail.com>2012-04-25 20:21:37 +0000
commit584eaadb4ae75e7297c381398b6cb7be1dbb2c53 (patch)
tree5696ee71a3b5db9a89ee26901ea6e1c8c30543e3
parentMerging r155536: (diff)
downloadllvm-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.cpp3
-rw-r--r--clang/test/SemaTemplate/dependent-names.cpp32
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}}
+}