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

Reply via email to