hokein added a comment.

since we're now preserving  more invalid code, we should check whether 
const-evaluator is cable of handling these newly-added invalid case.

I have played around it, it seems that if, do/while, while cases are already 
handled well. `switch` case need some work:

- the ASTs among different cases (`switch (;)`, `switch(;;)`, `switch(!!;)`) 
are subtle
- the follow case will result an value-dependent violation, the fix would be to 
handle value-dependent condition in `EvaluateSwitch` 
(`clang/lib/AST/ExprConstant.cpp`)

  constexpr int s() {
    switch(!!) {
    }
    return 0;
  }
  void a() {
    constexpr int k = s();
  }



================
Comment at: clang/lib/Parse/ParseExprCXX.cpp:1962
 ///
 /// \returns The parsed condition.
+Sema::ConditionResult
----------------
nit:  update the doc comment, though the comment is already stale (missing 
`CK`).


================
Comment at: clang/lib/Parse/ParseStmt.cpp:1194
                                        SourceLocation Loc,
-                                       Sema::ConditionKind CK,
+                                       Sema::ConditionKind CK, bool MissingOK,
                                        SourceLocation *LParenLoc,
----------------
sammccall wrote:
> hokein wrote:
> > what's the purpose of introducing `MissingOK`? It seems unclear to me, my 
> > understanding is
> > 
> > - before the patch, ActionOnCondition always returned a valid 
> > ConditionResult for an empty ConditionResult. I assume this was 
> > conceptually a "MissingOK-true" case.
> > - now in the patch, the MissingOK is propagated to `ActOnCondition`, which 
> > determines the returning result;  ​The MissingOK is set to false in 
> > ParseSwitchStatement, ParseDoStatement below. 
> > 
> > The only case I can think of is that we might fail to create a recoveryExpr 
> > (when the recovery-ast flag is off) for the condition.
> Your understanding is right: previously we were returning a "valid but empty" 
> ConditionResult for a while loop with no condition.
> 
> We want functions like ParseParenExprOrCondition to be able to recover in 
> this case, without having them "recover" legitimately missing for loop 
> conditions.
> 
> It would be possible to have ParseParenExprOrCondition conditionally recover 
> based on MissingOK, but since we're already using the tristate 
> ConditionResult, using its error state seems cleaner.
> 
> > The only case I can think of is that we might fail to create a recoveryExpr 
> > (when the recovery-ast flag is off) for the condition.
> 
> I'm not sure what you're saying here - what is that a case of?
> Is there something you'd like me to do here?
> I'm not sure what you're saying here - what is that a case of?
> Is there something you'd like me to do here?

sorry, no action needed.  


================
Comment at: clang/test/AST/loop-recovery.cpp:40
+
+  switch(!!!) // expected-error {{expected expression}}
+    int switchBody;
----------------
can you add an init-statement switch case? e.g. `switch (;)`, `switch(;;)`, 
`switch(!!;)`


================
Comment at: clang/test/Parser/cxx0x-attributes.cpp:155
       alignas(4 ns::i; // expected-note {{to match this '('}}
+                       // expected-error@-1 {{expected ';' after do/while}}
 } // expected-error 2{{expected ')'}} expected-error {{expected expression}}
----------------
This looks like a bogus diagnostic, but I think it is ok, as this is a 
poor-recovery case for clang already -- IIUC, the do-while statement range 
claims to the `}` on Line56.

this is a case which can be improved by our bracket-matching repair :)


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D113752/new/

https://reviews.llvm.org/D113752

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to