Commit 584eaadb authored by Bill Wendling's avatar Bill Wendling
Browse files

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
parent ea5f85ee
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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) {
+32 −0
Original line number Diff line number Diff line
@@ -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}}
}