[PATCH] D113393: [c++2b] Implement P0849R8 auto(x)

Richard Smith - zygoloid via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Nov 12 16:33:32 PST 2021

rsmith added a comment.

Thanks, this generally looks great.

It looks like we'll need some additional work on disambiguation to handle cases like:

  struct A { int n; } a;
  void f() { auto(&a)->n = 0; }

I think that's valid, but right now we misparse it as a declaration of a variable `&a`. (This syntax also resembles a function declaration with a trailing return type, but that interpretation should be rejected for various reasons, such as because `n` isn't a type.) This disambiguation failure seems to be specific to `auto`; this similar case is parsed properly:

  struct A { int n; } a;
  using T = A*;
  void f() { T(&a)->n = 1; }

Comment at: clang/lib/Parse/ParseDeclCXX.cpp:1032
+      // the typename-specifier in a function-style cast expression may
+      // be 'auto' since C++2b
Nice catch :)

Comment at: clang/lib/Sema/SemaExprCXX.cpp:1481
+  } else if (Deduced) {
+    auto Inits = Exprs;
+    if (Exprs.size() == 1) {
Please use an explicit type here.

Comment at: clang/lib/Sema/SemaExprCXX.cpp:1482-1486
+    if (Exprs.size() == 1) {
+      if (auto p = dyn_cast_or_null<InitListExpr>(Exprs[0])) {
+        Inits = MultiExprArg(p->getInits(), p->getNumInits());
+      }
+    }
You should only do this if `ListInitialization` is `true`. Otherwise we'll accept the invalid syntax `auto({a})`.

Comment at: clang/test/CXX/expr/expr.post/expr.type.conv/p1-2b.cpp:19
+  foo(auto {a});
+  foo(auto(a));
We're missing a test that we reject `auto({a})`. I assume that's what this line was intended to do.

  rG LLVM Github Monorepo



More information about the cfe-commits mailing list