efriedma created this revision. efriedma added reviewers: aaron.ballman, erichkeane. efriedma added a project: clang. Herald added a project: All. efriedma requested review of this revision.
The way this code checks whether a pointer is null is wrong for other reasons; it doesn't actually check whether a null pointer constant is a "constant" in the C++ standard sense. But this fix at least makes sure we don't treat a non-null pointer as if it were null. Fixes https://github.com/llvm/llvm-project/issues/57883 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D134928 Files: clang/lib/Sema/SemaTemplate.cpp clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1-11.cpp Index: clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1-11.cpp =================================================================== --- clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1-11.cpp +++ clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1-11.cpp @@ -4,7 +4,7 @@ typedef decltype(nullptr) nullptr_t; } -template<int *ip> struct IP { // expected-note 5 {{template parameter is declared here}} +template<int *ip> struct IP { // expected-note 6 {{template parameter is declared here}} IP<ip> *ip2; }; @@ -28,6 +28,7 @@ // expected-note{{read of non-constexpr variable 'nonconst_np' is not allowed in a constant expression}} IP<(float*)0> ip6; // expected-error{{null non-type template argument of type 'float *' does not match template parameter of type 'int *'}} IP<&tl> ip7; // expected-error{{non-type template argument of type 'int *' is not a constant expression}} +IP<(int*)1> ip8; // expected-error {{non-type template argument does not refer to any declaration}} IR<tl> ir1; // expected-error{{non-type template argument refers to thread-local object}} Index: clang/lib/Sema/SemaTemplate.cpp =================================================================== --- clang/lib/Sema/SemaTemplate.cpp +++ clang/lib/Sema/SemaTemplate.cpp @@ -6495,7 +6495,7 @@ // - a constant expression that evaluates to a null pointer value (4.10); or // - a constant expression that evaluates to a null member pointer value // (4.11); or - if ((EvalResult.Val.isLValue() && !EvalResult.Val.getLValueBase()) || + if ((EvalResult.Val.isLValue() && EvalResult.Val.isNullPointer()) || (EvalResult.Val.isMemberPointer() && !EvalResult.Val.getMemberPointerDecl())) { // If our expression has an appropriate type, we've succeeded.
Index: clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1-11.cpp =================================================================== --- clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1-11.cpp +++ clang/test/CXX/temp/temp.arg/temp.arg.nontype/p1-11.cpp @@ -4,7 +4,7 @@ typedef decltype(nullptr) nullptr_t; } -template<int *ip> struct IP { // expected-note 5 {{template parameter is declared here}} +template<int *ip> struct IP { // expected-note 6 {{template parameter is declared here}} IP<ip> *ip2; }; @@ -28,6 +28,7 @@ // expected-note{{read of non-constexpr variable 'nonconst_np' is not allowed in a constant expression}} IP<(float*)0> ip6; // expected-error{{null non-type template argument of type 'float *' does not match template parameter of type 'int *'}} IP<&tl> ip7; // expected-error{{non-type template argument of type 'int *' is not a constant expression}} +IP<(int*)1> ip8; // expected-error {{non-type template argument does not refer to any declaration}} IR<tl> ir1; // expected-error{{non-type template argument refers to thread-local object}} Index: clang/lib/Sema/SemaTemplate.cpp =================================================================== --- clang/lib/Sema/SemaTemplate.cpp +++ clang/lib/Sema/SemaTemplate.cpp @@ -6495,7 +6495,7 @@ // - a constant expression that evaluates to a null pointer value (4.10); or // - a constant expression that evaluates to a null member pointer value // (4.11); or - if ((EvalResult.Val.isLValue() && !EvalResult.Val.getLValueBase()) || + if ((EvalResult.Val.isLValue() && EvalResult.Val.isNullPointer()) || (EvalResult.Val.isMemberPointer() && !EvalResult.Val.getMemberPointerDecl())) { // If our expression has an appropriate type, we've succeeded.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits