forked from OSchip/llvm-project
Complain when we try to initialize an object of Objective-C class type
(which is ill-formed) with an initializer list. Also, change the fallback from an assertion to a generic error message, which is far friendlier. Fixes <rdar://problem/7730948>. llvm-svn: 102930
This commit is contained in:
parent
9f5200a122
commit
50ec46d4af
|
@ -1691,6 +1691,8 @@ def err_empty_scalar_initializer : Error<"scalar initializer cannot be empty">;
|
|||
def err_illegal_initializer : Error<
|
||||
"illegal initializer (only variables can be initialized)">;
|
||||
def err_illegal_initializer_type : Error<"illegal initializer type %0">;
|
||||
def err_init_objc_class : Error<
|
||||
"cannot initialize Objective-C class type %0">;
|
||||
def err_implicit_empty_initializer : Error<
|
||||
"initializer for aggregate with no elements requires explicit braces">;
|
||||
def err_bitfield_has_negative_width : Error<
|
||||
|
|
|
@ -624,10 +624,14 @@ void InitListChecker::CheckListElementTypes(const InitializedEntity &Entity,
|
|||
} else if (DeclType->isReferenceType()) {
|
||||
CheckReferenceType(Entity, IList, DeclType, Index,
|
||||
StructuredList, StructuredIndex);
|
||||
} else if (DeclType->isObjCInterfaceType()) {
|
||||
SemaRef.Diag(IList->getLocStart(), diag::err_init_objc_class)
|
||||
<< DeclType;
|
||||
hadError = true;
|
||||
} else {
|
||||
// In C, all types are either scalars or aggregates, but
|
||||
// additional handling is needed here for C++ (and possibly others?).
|
||||
assert(0 && "Unsupported initializer type");
|
||||
SemaRef.Diag(IList->getLocStart(), diag::err_illegal_initializer_type)
|
||||
<< DeclType;
|
||||
hadError = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
||||
@interface A
|
||||
@end
|
||||
|
||||
void f() {
|
||||
(A){ 0 }; // expected-error{{cannot initialize Objective-C class type 'A'}}
|
||||
}
|
Loading…
Reference in New Issue