[PATCH] D16465: [MS ABI] Prevent some expressions from evaluating to a constant
Ehsan Akhgari via cfe-commits
cfe-commits at lists.llvm.org
Fri Jan 22 11:17:51 PST 2016
ehsan added a comment.
In http://reviews.llvm.org/D16465#333688, @rnk wrote:
> Your code won't catch this test case:
>
> static int x;
> extern inline const bool *f() {
> static const bool p = !&x;
> return &p;
> }
>
> Getting this exactly right is going to be a challenge. =/
Oh you're right. I need to spend some more time comparing our behavior with cl's, it seems...
================
Comment at: include/clang/Basic/DiagnosticASTKinds.td:151
@@ -150,1 +150,3 @@
"%plural{1:byte|:bytes}1">;
+def note_constexpr_microsoft_abi_declrefexpr : Note<
+ "the constant expression cannot contain a reference to a variable as a Microsoft "
----------------
rnk wrote:
> We should add this test case and decide what to do with it:
> static int x;
> inline int **f() {
> static constexpr int *p = true ? 0 : &x;
> return &p;
> }
> Currently, in your patch, this diagnostic will come out. MSVC compiles this to guarded, dynamic initialization, despite the constexpr. ;_;
>
> David thinks we should just give the user the real deal constexpr behavior, even though it's ABI incompatible.
One solution to this would be to create a variation of `evaluateValue()` which activates this new behavior and only use it from `CodeGenModule::EmitConstantInit()`, so that the behavior of `evaluateValue()` in this context doesn't change. How does that sound?
By the way, I just realized that `CheckPotentialExpressionContainingDeclRefExpr()` eats this diagnostic because of the `SpeculativeLookForDeclRefExprRAII` object. Should I propagate it up from `CheckPotentialExpressionContainingDeclRefExpr()` to make it user visible? Right now the test case above only emits "constexpr variable 'p' must be initialized by a constant expression" without any notes.
================
Comment at: lib/AST/ExprConstant.cpp:9008
@@ -8917,1 +9007,3 @@
+ if (Ctx.getTargetInfo().getCXXABI().isMicrosoft())
+ InitInfo.useMicrosoftABI();
----------------
rnk wrote:
> This should be limited in scope to only apply to static locals. We should be able to statically initialize globals.
Right, my bad!
http://reviews.llvm.org/D16465
More information about the cfe-commits
mailing list