Author: dblaikie Date: Fri Aug 5 14:03:01 2016 New Revision: 277852 URL: http://llvm.org/viewvc/llvm-project?rev=277852&view=rev Log: PR26423: Assert on valid use of using declaration of a function with an undeduced auto return type
For now just disregard the using declaration in this case. Suboptimal, but wiring up the ability to have declarations of functions that are separate from their definition (we currently only do that for member functions) and have differing return types (we don't have any support for that) is more work than seems reasonable to at least fix this crash. Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp cfe/trunk/test/CodeGenCXX/debug-info-cxx1y.cpp Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=277852&r1=277851&r2=277852&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original) +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Fri Aug 5 14:03:01 2016 @@ -3654,6 +3654,16 @@ void CGDebugInfo::EmitUsingDecl(const Us // Emitting one decl is sufficient - debuggers can detect that this is an // overloaded name & provide lookup for all the overloads. const UsingShadowDecl &USD = **UD.shadow_begin(); + + // FIXME: Skip functions with undeduced auto return type for now since we + // don't currently have the plumbing for separate declarations & definitions + // of free functions and mismatched types (auto in the declaration, concrete + // return type in the definition) + if (const auto *FD = dyn_cast<FunctionDecl>(USD.getUnderlyingDecl())) + if (const auto *AT = + FD->getType()->getAs<FunctionProtoType>()->getContainedAutoType()) + if (AT->getDeducedType().isNull()) + return; if (llvm::DINode *Target = getDeclarationOrDefinition(USD.getUnderlyingDecl())) DBuilder.createImportedDeclaration( Modified: cfe/trunk/test/CodeGenCXX/debug-info-cxx1y.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-cxx1y.cpp?rev=277852&r1=277851&r2=277852&view=diff ============================================================================== --- cfe/trunk/test/CodeGenCXX/debug-info-cxx1y.cpp (original) +++ cfe/trunk/test/CodeGenCXX/debug-info-cxx1y.cpp Fri Aug 5 14:03:01 2016 @@ -1,16 +1,25 @@ // RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm-only -std=c++14 -emit-llvm -debug-info-kind=limited %s -o - | FileCheck %s +// CHECK: imports: [[IMPS:![0-9]*]] // CHECK: [[EMPTY:![0-9]*]] = !{} + // CHECK: [[FOO:![0-9]+]] = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "foo", // CHECK-SAME: elements: [[EMPTY]] -// FIXME: The context of this definition should be the CU/file scope, not the class. -// CHECK: !DISubprogram(name: "func", {{.*}} scope: [[FOO]] + +// CHECK: [[IMPS]] = !{[[IMP:![0-9]*]]} +// CHECK: [[IMP]] = !DIImportedEntity( +// CHECK-SAME: entity: [[F3:![0-9]*]] +// CHECK: [[F3]] = distinct !DISubprogram(name: "f3" // CHECK-SAME: type: [[SUBROUTINE_TYPE:![0-9]*]] -// CHECK-SAME: isDefinition: true -// CHECK-SAME: declaration: [[FUNC_DECL:![0-9]*]] // CHECK: [[SUBROUTINE_TYPE]] = !DISubroutineType(types: [[TYPE_LIST:![0-9]*]]) // CHECK: [[TYPE_LIST]] = !{[[INT:![0-9]*]]} // CHECK: [[INT]] = !DIBasicType(name: "int" + +// FIXME: The context of this definition should be the CU/file scope, not the class. +// CHECK: !DISubprogram(name: "func", {{.*}} scope: [[FOO]] +// CHECK-SAME: type: [[SUBROUTINE_TYPE]] +// CHECK-SAME: isDefinition: true +// CHECK-SAME: declaration: [[FUNC_DECL:![0-9]*]] // CHECK: [[FUNC_DECL]] = !DISubprogram(name: "func", // CHECK-SAME: scope: [[FOO]] // CHECK-SAME: type: [[SUBROUTINE_TYPE]] @@ -25,3 +34,12 @@ foo f; auto foo::func() { return 1; } + +namespace ns { +auto f2(); +auto f3() { + return 0; +} +} +using ns::f2; +using ns::f3; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits