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