diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp index dd0b8e790d444..58e84ef70abb7 100644 --- a/clang/lib/AST/ByteCode/Compiler.cpp +++ b/clang/lib/AST/ByteCode/Compiler.cpp @@ -1705,6 +1705,9 @@ bool Compiler::VisitFixedPointUnaryOperator(const UnaryOperator *E) { template bool Compiler::VisitImplicitValueInitExpr( const ImplicitValueInitExpr *E) { + if (DiscardResult) + return true; + QualType QT = E->getType(); if (OptPrimType T = classify(QT)) diff --git a/clang/test/AST/ByteCode/c.c b/clang/test/AST/ByteCode/c.c index bffd557ff77a6..0d3d97b5eeab2 100644 --- a/clang/test/AST/ByteCode/c.c +++ b/clang/test/AST/ByteCode/c.c @@ -392,3 +392,16 @@ void plainComplex(void) { _Complex cd; // all-warning {{_Complex double}} cd = *(_Complex *)&(struct { double r, i; }){0.0, 0.0}; // all-warning {{_Complex double}} } + +/// This test results in an ImplicitValueInitExpr with DiscardResult set. +struct M{ + char c; +}; +typedef struct S64 { + struct M m; + char a[64]; +} I64; + +_Static_assert((((I64){}, 1)), ""); // all-warning {{left operand of comma operator has no effect}} \ + // pedantic-warning {{use of an empty initializer is a C23 extension}} \ + // pedantic-warning {{expression is not an integer constant expression; folding it to a constant is a GNU extension}}