[PATCH] D100667: [clang] Fix assert() crash when checking undeduced arg alignment
Haojian Wu via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Apr 26 01:42:34 PDT 2021
hokein added a comment.
Thanks for tracking it down, and sorry for the delay.
I thought the crash was fix in https://reviews.llvm.org/D99145. Thinking more about it, this is a recovery-expr crash, see my comment below.
================
Comment at: clang/lib/Sema/SemaChecking.cpp:4543
// getTypeAlignInChars requires complete types
- if (ParamTy->isIncompleteType() || ArgTy->isIncompleteType() ||
- ParamTy->isUndeducedType() || ArgTy->isUndeducedType())
+ auto CheckTypeOK = [](QualType Ty) {
+ if (Ty->isIncompleteType() || Ty->isUndeducedType())
----------------
The current fix is on top of kadir's fix, now the code becomes more add-hoc, it looks like a smell to me.
It looks like `CheckArgAlignment` has an implicit invariant (the arg type should never be undeduced), and this invariant was enforced by dropping the invalid AST. Now with `RecoveryExpr`, we might break the invariant -- when the RecoveryExpr preserves an `undeduced` type, like the test case in this patch (which is done via the [code](https://github.com/llvm/llvm-project/blob/main/clang/lib/Sema/SemaExprCXX.cpp#L1420)).
I think a right fix is to fix in the `RecoveryExpr` side, `RecoveryExpr` should not preserve an undeduced type, we did it for function return type already (https://reviews.llvm.org/D87350), but it didn't cover all places. I think a general fixing place is `Sema::CreateRecoveryExpr`, if the passing `T` is undeduced, fallback to dependent type.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D100667/new/
https://reviews.llvm.org/D100667
More information about the cfe-commits
mailing list