aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2022-12-14 14:46:30 +0000
committerGitHub <noreply@github.com>2022-12-14 14:46:30 +0000
commit3b89428c0d5710c8093055b3d92c543888759f93 (patch)
treebeec559689144dfe4f023924ae1dd3a37b19a580
parent3d6dbb6fc5d1d14bf36a879b6f4a00ae91090a63 (diff)
parent5c2e6c93d919b939ba7eca2100fa35cc444f4b8d (diff)
downloadgcc-3b89428c0d5710c8093055b3d92c543888759f93.zip
gcc-3b89428c0d5710c8093055b3d92c543888759f93.tar.gz
gcc-3b89428c0d5710c8093055b3d92c543888759f93.tar.bz2
Merge #1703
1703: Backport "c++: Quash -Wdangling-reference for member operator* [PR107488]" r=tschwinge a=tschwinge As had also been reported in <https://gcc.gnu.org/PR107633> "Bootstrap failure due to -Werror=unused-parameter and -Werror=dangling-reference", GCC `--enable-bootstrap` build is currently broken: [...]/gcc/rust/backend/rust-compile-expr.cc: In member function ‘tree_node* Rust::Compile::CompileExpr::resolve_method_address(Rust::TyTy::FnType*, Rust::HirId, Rust::TyTy::BaseType*, Rust::HIR::PathIdentSegment&, Rust::Analysis::NodeMapping, Location)’: [...]/gcc/rust/backend/rust-compile-expr.cc:2019:13: error: possibly dangling reference to a temporary [-Werror=dangling-reference] 2019 | auto &candidate = *candidates.begin (); | ^~~~~~~~~ [...]/gcc/rust/backend/rust-compile-expr.cc:2019:44: note: the temporary was destroyed at the end of the full expression ‘candidates.std::set<Rust::Resolver::PathProbeCandidate>::begin().std::_Rb_tree_const_iterator<Rust::Resolver::PathProbeCandidate>::operator*()’ 2019 | auto &candidate = *candidates.begin (); | ^ [...]/gcc/rust/backend/rust-compile-expr.cc: In member function ‘tree_node* Rust::Compile::CompileExpr::generate_closure_fntype(Rust::HIR::ClosureExpr&, const Rust::TyTy::ClosureType&, tree, Rust::TyTy::FnType**)’: [...]/gcc/rust/backend/rust-compile-expr.cc:3034:35: error: possibly dangling reference to a temporary [-Werror=dangling-reference] 3034 | const TyTy::TypeBoundPredicate &predicate | ^~~~~~~~~ [...]/gcc/rust/backend/rust-compile-expr.cc:3035:52: note: the temporary was destroyed at the end of the full expression ‘(&(& closure_tyty)->Rust::TyTy::ClosureType::<anonymous>.Rust::TyTy::BaseType::<anonymous>.Rust::TyTy::TypeBoundsMappings::get_specified_bounds())->std::vector<Rust::TyTy::TypeBoundPredicate>::begin().__gnu_cxx::__normal_iterator<const Rust::TyTy::TypeBoundPredicate*, std::vector<Rust::TyTy::TypeBoundPredicate> >::operator*()’ 3035 | = *closure_tyty.get_specified_bounds ().begin (); | ^ [...]/gcc/rust/typecheck/rust-hir-type-check-path.cc: In member function ‘void Rust::Resolver::TypeCheckExpr::resolve_segments(Rust::NodeId, std::vector<Rust::HIR::PathExprSegment>&, size_t, Rust::TyTy::BaseType*, const Rust::Analysis::NodeMapping&, Location)’: [...]/gcc/rust/typecheck/rust-hir-type-check-path.cc:340:13: error: possibly dangling reference to a temporary [-Werror=dangling-reference] 340 | auto &candidate = *candidates.begin (); | ^~~~~~~~~ [...]/gcc/rust/typecheck/rust-hir-type-check-path.cc:340:44: note: the temporary was destroyed at the end of the full expression ‘candidates.std::set<Rust::Resolver::PathProbeCandidate>::begin().std::_Rb_tree_const_iterator<Rust::Resolver::PathProbeCandidate>::operator*()’ 340 | auto &candidate = *candidates.begin (); | ^ [...]/gcc/rust/typecheck/rust-hir-type-check-type.cc: In member function ‘Rust::TyTy::BaseType* Rust::Resolver::TypeCheckType::resolve_segments(Rust::NodeId, Rust::HirId, std::vector<std::unique_ptr<Rust::HIR::TypePathSegment> >&, size_t, Rust::TyTy::BaseType*, const Rust::Analysis::NodeMapping&, Location)’: [...]/gcc/rust/typecheck/rust-hir-type-check-type.cc:465:13: error: possibly dangling reference to a temporary [-Werror=dangling-reference] 465 | auto &candidate = *candidates.begin (); | ^~~~~~~~~ [...]/gcc/rust/typecheck/rust-hir-type-check-type.cc:465:44: note: the temporary was destroyed at the end of the full expression ‘candidates.std::set<Rust::Resolver::PathProbeCandidate>::begin().std::_Rb_tree_const_iterator<Rust::Resolver::PathProbeCandidate>::operator*()’ 465 | auto &candidate = *candidates.begin (); | ^ I understand this code has been changed in the GCC/Rust upstream submission; but in order to make progress with #1700, I'd like to first individually backport "c++: Quash -Wdangling-reference for member operator* [PR107488]", to resolve this issue here. Co-authored-by: Marek Polacek <polacek@redhat.com>
-rw-r--r--gcc/cp/call.cc12
-rw-r--r--gcc/testsuite/g++.dg/warn/Wdangling-reference5.C22
2 files changed, 33 insertions, 1 deletions
diff --git a/gcc/cp/call.cc b/gcc/cp/call.cc
index c7c7a12..2c0fa37 100644
--- a/gcc/cp/call.cc
+++ b/gcc/cp/call.cc
@@ -13467,7 +13467,17 @@ do_warn_dangling_reference (tree expr)
can be e.g.
const int& z = std::min({1, 2, 3, 4, 5, 6, 7});
which doesn't dangle: std::min here returns an int. */
- || !TYPE_REF_OBJ_P (TREE_TYPE (TREE_TYPE (fndecl))))
+ || !TYPE_REF_OBJ_P (TREE_TYPE (TREE_TYPE (fndecl)))
+ /* Don't emit a false positive for:
+ std::vector<int> v = ...;
+ std::vector<int>::const_iterator it = v.begin();
+ const int &r = *it++;
+ because R refers to one of the int elements of V, not to
+ a temporary object. Member operator* may return a reference
+ but probably not to one of its arguments. */
+ || (DECL_NONSTATIC_MEMBER_FUNCTION_P (fndecl)
+ && DECL_OVERLOADED_OPERATOR_P (fndecl)
+ && DECL_OVERLOADED_OPERATOR_IS (fndecl, INDIRECT_REF)))
return NULL_TREE;
/* Here we're looking to see if any of the arguments is a temporary
diff --git a/gcc/testsuite/g++.dg/warn/Wdangling-reference5.C b/gcc/testsuite/g++.dg/warn/Wdangling-reference5.C
new file mode 100644
index 0000000..59b5538
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wdangling-reference5.C
@@ -0,0 +1,22 @@
+// PR c++/107488
+// { dg-do compile }
+// { dg-options "-Wdangling-reference" }
+
+#include <vector>
+
+int
+do_sum (std::vector<int>& v)
+{
+ int sum = 0;
+
+ std::vector<int>::const_iterator it = v.begin();
+ while (it != v.end())
+ {
+ // R refers to one of the int elements of V, not to a temporary
+ // object, so no dangling reference here.
+ const int &r = *it++; // { dg-bogus "dangling reference" }
+ sum += r;
+ }
+
+ return sum;
+}