Commit 8a2eba80 authored by Reid Kleckner's avatar Reid Kleckner
Browse files

Merging r340101:

------------------------------------------------------------------------
r340101 | rnk | 2018-08-17 15:11:31 -0700 (Fri, 17 Aug 2018) | 14 lines

Don't warn on returning the address of a label from a statement expression

Summary:
There isn't anything inherently wrong with returning a label from a
statement expression. In practice, the Linux kernel uses this pattern to
materialize PCs.

Fixes PR38569

Reviewers: niravd, rsmith, nickdesaulniers

Subscribers: cfe-commits

Differential Revision: https://reviews.llvm.org/D50805
------------------------------------------------------------------------

llvm-svn: 340103
parent 786ae53d
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -6942,6 +6942,10 @@ void Sema::checkInitializerLifetime(const InitializedEntity &Entity,
      } else if (isa<BlockExpr>(L)) {
        Diag(DiagLoc, diag::err_ret_local_block) << DiagRange;
      } else if (isa<AddrLabelExpr>(L)) {
        // Don't warn when returning a label from a statement expression.
        // Leaving the scope doesn't end its lifetime.
        if (LK == LK_StmtExprResult)
          return false;
        Diag(DiagLoc, diag::warn_ret_addr_label) << DiagRange;
      } else {
        Diag(DiagLoc, diag::warn_ret_local_temp_addr_ref)
+9 −0
Original line number Diff line number Diff line
@@ -34,6 +34,15 @@ bar:
  return &&bar;  // expected-warning {{returning address of label, which is local}}
}

// PR38569: Don't warn when returning a label from a statement expression.
void test10_logpc(void*);
void test10a() {
  test10_logpc(({
    my_pc:
      &&my_pc;
  }));
}

// PR6034
void test11(int bit) {
  switch (bit)