[PATCH] [Parse] Allow 'constexpr' in condition declarations

Meador Inge meadori at gmail.com
Fri May 1 11:28:00 PDT 2015


Opening up in **constexpr** s in conditions allows "maybe" odr used expression to be collected in cases like:

  class T {
  public:
     constexpr T(int v) : v(v) { }
     constexpr operator int() const { return v; }
  private:
     int v;
  };
  
  int main() {
     if (constexpr T x = 200) { }
  }

Without the cleanup the following assert fires:

  (MaybeODRUseExprs.empty() && "Leftover expressions for odr-use checking"), function ActOnFinishFunctionBody, file /Users/meadori/Code/source/llvm/tools/clang/lib/Sema/SemaDecl.cpp, line 10820.

**MaybeODRUseExprs** is populated in **DoMarkVarDeclReferenced** from **SemaExpr.cpp** (the end of the function does an explicit check for constant expressions).  I don't think this situation could ever happen for conditional declarations before, but know it can and we need the new cleanup.


================
Comment at: include/clang/Parse/Parser.h:1760
@@ -1760,1 +1759,3 @@
+                                   DeclSpecContext DSC = DSC_normal,
+                                   bool AllowConstexprs = false);
 
----------------
rsmith wrote:
> Please add a new DSC value for conditions rather than adding a flag here.
Will fix.

================
Comment at: lib/Sema/SemaExprCXX.cpp:2585
@@ -2584,1 +2584,3 @@
 
+  Condition = MaybeCreateExprWithCleanups(Condition.get());
+
----------------
rsmith wrote:
> Do your tests cover the need for this?
Not yet, but I will add a test for it.

================
Comment at: test/CXX/stmt.stmt/stmt.select/p6.cpp:4-5
@@ +3,4 @@
+
+// This test verifies the functionality specified by DR948:
+// http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#948
+
----------------
rsmith wrote:
> The right place for such a test is tests/CXX/drs/dr9xx.cpp.
Will fix.

http://reviews.llvm.org/D8978

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/






More information about the cfe-commits mailing list