From: Chris Lattner Date: Tue, 28 Aug 2007 16:54:00 +0000 (+0000) Subject: extwarn about VLAs in C89 mode. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=94f81fd0b0f81a99d215b225c8c5616295b063f6;p=clang extwarn about VLAs in C89 mode. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41545 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Sema/SemaType.cpp b/Sema/SemaType.cpp index 5582c5a89b..04264a3e51 100644 --- a/Sema/SemaType.cpp +++ b/Sema/SemaType.cpp @@ -165,6 +165,7 @@ QualType Sema::GetTypeForDeclarator(Declarator &D, Scope *S) { break; case DeclaratorChunk::Array: { const DeclaratorChunk::ArrayTypeInfo &ATI = DeclType.Arr; + Expr *ArraySize = static_cast(ATI.NumElts); ArrayType::ArraySizeModifier ASM; if (ATI.isStar) ASM = ArrayType::Star; @@ -201,8 +202,13 @@ QualType Sema::GetTypeForDeclarator(Declarator &D, Scope *S) { D.setInvalidType(true); } } - T = Context.getArrayType(T, ASM, ATI.TypeQuals, - static_cast(ATI.NumElts)); + T = Context.getArrayType(T, ASM, ATI.TypeQuals, ArraySize); + + // If this is not C99, extwarn about VLA's and C99 array size modifiers. + if (!getLangOptions().C99 && + (ASM != ArrayType::Normal || + (ArraySize && !ArraySize->isIntegerConstantExpr(Context)))) + Diag(D.getIdentifierLoc(), diag::ext_vla); break; } case DeclaratorChunk::Function: diff --git a/include/clang/Basic/DiagnosticKinds.def b/include/clang/Basic/DiagnosticKinds.def index dbf1b270a0..f2437d6554 100644 --- a/include/clang/Basic/DiagnosticKinds.def +++ b/include/clang/Basic/DiagnosticKinds.def @@ -448,6 +448,8 @@ DIAG(err_ellipsis_first_arg, ERROR, "ISO C requires a named argument before '...'") DIAG(err_unspecified_vla_size_with_static, ERROR, "'static' may not be used with an unspecified variable length array size") +DIAG(ext_vla, EXTENSION, + "variable length arrays are a C99 feature, accepted as an extension") DIAG(err_invalid_storage_class_in_func_decl, ERROR, "invalid storage class specifier in function declarator") DIAG(err_invalid_reference_qualifier_application, ERROR, diff --git a/test/Sema/c89.c b/test/Sema/c89.c index a78472222a..a5855b21d0 100644 --- a/test/Sema/c89.c +++ b/test/Sema/c89.c @@ -1,6 +1,6 @@ /* RUN: clang %s -std=c89 -pedantic -parse-ast-check */ -void foo() { +void test1() { { int i; i = i + 1; @@ -18,5 +18,9 @@ void foo() { } } -long long x; /* expected-warning {{extension}} */ +long long test2; /* expected-warning {{extension}} */ + +void test3(int i) { + int A[i]; /* expected-warning {{variable length array}} */ +}