rsmith added a comment.

This is CWG issue 2351. Please add a corresponding test to 
`tests/CXX/drs/dr23xx.cpp`.



================
Comment at: clang/lib/Sema/SemaInit.cpp:1311-1319
+  } else if (DeclType->isVoidType()) {
+    // [expr.type.conv]p2: Otherwise, if the type is cv void and the
+    // initializer is () or {} (after pack expansion, if any), the expression
+    // is a prvalue of type void that performs no initialization.
+    if (IList->getNumInits() > 0) {
+      if (!VerifyOnly)
+        SemaRef.Diag(IList->getBeginLoc(), diag::err_init_list_void_nonempty);
----------------
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.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D113838/new/

https://reviews.llvm.org/D113838

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

Reply via email to