Author: rsmith
Date: Wed Oct 17 18:52:07 2012
New Revision: 166156
URL: http://llvm.org/viewvc/llvm-project?rev=166156&view=rev
Log:
DR1535: only potentially-evaluated typeid expressions are disallowed in constant
expressions, not *any* typeid on a polymorphic class type.
Modified:
cfe/trunk/lib/AST/ExprConstant.cpp
cfe/trunk/test/CodeGenCXX/typeid-cxx11.cpp
cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp
Modified: cfe/trunk/lib/AST/ExprConstant.cpp
URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=166156&r1=166155&r2=166156&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ExprConstant.cpp (original)
+++ cfe/trunk/lib/AST/ExprConstant.cpp Wed Oct 17 18:52:07 2012
@@ -2886,19 +2886,13 @@
}
bool LValueExprEvaluator::VisitCXXTypeidExpr(const CXXTypeidExpr *E) {
- if (E->isTypeOperand())
+ if (!E->isPotentiallyEvaluated())
return Success(E);
- CXXRecordDecl *RD = E->getExprOperand()->getType()->getAsCXXRecordDecl();
- // FIXME: The standard says "a typeid expression whose operand is of a
- // polymorphic class type" is not a constant expression, but it probably
- // means "a typeid expression whose operand is potentially evaluated".
- if (RD && RD->isPolymorphic()) {
- Info.Diag(E, diag::note_constexpr_typeid_polymorphic)
- << E->getExprOperand()->getType()
- << E->getExprOperand()->getSourceRange();
- return false;
- }
- return Success(E);
+
+ Info.Diag(E, diag::note_constexpr_typeid_polymorphic)
+ << E->getExprOperand()->getType()
+ << E->getExprOperand()->getSourceRange();
+ return false;
}
bool LValueExprEvaluator::VisitCXXUuidofExpr(const CXXUuidofExpr *E) {
Modified: cfe/trunk/test/CodeGenCXX/typeid-cxx11.cpp
URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/typeid-cxx11.cpp?rev=166156&r1=166155&r2=166156&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenCXX/typeid-cxx11.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/typeid-cxx11.cpp Wed Oct 17 18:52:07 2012
@@ -18,13 +18,15 @@
struct B : virtual A {};
struct C { int n; };
-// FIXME: check we produce a constant array for this, once we support IRGen of
-// folded structs and arrays.
+// CHECK: @_ZN5Test1L5itemsE = internal constant [4 x {{.*}}] [{{.*}}
@_ZTIN5Test11AE {{.*}}, {{.*}}, {{.*}} @_ZN5Test19make_implINS_1AEEEPvv },
{{.*}} @_ZTIN5Test11BE {{.*}} @_ZN5Test19make_implINS_1BEEEPvv {{.*}}
@_ZTIN5Test11CE {{.*}} @_ZN5Test19make_implINS_1CEEEPvv {{.*}} @_ZTIi {{.*}}
@_ZN5Test19make_implIiEEPvv }]
constexpr Item items[] = {
item<A>("A"), item<B>("B"), item<C>("C"), item<int>("int")
};
-// CHECK: @_ZN5Test11xE = constant %"class.std::type_info"* bitcast (i8**
@_ZTIN5Test11AE to %"class.std::type_info"*), align 8
+// CHECK: @_ZN5Test11xE = constant %"class.std::type_info"* bitcast ({{.*}}*
@_ZTIN5Test11AE to %"class.std::type_info"*), align 8
constexpr auto &x = items[0].ti;
+// CHECK: @_ZN5Test11yE = constant %"class.std::type_info"* bitcast ({{.*}}*
@_ZTIN5Test11BE to %"class.std::type_info"*), align 8
+constexpr auto &y = typeid(B{});
+
}
Modified: cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp
URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp?rev=166156&r1=166155&r2=166156&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp (original)
+++ cfe/trunk/test/SemaCXX/constant-expression-cxx11.cpp Wed Oct 17 18:52:07
2012
@@ -1408,3 +1408,14 @@
static_assert(get(arr, 0) == 4, ""); // expected-error{{not an integral
constant expression}} \
// expected-note{{in call to 'get(arr, 0)'}}
}
+
+namespace std { struct type_info; }
+
+namespace TypeId {
+ struct A { virtual ~A(); };
+ A f();
+ A &g();
+ constexpr auto &x = typeid(f());
+ constexpr auto &y = typeid(g()); // expected-error{{constant expression}} \
+ // expected-note{{typeid applied to expression of polymorphic type
'TypeId::A' is not allowed in a constant expression}}
+}
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits