diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index 003d9bb3a97dc..1e838fd751305 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -328,9 +328,8 @@ NarrowingKind StandardConversionSequence::getNarrowingKind( goto FloatingIntegralConversion; if (FromType->isIntegralOrUnscopedEnumerationType()) goto IntegralConversion; - // Boolean conversions can be from pointers and pointers to members - // [conv.bool], and those aren't considered narrowing conversions. - return NK_Not_Narrowing; + // -- from a pointer type or pointer-to-member type to bool, or + return NK_Type_Narrowing; // -- from a floating-point type to an integer type, or // diff --git a/clang/test/CXX/dcl.decl/dcl.init/dcl.init.list/p7-0x.cpp b/clang/test/CXX/dcl.decl/dcl.init/dcl.init.list/p7-0x.cpp index 4436cb0aac607..eac9ac0e82798 100644 --- a/clang/test/CXX/dcl.decl/dcl.init/dcl.init.list/p7-0x.cpp +++ b/clang/test/CXX/dcl.decl/dcl.init/dcl.init.list/p7-0x.cpp @@ -180,9 +180,9 @@ void shrink_int() { Agg b2 = {1}; // OK Agg b3 = {-1}; // expected-error {{ cannot be narrowed }} expected-note {{silence}} - // Conversions from pointers to booleans aren't narrowing conversions. + // Conversions from pointers to booleans are narrowing conversions. Agg* ptr = &b1; - Agg b = {ptr}; // OK + Agg b = {ptr}; // expected-error {{ cannot be narrowed }} expected-note {{silence}} Agg ce1 = { Convert(100000) }; // expected-error {{constant expression evaluates to 100000 which cannot be narrowed to type 'short'}} expected-note {{silence}} expected-warning {{changes value from 100000 to -31072}} Agg ce2 = { ConvertVar() }; // expected-error {{non-constant-expression cannot be narrowed from type 'short' to 'char'}} expected-note {{silence}} @@ -240,3 +240,13 @@ void test_narrowed(Value vi, Value vd) { int &ir = check_narrowed(vd); float &fr = check_narrowed(vi); } + +// * from a pointer type or a pointer-to-member type to bool. +void P1957R2(void *a, int *b, Agg *c, int Agg::*d) { + Agg ta = {a}; // expected-error {{cannot be narrowed}} expected-note {{}} + Agg tb = {b}; // expected-error {{cannot be narrowed}} expected-note {{}} + Agg tc = {c}; // expected-error {{cannot be narrowed}} expected-note {{}} + Agg td = {d}; // expected-error {{cannot be narrowed}} expected-note {{}} +} +template struct BoolParam {}; +BoolParam<&P1957R2> bp; // expected-error {{not allowed in a converted constant expression}} diff --git a/clang/test/CXX/dcl.decl/dcl.init/dcl.init.list/p7-cxx11-nowarn.cpp b/clang/test/CXX/dcl.decl/dcl.init/dcl.init.list/p7-cxx11-nowarn.cpp index d4d8198d4fc83..d701ec9646052 100644 --- a/clang/test/CXX/dcl.decl/dcl.init/dcl.init.list/p7-cxx11-nowarn.cpp +++ b/clang/test/CXX/dcl.decl/dcl.init/dcl.init.list/p7-cxx11-nowarn.cpp @@ -163,10 +163,6 @@ void shrink_int() { Agg b2 = {1}; // OK Agg b3 = {-1}; // expected-warning {{ cannot be narrowed }} expected-note {{silence}} - // Conversions from pointers to booleans aren't narrowing conversions. - Agg* ptr = &b1; - Agg b = {ptr}; // OK - Agg ce1 = { Convert(100000) }; // expected-warning {{constant expression evaluates to 100000 which cannot be narrowed to type 'short'}} expected-note {{silence}} expected-warning {{changes value from 100000 to -31072}} Agg ce2 = { ConvertVar() }; // expected-warning {{non-constant-expression cannot be narrowed from type 'short' to 'char'}} expected-note {{silence}} }