From af189c8ab113668434eae5c71f174613a9e64625 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Thu, 22 Oct 2020 17:02:28 -0700 Subject: [PATCH] Fix constant evaluation of zero-initialization of a union whose first FieldDecl is an unamed bitfield. Unnamed bitfields aren't non-static data member, so such a bitfield isn't actually the first non-static data member. --- clang/lib/AST/ExprConstant.cpp | 2 ++ clang/test/SemaCXX/constant-expression-cxx11.cpp | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index e978a190a195..c6fc02a6fe91 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -9630,6 +9630,8 @@ bool RecordExprEvaluator::ZeroInitialization(const Expr *E, QualType T) { // C++11 [dcl.init]p5: If T is a (possibly cv-qualified) union type, the // object's first non-static named data member is zero-initialized RecordDecl::field_iterator I = RD->field_begin(); + while (I != RD->field_end() && (*I)->isUnnamedBitfield()) + ++I; if (I == RD->field_end()) { Result = APValue((const FieldDecl*)nullptr); return true; diff --git a/clang/test/SemaCXX/constant-expression-cxx11.cpp b/clang/test/SemaCXX/constant-expression-cxx11.cpp index 0d67b747a0f4..7d51a48eac42 100644 --- a/clang/test/SemaCXX/constant-expression-cxx11.cpp +++ b/clang/test/SemaCXX/constant-expression-cxx11.cpp @@ -2021,6 +2021,14 @@ namespace Bitfields { const HasUnnamedBitfield oneZero{1, 0}; int b = 1 / oneZero.b; // expected-warning {{division by zero is undefined}} } + + union UnionWithUnnamedBitfield { + int : 3; + int n; + }; + static_assert(UnionWithUnnamedBitfield().n == 0, ""); + static_assert(UnionWithUnnamedBitfield{}.n == 0, ""); + static_assert(UnionWithUnnamedBitfield{1}.n == 1, ""); } namespace ZeroSizeTypes {