diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp --- a/clang/lib/Parse/ParseDeclCXX.cpp +++ b/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, diff --git a/clang/test/SemaCXX/move-not-noexcept.cpp b/clang/test/SemaCXX/move-not-noexcept.cpp new file mode 100644 --- /dev/null +++ b/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 +struct NoexceptDependentSpecifierCtor { + NoexceptDependentSpecifierCtor(NoexceptDependentSpecifierCtor&&) noexcept(__is_integral(T)); +}; + +template +struct NoexceptDependentSpecifierAssign { + NoexceptDependentSpecifierAssign& operator=(NoexceptDependentSpecifierAssign&&) noexcept(__is_integral(T)); +}; + +struct ThrowParensSpecifierCtor { + ThrowParensSpecifierCtor(ThrowParensSpecifierCtor&&) throw(); +}; + +struct ThrowParensSpecifierAssign { + ThrowParensSpecifierAssign& operator=(ThrowParensSpecifierAssign&&) throw(); +};