Skip to content

Commit

Permalink
[DEBUG-INFO] Change how we handle auto return types for lambda operat…
Browse files Browse the repository at this point in the history
…or() to be consistent with gcc

D70524 added support for auto return types for C++ member functions. I was
implementing support on the LLDB side for looking up the deduced type.

I ran into trouble with some cases with respect to lambdas. I looked into
how gcc was handling these cases and it appears gcc emits the deduced return type for lambdas.

So I am changing out behavior to match that.

Differential Revision: https://reviews.llvm.org/D123319
  • Loading branch information
shafik committed Apr 21, 2022
1 parent 414f84b commit 5ff992b
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 3 deletions.
14 changes: 11 additions & 3 deletions clang/lib/CodeGen/CGDebugInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1679,9 +1679,17 @@ CGDebugInfo::getOrCreateInstanceMethodType(QualType ThisPtr,
SmallVector<llvm::Metadata *, 16> Elts;
// First element is always return type. For 'void' functions it is NULL.
QualType temp = Func->getReturnType();
if (temp->getTypeClass() == Type::Auto && decl)
Elts.push_back(CreateType(cast<AutoType>(temp)));
else
if (temp->getTypeClass() == Type::Auto && decl) {
const AutoType *AT = cast<AutoType>(temp);

// It may be tricky in some cases to link the specification back the lambda
// call operator and so we skip emitting "auto" for lambdas. This is
// consistent with gcc as well.
if (AT->isDeduced() && ThisPtr->getPointeeCXXRecordDecl()->isLambda())
Elts.push_back(getOrCreateType(AT->getDeducedType(), Unit));
else
Elts.push_back(CreateType(AT));
} else
Elts.push_back(Args[0]);

// "this" pointer is always first argument.
Expand Down
25 changes: 25 additions & 0 deletions clang/test/CodeGenCXX/no_auto_return_lambda.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
// RUN: %clang_cc1 -emit-llvm -debug-info-kind=limited %s -o - | FileCheck %s

// We emit "auto" for deduced return types for member functions but we should
// not emitting "auto" for deduced return types for lambdas call function which
// will be implmented as operator() in a class type. This test will verify that
// behavior.

__attribute__((used)) int g() {
auto f = []() { return 10; };
return f();
}

// g() is not a member function so we should not emit "auto" for the deduced
// return type.
//
// CHECK: !DISubprogram(name: "g",{{.*}}, type: ![[FUN_TYPE:[0-9]+]],{{.*}}
// CHECK: ![[FUN_TYPE]] = !DISubroutineType(types: ![[TYPE_NODE:[0-9]+]])
// CHECK: ![[TYPE_NODE]] = !{![[INT_TYPE:[0-9]+]]}
// CHECK: ![[INT_TYPE]] = !DIBasicType(name: "int", {{.*}})

// operator() of the local lambda should have the same return type as g()
//
// CHECK: distinct !DISubprogram(name: "operator()",{{.*}}, type: ![[FUN_TYPE_LAMBDA:[0-9]+]],{{.*}}
// CHECK: ![[FUN_TYPE_LAMBDA]] = !DISubroutineType(types: ![[TYPE_NODE_LAMBDA:[0-9]+]])
// CHECK: ![[TYPE_NODE_LAMBDA]] = !{![[INT_TYPE:[0-9]+]], {{.*}}

0 comments on commit 5ff992b

Please sign in to comment.