cjdb created this revision. cjdb added reviewers: aaron.ballman, erichkeane, shafik, dblaikie. Herald added a project: All. cjdb requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
Since this was originally a name in library, it needs an escape hatch for versions of Clang that are slightly out-of-sync with libc++. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D148677 Files: clang/lib/Parse/ParseDeclCXX.cpp clang/test/SemaCXX/move-not-noexcept.cpp Index: clang/test/SemaCXX/move-not-noexcept.cpp =================================================================== --- /dev/null +++ clang/test/SemaCXX/move-not-noexcept.cpp @@ -0,0 +1,63 @@ +// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s + +struct TrivialMoveOps {}; + +struct DefaultedMoveCtor { + DefaultedMoveCtor(DefaultedMoveCtor&&) = default; +}; + +struct DefaultedMoveAssign { + DefaultedMoveAssign& operator=(DefaultedMoveAssign&&) = default; +}; + +struct UnknownNoexceptCtor { + UnknownNoexceptCtor(UnknownNoexceptCtor&&); + // expected-warning@-1{{move constructor for 'UnknownNoexceptCtor' is not noexcept, which can cause performance issues; use 'noexcept(false)' if this is intentional}} +}; + +struct UnknownNoexceptAssign { + UnknownNoexceptAssign& operator=(UnknownNoexceptAssign&&); + // expected-warning@-1{{move assignment operator for 'UnknownNoexceptAssign' is not noexcept, which can cause performance issues; use 'noexcept(false)' if this is intentional}} +}; + +struct NoexceptSpecifierCtor { + NoexceptSpecifierCtor(NoexceptSpecifierCtor&&) noexcept; +}; + +struct NoexceptSpecifierAssign { + NoexceptSpecifierAssign& operator=(NoexceptSpecifierAssign&&) noexcept; +}; + +struct NoexceptTrueSpecifierCtor { + NoexceptTrueSpecifierCtor(NoexceptTrueSpecifierCtor&&) noexcept(true); +}; + +struct NoexceptTrueSpecifierAssign { + NoexceptTrueSpecifierAssign& operator=(NoexceptTrueSpecifierAssign&&) noexcept(true); +}; + +struct NoexceptFalseSpecifierCtor { + NoexceptFalseSpecifierCtor(NoexceptFalseSpecifierCtor&&) noexcept(false); +}; + +struct NoexceptFalseSpecifierAssign { + NoexceptFalseSpecifierAssign& operator=(NoexceptFalseSpecifierAssign&&) noexcept(false); +}; + +template<class T> +struct NoexceptDependentSpecifierCtor { + NoexceptDependentSpecifierCtor(NoexceptDependentSpecifierCtor&&) noexcept(__is_integral(T)); +}; + +template<class T> +struct NoexceptDependentSpecifierAssign { + NoexceptDependentSpecifierAssign& operator=(NoexceptDependentSpecifierAssign&&) noexcept(__is_integral(T)); +}; + +struct ThrowParensSpecifierCtor { + ThrowParensSpecifierCtor(ThrowParensSpecifierCtor&&) throw(); +}; + +struct ThrowParensSpecifierAssign { + ThrowParensSpecifierAssign& operator=(ThrowParensSpecifierAssign&&) throw(); +}; Index: clang/lib/Parse/ParseDeclCXX.cpp =================================================================== --- clang/lib/Parse/ParseDeclCXX.cpp +++ clang/lib/Parse/ParseDeclCXX.cpp @@ -1622,6 +1622,7 @@ tok::kw___is_signed, tok::kw___is_standard_layout, tok::kw___is_trivial, + tok::kw___is_trivially_equality_comparable, tok::kw___is_trivially_assignable, tok::kw___is_trivially_constructible, tok::kw___is_trivially_copyable,
Index: clang/test/SemaCXX/move-not-noexcept.cpp =================================================================== --- /dev/null +++ clang/test/SemaCXX/move-not-noexcept.cpp @@ -0,0 +1,63 @@ +// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s + +struct TrivialMoveOps {}; + +struct DefaultedMoveCtor { + DefaultedMoveCtor(DefaultedMoveCtor&&) = default; +}; + +struct DefaultedMoveAssign { + DefaultedMoveAssign& operator=(DefaultedMoveAssign&&) = default; +}; + +struct UnknownNoexceptCtor { + UnknownNoexceptCtor(UnknownNoexceptCtor&&); + // expected-warning@-1{{move constructor for 'UnknownNoexceptCtor' is not noexcept, which can cause performance issues; use 'noexcept(false)' if this is intentional}} +}; + +struct UnknownNoexceptAssign { + UnknownNoexceptAssign& operator=(UnknownNoexceptAssign&&); + // expected-warning@-1{{move assignment operator for 'UnknownNoexceptAssign' is not noexcept, which can cause performance issues; use 'noexcept(false)' if this is intentional}} +}; + +struct NoexceptSpecifierCtor { + NoexceptSpecifierCtor(NoexceptSpecifierCtor&&) noexcept; +}; + +struct NoexceptSpecifierAssign { + NoexceptSpecifierAssign& operator=(NoexceptSpecifierAssign&&) noexcept; +}; + +struct NoexceptTrueSpecifierCtor { + NoexceptTrueSpecifierCtor(NoexceptTrueSpecifierCtor&&) noexcept(true); +}; + +struct NoexceptTrueSpecifierAssign { + NoexceptTrueSpecifierAssign& operator=(NoexceptTrueSpecifierAssign&&) noexcept(true); +}; + +struct NoexceptFalseSpecifierCtor { + NoexceptFalseSpecifierCtor(NoexceptFalseSpecifierCtor&&) noexcept(false); +}; + +struct NoexceptFalseSpecifierAssign { + NoexceptFalseSpecifierAssign& operator=(NoexceptFalseSpecifierAssign&&) noexcept(false); +}; + +template<class T> +struct NoexceptDependentSpecifierCtor { + NoexceptDependentSpecifierCtor(NoexceptDependentSpecifierCtor&&) noexcept(__is_integral(T)); +}; + +template<class T> +struct NoexceptDependentSpecifierAssign { + NoexceptDependentSpecifierAssign& operator=(NoexceptDependentSpecifierAssign&&) noexcept(__is_integral(T)); +}; + +struct ThrowParensSpecifierCtor { + ThrowParensSpecifierCtor(ThrowParensSpecifierCtor&&) throw(); +}; + +struct ThrowParensSpecifierAssign { + ThrowParensSpecifierAssign& operator=(ThrowParensSpecifierAssign&&) throw(); +}; Index: clang/lib/Parse/ParseDeclCXX.cpp =================================================================== --- clang/lib/Parse/ParseDeclCXX.cpp +++ clang/lib/Parse/ParseDeclCXX.cpp @@ -1622,6 +1622,7 @@ tok::kw___is_signed, tok::kw___is_standard_layout, tok::kw___is_trivial, + tok::kw___is_trivially_equality_comparable, tok::kw___is_trivially_assignable, tok::kw___is_trivially_constructible, tok::kw___is_trivially_copyable,
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits