[PATCH] D35562: Support GNU extension StmtExpr in constexpr function
Stephan Bergmann via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Jul 18 07:47:23 PDT 2017
sberg created this revision.
The assert.h in glibc 2.25 defines assert as a GNU-extension "statement expression", see https://sourceware.org/git/?p=glibc.git;a=commit;h=e077349ce589466eecd47213db4fae6b80ec18c4 "assert.h: allow gcc to detect assert(a = 1) errors". That caused Clang's -std=gnu++14 to no longer treat constexpr functions containing assert as actually being constant expressions. (And I ran into that when trying to build LibreOffice master with Clang trunk against Fedora 26 glibc.)
https://reviews.llvm.org/D35562
Files:
clang/lib/AST/ExprConstant.cpp
clang/test/SemaCXX/constant-expression-cxx1y.cpp
Index: clang/test/SemaCXX/constant-expression-cxx1y.cpp
===================================================================
--- clang/test/SemaCXX/constant-expression-cxx1y.cpp
+++ clang/test/SemaCXX/constant-expression-cxx1y.cpp
@@ -781,9 +781,8 @@
return ({ int n; n; }); // expected-note {{object of type 'int' is not initialized}}
}
- // FIXME: We should handle the void statement expression case.
- constexpr int h() { // expected-error {{never produces a constant}}
- ({ if (true) {} }); // expected-note {{not supported}}
+ constexpr int h() {
+ ({ if (true) {} });
return 0;
}
}
Index: clang/lib/AST/ExprConstant.cpp
===================================================================
--- clang/lib/AST/ExprConstant.cpp
+++ clang/lib/AST/ExprConstant.cpp
@@ -4838,16 +4838,10 @@
for (CompoundStmt::const_body_iterator BI = CS->body_begin(),
BE = CS->body_end();
- /**/; ++BI) {
- if (BI + 1 == BE) {
- const Expr *FinalExpr = dyn_cast<Expr>(*BI);
- if (!FinalExpr) {
- Info.FFDiag((*BI)->getLocStart(),
- diag::note_constexpr_stmt_expr_unsupported);
- return false;
- }
- return this->Visit(FinalExpr);
- }
+ BI != BE; ++BI) {
+ if (BI + 1 == BE)
+ if (const Expr *FinalExpr = dyn_cast<Expr>(*BI))
+ return this->Visit(FinalExpr);
APValue ReturnValue;
StmtResult Result = { ReturnValue, nullptr };
@@ -4863,7 +4857,7 @@
}
}
- llvm_unreachable("Return from function from the loop above.");
+ return true;
}
/// Visit a value which is evaluated, but whose value is ignored.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D35562.107096.patch
Type: text/x-patch
Size: 1715 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170718/59ca031a/attachment-0001.bin>
More information about the cfe-commits
mailing list