Page MenuHomePhabricator

Sema: Don't erroneously reject `void{}`
Needs ReviewPublic

Authored by aaronpuchert on Nov 13 2021, 6:19 PM.

Details

Reviewers
rsmith
Summary

This is explicitly allowed via [expr.type.conv], if the initialization
list is empty.

Diff Detail

Event Timeline

aaronpuchert requested review of this revision.Nov 13 2021, 6:19 PM
aaronpuchert created this revision.
Herald added a project: Restricted Project. · View Herald TranscriptNov 13 2021, 6:19 PM
Herald added a subscriber: cfe-commits. · View Herald Transcript

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:

If the initializer is a parenthesized single expression, the type conversion expression is equivalent to the corresponding cast expression.

[expr.static.cast]p6:

Any expression can be explicitly converted to type cv void, in which case it becomes a discarded-value expression ([expr.prop]).

Not sure if we need a test for that.

rsmith added a comment.Jan 7 2022, 3:14 PM

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.