llvm/llvm-project

[clang] Poor diagnostic with wrong template argument type

Open

#121,235 opened on 2024年12月27日

GitHub で見る
 (7 comments) (0 reactions) (1 assignee)C++ (10,782 forks)batch import
clang:diagnosticsconfirmedenhancementgood first issue

Repository metrics

Stars
 (26,378 stars)
PR merge metrics
 (平均マージ 1d 2h) (30d で 1,000 merged PRs)

説明

Clang diagnostic for invalid bool-to-enum template parameter conversion lacks failure detail when compared to GCC, as the following C++ snippet:

enum endianness { little = 0, big };

template <endianness e>
inline void foo() {}

void bar() {
    foo<false>();
}

Fails as follows on latest clang:

<source>:7:5: error: no matching function for call to 'foo'
    7 |     foo<false>();
      |     ^~~~~~~~~~
<source>:4:13: note: candidate template ignored: invalid explicitly-specified argument for template parameter 'big_endian'
    4 | inline void foo() {}

GCC explicitly indicates the conversion failure instead:

<source>:4:13: note: template argument deduction/substitution failed:
<source>:7:15: error: could not convert 'false' from 'bool' to 'endianness'
    7 |     foo<false>();
      |     ~~~~~~~~~~^~
      |               |
      |               bool

Godbolt: https://godbolt.org/z/hnazTn3M7 (cc/ @shafik).

コントリビューターガイド