[cfe-commits] r162793 - in /cfe/trunk: include/clang/Basic/DiagnosticGroups.td include/clang/Basic/DiagnosticParseKinds.td lib/Sema/DeclSpec.cpp test/Misc/warning-flags.c test/Parser/cxx-decl.cpp test/Parser/cxx0x-decl.cpp

Richard Smith richard at metafoo.co.uk
Tue Aug 28 22:51:42 PDT 2012


On 28 Aug 2012 21:58, "Aaron Ballman" <aaron at aaronballman.com> wrote:
>
> Author: aaronballman
> Date: Tue Aug 28 15:55:40 2012
> New Revision: 162793
>
> URL: http://llvm.org/viewvc/llvm-project?rev=162793&view=rev
> Log:
> Splitting the duplicated decl spec extension warning into two: one is an
ExtWarn and the other a vanilla warning.  This addresses PR13705, where
const char const * wouldn't warn unless -pedantic was specified under the
right conditions.
>
> Modified:
>     cfe/trunk/include/clang/Basic/DiagnosticGroups.td
>     cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td
>     cfe/trunk/lib/Sema/DeclSpec.cpp
>     cfe/trunk/test/Misc/warning-flags.c
>     cfe/trunk/test/Parser/cxx-decl.cpp
>     cfe/trunk/test/Parser/cxx0x-decl.cpp
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticGroups.td
> URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticGroups.td?rev=162793&r1=162792&r2=162793&view=diff
>
==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticGroups.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticGroups.td Tue Aug 28 15:55:40
2012
> @@ -197,6 +197,7 @@
>  def StrncatSize : DiagGroup<"strncat-size">;
>  def TautologicalCompare : DiagGroup<"tautological-compare">;
>  def HeaderHygiene : DiagGroup<"header-hygiene">;
> +def DuplicateDeclSpecifiers : DiagGroup<"duplicate-decl-specifiers">;

It seems inconsistent to use a plural here and a singular in the warning
text.

>
>  // Preprocessor warnings.
>  def : DiagGroup<"builtin-macro-redefined">;
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td
> URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td?rev=162793&r1=162792&r2=162793&view=diff
>
==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td Tue Aug 28
15:55:40 2012
> @@ -43,7 +43,10 @@
>    "extra ';' after member function definition">,
>    InGroup<ExtraSemi>, DefaultIgnore;
>
> -def ext_duplicate_declspec : Extension<"duplicate '%0' declaration
specifier">;
> +def ext_duplicate_declspec : ExtWarn<"duplicate '%0' declaration
specifier">,
> +  InGroup<DuplicateDeclSpecifiers>;
> +def warn_duplicate_declspec : Warning<"duplicate '%0' declaration
specifier">,
> +  InGroup<DuplicateDeclSpecifiers>;
>  def ext_plain_complex : ExtWarn<
>    "plain '_Complex' requires a type specifier; assuming '_Complex
double'">;
>  def ext_integer_complex : Extension<
>
> Modified: cfe/trunk/lib/Sema/DeclSpec.cpp
> URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/DeclSpec.cpp?rev=162793&r1=162792&r2=162793&view=diff
>
==============================================================================
> --- cfe/trunk/lib/Sema/DeclSpec.cpp (original)
> +++ cfe/trunk/lib/Sema/DeclSpec.cpp Tue Aug 28 15:55:40 2012
> @@ -325,10 +325,14 @@
>
>  template <class T> static bool BadSpecifier(T TNew, T TPrev,
>                                              const char *&PrevSpec,
> -                                            unsigned &DiagID) {
> +                                            unsigned &DiagID,
> +                                            bool IsExtension = true) {
>    PrevSpec = DeclSpec::getSpecifierName(TPrev);
> -  DiagID = (TNew == TPrev ? diag::ext_duplicate_declspec
> -            : diag::err_invalid_decl_spec_combination);
> +  if (TNew != TPrev)
> +    DiagID = diag::err_invalid_decl_spec_combination;
> +  else
> +    DiagID = IsExtension ? diag::ext_duplicate_declspec :
> +                           diag::warn_duplicate_declspec;
>    return true;
>  }
>
> @@ -673,9 +677,15 @@
>                             unsigned &DiagID, const LangOptions &Lang,
>                             bool IsTypeSpec) {
>    // Duplicates are permitted in C99, and are permitted in C++11 unless
the
> -  // cv-qualifier appears as a type-specifier.
> -  if ((TypeQualifiers & T) && !Lang.C99 && (!Lang.CPlusPlus0x ||
IsTypeSpec))
> -    return BadSpecifier(T, T, PrevSpec, DiagID);
> +  // cv-qualifier appears as a type-specifier.  However, since this is
likely
> +  // not what the user intended, we will always warn.  We do not need to
set the
> +  // qualifier's location since we already have it.
> +  if (TypeQualifiers & T) {
> +    bool IsExtension = false;
> +    if (Lang.C99 || (Lang.CPlusPlus0x && !IsTypeSpec))
> +      IsExtension = true;

Isn't this backwards? The warning is not an extension in C99 because the
code is well-formed there.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20120828/8c4ffbf9/attachment.html>


More information about the cfe-commits mailing list