[clang] [clang][Sema] Preserve the initializer of invalid VarDecls (PR #88645)

Matheus Izvekov via cfe-commits cfe-commits at lists.llvm.org
Sun Apr 14 13:32:39 PDT 2024


================
@@ -13456,6 +13455,14 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, bool DirectInit) {
     return;
   }
 
+  if (VDecl->isInvalidDecl()) {
+    CorrectDelayedTyposInExpr(Init, VDecl);
+    VDecl->setInit(
+        CreateRecoveryExpr(Init->getBeginLoc(), Init->getEndLoc(), {Init})
+            .get());
----------------
mizvekov wrote:

`CreateRecoveryExpr` returns an ExprResult, which means it not only returns an expression on success, but it can also return an error, and using `get()` in that case is UB, you have to check it first.

It can return an error in case we are in an SFINAE context, and also when using the frontend flag `-fno-recovery-ast`.

https://github.com/llvm/llvm-project/pull/88645


More information about the cfe-commits mailing list