[PATCH] D113749: [Clang] Fix nesting of discarded and immediate contexts.
Paul Hollinsky via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Dec 6 00:37:36 PST 2021
hollinsky added a comment.
This change breaks return value deduction of template instantiations that first occur within a discarded context.
template<int S>
class Foo {
public:
constexpr Foo(const char str[S]) : buf(str[0]) {}
char get() const { return buf; }
char buf;
};
template<int S>
static constexpr auto make(const char(&str)[S]) {
return Foo<S>{str};
}
int main() {
if constexpr(false) {
return make("used to be Foo<29>, now void").get();
}
return 0;
}
This code now fails to compile with
regression.cpp:16:46: error: member reference base type 'void' is not a structure or union
return make("used to be Foo<29>, now void").get();
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~
The only return statement in the `make()` function template is not being considered anymore, making the resulting instantiation
template<>
static constexpr void make(const char(&str)[29]) {
return Foo<29>{str};
}
Intuitively, I wouldn't think that the "discarded return statements are not considered when deducing a return type" rule should continue into new function scopes, though I'm not sure exactly how the spec backs that up.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D113749/new/
https://reviews.llvm.org/D113749
More information about the cfe-commits
mailing list