This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rGd6f9000ecabe: [clang] Fix a constant evaluator crash on a NULL-type expr. (authored by hokein).
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D124384/new/ https://reviews.llvm.org/D124384 Files: clang/lib/AST/ExprConstant.cpp clang/test/SemaCXX/recovery-expr-type.cpp Index: clang/test/SemaCXX/recovery-expr-type.cpp =================================================================== --- clang/test/SemaCXX/recovery-expr-type.cpp +++ clang/test/SemaCXX/recovery-expr-type.cpp @@ -151,3 +151,13 @@ // Enumerators can be evaluated (they evaluate as zero, but we don't care). static_assert(Circular_A == 0 && Circular_A != 0, ""); // expected-error {{static_assert failed}} } + +namespace test14 { +extern "C" void *memset(void *, int b, unsigned long) { + int * const c(undef()); // expected-error {{undeclared identifier}} + // Verify we do not crash on evaluating *c whose initializer is a NULL-type ParenListExpr! + memset(c, 0, *c); // crash1 + + b = __builtin_object_size(c, 0); // crash2 +} +} Index: clang/lib/AST/ExprConstant.cpp =================================================================== --- clang/lib/AST/ExprConstant.cpp +++ clang/lib/AST/ExprConstant.cpp @@ -8631,7 +8631,7 @@ return false; const Expr *Init = VD->getAnyInitializer(); - if (!Init) + if (!Init || Init->getType().isNull()) return false; const Expr *E = Init->IgnoreParens();
Index: clang/test/SemaCXX/recovery-expr-type.cpp =================================================================== --- clang/test/SemaCXX/recovery-expr-type.cpp +++ clang/test/SemaCXX/recovery-expr-type.cpp @@ -151,3 +151,13 @@ // Enumerators can be evaluated (they evaluate as zero, but we don't care). static_assert(Circular_A == 0 && Circular_A != 0, ""); // expected-error {{static_assert failed}} } + +namespace test14 { +extern "C" void *memset(void *, int b, unsigned long) { + int * const c(undef()); // expected-error {{undeclared identifier}} + // Verify we do not crash on evaluating *c whose initializer is a NULL-type ParenListExpr! + memset(c, 0, *c); // crash1 + + b = __builtin_object_size(c, 0); // crash2 +} +} Index: clang/lib/AST/ExprConstant.cpp =================================================================== --- clang/lib/AST/ExprConstant.cpp +++ clang/lib/AST/ExprConstant.cpp @@ -8631,7 +8631,7 @@ return false; const Expr *Init = VD->getAnyInitializer(); - if (!Init) + if (!Init || Init->getType().isNull()) return false; const Expr *E = Init->IgnoreParens();
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits