]> granicus.if.org Git - clang/commitdiff
PR26423: Assert on valid use of using declaration of a function with an undeduced...
authorDavid Blaikie <dblaikie@gmail.com>
Fri, 5 Aug 2016 19:03:01 +0000 (19:03 +0000)
committerDavid Blaikie <dblaikie@gmail.com>
Fri, 5 Aug 2016 19:03:01 +0000 (19:03 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@277852 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGDebugInfo.cpp
test/CodeGenCXX/debug-info-cxx1y.cpp

index d6cb798c475fbe9862327836fd8274050d12e8e8..8722e5ae260e815816007cdb70ae85661d8d3755 100644 (file)
@@ -3654,6 +3654,16 @@ void CGDebugInfo::EmitUsingDecl(const UsingDecl &UD) {
   // 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(
index faf29d3ed11b4cc07053e243aa1d6063660eda2e..36b3e09180c61a6cc43e77f5ac1efa6ccd2c71be 100644 (file)
@@ -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;