SemaTemplateInstantiateDecl mistakenly issuing diag::warn_func_template_missing for templated deduction guides

Mário Feroldi via cfe-commits cfe-commits at
Wed Oct 25 06:17:10 PDT 2017

Following compilation shows the issue:

    $ clang++ --version
    clang version 6.0.0 (trunk 316414)
    Target: x86_64-unknown-linux-gnu
    Thread model: posix
    InstalledDir: /opt/compiler-explorer/clang-trunk/bin

    $ cat a.cpp
    template <typename T>
    struct S
      template <typename U>
      S(U&&) {}

    template <typename T>
    S(T) -> S<T>;

    int main()
      S s(42);

    $ clang++ -std=c++17 -Wundefined-func-template a.cpp
    a.cpp:13:7: warning: instantiation of function '<deduction guide for
S><int>' required here, but no definition is available
        S s(42);
    a.cpp:9:1: note: forward declaration of template entity is here
        S(T) -> S<T>;
    a.cpp:13:7: note: add an explicit instantiation declaration to suppress
this warning if '<deduction guide for S><int>' is explicitly instantiated
in another translation unit
            S s(42);

I found out that this warning occurs at

    else if (TSK == TSK_ExplicitInstantiationDefinition) {
      // Try again at the end of the translation unit (at which point a
      // definition will be required).
        std::make_pair(Function, PointOfInstantiation));
    } else if (TSK == TSK_ImplicitInstantiation) { //< here
      if (AtEndOfTU && !getDiagnostics().hasErrorOccurred()) {
        Diag(PointOfInstantiation, diag::warn_func_template_missing)
          << Function;
        Diag(PatternDecl->getLocation(), diag::note_forward_template_decl);
        if (getLangOpts().CPlusPlus11)
          Diag(PointOfInstantiation, diag::note_inst_declaration_hint)
            << Function;

Shouldn't that check whether it's a deduction guide?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the cfe-commits mailing list