]> granicus.if.org Git - clang/commitdiff
Clean up the tests for warning about unused function results given the
authorChandler Carruth <chandlerc@gmail.com>
Mon, 21 Feb 2011 00:56:56 +0000 (00:56 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Mon, 21 Feb 2011 00:56:56 +0000 (00:56 +0000)
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. =]

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@126098 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaStmt.cpp
test/SemaCXX/warn-unused-result.cpp [new file with mode: 0644]
test/SemaCXX/warn-unused-variables.cpp

index e995e8f207dfa542016673c8788bd32e1dab87ce..49efca82412d9c9506a76e650662d430b6e92c52 100644 (file)
@@ -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/test/SemaCXX/warn-unused-result.cpp b/test/SemaCXX/warn-unused-result.cpp
new file mode 100644 (file)
index 0000000..d14fdf9
--- /dev/null
@@ -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}}
+}
index 8ae7d6ace4daa737154d9098b8f9d533376b94e5..81f22a796a0e64c6a8daf27df8766934f0be3602 100644 (file)
@@ -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 { };