Avoid dumping during semantic analysis when checking array types when

a vla is used.

llvm-svn: 72575
This commit is contained in:
Mike Stump 2009-05-29 16:34:15 +00:00
parent de83126b80
commit fc30bf9b16
2 changed files with 19 additions and 15 deletions

View File

@ -97,21 +97,22 @@ static void CheckStringInit(Expr *Str, QualType &DeclT, Sema &S) {
return;
}
const ConstantArrayType *CAT = cast<ConstantArrayType>(AT);
// C99 6.7.8p14. We have an array of character type with known size. However,
// the size may be smaller or larger than the string we are initializing.
// FIXME: Avoid truncation for 64-bit length strings.
if (StrLength-1 > CAT->getSize().getZExtValue())
S.Diag(Str->getSourceRange().getBegin(),
diag::warn_initializer_string_for_char_array_too_long)
<< Str->getSourceRange();
// Set the type to the actual size that we are initializing. If we have
// something like:
// char x[1] = "foo";
// then this will set the string literal's type to char[1].
Str->setType(DeclT);
if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(AT)) {
// C99 6.7.8p14. We have an array of character type with known size.
// However, the size may be smaller or larger than the string we are
// initializing.
// FIXME: Avoid truncation for 64-bit length strings.
if (StrLength-1 > CAT->getSize().getZExtValue())
S.Diag(Str->getSourceRange().getBegin(),
diag::warn_initializer_string_for_char_array_too_long)
<< Str->getSourceRange();
// Set the type to the actual size that we are initializing. If we have
// something like:
// char x[1] = "foo";
// then this will set the string literal's type to char[1].
Str->setType(DeclT);
}
}
bool Sema::CheckInitializerTypes(Expr *&Init, QualType &DeclType,

View File

@ -51,3 +51,6 @@ int f4(int a[*][*]);
int pr2044(int b) {int (*c(void))[b];**c() = 2;} // expected-error {{variably modified type}}
int pr2044b;
int (*pr2044c(void))[pr2044b]; // expected-error {{variably modified type}}
const int f5_ci = 1;
void f5() { char a[][f5_ci] = {""}; }