[cfe-commits] r147631 - in /cfe/trunk: lib/AST/ExprConstant.cpp lib/CodeGen/CGExprConstant.cpp test/CodeGenCXX/const-init-cxx11.cpp test/SemaCXX/constexpr-printing.cpp
Eli Friedman
eli.friedman at gmail.com
Thu Jan 5 15:59:40 PST 2012
Author: efriedma
Date: Thu Jan 5 17:59:40 2012
New Revision: 147631
URL: http://llvm.org/viewvc/llvm-project?rev=147631&view=rev
Log:
Address Richard's review comments on r147561 (Evaluate support for address-of-label differences).
Added:
cfe/trunk/test/CodeGenCXX/const-init-cxx11.cpp
Modified:
cfe/trunk/lib/AST/ExprConstant.cpp
cfe/trunk/lib/CodeGen/CGExprConstant.cpp
cfe/trunk/test/SemaCXX/constexpr-printing.cpp
Modified: cfe/trunk/lib/AST/ExprConstant.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=147631&r1=147630&r2=147631&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ExprConstant.cpp (original)
+++ cfe/trunk/lib/AST/ExprConstant.cpp Thu Jan 5 17:59:40 2012
@@ -3453,7 +3453,7 @@
}
bool Success(const CCValue &V, const Expr *E) {
- if (V.isLValue()) {
+ if (V.isLValue() || V.isAddrLabelDiff()) {
Result = V;
return true;
}
@@ -4002,8 +4002,6 @@
if (!HasSameBase(LHSValue, RHSValue)) {
if (E->getOpcode() == BO_Sub) {
// Handle &&A - &&B.
- // FIXME: We're missing a check that both labels have the same
- // associated function; I'm not sure how to write this check.
if (!LHSValue.Offset.isZero() || !RHSValue.Offset.isZero())
return false;
const Expr *LHSExpr = LHSValue.Base.dyn_cast<const Expr*>();
@@ -4014,6 +4012,10 @@
const AddrLabelExpr *RHSAddrExpr = dyn_cast<AddrLabelExpr>(RHSExpr);
if (!LHSAddrExpr || !RHSAddrExpr)
return false;
+ // Make sure both labels come from the same function.
+ if (LHSAddrExpr->getLabel()->getDeclContext() !=
+ RHSAddrExpr->getLabel()->getDeclContext())
+ return false;
Result = CCValue(LHSAddrExpr, RHSAddrExpr);
return true;
}
@@ -4113,8 +4115,6 @@
if (E->getOpcode() == BO_Sub && LHSVal.isLValue() && RHSVal.isLValue()) {
// Handle (intptr_t)&&A - (intptr_t)&&B.
- // FIXME: We're missing a check that both labels have the same
- // associated function; I'm not sure how to write this check.
if (!LHSVal.getLValueOffset().isZero() ||
!RHSVal.getLValueOffset().isZero())
return false;
@@ -4126,6 +4126,10 @@
const AddrLabelExpr *RHSAddrExpr = dyn_cast<AddrLabelExpr>(RHSExpr);
if (!LHSAddrExpr || !RHSAddrExpr)
return false;
+ // Make sure both labels come from the same function.
+ if (LHSAddrExpr->getLabel()->getDeclContext() !=
+ RHSAddrExpr->getLabel()->getDeclContext())
+ return false;
Result = CCValue(LHSAddrExpr, RHSAddrExpr);
return true;
}
Modified: cfe/trunk/lib/CodeGen/CGExprConstant.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprConstant.cpp?rev=147631&r1=147630&r2=147631&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGExprConstant.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGExprConstant.cpp Thu Jan 5 17:59:40 2012
@@ -1034,7 +1034,7 @@
RHS = llvm::ConstantExpr::getPtrToInt(RHS, IntPtrTy);
llvm::Constant *AddrLabelDiff = llvm::ConstantExpr::getSub(LHS, RHS);
- // LLVM os a bit sensitive about the exact format of the
+ // LLVM is a bit sensitive about the exact format of the
// address-of-label difference; make sure to truncate after
// the subtraction.
return llvm::ConstantExpr::getTruncOrBitCast(AddrLabelDiff, ResultType);
Added: cfe/trunk/test/CodeGenCXX/const-init-cxx11.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/const-init-cxx11.cpp?rev=147631&view=auto
==============================================================================
--- cfe/trunk/test/CodeGenCXX/const-init-cxx11.cpp (added)
+++ cfe/trunk/test/CodeGenCXX/const-init-cxx11.cpp Thu Jan 5 17:59:40 2012
@@ -0,0 +1,9 @@
+// RUN: %clang_cc1 -verify -triple x86_64-apple-darwin -emit-llvm -o - %s -std=c++11 | FileCheck %s
+
+namespace CrossFuncLabelDiff {
+ // Make sure we refuse to constant-fold the variable b.
+ constexpr long a() { return (long)&&lbl + (0 && ({lbl: 0;})); }
+ void test() { static long b = (long)&&lbl - a(); lbl: return; }
+ // CHECK: sub nsw i64 ptrtoint (i8* blockaddress(@_ZN18CrossFuncLabelDiff4testEv, {{.*}}) to i64),
+ // CHECK: store i64 {{.*}}, i64* @_ZZN18CrossFuncLabelDiff4testEvE1b, align 8
+}
Modified: cfe/trunk/test/SemaCXX/constexpr-printing.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/constexpr-printing.cpp?rev=147631&r1=147630&r2=147631&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/constexpr-printing.cpp (original)
+++ cfe/trunk/test/SemaCXX/constexpr-printing.cpp Thu Jan 5 17:59:40 2012
@@ -89,3 +89,10 @@
expected-error {{}} expected-note {{L"test\000\\\"\t\a\b\234\u1234"}}
constexpr char32_t c32_err = get(U"\U00110000"); // expected-error {{invalid universal character}}
+
+typedef decltype(sizeof(int)) LabelDiffTy;
+constexpr LabelDiffTy mulBy3(LabelDiffTy x) { return x * 3; } // expected-note {{subexpression}}
+void LabelDiffTest() {
+ static_assert(mulBy3((LabelDiffTy)&&a-(LabelDiffTy)&&b) == 3, ""); // expected-error {{constant expression}} expected-note {{call to 'mulBy3(&&a - &&b)'}}
+ a:b:return;
+}
More information about the cfe-commits
mailing list