diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2012-02-10 07:41:06 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2012-02-10 07:41:06 +0000 |
commit | 0cd4ab194bed0038463e39cb15a9e5c80f8a7e8f (patch) | |
tree | 37e5e78edd2d6d6b91d0f35dc33a8f2066aefde4 /clang | |
parent | 09fc1bb605794d0615e90b07b142fabd576eb3fc (diff) | |
download | bcm5719-llvm-0cd4ab194bed0038463e39cb15a9e5c80f8a7e8f.tar.gz bcm5719-llvm-0cd4ab194bed0038463e39cb15a9e5c80f8a7e8f.zip |
Update to new resolution for DR1458. When taking the address of an object of
incomplete class type which has an overloaded operator&, it's now just
unspecified whether the overloaded operator or the builtin is used.
llvm-svn: 150234
Diffstat (limited to 'clang')
-rw-r--r-- | clang/include/clang/Basic/DiagnosticASTKinds.td | 3 | ||||
-rw-r--r-- | clang/lib/AST/ExprConstant.cpp | 12 | ||||
-rw-r--r-- | clang/test/CXX/expr/expr.const/p2-0x.cpp | 7 |
3 files changed, 4 insertions, 18 deletions
diff --git a/clang/include/clang/Basic/DiagnosticASTKinds.td b/clang/include/clang/Basic/DiagnosticASTKinds.td index 80d93291729..fb6e73090e2 100644 --- a/clang/include/clang/Basic/DiagnosticASTKinds.td +++ b/clang/include/clang/Basic/DiagnosticASTKinds.td @@ -55,9 +55,6 @@ def note_constexpr_pointer_comparison_differing_access : Note< "specifiers (%1 vs %3) has unspecified value">; def note_constexpr_compare_virtual_mem_ptr : Note< "comparison of pointer to virtual member function %0 has unspecified value">; -def note_constexpr_addr_of_incomplete : Note< - "cannot take address of object of incomplete class type %0 " - "in a constant expression">; def note_constexpr_past_end : Note< "dereferenced pointer past the end of %select{|subobject of }0" "%select{temporary|%2}1 is not a constant expression">; diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index e43884e3766..998bb705f9d 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -2944,18 +2944,6 @@ bool PointerExprEvaluator::VisitBinaryOperator(const BinaryOperator *E) { } bool PointerExprEvaluator::VisitUnaryAddrOf(const UnaryOperator *E) { - QualType SrcTy = E->getSubExpr()->getType(); - // In C++, taking the address of an object of incomplete class type has - // undefined behavior if the complete class type has an overloaded operator&. - // DR1458 makes such expressions non-constant. - if (Info.getLangOpts().CPlusPlus && - SrcTy->isRecordType() && SrcTy->isIncompleteType()) { - const RecordType *RT = SrcTy->getAs<RecordType>(); - Info.CCEDiag(E->getExprLoc(), diag::note_constexpr_addr_of_incomplete, 1) - << SrcTy; - Info.Note(RT->getDecl()->getLocation(), diag::note_forward_declaration) - << RT->getDecl(); - } return EvaluateLValue(E->getSubExpr(), Result, Info); } diff --git a/clang/test/CXX/expr/expr.const/p2-0x.cpp b/clang/test/CXX/expr/expr.const/p2-0x.cpp index 43d683aeca4..2d4f4fb62e6 100644 --- a/clang/test/CXX/expr/expr.const/p2-0x.cpp +++ b/clang/test/CXX/expr/expr.const/p2-0x.cpp @@ -111,9 +111,10 @@ namespace RecursionLimits { // DR1458: taking the address of an object of incomplete class type namespace IncompleteClassTypeAddr { - struct S; // expected-note {{forward}} + struct S; extern S s; - constexpr S *p = &s; // expected-error {{constant expression}} expected-note {{cannot take address of object of incomplete class type 'IncompleteClassTypeAddr::S' in a constant expression}} + constexpr S *p = &s; // ok + static_assert(p, ""); extern S sArr[]; constexpr S (*p2)[] = &sArr; // ok @@ -121,7 +122,7 @@ namespace IncompleteClassTypeAddr { struct S { constexpr S *operator&() { return nullptr; } }; - constexpr S *q = &s; + constexpr S *q = &s; // ok static_assert(!q, ""); } |