diff options
| author | Richard Trieu <rtrieu@google.com> | 2016-08-05 23:24:47 +0000 |
|---|---|---|
| committer | Richard Trieu <rtrieu@google.com> | 2016-08-05 23:24:47 +0000 |
| commit | 81b6c561eaeb2a48318523a037e6903d34f5fec3 (patch) | |
| tree | 2573ed1a4e12c1561d4a9135555a2065ccbceddf /clang/test | |
| parent | 9e91c28b7121f726b3ee62bd5d17abb9bfe6841a (diff) | |
| download | bcm5719-llvm-81b6c561eaeb2a48318523a037e6903d34f5fec3.tar.gz bcm5719-llvm-81b6c561eaeb2a48318523a037e6903d34f5fec3.zip | |
Fix two false positives in -Wreturn-stack-address
If the return type is a pointer and the function returns the reference to a
pointer, don't warn since only the value is returned, not the reference.
If a reference function parameter appears in the reference chain, don't warn
since binding happens at the caller scope, so addresses returned are not
to local stack. This includes default arguments as well.
llvm-svn: 277889
Diffstat (limited to 'clang/test')
| -rw-r--r-- | clang/test/SemaCXX/return-stack-addr-2.cpp | 64 |
1 files changed, 63 insertions, 1 deletions
diff --git a/clang/test/SemaCXX/return-stack-addr-2.cpp b/clang/test/SemaCXX/return-stack-addr-2.cpp index ad27567fcd6..f6ea9b2a738 100644 --- a/clang/test/SemaCXX/return-stack-addr-2.cpp +++ b/clang/test/SemaCXX/return-stack-addr-2.cpp @@ -1,5 +1,4 @@ // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify -std=c++11 %s -// expected-no-diagnostics namespace PR26599 { template <typename> @@ -20,3 +19,66 @@ void *&pointer() { } } +namespace LocalTemporary { + +template <class T> +class QMap { +public: + T value(const T &t = T()) const { + return t; + } +}; + +struct A {}; + +void test() { + QMap<A *> map; + map.value(); +} + +typedef int* ptr; +ptr int1(const ptr &p = ptr()) { + return (p); +} + +ptr int2(const ptr &p = nullptr) { + return p; +} + +ptr int3() { + const ptr &p = ptr(); + return p; +} + +const int *int4(const int &x = 5) { + return &x; +} + +const int *int5(const int &x) { + return &x; +} + +const int *int6() { + const int &x = 11; //expected-note{{binding reference variable 'x' here}} + return &x; //expected-warning{{returning address of local temporary object}} +} + +const int *int7(int x) { + const int &x2 = x; // expected-note{{binding reference variable 'x2' here}} + const int &x3 = x2; + return &x2; // expected-warning{{address of stack memory associated with local variable 'x' returned}} +} + +const int *int8(const int &x = 5) { + const int &x2 = x; + const int &x3 = x2; + return &x2; +} + +const int *int9() { + const int &x = 5; // expected-note{{binding reference variable 'x' here}} + const int &x2 = x; // expected-note{{binding reference variable 'x2' here}} + const int &x3 = x2; + return &x2; // expected-warning{{returning address of local temporary object}} +} +} |

