NoQ added a comment. It looks like this commit causes unexpected changes in non-C++ code. Eg., in this tiny reproducer (that uses the non-standard "blocks" feature but is otherwise plain C):
typedef struct { int x; } S; void foo() { ^{ S s; return s; }; } I'm suddenly seeing C++-specific items in the AST that shouldn't show up in C (xvalues, NRVO, etc.): `$ clang -x c -Xclang -ast-dump test.c` ... `-FunctionDecl 0x7fc55288aa88 <line:5:1, line:10:1> line:5:6 foo 'void ()' `-CompoundStmt 0x7fc55288aec0 <col:12, line:10:1> `-BlockExpr 0x7fc55288aea8 <line:6:3, line:9:3> 'S (^)(void)' `-BlockDecl 0x7fc55288ab70 <line:6:3, line:9:3> line:6:3 |-CompoundStmt 0x7fc55288adc8 <col:4, line:9:3> | |-DeclStmt 0x7fc55288acd8 <line:7:5, col:8> | | `-VarDecl 0x7fc55288ac70 <col:5, col:7> col:7 used s 'S':'S' nrvo | `-ReturnStmt 0x7fc55288adb0 <line:8:5, col:12> | `-ImplicitCastExpr 0x7fc55288ad98 <col:12> 'S':'S' <LValueToRValue> | `-ImplicitCastExpr 0x7fc55288ad80 <col:12> 'S':'S' xvalue <NoOp> | `-ImplicitCastExpr 0x7fc55288ad68 <col:12> 'S':'S' <LValueToRValue> | `-DeclRefExpr 0x7fc55288acf0 <col:12> 'S':'S' lvalue Var 0x7fc55288ac70 's' 'S':'S' `-VarDecl 0x7fc55288ac70 <line:7:5, col:7> col:7 used s 'S':'S' nrvo The double implicit lvalue-to-rvalue cast looks incorrect as well (there isn't an extra dereference here). Here's how the old AST looks like: ... `-FunctionDecl 0x7fb594079e88 <line:5:1, line:10:1> line:5:6 foo 'void ()' `-CompoundStmt 0x7fb59407a230 <col:12, line:10:1> `-BlockExpr 0x7fb59407a218 <line:6:3, line:9:3> 'S (^)(void)' `-BlockDecl 0x7fb594079f70 <line:6:3, line:9:3> line:6:3 |-CompoundStmt 0x7fb59407a138 <col:4, line:9:3> | |-DeclStmt 0x7fb59407a0d8 <line:7:5, col:8> | | `-VarDecl 0x7fb59407a070 <col:5, col:7> col:7 used s 'S':'S' | `-ReturnStmt 0x7fb59407a128 <line:8:5, col:12> | `-ImplicitCastExpr 0x7fb59407a110 <col:12> 'S':'S' <LValueToRValue> | `-DeclRefExpr 0x7fb59407a0f0 <col:12> 'S':'S' lvalue Var 0x7fb59407a070 's' 'S':'S' `-VarDecl 0x7fb59407a070 <line:7:5, col:7> col:7 used s 'S':'S' I don't think this is intended. @mizvekov, do you think you can add more hard checks to make sure it's constrained to C++? (Or maybe there's another, more precise solution?) Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D105756/new/ https://reviews.llvm.org/D105756 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits