Issue 125491
Summary if constexpr code not ignored
Labels new issue
Assignees
Reporter Toeger
    ### Minimal reproducible example
```cpp
template <class... Ts>
struct Type_list {
	private:
	template <int index, class... Args>
	struct Get_at;
	template <class T, class... Args>
	struct Get_at<0, T, Args...> {
		using Type = T;
	};
	template <int index, class T, class... Args>
	struct Get_at<index, T, Args...> {
		using Type = typename Get_at<index - 1, Args...>::Type;
	};

	public:
	template <int index>
	using at = typename Get_at<index, Ts...>::Type;
	constexpr static auto size = sizeof...(Ts);
};

template <class F>
struct CI {};
template <class R, class... PArgs>
struct CI<R (*)(PArgs...)> {
	using Args = Type_list<PArgs...>;
};

template <class Function>
constexpr bool is_viable_source = []<class Properties_list>(Properties_list) {
	if constexpr (Properties_list::size != Properties_list::size) {
		static_assert(false);
		return sizeof(typename CI<Function>::Args::template at<0>) > 0;
	}
	return false;
}(Type_list<>{});

int main() {
	return is_viable_source<void (*)()>;
}

```
https://godbolt.org/z/o3co4j31e

### Expected behavior
Successfully builds executable equivalent to `int main() {}`.

### Actual behavior: Compilation error
```
<source>:17:2: error: implicit instantiation of undefined template 'Type_list<>::Get_at<0>'
   17 |         using at = typename Get_at<index, Ts...>::Type;
      | ^
<source>:32:55: note: in instantiation of template type alias 'at' requested here
   32 |                 return sizeof(typename CI<Function>::Args::template at<0>) > 0;
      | ^
<source>:29:78: note: while substituting into a lambda _expression_ here
   29 | constexpr bool is_viable_source = []<class Properties_list>(Properties_list) {
      | ^
<source>:38:9: note: in instantiation of variable template specialization 'is_viable_source<void (*)()>' requested here
   38 |         return is_viable_source<void (*)()>;
      |                ^
<source>:5:9: note: template is declared here
    5 |         struct Get_at;
      | ^
1 error generated.
```

### Affected versions
Clang 18, clang 19 and clang trunk
C++23 and above (it seems the explicit lambda template argument is required to reproduce, which is a C++23 feature)
Gcc compiles the code successfully.

### Reasoning why clang is wrong
The error is caused by code inside an `if constexpr` that evaluates to `false`, thus clang should not have attempted to compile the code or ignored the error. Clang partially agrees that the `if constexpr` evaluates to `false` and that the code should not be compiled since it does not complain about the `static_assert(false);`.


_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to