r357027 - [clang-format] Add style option AllowShortLambdasOnASingleLine
Author: rdwampler Date: Tue Mar 26 13:18:14 2019 New Revision: 357027 URL: http://llvm.org/viewvc/llvm-project?rev=357027&view=rev Log: [clang-format] Add style option AllowShortLambdasOnASingleLine Summary: This option `AllowShortLambdasOnASingleLine` similar to the other `AllowShort*` options, but applied to C++ lambdas. Reviewers: djasper, klimek Reviewed By: klimek Subscribers: MyDeveloperDay, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D57687 Modified: cfe/trunk/docs/ClangFormatStyleOptions.rst cfe/trunk/include/clang/Format/Format.h cfe/trunk/lib/Format/Format.cpp cfe/trunk/lib/Format/FormatToken.h cfe/trunk/lib/Format/TokenAnnotator.cpp cfe/trunk/lib/Format/UnwrappedLineParser.cpp cfe/trunk/unittests/Format/FormatTest.cpp Modified: cfe/trunk/docs/ClangFormatStyleOptions.rst URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/ClangFormatStyleOptions.rst?rev=357027&r1=357026&r2=357027&view=diff == --- cfe/trunk/docs/ClangFormatStyleOptions.rst (original) +++ cfe/trunk/docs/ClangFormatStyleOptions.rst Tue Mar 26 13:18:14 2019 @@ -449,6 +449,45 @@ the configuration (without a prefix: ``A return; } +**AllowShortLambdasOnASingleLine** (``ShortLambdaStyle``) + Dependent on the value, ``auto lambda []() { return 0; }`` can be put on a + single line. + + Possible values: + + * ``SLS_None`` (in configuration: ``None``) +Never merge lambdas into a single line. + + * ``SLS_Empty`` (in configuration: ``Empty``) +Only merge empty lambdas. + +.. code-block:: c++ + + auto lambda = [](int a) {} + auto lambda2 = [](int a) { + return a; + }; + + * ``SLS_Inline`` (in configuration: ``Inline``) +Merge lambda into a single line if argument of a function. + +.. code-block:: c++ + + auto lambda = [](int a) { + return a; + }; + sort(a.begin(), a.end(), ()[] { return x < y; }) + + * ``SLS_All`` (in configuration: ``All``) +Merge all lambdas fitting on a single line. + +.. code-block:: c++ + + auto lambda = [](int a) {} + auto lambda2 = [](int a) { return a; }; + + + **AllowShortLoopsOnASingleLine** (``bool``) If ``true``, ``while (true) continue;`` can be put on a single line. Modified: cfe/trunk/include/clang/Format/Format.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Format/Format.h?rev=357027&r1=357026&r2=357027&view=diff == --- cfe/trunk/include/clang/Format/Format.h (original) +++ cfe/trunk/include/clang/Format/Format.h Tue Mar 26 13:18:14 2019 @@ -306,6 +306,39 @@ struct FormatStyle { /// If ``true``, ``if (a) return;`` can be put on a single line. ShortIfStyle AllowShortIfStatementsOnASingleLine; + /// Different styles for merging short lambdas containing at most one + /// statement. + enum ShortLambdaStyle { +/// Never merge lambdas into a single line. +SLS_None, +/// Only merge empty lambdas. +/// \code +/// auto lambda = [](int a) {} +/// auto lambda2 = [](int a) { +/// return a; +/// }; +/// \endcode +SLS_Empty, +/// Merge lambda into a single line if argument of a function. +/// \code +/// auto lambda = [](int a) { +/// return a; +/// }; +/// sort(a.begin(), a.end(), ()[] { return x < y; }) +/// \endcode +SLS_Inline, +/// Merge all lambdas fitting on a single line. +/// \code +/// auto lambda = [](int a) {} +/// auto lambda2 = [](int a) { return a; }; +/// \endcode +SLS_All, + }; + + /// Dependent on the value, ``auto lambda []() { return 0; }`` can be put on a + /// single line. + ShortLambdaStyle AllowShortLambdasOnASingleLine; + /// If ``true``, ``while (true) continue;`` can be put on a single /// line. bool AllowShortLoopsOnASingleLine; @@ -1805,6 +1838,7 @@ struct FormatStyle { R.AllowShortFunctionsOnASingleLine && AllowShortIfStatementsOnASingleLine == R.AllowShortIfStatementsOnASingleLine && + AllowShortLambdasOnASingleLine == R.AllowShortLambdasOnASingleLine && AllowShortLoopsOnASingleLine == R.AllowShortLoopsOnASingleLine && AlwaysBreakAfterReturnType == R.AlwaysBreakAfterReturnType && AlwaysBreakBeforeMultilineStrings == Modified: cfe/trunk/lib/Format/Format.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/Format.cpp?rev=357027&r1=357026&r2=357027&view=diff == --- cfe/trunk/lib/Format/Format.cpp (original) +++ cfe/trunk/lib/Format/Format.cpp Tue Mar 26 13:18:14 2019 @@ -119,6 +119,17 @@ template <> struct ScalarEnumerationTrai } }; +template <> struct ScalarEnumerationTraits { + static void enumeration(IO
[clang] ae45145 - Create a warning flag for 'warn_conv_*_not_used'
Author: Ronald Wampler Date: 2020-06-10T09:09:48-04:00 New Revision: ae451454e32db48793afc76e0c5f2bcbda878995 URL: https://github.com/llvm/llvm-project/commit/ae451454e32db48793afc76e0c5f2bcbda878995 DIFF: https://github.com/llvm/llvm-project/commit/ae451454e32db48793afc76e0c5f2bcbda878995.diff LOG: Create a warning flag for 'warn_conv_*_not_used' These warnings are grouped under '-Wclass-conversion' to be compatiable with GCC 9. Differential Revision: https://reviews.llvm.org/D78442 Added: Modified: clang/include/clang/Basic/DiagnosticGroups.td clang/include/clang/Basic/DiagnosticSemaKinds.td clang/test/Misc/warning-flags.c Removed: diff --git a/clang/include/clang/Basic/DiagnosticGroups.td b/clang/include/clang/Basic/DiagnosticGroups.td index 451310a8c3a6..23f530dd4e1f 100644 --- a/clang/include/clang/Basic/DiagnosticGroups.td +++ b/clang/include/clang/Basic/DiagnosticGroups.td @@ -60,6 +60,7 @@ def UndefinedBoolConversion : DiagGroup<"undefined-bool-conversion">; def BoolConversion : DiagGroup<"bool-conversion", [PointerBoolConversion, UndefinedBoolConversion]>; def IntConversion : DiagGroup<"int-conversion">; +def ClassConversion: DiagGroup<"class-conversion">; def DeprecatedEnumCompareConditional : DiagGroup<"deprecated-enum-compare-conditional">; def EnumCompareConditional : DiagGroup<"enum-compare-conditional", diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 84bcf66a148e..ffe9513f8208 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -8589,11 +8589,14 @@ def err_conv_function_with_complex_decl : Error< def err_conv_function_redeclared : Error< "conversion function cannot be redeclared">; def warn_conv_to_self_not_used : Warning< - "conversion function converting %0 to itself will never be used">; + "conversion function converting %0 to itself will never be used">, + InGroup; def warn_conv_to_base_not_used : Warning< - "conversion function converting %0 to its base class %1 will never be used">; + "conversion function converting %0 to its base class %1 will never be used">, + InGroup; def warn_conv_to_void_not_used : Warning< - "conversion function converting %0 to %1 will never be used">; + "conversion function converting %0 to %1 will never be used">, + InGroup; def warn_not_compound_assign : Warning< "use of unary operator that may be intended as compound assignment (%0=)">; diff --git a/clang/test/Misc/warning-flags.c b/clang/test/Misc/warning-flags.c index aff90dd6f1d3..841c748b8025 100644 --- a/clang/test/Misc/warning-flags.c +++ b/clang/test/Misc/warning-flags.c @@ -18,7 +18,8 @@ This test serves two purposes: The list of warnings below should NEVER grow. It should gradually shrink to 0. -CHECK: Warnings without flags (72): +CHECK: Warnings without flags (69): + CHECK-NEXT: ext_expected_semi_decl_list CHECK-NEXT: ext_explicit_specialization_storage_class CHECK-NEXT: ext_missing_declspec @@ -41,9 +42,6 @@ CHECK-NEXT: warn_case_empty_range CHECK-NEXT: warn_char_constant_too_large CHECK-NEXT: warn_collection_expr_type CHECK-NEXT: warn_conflicting_variadic -CHECK-NEXT: warn_conv_to_base_not_used -CHECK-NEXT: warn_conv_to_self_not_used -CHECK-NEXT: warn_conv_to_void_not_used CHECK-NEXT: warn_delete_array_type CHECK-NEXT: warn_double_const_requires_fp64 CHECK-NEXT: warn_drv_assuming_mfloat_abi_is ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] 4b53495 - Perform ActOnConversionDeclarator after looking for any virtual functions it overrides
Author: Ronald Wampler Date: 2020-05-13T10:34:19-04:00 New Revision: 4b53495c4ba2ba410f6383f9c57593e838ec0d57 URL: https://github.com/llvm/llvm-project/commit/4b53495c4ba2ba410f6383f9c57593e838ec0d57 DIFF: https://github.com/llvm/llvm-project/commit/4b53495c4ba2ba410f6383f9c57593e838ec0d57.diff LOG: Perform ActOnConversionDeclarator after looking for any virtual functions it overrides Summary: This allows for suppressing warnings about the conversion function never being called if it overrides a virtual function in a base class. Differential Revision: https://reviews.llvm.org/D78444 Added: Modified: clang/lib/Sema/SemaDecl.cpp clang/lib/Sema/SemaDeclCXX.cpp clang/test/SemaCXX/conversion-function.cpp Removed: diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index eba672d54cf8..74a4fd8a06de 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -10716,9 +10716,6 @@ bool Sema::CheckFunctionDeclaration(Scope *S, FunctionDecl *NewFD, return Redeclaration; } } -} else if (CXXConversionDecl *Conversion - = dyn_cast(NewFD)) { - ActOnConversionDeclarator(Conversion); } else if (auto *Guide = dyn_cast(NewFD)) { if (auto *TD = Guide->getDescribedFunctionTemplate()) CheckDeductionGuideTemplate(TD); @@ -10747,6 +10744,9 @@ bool Sema::CheckFunctionDeclaration(Scope *S, FunctionDecl *NewFD, checkThisInStaticMemberFunctionType(Method); } +if (CXXConversionDecl *Conversion = dyn_cast(NewFD)) + ActOnConversionDeclarator(Conversion); + // Extra checking for C++ overloaded operators (C++ [over.oper]). if (NewFD->isOverloadedOperator() && CheckOverloadedOperatorDeclaration(NewFD)) { diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 935ac93e9922..3f1121c0e9b2 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -10486,15 +10486,12 @@ Decl *Sema::ActOnConversionDeclarator(CXXConversionDecl *Conversion) { // Make sure we aren't redeclaring the conversion function. QualType ConvType = Context.getCanonicalType(Conversion->getConversionType()); - // C++ [class.conv.fct]p1: // [...] A conversion function is never used to convert a // (possibly cv-qualified) object to the (possibly cv-qualified) // same object type (or a reference to it), to a (possibly // cv-qualified) base class of that type (or a reference to it), // or to (possibly cv-qualified) void. - // FIXME: Suppress this warning if the conversion function ends up being a - // virtual function that overrides a virtual function in a base class. QualType ClassType = Context.getCanonicalType(Context.getTypeDeclType(ClassDecl)); if (const ReferenceType *ConvTypeRef = ConvType->getAs()) @@ -10502,6 +10499,8 @@ Decl *Sema::ActOnConversionDeclarator(CXXConversionDecl *Conversion) { if (Conversion->getTemplateSpecializationKind() != TSK_Undeclared && Conversion->getTemplateSpecializationKind() != TSK_ExplicitSpecialization) /* Suppress diagnostics for instantiations. */; + else if (Conversion->size_overridden_methods() != 0) +/* Suppress diagnostics for overriding virtual function in a base class. */; else if (ConvType->isRecordType()) { ConvType = Context.getCanonicalType(ConvType).getUnqualifiedType(); if (ConvType == ClassType) diff --git a/clang/test/SemaCXX/conversion-function.cpp b/clang/test/SemaCXX/conversion-function.cpp index 1486abea8c60..fdd603c98f43 100644 --- a/clang/test/SemaCXX/conversion-function.cpp +++ b/clang/test/SemaCXX/conversion-function.cpp @@ -62,6 +62,24 @@ class B : public A { operator const B(); // expected-warning{{conversion function converting 'B' to itself will never be used}} }; +class BaseA {}; +class DerivedA; + +class BaseB { + virtual operator BaseA &() = 0; + virtual operator DerivedA &() = 0; +}; + +class DerivedA : public BaseA, BaseB { + virtual operator BaseA &();// OK. Overrides BaseB::operatorBaseA&() + virtual operator DerivedA &(); // OK. Overrides BaseB::operatorDerivedA&() +}; + +class DerivedB : public BaseA { + virtual operator DerivedB &(); // expected-warning{{conversion function converting 'DerivedB' to itself will never be used}} + virtual operator BaseA &();// expected-warning{{conversion function converting 'DerivedB' to its base class 'BaseA' will never be used}} +}; + // This used to crash Clang. struct Flip; struct Flop { ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits