This is explicitly allowed via [expr.type.conv], if the initialization
list is empty.
Details
- Reviewers
rsmith
Diff Detail
- Repository
- rG LLVM Github Monorepo
Event Timeline
CC @Tyker for the changes to SemaCXX/attr-annotate.cpp.
clang/include/clang/Basic/DiagnosticSemaKinds.td | ||
---|---|---|
5848–5849 | Might also consider it a narrowing conversion. But I can't find the standard specifically calling it that. | |
clang/test/CXX/expr/expr.post/expr.type.conv/p2.cpp | ||
12 | With parantheses this is (correctly) allowed:
[expr.static.cast]p6:
Not sure if we need a test for that. |
This is CWG issue 2351. Please add a corresponding test to tests/CXX/drs/dr23xx.cpp.
clang/lib/Sema/SemaInit.cpp | ||
---|---|---|
1311–1319 | Hm, this seems like the wrong place for this check, given the wording -- the language rule is specific to functional casts, and shouldn't apply to initialization of void-typed objects in general -- but perhaps it's the best place we have (and I think we deal with the void() case here in SemaInit too). Please at least make sure that we still properly reject things like: void f() { return {}; } We also need to decide whether to accept the compound-literal form of this: void g() { (void){}; } GCC trunk does, but I'm not sure whether that's intentional or an oversight. We certainly shouldn't accept that (without a diagnostic, at least) in C. |
Yeah, we should get this over the line. I'm still not quite sure where to put the check. Reading @rsmith's comment again, SemaInit might perhaps be acceptable for now, except that I should add the additional tests (in case we don't have them already).
I think we also need D113837, because otherwise void is being used as a placeholder. In any event, I should at least rebase the patches and check if they still work.
clang/lib/Sema/SemaInit.cpp | ||
---|---|---|
1311–1319 |
So we should unconditionally allow it here and check later in CastOperation::CheckCXXCStyleCast? It handles void target types already, but only for [expr.static.cast]p6:
Indeed we don't create a CXXFunctionalCastExpr for void() but a CXXScalarValueInitExpr (though probably for legacy reasons). But it should be the proper place, I agree.
That fails as before with <stdin>:2:3: error: void function 'f' must not return a value return {}; ^ ~~
That is rejected in C and C++ with <stdin>:2:3: error: variable has incomplete type 'void' (void){}; ^~~~~~~~ |
Might also consider it a narrowing conversion. But I can't find the standard specifically calling it that.