From 438cf5577e720f84d493a272c5a1cbaf6ce19e51 Mon Sep 17 00:00:00 2001 From: Ole Strohm Date: Mon, 7 Jun 2021 09:34:53 +0100 Subject: [PATCH] [OpenCL] Fix missing addrspace on implicit move assignment operator This fixes the missing address space on `this` in the implicit move assignment operator. The function called here is an abstraction around the lines that have been removed which also sets the address space correctly. This is copied from CopyConstructor, CopyAssignment and MoveConstructor, all of which use this function, and now MoveAssignment does too. Fixes: PR50259 Reviewed By: svenvh Differential Revision: https://reviews.llvm.org/D103252 --- clang/lib/Sema/SemaDeclCXX.cpp | 5 +---- clang/test/AST/ast-dump-implicit-members.clcpp | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 clang/test/AST/ast-dump-implicit-members.clcpp diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index f6c907b..3fffcd3 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -14344,10 +14344,7 @@ CXXMethodDecl *Sema::DeclareImplicitMoveAssignment(CXXRecordDecl *ClassDecl) { /* Diagnose */ false); } - // Build an exception specification pointing back at this member. - FunctionProtoType::ExtProtoInfo EPI = - getImplicitMethodEPI(*this, MoveAssignment); - MoveAssignment->setType(Context.getFunctionType(RetType, ArgType, EPI)); + setupImplicitSpecialMemberType(MoveAssignment, RetType, ArgType); // Add the parameter to the operator. ParmVarDecl *FromParam = ParmVarDecl::Create(Context, MoveAssignment, diff --git a/clang/test/AST/ast-dump-implicit-members.clcpp b/clang/test/AST/ast-dump-implicit-members.clcpp new file mode 100644 index 0000000..5e1eb7c --- /dev/null +++ b/clang/test/AST/ast-dump-implicit-members.clcpp @@ -0,0 +1,14 @@ +// RUN: %clang_cc1 %s -ast-dump -ast-dump-filter S | FileCheck -strict-whitespace %s + +struct S {}; + +void f() { + S i; + i = i; +} + +// CHECK: CXXConstructorDecl {{.*}} implicit used constexpr S 'void () __generic noexcept' +// CHECK: CXXConstructorDecl {{.*}} implicit constexpr S 'void (const __generic S &) __generic' +// CHECK: CXXConstructorDecl {{.*}} implicit constexpr S 'void (__generic S &&) __generic' +// CHECK: CXXMethodDecl {{.*}} implicit used constexpr operator= '__generic S &(const __generic S &) __generic noexcept' +// CHECK: CXXMethodDecl {{.*}} implicit constexpr operator= '__generic S &(__generic S &&) __generic' -- 2.7.4