================ @@ -5563,6 +5563,12 @@ ExprResult Sema::BuildCXXDefaultArgExpr(SourceLocation CallLoc, ExprResult Sema::BuildCXXDefaultInitExpr(SourceLocation Loc, FieldDecl *Field) { assert(Field->hasInClassInitializer()); + // We do not want to aggressively cutoff parsing. Try to recover when + // in-class-initializer had errors. + if (Field->getInClassInitializer() && + Field->getInClassInitializer()->containsErrors()) + return Field->getInClassInitializer(); ---------------- yronglin wrote:
> I guess the idea here is that we're throwing away too much if we just return > an ExprError? Yes. > BuildCXXDefaultInitExpr is supposed to, as the name suggests, return a > CXXDefaultInitExpr. Agree. Should we remove this code from `BuildCXXDefaultInitExpr`? Because we created`RecoveryExpr` in `Sema::ActOnFinishCXXInClassMemberInitializer`. ```c++ // If we might have already tried and failed to instantiate, don't try again. if (Field->isInvalidDecl()) return ExprError(); ``` and the AST will be: ``` -CompoundStmt 0x12480cb70 <col:12, line:494:1> 537: `-DeclStmt 0x12480cb58 <line:493:3, col:8> 538: `-VarDecl 0x12480ca40 <col:3, col:7> col:5 g 'U':'GH112560::U' listinit 539: `-InitListExpr 0x12480cae8 <col:6, col:7> 'U':'GH112560::U' contains-errors field Field 0x12480c870 'f' 'int' 540: `-CXXDefaultInitExpr 0x12480cb30 <col:7> 'int' contains-errors has rewritten init 541: `-RecoveryExpr 0x12480c910 <line:482:9> 'int' contains-errors ``` https://github.com/llvm/llvm-project/pull/113049 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits