[cfe-commits] r166361 - in /cfe/trunk: lib/CodeGen/CGExpr.cpp lib/Sema/SemaExpr.cpp test/CodeGenCXX/const-init-cxx11.cpp test/CodeGenCXX/for-range.cpp test/CodeGenCXX/lambda-expressions.cpp test/SemaCXX/lambda-expressions.cpp
Craig Topper
craig.topper at gmail.com
Thu Oct 25 22:48:53 PDT 2012
I think this change broke bootstrap builds with C++11 and -Werror enabled.
lib/VMCore/Verifier.cpp:116:14: error: variable 'PreVerifyID' is not needed
and will not be emitted [-Werror,-Wunneeded-internal-declaration]
static char &PreVerifyID = PreVerifier::ID;
On Fri, Oct 19, 2012 at 6:38 PM, Richard Smith
<richard-llvm at metafoo.co.uk>wrote:
> Author: rsmith
> Date: Fri Oct 19 20:38:33 2012
> New Revision: 166361
>
> URL: http://llvm.org/viewvc/llvm-project?rev=166361&view=rev
> Log:
> DR1472: A reference isn't odr-used if it has preceding initialization,
> initialized by a reference constant expression.
>
> Our odr-use modeling still needs work here: we don't yet implement the
> 'set of
> potential results of an expression' DR.
>
> Modified:
> cfe/trunk/lib/CodeGen/CGExpr.cpp
> cfe/trunk/lib/Sema/SemaExpr.cpp
> cfe/trunk/test/CodeGenCXX/const-init-cxx11.cpp
> cfe/trunk/test/CodeGenCXX/for-range.cpp
> cfe/trunk/test/CodeGenCXX/lambda-expressions.cpp
> cfe/trunk/test/SemaCXX/lambda-expressions.cpp
>
> Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=166361&r1=166360&r2=166361&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGExpr.cpp Fri Oct 19 20:38:33 2012
> @@ -1695,6 +1695,21 @@
> CharUnits Alignment = getContext().getDeclAlign(ND);
> QualType T = E->getType();
>
> + // A DeclRefExpr for a reference initialized by a constant expression
> can
> + // appear without being odr-used. Directly emit the constant
> initializer.
> + if (const VarDecl *VD = dyn_cast<VarDecl>(ND)) {
> + const Expr *Init = VD->getAnyInitializer(VD);
> + if (Init && !isa<ParmVarDecl>(VD) && VD->getType()->isReferenceType()
> &&
> + VD->isUsableInConstantExpressions(getContext()) &&
> + VD->checkInitIsICE()) {
> + llvm::Constant *Val =
> + CGM.EmitConstantValue(*VD->evaluateValue(), VD->getType(), this);
> + assert(Val && "failed to emit reference constant expression");
> + // FIXME: Eventually we will want to emit vector element references.
> + return MakeAddrLValue(Val, T, Alignment);
> + }
> + }
> +
> // FIXME: We should be able to assert this for FunctionDecls as well!
> // FIXME: We should be able to assert this for all DeclRefExprs, not
> just
> // those with a valid source location.
> @@ -1705,7 +1720,7 @@
> if (ND->hasAttr<WeakRefAttr>()) {
> const ValueDecl *VD = cast<ValueDecl>(ND);
> llvm::Constant *Aliasee = CGM.GetWeakRefReference(VD);
> - return MakeAddrLValue(Aliasee, E->getType(), Alignment);
> + return MakeAddrLValue(Aliasee, T, Alignment);
> }
>
> if (const VarDecl *VD = dyn_cast<VarDecl>(ND)) {
> @@ -1733,9 +1748,8 @@
> }
>
> assert(isa<BlockDecl>(CurCodeDecl) && E->refersToEnclosingLocal());
> - CharUnits alignment = getContext().getDeclAlign(VD);
> return MakeAddrLValue(GetAddrOfBlockDecl(VD, isBlockVariable),
> - E->getType(), alignment);
> + T, Alignment);
> }
>
> assert(V && "DeclRefExpr not entered in LocalDeclMap?");
>
> Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=166361&r1=166360&r2=166361&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Fri Oct 19 20:38:33 2012
> @@ -11010,20 +11010,21 @@
> }
> }
>
> - // Per C++11 [basic.def.odr], a variable is odr-used "unless it is
> - // an object that satisfies the requirements for appearing in a
> - // constant expression (5.19) and the lvalue-to-rvalue conversion (4.1)
> + // Per C++11 [basic.def.odr], a variable is odr-used "unless it
> satisfies
> + // the requirements for appearing in a constant expression (5.19) and,
> if
> + // it is an object, the lvalue-to-rvalue conversion (4.1)
> // is immediately applied." We check the first part here, and
> // Sema::UpdateMarkingForLValueToRValue deals with the second part.
> // Note that we use the C++11 definition everywhere because nothing in
> - // C++03 depends on whether we get the C++03 version correct. This does
> not
> - // apply to references, since they are not objects.
> + // C++03 depends on whether we get the C++03 version correct. The second
> + // part does not apply to references, since they are not objects.
> const VarDecl *DefVD;
> - if (E && !isa<ParmVarDecl>(Var) && !Var->getType()->isReferenceType() &&
> + if (E && !isa<ParmVarDecl>(Var) &&
> Var->isUsableInConstantExpressions(SemaRef.Context) &&
> - Var->getAnyInitializer(DefVD) && DefVD->checkInitIsICE())
> - SemaRef.MaybeODRUseExprs.insert(E);
> - else
> + Var->getAnyInitializer(DefVD) && DefVD->checkInitIsICE()) {
> + if (!Var->getType()->isReferenceType())
> + SemaRef.MaybeODRUseExprs.insert(E);
> + } else
> MarkVarDeclODRUsed(SemaRef, Var, Loc);
> }
>
>
> Modified: cfe/trunk/test/CodeGenCXX/const-init-cxx11.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/const-init-cxx11.cpp?rev=166361&r1=166360&r2=166361&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/const-init-cxx11.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/const-init-cxx11.cpp Fri Oct 19 20:38:33 2012
> @@ -432,11 +432,7 @@
> // CHECK: call void
> @_ZN13InitFromConst7consumeIRKNS_1SEEEvT_(%"struct.InitFromConst::S"*
> @_ZN13InitFromConstL1sE)
> consume<const S&>(s);
>
> - // FIXME CHECK-NOT: call void
> @_ZN13InitFromConst7consumeIRKNS_1SEEEvT_(%"struct.InitFromConst::S"*
> @_ZN13InitFromConstL1sE)
> - // There's no lvalue-to-rvalue conversion here, so 'r' is odr-used,
> and
> - // we're permitted to emit a load of it. This seems likely to be a
> defect
> - // in the standard. If we start emitting a direct reference to 's',
> update
> - // this test.
> + // CHECK: call void
> @_ZN13InitFromConst7consumeIRKNS_1SEEEvT_(%"struct.InitFromConst::S"*
> @_ZN13InitFromConstL1sE)
> consume<const S&>(r);
>
> // CHECK: call void
> @_ZN13InitFromConst7consumeIPKNS_1SEEEvT_(%"struct.InitFromConst::S"*
> @_ZN13InitFromConstL1sE)
>
> Modified: cfe/trunk/test/CodeGenCXX/for-range.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/for-range.cpp?rev=166361&r1=166360&r2=166361&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/for-range.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/for-range.cpp Fri Oct 19 20:38:33 2012
> @@ -40,7 +40,7 @@
> // CHECK-NOT: 5begin
> // CHECK-NOT: 3end
> // CHECK: getelementptr {{.*}}, i32 0
> - // CHECK: getelementptr {{.*}}, i64 5
> + // CHECK: getelementptr {{.*}}, i64 1, i64 0
> // CHECK: br label %[[COND:.*]]
>
> // CHECK: [[COND]]:
>
> Modified: cfe/trunk/test/CodeGenCXX/lambda-expressions.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/lambda-expressions.cpp?rev=166361&r1=166360&r2=166361&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/lambda-expressions.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/lambda-expressions.cpp Fri Oct 19 20:38:33
> 2012
> @@ -71,6 +71,15 @@
> int (*fp)(int, int) = [](int x, int y){ return x + y; };
> }
>
> +static int k;
> +int g() {
> + int &r = k;
> + // CHECK: define internal i32 @"_ZZ1gvENK3$_6clEv"(
> + // CHECK-NOT: }
> + // CHECK: load i32* @_ZL1k,
> + return [] { return r; } ();
> +};
> +
> // CHECK: define internal i32 @"_ZZ1fvEN3$_58__invokeEii"
> // CHECK: store i32
> // CHECK-NEXT: store i32
>
> Modified: cfe/trunk/test/SemaCXX/lambda-expressions.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/lambda-expressions.cpp?rev=166361&r1=166360&r2=166361&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/lambda-expressions.cpp (original)
> +++ cfe/trunk/test/SemaCXX/lambda-expressions.cpp Fri Oct 19 20:38:33 2012
> @@ -83,12 +83,15 @@
> const int h = a; // expected-note {{declared}}
> []() { return h; }; // expected-error {{variable 'h' cannot be
> implicitly captured in a lambda with no capture-default specified}}
> expected-note {{lambda expression begins here}}
>
> - // The exemption for variables which can appear in constant
> expressions
> - // applies only to objects (and not to references).
> - // FIXME: This might be a bug in the standard.
> - static int i;
> - constexpr int &ref_i = i; // expected-note {{declared}}
> + // References can appear in constant expressions if they are
> initialized by
> + // reference constant expressions.
> + int i;
> + int &ref_i = i; // expected-note {{declared}}
> [] { return ref_i; }; // expected-error {{variable 'ref_i' cannot be
> implicitly captured in a lambda with no capture-default specified}}
> expected-note {{lambda expression begins here}}
> +
> + static int j;
> + int &ref_j = j;
> + [] { return ref_j; }; // ok
> }
> }
>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
--
~Craig
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20121025/e8df2c3e/attachment.html>
More information about the cfe-commits
mailing list