tmroeder marked an inline comment as done.
tmroeder added inline comments.

================
Comment at: lib/AST/ASTImporter.cpp:6160
+  // condition-dependent.
+  bool CondIsTrue = false;
+  if (!E->isConditionDependent())
----------------
tmroeder wrote:
> aaron.ballman wrote:
> > tmroeder wrote:
> > > a_sidorin wrote:
> > > > aaron.ballman wrote:
> > > > > tmroeder wrote:
> > > > > > aaron.ballman wrote:
> > > > > > > a_sidorin wrote:
> > > > > > > > aaron.ballman wrote:
> > > > > > > > > `bool CondIsTrue = E->isConditionDependent() ? false : 
> > > > > > > > > E->isConditionTrue();`
> > > > > > > > `bool CondIsTrue = E->isConditionDependent() && 
> > > > > > > > E->isConditionTrue();`?
> > > > > > > I like that even better than my suggestion. :-)
> > > > > > Wait, this doesn't have the same truth table as my original code.
> > > > > > 
> > > > > > let `CD = E->isConditionDependent()`
> > > > > > let `CT = E->isConditionTrue()`
> > > > > > 
> > > > > > in
> > > > > > 
> > > > > > ```
> > > > > > bool CondIsTrue = false;
> > > > > > if (!CD)
> > > > > >   CondIsTrue = CT;
> > > > > > ```
> > > > > > 
> > > > > > has the table for `CondIsTrue`:
> > > > > > 
> > > > > > | `CD` | `CT` |  `CondIsTrue` |
> > > > > > | T | T | F |
> > > > > > | T | F | F |
> > > > > > | F | T | T |
> > > > > > | F | F | F |
> > > > > > i.e., if CD is true, then CondIsTrue is always false. Otherwise, 
> > > > > > it's the value of CT.
> > > > > > 
> > > > > > The suggested line has the truth table
> > > > > > 
> > > > > > | `CD` | `CT` |  `CondIsTrue` |
> > > > > > | T | T | T |
> > > > > > | T | F | F |
> > > > > > | F | T | F |
> > > > > > | F | F | F |
> > > > > > 
> > > > > > That is, the effect of CD is swapped.
> > > > > > 
> > > > > > Aaron's suggestion matches my original table. I based my code on 
> > > > > > include/clang/AST/Expr.h line 4032, which asserts 
> > > > > > !isConditionDependent() in the implementation of isConditionTrue.
> > > > > > 
> > > > > > I realized this after I "fixed" my comment to match the 
> > > > > > implementation change. Am I missing something? Or is the assertion 
> > > > > > in Expr.h wrong? I think this should be
> > > > > > 
> > > > > > ```
> > > > > > bool CondIsTrue = !E->isConditionDependent() && 
> > > > > > E->isConditionTrue();
> > > > > > ```
> > > > > > 
> > > > > > I've changed my code to that and reverted the comment change.
> > > > > Good catch -- I think my eyes just missed the change in logic. 
> > > > > Perhaps we should add a test case that exercises this?
> > > > Wow, that's a nice catch. Sorry for the misleading.
> > > I started to look for a way to test this, then realized that while it's 
> > > possible to test the code itself, it's impossible to make a ChooseExpr 
> > > with isConditionDependent() that returns true for real code.
> > > 
> > > TL;DR: ChooseExpr is a C-only construct, and isConditionDependent is a 
> > > C++-only condition; it's always false in C.
> > > 
> > > Details:
> > > 
> > > ChooseExpr only represents __builtin_choose_expr which is only valid in 
> > > C, not C++. That means ChooseExpr::isConditionDependent() will always be 
> > > false.
> > > 
> > > The definition is
> > > 
> > > ```
> > > bool isConditionDependent() const {
> > >   return getCond()->isTypeDependent() || getCond() ->isValueDependent();
> > > }
> > > ```
> > > 
> > > However Expr::isTypeDependent() (see Expr.h line 158) is a purely C++ 
> > > property to do with templates ([temp.dep.expr]): it is true if the type 
> > > of the expression could change from one template instantiation to another.
> > > 
> > > Similarly Expr::isValueDependent() (see Expr.h line 144) is a purely C++ 
> > > property to do with templates ([temp.dep.expr]): it is true for 
> > > value-dependent types in templates.
> > > 
> > > Both will always be false in all instantiations of ChooseExpr, due to the 
> > > language difference.
> > > 
> > > So, I think ChooseExpr can be refactored to remove isConditionDependent 
> > > and change its constructor to remove TypeDependent and ValueDependent.
> > > 
> > > If it's OK with you, I'll do that in a followup patch.
> > > ChooseExpr only represents __builtin_choose_expr which is only valid in 
> > > C, not C++. 
> > 
> > We allow it in C++, though: https://godbolt.org/z/_f1DPV
> Hmm. Is that by design or chance? GCC doesn't allow it: 
> https://godbolt.org/z/kvGCk1
> 
> Maybe it shouldn't be allowed?
Anyway, that means I can add a test; I'll look into doing that.


Repository:
  rC Clang

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

https://reviews.llvm.org/D58292



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

Reply via email to