[cfe-commits] r52054 - in /cfe/trunk/lib/Sema: Sema.h SemaDecl.cpp
Eli Friedman
eli.friedman at gmail.com
Fri Jun 6 12:40:52 PDT 2008
Author: efriedma
Date: Fri Jun 6 14:40:52 2008
New Revision: 52054
URL: http://llvm.org/viewvc/llvm-project?rev=52054&view=rev
Log:
Clean up dead code from SemaInit landing.
Modified:
cfe/trunk/lib/Sema/Sema.h
cfe/trunk/lib/Sema/SemaDecl.cpp
Modified: cfe/trunk/lib/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.h?rev=52054&r1=52053&r2=52054&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/Sema.h (original)
+++ cfe/trunk/lib/Sema/Sema.h Fri Jun 6 14:40:52 2008
@@ -862,10 +862,6 @@
friend class InitListChecker;
bool CheckInitializerTypes(Expr *&simpleInit_or_initList, QualType &declType);
bool CheckSingleInitializer(Expr *&simpleInit, QualType declType);
- bool CheckInitExpr(Expr *expr, InitListExpr *IList, unsigned slot,
- QualType ElementType);
- bool CheckInitializerListTypes(InitListExpr*& IList, QualType &DeclType,
- bool topLevel, unsigned& startIndex);
bool CheckForConstantInitializer(Expr *e, QualType t);
bool CheckArithmeticConstantExpression(const Expr* e);
bool CheckAddressConstantExpression(const Expr* e);
Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=52054&r1=52053&r2=52054&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Fri Jun 6 14:40:52 2008
@@ -514,17 +514,6 @@
InitType, Init, "initializing");
}
-bool Sema::CheckInitExpr(Expr *expr, InitListExpr *IList, unsigned slot,
- QualType ElementType) {
- Expr *savExpr = expr; // Might be promoted by CheckSingleInitializer.
- if (CheckSingleInitializer(expr, ElementType))
- return true; // types weren't compatible.
-
- if (savExpr != expr) // The type was promoted, update initializer list.
- IList->setInit(slot, expr);
- return false;
-}
-
bool Sema::CheckStringLiteralInit(StringLiteral *strLiteral, QualType &DeclT) {
if (const IncompleteArrayType *IAT = DeclT->getAsIncompleteArrayType()) {
// C99 6.7.8p14. We have an array of character type with unknown size
@@ -557,200 +546,6 @@
return 0;
}
-// CheckInitializerListTypes - Checks the types of elements of an initializer
-// list. This function is recursive: it calls itself to initialize subelements
-// of aggregate types. Note that the topLevel parameter essentially refers to
-// whether this expression "owns" the initializer list passed in, or if this
-// initialization is taking elements out of a parent initializer. Each
-// call to this function adds zero or more to startIndex, reports any errors,
-// and returns true if it found any inconsistent types.
-bool Sema::CheckInitializerListTypes(InitListExpr*& IList, QualType &DeclType,
- bool topLevel, unsigned& startIndex) {
- bool hadError = false;
-
- if (DeclType->isScalarType()) {
- // The simplest case: initializing a single scalar
- if (topLevel) {
- Diag(IList->getLocStart(), diag::warn_braces_around_scalar_init,
- IList->getSourceRange());
- }
- if (startIndex < IList->getNumInits()) {
- Expr* expr = IList->getInit(startIndex);
- if (InitListExpr *SubInitList = dyn_cast<InitListExpr>(expr)) {
- // FIXME: Should an error be reported here instead?
- unsigned newIndex = 0;
- CheckInitializerListTypes(SubInitList, DeclType, true, newIndex);
- } else {
- hadError |= CheckInitExpr(expr, IList, startIndex, DeclType);
- }
- ++startIndex;
- }
- // FIXME: Should an error be reported for empty initializer list + scalar?
- } else if (DeclType->isVectorType()) {
- if (startIndex < IList->getNumInits()) {
- const VectorType *VT = DeclType->getAsVectorType();
- int maxElements = VT->getNumElements();
- QualType elementType = VT->getElementType();
-
- for (int i = 0; i < maxElements; ++i) {
- // Don't attempt to go past the end of the init list
- if (startIndex >= IList->getNumInits())
- break;
- Expr* expr = IList->getInit(startIndex);
- if (InitListExpr *SubInitList = dyn_cast<InitListExpr>(expr)) {
- unsigned newIndex = 0;
- hadError |= CheckInitializerListTypes(SubInitList, elementType,
- true, newIndex);
- ++startIndex;
- } else {
- hadError |= CheckInitializerListTypes(IList, elementType,
- false, startIndex);
- }
- }
- }
- } else if (DeclType->isAggregateType() || DeclType->isUnionType()) {
- if (DeclType->isStructureType() || DeclType->isUnionType()) {
- if (startIndex < IList->getNumInits() && !topLevel &&
- Context.typesAreCompatible(IList->getInit(startIndex)->getType(),
- DeclType)) {
- // We found a compatible struct; per the standard, this initializes the
- // struct. (The C standard technically says that this only applies for
- // initializers for declarations with automatic scope; however, this
- // construct is unambiguous anyway because a struct cannot contain
- // a type compatible with itself. We'll output an error when we check
- // if the initializer is constant.)
- // FIXME: Is a call to CheckSingleInitializer required here?
- ++startIndex;
- } else {
- RecordDecl* structDecl = DeclType->getAsRecordType()->getDecl();
-
- // If the record is invalid, some of it's members are invalid. To avoid
- // confusion, we forgo checking the intializer for the entire record.
- if (structDecl->isInvalidDecl())
- return true;
-
- // If structDecl is a forward declaration, this loop won't do anything;
- // That's okay, because an error should get printed out elsewhere. It
- // might be worthwhile to skip over the rest of the initializer, though.
- int numMembers = structDecl->getNumMembers() -
- structDecl->hasFlexibleArrayMember();
- for (int i = 0; i < numMembers; i++) {
- // Don't attempt to go past the end of the init list
- if (startIndex >= IList->getNumInits())
- break;
- FieldDecl * curField = structDecl->getMember(i);
- if (!curField->getIdentifier()) {
- // Don't initialize unnamed fields, e.g. "int : 20;"
- continue;
- }
- QualType fieldType = curField->getType();
- Expr* expr = IList->getInit(startIndex);
- if (InitListExpr *SubInitList = dyn_cast<InitListExpr>(expr)) {
- unsigned newStart = 0;
- hadError |= CheckInitializerListTypes(SubInitList, fieldType,
- true, newStart);
- ++startIndex;
- } else {
- hadError |= CheckInitializerListTypes(IList, fieldType,
- false, startIndex);
- }
- if (DeclType->isUnionType())
- break;
- }
- // FIXME: Implement flexible array initialization GCC extension (it's a
- // really messy extension to implement, unfortunately...the necessary
- // information isn't actually even here!)
- }
- } else if (DeclType->isArrayType()) {
- // Check for the special-case of initializing an array with a string.
- if (startIndex < IList->getNumInits()) {
- if (StringLiteral *lit = IsStringLiteralInit(IList->getInit(startIndex),
- DeclType)) {
- CheckStringLiteralInit(lit, DeclType);
- ++startIndex;
- if (topLevel && startIndex < IList->getNumInits()) {
- // We have leftover initializers; warn
- Diag(IList->getInit(startIndex)->getLocStart(),
- diag::err_excess_initializers_in_char_array_initializer,
- IList->getInit(startIndex)->getSourceRange());
- }
- return false;
- }
- }
- int maxElements;
- if (DeclType->isIncompleteArrayType()) {
- // FIXME: use a proper constant
- maxElements = 0x7FFFFFFF;
- } else if (const VariableArrayType *VAT =
- DeclType->getAsVariableArrayType()) {
- // Check for VLAs; in standard C it would be possible to check this
- // earlier, but I don't know where clang accepts VLAs (gcc accepts
- // them in all sorts of strange places).
- Diag(VAT->getSizeExpr()->getLocStart(),
- diag::err_variable_object_no_init,
- VAT->getSizeExpr()->getSourceRange());
- hadError = true;
- maxElements = 0x7FFFFFFF;
- } else {
- const ConstantArrayType *CAT = DeclType->getAsConstantArrayType();
- maxElements = static_cast<int>(CAT->getSize().getZExtValue());
- }
- QualType elementType = DeclType->getAsArrayType()->getElementType();
- int numElements = 0;
- for (int i = 0; i < maxElements; ++i, ++numElements) {
- // Don't attempt to go past the end of the init list
- if (startIndex >= IList->getNumInits())
- break;
- Expr* expr = IList->getInit(startIndex);
- if (InitListExpr *SubInitList = dyn_cast<InitListExpr>(expr)) {
- unsigned newIndex = 0;
- hadError |= CheckInitializerListTypes(SubInitList, elementType,
- true, newIndex);
- ++startIndex;
- } else {
- hadError |= CheckInitializerListTypes(IList, elementType,
- false, startIndex);
- }
- }
- if (DeclType->isIncompleteArrayType()) {
- // If this is an incomplete array type, the actual type needs to
- // be calculated here
- if (numElements == 0) {
- // Sizing an array implicitly to zero is not allowed
- // (It could in theory be allowed, but it doesn't really matter.)
- Diag(IList->getLocStart(),
- diag::err_at_least_one_initializer_needed_to_size_array);
- hadError = true;
- } else {
- llvm::APSInt ConstVal(32);
- ConstVal = numElements;
- DeclType = Context.getConstantArrayType(elementType, ConstVal,
- ArrayType::Normal, 0);
- }
- }
- } else {
- assert(0 && "Aggregate that isn't a function or array?!");
- }
- } 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");
- }
-
- // If this init list is a base list, we set the type; an initializer doesn't
- // fundamentally have a type, but this makes the ASTs a bit easier to read
- if (topLevel)
- IList->setType(DeclType);
-
- if (topLevel && startIndex < IList->getNumInits()) {
- // We have leftover initializers; warn
- Diag(IList->getInit(startIndex)->getLocStart(),
- diag::warn_excess_initializers,
- IList->getInit(startIndex)->getSourceRange());
- }
- return hadError;
-}
-
bool Sema::CheckInitializerTypes(Expr *&Init, QualType &DeclType) {
// C99 6.7.8p3: The type of the entity to be initialized shall be an array
// of unknown size ("[]") or an object type that is not a variable array type.
@@ -772,13 +567,9 @@
return CheckSingleInitializer(Init, DeclType);
}
-#if 0
- unsigned newIndex = 0;
- return CheckInitializerListTypes(InitList, DeclType, true, newIndex);
-#else
+
InitListChecker CheckInitList(this, InitList, DeclType);
return CheckInitList.HadError();
-#endif
}
Sema::DeclTy *
More information about the cfe-commits
mailing list