Objective-C foreach selector elements must be lvalues.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@55316 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Anders Carlsson 2008-08-25 18:16:36 +00:00
Родитель d1d66bcd69
Коммит 1fe379f0fa
3 изменённых файлов: 22 добавлений и 3 удалений

Просмотреть файл

@ -489,6 +489,8 @@ DIAG(err_collection_expr_type, ERROR,
"collection expression type ('%0') is not a valid object")
DIAG(err_selector_element_type, ERROR,
"selector element type ('%0') is not a valid object")
DIAG(err_selector_element_not_lvalue, ERROR,
"selector element is not a valid lvalue")
DIAG(err_toomany_element_decls, ERROR,
"Only one element declaration is allowed")
DIAG(warn_expected_implementation, WARNING,

Просмотреть файл

@ -562,11 +562,18 @@ Sema::ActOnObjCForCollectionStmt(SourceLocation ForLoc,
return Diag(VD->getLocation(), diag::err_non_variable_decl_in_for);
if (D->getNextDeclarator())
return Diag(D->getLocation(), diag::err_toomany_element_decls);
} else
FirstType = static_cast<Expr*>(first)->getType();
} else {
Expr::isLvalueResult lval = cast<Expr>(First)->isLvalue(Context);
if (lval != Expr::LV_Valid)
return Diag(First->getLocStart(), diag::err_selector_element_not_lvalue,
First->getSourceRange());
FirstType = static_cast<Expr*>(first)->getType();
}
if (!Context.isObjCObjectPointerType(FirstType))
Diag(ForLoc, diag::err_selector_element_type,
FirstType.getAsString(), First->getSourceRange());
FirstType.getAsString(), First->getSourceRange());
}
if (Second) {
DefaultFunctionArrayConversion(Second);

10
test/SemaObjC/foreach-1.m Normal file
Просмотреть файл

@ -0,0 +1,10 @@
// RUN: clang -fsyntax-only -verify %s
@class NSArray;
void f(NSArray *a)
{
for (int i in a); // expected-error{{selector element type ('int') is not a valid object}}
for ((id)2 in a); // expected-error{{selector element is not a valid lvalue}}
for (2 in a); // expected-error{{selector element is not a valid lvalue}}
}