================ @@ -121,6 +121,186 @@ Attribute Changes in Clang Improvements to Clang's diagnostics ----------------------------------- +- Some template related diagnostics have been improved. + + .. code-block:: c++ + + void foo() { template <typename> int i; } // error: templates can only be declared in namespace or class scope + + struct S { + template <typename> int i; // error: non-static data member 'i' cannot be declared as a template + }; + +- Clang now has improved diagnostics for functions with explicit 'this' parameters. Fixes #GH97878 + +- Clang now diagnoses dangling references to fields of temporary objects. Fixes #GH81589. + +- Clang now diagnoses undefined behavior in constant expressions more consistently. This includes invalid shifts, and signed overflow in arithmetic. + +- -Wdangling-assignment-gsl is enabled by default. +- Clang now always preserves the template arguments as written used + to specialize template type aliases. + +- Clang now diagnoses the use of ``main`` in an ``extern`` context as invalid according to [basic.start.main] p3. Fixes #GH101512. + +- Clang now diagnoses when the result of a [[nodiscard]] function is discarded after being cast in C. Fixes #GH104391. + +- Don't emit duplicated dangling diagnostics. (#GH93386). + +- Improved diagnostic when trying to befriend a concept. (#GH45182). + +- Added the ``-Winvalid-gnu-asm-cast`` diagnostic group to control warnings + about use of "noop" casts for lvalues (a GNU extension). This diagnostic is + a warning which defaults to being an error, is enabled by default, and is + also controlled by the now-deprecated ``-fheinous-gnu-extensions`` flag. + +- Added the ``-Wdecls-in-multiple-modules`` option to assist users to identify + multiple declarations in different modules, which is the major reason of the slow + compilation speed with modules. This warning is disabled by default and it needs + to be explicitly enabled or by ``-Weverything``. + +- Improved diagnostic when trying to overload a function in an ``extern "C"`` context. (#GH80235) + +- Clang now respects lifetimebound attribute for the assignment operator parameter. (#GH106372). + +- The lifetimebound and GSL analysis in clang are coherent, allowing clang to + detect more use-after-free bugs. (#GH100549). + +- Clang now diagnoses dangling cases where a gsl-pointer is constructed from a gsl-owner object inside a container (#GH100384). + +- Clang now warns for u8 character literals used in C23 with ``-Wpre-c23-compat`` instead of ``-Wpre-c++17-compat``. + +- Clang now diagnose when importing module implementation partition units in module interface units. + +- Don't emit bogus dangling diagnostics when ``[[gsl::Owner]]`` and `[[clang::lifetimebound]]` are used together (#GH108272). + +- The ``-Wreturn-stack-address`` warning now also warns about addresses of + local variables passed to function calls using the ``[[clang::musttail]]`` + attribute. + +- Clang now diagnoses cases where a dangling ``GSLOwner<GSLPointer>`` object is constructed, e.g. ``std::vector<string_view> v = {std::string()};`` (#GH100526). + +- Clang now diagnoses when a ``requires`` expression has a local parameter of void type, aligning with the function parameter (#GH109831). + +- Clang now emits a diagnostic note at the class declaration when the method definition does not match any declaration (#GH110638). + +- Clang now omits warnings for extra parentheses in fold expressions with single expansion (#GH101863). + +- The warning for an unsupported type for a named register variable is now phrased ``unsupported type for named register variable``, + instead of ``bad type for named register variable``. This makes it clear that the type is not supported at all, rather than being + suboptimal in some way the error fails to mention (#GH111550). + +- Clang now emits a ``-Wdepredcated-literal-operator`` diagnostic, even if the + name was a reserved name, which we improperly allowed to suppress the + diagnostic. + +- Clang now diagnoses ``[[deprecated]]`` attribute usage on local variables (#GH90073). + +- Fix false positives when `[[gsl::Owner/Pointer]]` and `[[clang::lifetimebound]]` are used together. + +- Improved diagnostic message for ``__builtin_bit_cast`` size mismatch (#GH115870). + +- Clang now omits shadow warnings for enum constants in separate class scopes (#GH62588). + +- When diagnosing an unused return value of a type declared ``[[nodiscard]]``, the type + itself is now included in the diagnostic. + +- Clang will now prefer the ``[[nodiscard]]`` declaration on function declarations over ``[[nodiscard]]`` + declaration on the return type of a function. Previously, when both have a ``[[nodiscard]]`` declaration attached, + the one on the return type would be preferred. This may affect the generated warning message: + + .. code-block:: c++ + + struct [[nodiscard("Reason 1")]] S {}; + [[nodiscard("Reason 2")]] S getS(); + void use() + { + getS(); // Now diagnoses "Reason 2", previously diagnoses "Reason 1" + } + +- Clang now diagnoses ``= delete("reason")`` extension warnings only in pedantic mode rather than on by default. (#GH109311). + +- Clang now diagnoses missing return value in functions containing ``if consteval`` (#GH116485). + +- Clang now correctly recognises code after a call to a ``[[noreturn]]`` constructor + as unreachable (#GH63009). + +- Clang now omits shadowing warnings for parameter names in explicit object member functions (#GH95707). + +- Improved error recovery for function call arguments with trailing commas (#GH100921). + +- For an rvalue reference bound to a temporary struct with an integer member, Clang will detect constant integer overflow + in the initializer for the integer member (#GH46755). + +- Fixed a false negative ``-Wunused-private-field`` diagnostic when a defaulted comparison operator is defined out of class (#GH116961). + +- Clang now diagnoses dangling references for C++20's parenthesized aggregate initialization (#101957). + +- Fixed a bug where Clang would not emit ``-Wunused-private-field`` warnings when an unrelated class + defined a defaulted comparison operator (#GH116270). + + .. code-block:: c++ + + class A { + private: + int a; // warning: private field 'a' is not used, no diagnostic previously + }; + + class C { + bool operator==(const C&) = default; + }; + +- Clang now emits `-Wdangling-capture` diangostic when a STL container captures a dangling reference. + + .. code-block:: c++ + + void test() { + std::vector<std::string_view> views; + views.push_back(std::string("123")); // warning + } + +- Clang now emits a ``-Wtautological-compare`` diagnostic when a check for + pointer addition overflow is always true or false, because overflow would + be undefined behavior. + + .. code-block:: c++ + + bool incorrect_overflow_check(const char *ptr, size_t index) { + return ptr + index < ptr; // warning + } + +- Fix -Wdangling false positives on conditional operators (#120206). + +- Fixed a bug where Clang hung on an unsupported optional scope specifier ``::`` when parsing + Objective-C. Clang now emits a diagnostic message instead of hanging. + +- The :doc:`ThreadSafetyAnalysis` now supports passing scoped capabilities into functions: + an attribute on the scoped capability parameter indicates both the expected associated capabilities and, + like in the case of attributes on the function declaration itself, their state before and after the call. + + .. code-block:: c++ + + #include "mutex.h" + + Mutex mu1, mu2; + int a GUARDED_BY(mu1); + + void require(MutexLocker& scope REQUIRES(mu1)) { + scope.Unlock(); + a = 0; // Warning! Requires mu1. + scope.Lock(); + } + + void testParameter() { + MutexLocker scope(&mu1), scope2(&mu2); + require(scope2); // Warning! Mutex managed by 'scope2' is 'mu2' instead of 'mu1' + require(scope); // OK. + scope.Unlock(); + require(scope); // Warning! Requires mu1. + } + ---------------- AaronBallman wrote:
Resolving the conflict with main should have left just the one-line addition from your PR. https://github.com/llvm/llvm-project/pull/125370 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits