r186817 - Implement the part of C89 6.5.7 p3 requiring a constant initializer list

NAKAMURA Takumi geek4civic at gmail.com
Mon Jul 22 05:28:27 PDT 2013


It brings bunch of warnings in c-index-test.c with c89 mode.
Shall we tweak c-index-test.c as c89-compliant, or should I suppress
warnings with -Wno-c99-extensions in my builders?

2013/7/22 Enea Zaffanella <zaffanella at cs.unipr.it>:
> Author: enea
> Date: Mon Jul 22 05:58:26 2013
> New Revision: 186817
>
> URL: http://llvm.org/viewvc/llvm-project?rev=186817&view=rev
> Log:
> Implement the part of C89 6.5.7 p3 requiring a constant initializer list
> when initializing aggregate/union types, no matter if static or not.
>
> Modified:
>     cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>     cfe/trunk/lib/Sema/SemaDecl.cpp
>     cfe/trunk/test/Sema/c89.c
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=186817&r1=186816&r2=186817&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Mon Jul 22 05:58:26 2013
> @@ -3626,6 +3626,8 @@ def warn_typecheck_zero_static_array_siz
>  def err_array_size_non_int : Error<"size of array has non-integer type %0">;
>  def err_init_element_not_constant : Error<
>    "initializer element is not a compile-time constant">;
> +def ext_aggregate_init_not_constant : Extension<
> +  "initializer for aggregate is not a compile-time constant">, InGroup<C99>;
>  def err_local_cant_init : Error<
>    "'__local' variable cannot have an initializer">;
>  def err_block_extern_cant_init : Error<
>
> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=186817&r1=186816&r2=186817&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Mon Jul 22 05:58:26 2013
> @@ -7777,9 +7777,19 @@ void Sema::AddInitializerToDecl(Decl *Re
>      // C99 6.7.8p4: All the expressions in an initializer for an object that has
>      // static storage duration shall be constant expressions or string literals.
>      // C++ does not have this restriction.
> -    if (!getLangOpts().CPlusPlus && !VDecl->isInvalidDecl() &&
> -        VDecl->getStorageClass() == SC_Static)
> -      CheckForConstantInitializer(Init, DclT);
> +    if (!getLangOpts().CPlusPlus && !VDecl->isInvalidDecl()) {
> +      if (VDecl->getStorageClass() == SC_Static)
> +        CheckForConstantInitializer(Init, DclT);
> +      // C89 is stricter than C99 for non-static aggregate types.
> +      // C89 6.5.7p3: All the expressions [...] in an initializer list
> +      // for an object that has aggregate or union type shall be
> +      // constant expressions.
> +      else if (!getLangOpts().C99 && VDecl->getType()->isAggregateType() &&
> +               !Init->isConstantInitializer(Context, false))
> +        Diag(Init->getExprLoc(),
> +             diag::ext_aggregate_init_not_constant)
> +          << Init->getSourceRange();
> +    }
>    } else if (VDecl->isStaticDataMember() &&
>               VDecl->getLexicalDeclContext()->isRecord()) {
>      // This is an in-class initialization for a static data member, e.g.,
>
> Modified: cfe/trunk/test/Sema/c89.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/c89.c?rev=186817&r1=186816&r2=186817&view=diff
> ==============================================================================
> --- cfe/trunk/test/Sema/c89.c (original)
> +++ cfe/trunk/test/Sema/c89.c Mon Jul 22 05:58:26 2013
> @@ -116,3 +116,7 @@ long long ll1 = /* expected-warning {{'l
>  unsigned long long ull1 = /* expected-warning {{'long long' is an extension when C99 mode is not enabled}} */
>                     42ULL; /* expected-warning {{'long long' is an extension when C99 mode is not enabled}} */
>
> +void test17(int v, int w) {
> +  int a[2] = { v, w }; /* expected-warning {{initializer for aggregate is not a compile-time constant}} */
> +}
> +
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list