зеркало из https://github.com/microsoft/clang-1.git
Perform l2r conversions on delete operands before doing
type-analysis; otherwise, we just completely do the wrong thing for placeholders. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@152375 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
71cba34b6e
Коммит
5aba3eb1be
Двоичный файл не отображается.
|
@ -1972,6 +1972,9 @@ Sema::ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal,
|
|||
bool UsualArrayDeleteWantsSize = false;
|
||||
|
||||
if (!Ex.get()->isTypeDependent()) {
|
||||
// Perform lvalue-to-rvalue cast, if needed.
|
||||
Ex = DefaultLvalueConversion(Ex.take());
|
||||
|
||||
QualType Type = Ex.get()->getType();
|
||||
|
||||
if (const RecordType *Record = Type->getAs<RecordType>()) {
|
||||
|
@ -2053,9 +2056,6 @@ Sema::ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal,
|
|||
}
|
||||
}
|
||||
|
||||
// Perform lvalue-to-rvalue cast, if needed.
|
||||
Ex = DefaultLvalueConversion(Ex.take());
|
||||
|
||||
// C++ [expr.delete]p2:
|
||||
// [Note: a pointer to a const type can be the operand of a
|
||||
// delete-expression; it is not necessary to cast away the constness
|
||||
|
|
|
@ -85,3 +85,24 @@ void test6_template(T *t6) {
|
|||
}
|
||||
|
||||
template void test6_template(Test6*);
|
||||
|
||||
// rdar://problem/10965735
|
||||
struct Test7PointerMaker {
|
||||
operator char *() const;
|
||||
};
|
||||
@interface Test7
|
||||
- (char*) implicit_property;
|
||||
- (char) bad_implicit_property;
|
||||
- (Test7PointerMaker) implicit_struct_property;
|
||||
@property int *explicit_property;
|
||||
@property int bad_explicit_property;
|
||||
@property Test7PointerMaker explicit_struct_property;
|
||||
@end
|
||||
void test7(Test7 *ptr) {
|
||||
delete ptr.implicit_property;
|
||||
delete ptr.bad_implicit_property; // expected-error {{cannot delete expression of type 'char'}}
|
||||
delete ptr.explicit_property;
|
||||
delete ptr.bad_explicit_property; // expected-error {{cannot delete expression of type 'int'}}
|
||||
delete ptr.implicit_struct_property;
|
||||
delete ptr.explicit_struct_property;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче