rsmith added a comment. Sorry for the late comments.
================ Comment at: clang/lib/Sema/SemaInit.cpp:167-177 } else if (ParenExpr *PE = dyn_cast<ParenExpr>(E)) { E = PE->getSubExpr(); } else if (UnaryOperator *UO = dyn_cast<UnaryOperator>(E)) { assert(UO->getOpcode() == UO_Extension); E = UO->getSubExpr(); } else if (GenericSelectionExpr *GSE = dyn_cast<GenericSelectionExpr>(E)) { E = GSE->getResultExpr(); ---------------- The duplication between this and `IgnoreParensSingleStep` is a code smell; can we expose `IgnoreParensSingleStep` and call it from here? ================ Comment at: clang/lib/Sema/SemaInit.cpp:8511 + Expr *Init = Args[0]; + S.Diag(Init->getBeginLoc(), diag::ext_init_from_predefined) << Init; + } ---------------- We won't reach this case for `const char arr[] = {__func__};` because in that case `Args[0]` will be an `InitListExpr` instead. Right now we accept this with no warning in MS extensions mode: ``` void f() { const char c[] = {__func__}; } ``` We should perform this check in the handling of `SK_StringInit` instead, in order to properly address that case. Also, this will only catch the case where the argument is an unparenthesized predefined expression. You'll need to do something like repeatedly calling `IgnoreParensSingleStep` looking for a `PredefinedExpr` to cope with things like: ``` void g() { const char c[] = (__func__); const char d[] = _Generic(0, int: __func__); } ``` Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146764/new/ https://reviews.llvm.org/D146764 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits