Index: clang/include/clang/Sema/Sema.h =================================================================== --- clang/include/clang/Sema/Sema.h +++ clang/include/clang/Sema/Sema.h @@ -10885,7 +10885,8 @@ /// 'if' keyword. /// \return true iff there were any errors ExprResult CheckBooleanCondition(SourceLocation Loc, Expr *E, - bool IsConstexpr = false); + bool IsConstexpr = false, + bool IsNoexceptExpr = false); /// ActOnExplicitBoolSpecifier - Build an ExplicitSpecifier from an expression /// found in an explicit(bool) specifier. Index: clang/lib/Sema/SemaExceptionSpec.cpp =================================================================== --- clang/lib/Sema/SemaExceptionSpec.cpp +++ clang/lib/Sema/SemaExceptionSpec.cpp @@ -80,7 +80,9 @@ Expr *NoexceptExpr, ExceptionSpecificationType &EST) { // FIXME: This is bogus, a noexcept expression is not a condition. - ExprResult Converted = CheckBooleanCondition(NoexceptLoc, NoexceptExpr); + ExprResult Converted = CheckBooleanCondition(NoexceptLoc, NoexceptExpr, + /*IsConstexpr*/ false, + /*IsNoexceptExpr*/ true); if (Converted.isInvalid()) return Converted; Index: clang/lib/Sema/SemaExpr.cpp =================================================================== --- clang/lib/Sema/SemaExpr.cpp +++ clang/lib/Sema/SemaExpr.cpp @@ -17362,7 +17362,7 @@ } ExprResult Sema::CheckBooleanCondition(SourceLocation Loc, Expr *E, - bool IsConstexpr) { + bool IsConstexpr, bool IsNoexceptExpr) { DiagnoseAssignmentAsCondition(E); if (ParenExpr *parenE = dyn_cast(E)) DiagnoseEqualityWithExtraParens(parenE); @@ -17372,8 +17372,11 @@ E = result.get(); if (!E->isTypeDependent()) { - if (getLangOpts().CPlusPlus) + if (getLangOpts().CPlusPlus) { + if (E->isValueDependent() && !IsNoexceptExpr) + return E; return CheckCXXBooleanCondition(E, IsConstexpr); // C++ 6.4p4 + } ExprResult ERes = DefaultFunctionArrayLvalueConversion(E); if (ERes.isInvalid()) Index: clang/test/SemaTemplate/value-dependent-bitfield-cond.cpp =================================================================== --- /dev/null +++ clang/test/SemaTemplate/value-dependent-bitfield-cond.cpp @@ -0,0 +1,31 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s -ast-dump | FileCheck %s --check-prefix=CHECK-AST +// expected-no-diagnostics + +template +class A { + int c : b; + +public: + void f() { + if (c) + ; + } +}; + +void foo() { + + // CHECK-AST: ClassTemplateSpecializationDecl{{.*}}class A definition + // CHECK-AST: TemplateArgument integral 3 + // CHECK-AST: FieldDecl{{.*}}c 'int' + // CHECK-AST-NEXT: ConstantExpr{{.*}}'int' Int: 3 + // CHECK-AST-NEXT: SubstNonTypeTemplateParmExpr{{.*}}'int' + // CHECK-AST-NEXT: IntegerLiteral{{.*}}'int' 3 + A<3> a; + + // CHECK-AST: IfStmt + // CHECK-AST-NEXT: ImplicitCastExpr{{.*}}'bool' + // CHECK-AST-NEXT: ImplicitCastExpr{{.*}}'int' + // CHECK-AST-NEXT: MemberExpr{{.*}}'int' lvalue bitfield ->c + // CHECK-AST-NEXT: CXXThisExpr{{.*}}'A<3> *' implicit this + a.f(); +}