diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2017-12-18 20:11:37 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2017-12-18 20:11:37 +0000 |
commit | 461a67fa15370a9ec88f8f8a240bf7c123bb2029 (patch) | |
tree | 6942083d7d56bba40ec790a453ca58ad3baf6832 /test/SemaCXX/nullptr-arithmetic.cpp | |
parent | 75c3240472ba6ac2669ee72ca67eb72d4e2851fc (diff) |
Notes
Diffstat (limited to 'test/SemaCXX/nullptr-arithmetic.cpp')
-rw-r--r-- | test/SemaCXX/nullptr-arithmetic.cpp | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/test/SemaCXX/nullptr-arithmetic.cpp b/test/SemaCXX/nullptr-arithmetic.cpp new file mode 100644 index 0000000000000..9963c8858ee87 --- /dev/null +++ b/test/SemaCXX/nullptr-arithmetic.cpp @@ -0,0 +1,30 @@ +// RUN: %clang_cc1 %s -fsyntax-only -verify -pedantic -Wextra -std=c++11 +// RUN: %clang_cc1 %s -fsyntax-only -triple i686-unknown-unknown -verify -pedantic -Wextra -std=c++11 +// RUN: %clang_cc1 %s -fsyntax-only -triple x86_64-unknown-unknown -verify -pedantic -Wextra -std=c++11 + +#include <stdint.h> + +void f(intptr_t offset) { + // A zero offset from a nullptr is OK. + char *f = (char*)nullptr + 0; + int *g = (int*)0 + 0; + f = (char*)nullptr - 0; + g = (int*)nullptr - 0; + // adding other values is undefined. + f = (char*)nullptr + offset; // expected-warning {{arithmetic on a null pointer treated as a cast from integer to pointer is a GNU extension}} + // Cases that don't match the GNU inttoptr idiom get a different warning. + f = (char*)0 - offset; // expected-warning {{performing pointer arithmetic on a null pointer has undefined behavior if the offset is nonzero}} + g = (int*)0 + offset; // expected-warning {{performing pointer arithmetic on a null pointer has undefined behavior if the offset is nonzero}} +} + +// Value-dependent pointer arithmetic should not produce a nullptr warning. +template<char *P> +char* g(intptr_t offset) { + return P + offset; +} + +// Value-dependent offsets should not produce a nullptr warning. +template<intptr_t N> +char *h() { + return (char*)nullptr + N; +} |