Author: Richard Smith Date: 2020-10-21T18:51:55-07:00 New Revision: 81560743527e127ff8e47384db5dd60c7c40f153
URL: https://github.com/llvm/llvm-project/commit/81560743527e127ff8e47384db5dd60c7c40f153 DIFF: https://github.com/llvm/llvm-project/commit/81560743527e127ff8e47384db5dd60c7c40f153.diff LOG: Ensure that the "value" of an unnamed bit-field isn't taken into account when determining the identity of a class NTTP. Added: Modified: clang/lib/AST/ExprConstant.cpp clang/test/SemaTemplate/temp_arg_nontype_cxx20.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 00f9d4205581..e978a190a195 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -9607,7 +9607,7 @@ static bool HandleClassZeroInitialization(EvalInfo &Info, const Expr *E, for (const auto *I : RD->fields()) { // -- if T is a reference type, no initialization is performed. - if (I->getType()->isReferenceType()) + if (I->isUnnamedBitfield() || I->getType()->isReferenceType()) continue; LValue Subobject = This; diff --git a/clang/test/SemaTemplate/temp_arg_nontype_cxx20.cpp b/clang/test/SemaTemplate/temp_arg_nontype_cxx20.cpp index 1d9fefb6cbe5..75428a44eb32 100644 --- a/clang/test/SemaTemplate/temp_arg_nontype_cxx20.cpp +++ b/clang/test/SemaTemplate/temp_arg_nontype_cxx20.cpp @@ -201,3 +201,22 @@ namespace CTADPartialOrder { template<typename T, A<0> a> struct X<T, T, a> { static constexpr int n = 4; }; static_assert(X<float, float, a>::n == 4); } + +namespace UnnamedBitfield { + struct A { + int : 16; + }; + // Make sure we don't distinguish between the unnamed bit-field being + // uninitialized and it being zeroed. Those are not distinct states + // according to [temp.type]p2. + // + // FIXME: We shouldn't track a value for unnamed bit-fields, nor number + // them when computing field indexes. + template <A> struct X {}; + constexpr A a; + using T = X<a>; + using T = X<A{}>; + using T = X<(A())>; + // Once we support bit-casts involving bit-fields, this should be valid too. + using T = X<__builtin_bit_cast(A, (unsigned short)0)>; // expected-error {{constant}} expected-note {{not yet supported}} +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits