[llvm-bugs] [Bug 38302] New: Attributes on templates are mishandled

via llvm-bugs llvm-bugs at lists.llvm.org
Tue Jul 24 21:18:26 PDT 2018


https://bugs.llvm.org/show_bug.cgi?id=38302

            Bug ID: 38302
           Summary: Attributes on templates are mishandled
           Product: clang
           Version: trunk
          Hardware: All
                OS: All
            Status: NEW
          Severity: normal
          Priority: P
         Component: C++
          Assignee: unassignedclangbugs at nondot.org
          Reporter: arthur.j.odwyer at gmail.com
                CC: dgregor at apple.com, llvm-bugs at lists.llvm.org

cat >test.cc <<EOF
// https://godbolt.org/g/pqog4L
template<class T>
[[noreturn]] void one();

template<>
void one<int>() {}

template<class T>
void two();

template<>
[[noreturn]] void two<int>() {}

EOF
clang++ -std=c++2a -c test.cc

As far as I can tell, this program produces bogus diagnostics in both
directions.
First, the explicit specialization `one<int>` seems to be inheriting
`[[noreturn]]` from the primary template; I believe this is unwanted behavior.

    test.cc:2:18: warning: function declared 'noreturn' should not return
[-Winvalid-noreturn]
    void one<int>() {}
                     ^

Second, Clang complains that the explicit specialization `two<int>` is marked
`[[noreturn]]` when its "first declaration" is not so marked. Clang seems to be
considering the primary template as the "first" declaration of every
specialization (even though the accompanying note nonsensically points to the
specialization's own declaration). This is problematic, because maybe the
programmer wants to apply `[[noreturn]]` NOT to ALL possible instantiations of
the primary template, but only to this one explicit specialization.

    test.cc:9:3: error: function declared '[[noreturn]]' after its first
declaration
    [[noreturn]] void two<int>() {}
      ^
    test.cc:9:19: note: declaration missing '[[noreturn]]' attribute is here
    [[noreturn]] void two<int>() {}
                      ^

After some discussion on Slack, I think what ought to happen here is that the
attribute on the primary template ought to be applied only to instantiations
that come directly from that primary (unspecialized) template; and the
attribute on the explicit specialization ought to be applied only to that
explicit specialization. But we see that Clang doesn't do either of those
things.

This is highly relevant to my interests because of P1144
[[trivially_relocatable]], and I'd love to put together a patch to fix it, but
at least at the moment I'm completely lost as to where I would even start
looking.

See also: https://bugs.llvm.org/show_bug.cgi?id=20758

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20180725/1529259a/attachment.html>


More information about the llvm-bugs mailing list