================
@@ -7382,6 +7382,17 @@ bool Compiler<Emitter>::VisitUnaryOperator(const
UnaryOperator *E) {
return true;
return this->emitGetMemberPtr(cast<DeclRefExpr>(SubExpr)->getDecl(), E);
}
+ // [C11 6.5.3.2p3]: if the operand of '&' is the result of a unary '*'
+ // operator, neither operator is evaluated and the result is as if both
+ // were omitted. So '&*q' is just 'q' with no dereference; delegate to the
+ // pointer operand directly instead of to the '*' (which would emit a null
+ // check), so that e.g. '&*(int *)0' is not rejected.
+ if (!Ctx.getLangOpts().CPlusPlus) {
+ const Expr *Sub = SubExpr->IgnoreParens();
+ if (const auto *Deref = dyn_cast<UnaryOperator>(Sub);
+ Deref && Deref->getOpcode() == UO_Deref)
+ return this->delegate(Deref->getSubExpr());
----------------
efriedma-quic wrote:
I think we also need to check for array subscripting, because that's defined in
terms of `*`. (I'm not sure how much of a practical effect that has, though;
pointer arithmetic on null is undefined in C.)
https://github.com/llvm/llvm-project/pull/201483
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits