diff options
author | Chandler Carruth <chandlerc@gmail.com> | 2011-02-21 00:56:56 +0000 |
---|---|---|
committer | Chandler Carruth <chandlerc@gmail.com> | 2011-02-21 00:56:56 +0000 |
commit | d05b352b0e5b036d67e9916936b1e59e742039fd (patch) | |
tree | f248619ab69c1d7d75b63432eb58bd234528c73a /clang | |
parent | 8731d0cc836cc879f5a7d32248cdd9ccf4e3b69e (diff) | |
download | bcm5719-llvm-d05b352b0e5b036d67e9916936b1e59e742039fd.tar.gz bcm5719-llvm-d05b352b0e5b036d67e9916936b1e59e742039fd.zip |
Clean up the tests for warning about unused function results given the
appropriate attribute. Add a bit more testing that finds a pretty bad
regression (since ~forever) in this warning. Fix it with a nice 2 line
change. =]
llvm-svn: 126098
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Sema/SemaStmt.cpp | 2 | ||||
-rw-r--r-- | clang/test/SemaCXX/warn-unused-result.cpp | 44 | ||||
-rw-r--r-- | clang/test/SemaCXX/warn-unused-variables.cpp | 11 |
3 files changed, 46 insertions, 11 deletions
diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp index e995e8f207d..49efca82412 100644 --- a/clang/lib/Sema/SemaStmt.cpp +++ b/clang/lib/Sema/SemaStmt.cpp @@ -92,6 +92,8 @@ void Sema::DiagnoseUnusedExprResult(const Stmt *S) { unsigned DiagID = diag::warn_unused_expr; if (const ExprWithCleanups *Temps = dyn_cast<ExprWithCleanups>(E)) E = Temps->getSubExpr(); + if (const CXXBindTemporaryExpr *TempExpr = dyn_cast<CXXBindTemporaryExpr>(E)) + E = TempExpr->getSubExpr(); E = E->IgnoreParenImpCasts(); if (const CallExpr *CE = dyn_cast<CallExpr>(E)) { diff --git a/clang/test/SemaCXX/warn-unused-result.cpp b/clang/test/SemaCXX/warn-unused-result.cpp new file mode 100644 index 00000000000..d14fdf9833f --- /dev/null +++ b/clang/test/SemaCXX/warn-unused-result.cpp @@ -0,0 +1,44 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +int f() __attribute__((warn_unused_result)); + +struct S { + void t() const; +}; +S g1() __attribute__((warn_unused_result)); +S *g2() __attribute__((warn_unused_result)); +S &g3() __attribute__((warn_unused_result)); + +void test() { + f(); // expected-warning {{ignoring return value}} + g1(); // expected-warning {{ignoring return value}} + g2(); // expected-warning {{ignoring return value}} + g3(); // expected-warning {{ignoring return value}} + + (void)f(); + (void)g1(); + (void)g2(); + (void)g3(); + + if (f() == 0) return; + + g1().t(); + g2()->t(); + g3().t(); + + int i = f(); + S s1 = g1(); + S *s2 = g2(); + S &s3 = g3(); + const S &s4 = g1(); +} + +struct X { + int foo() __attribute__((warn_unused_result)); +}; + +void bah() { + X x, *x2; + x.foo(); // expected-warning {{ignoring return value}} + x2->foo(); // expected-warning {{ignoring return value}} +} diff --git a/clang/test/SemaCXX/warn-unused-variables.cpp b/clang/test/SemaCXX/warn-unused-variables.cpp index 8ae7d6ace4d..81f22a796a0 100644 --- a/clang/test/SemaCXX/warn-unused-variables.cpp +++ b/clang/test/SemaCXX/warn-unused-variables.cpp @@ -32,17 +32,6 @@ namespace PR5531 { } } - -struct X { - int foo() __attribute__((warn_unused_result)); -}; - -void bah() { - X x, *x2; - x.foo(); // expected-warning {{ignoring return value of function declared with warn_unused_result attribute}} - x2->foo(); // expected-warning {{ignoring return value of function declared with warn_unused_result attribute}} -} - template<typename T> struct X0 { }; |