Commit 8f456a6c authored by Bill Wendling's avatar Bill Wendling
Browse files

Merging r197305:

------------------------------------------------------------------------
r197305 | rsmith | 2013-12-13 19:18:05 -0800 (Fri, 13 Dec 2013) | 7 lines

PR18246: When performing template argument deduction to decide which template
is specialized by an explicit specialization, start from the first declaration
in case we've got a member of a class template (redeclarations might not number
the template parameters the same way).

Our recover here is still far from ideal.

------------------------------------------------------------------------

llvm-svn: 197319
parent 56206980
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -6523,9 +6523,9 @@ bool Sema::CheckFunctionTemplateSpecialization(
      // FIXME: It is somewhat wasteful to build
      TemplateDeductionInfo Info(FailedCandidates.getLocation());
      FunctionDecl *Specialization = 0;
      if (TemplateDeductionResult TDK
            = DeduceTemplateArguments(FunTmpl, ExplicitTemplateArgs, FT,
                                      Specialization, Info)) {
      if (TemplateDeductionResult TDK = DeduceTemplateArguments(
              cast<FunctionTemplateDecl>(FunTmpl->getFirstDecl()),
              ExplicitTemplateArgs, FT, Specialization, Info)) {
        // Template argument deduction failed; record why it failed, so
        // that we can provide nifty diagnostics.
        FailedCandidates.addCandidate()
+19 −0
Original line number Diff line number Diff line
@@ -28,3 +28,22 @@ namespace PR12331 {
  };
  template<> struct S<int>::U { static const int n = sizeof(int); }; // expected-error {{explicit specialization of 'U' after instantiation}}
}

namespace PR18246 {
  template<typename T>
  class Baz {
  public:
    template<int N> void bar();
  };

  template<typename T>
  template<int N>
  void Baz<T>::bar() {
  }

  // FIXME: Don't suggest the 'template<>' correction here, because this cannot
  // be an explicit specialization.
  template<typename T>
  void Baz<T>::bar<0>() { // expected-error {{requires 'template<>'}}
  }
}