diff options
-rw-r--r-- | include/clang/Basic/DiagnosticASTKinds.td | 3 | ||||
-rw-r--r-- | lib/AST/ExprConstant.cpp | 12 | ||||
-rw-r--r-- | test/CXX/expr/expr.const/p2-0x.cpp | 7 |
3 files changed, 4 insertions, 18 deletions
diff --git a/include/clang/Basic/DiagnosticASTKinds.td b/include/clang/Basic/DiagnosticASTKinds.td index 80d9329172..fb6e73090e 100644 --- a/include/clang/Basic/DiagnosticASTKinds.td +++ b/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/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp index e43884e376..998bb705f9 100644 --- a/lib/AST/ExprConstant.cpp +++ b/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/test/CXX/expr/expr.const/p2-0x.cpp b/test/CXX/expr/expr.const/p2-0x.cpp index 43d683aeca..2d4f4fb62e 100644 --- a/test/CXX/expr/expr.const/p2-0x.cpp +++ b/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, ""); } |