Further implement CWG 2292
authorSoumi Manna <soumi.manna@intel.com>
Wed, 15 Jan 2020 13:47:22 +0000 (08:47 -0500)
committerAaron Ballman <aaron@aaronballman.com>
Wed, 15 Jan 2020 13:49:44 +0000 (08:49 -0500)
The core issue is that simple-template-id is ambiguous between class-name
and type-name. This fixes PR43966.

clang/lib/Sema/SemaExprCXX.cpp
clang/test/SemaCXX/pseudo-destructor-name.cpp [new file with mode: 0644]

index a73e690..96e1810 100644 (file)
@@ -192,8 +192,10 @@ ParsedType Sema::getDestructorName(SourceLocation TildeLoc,
       AlreadySearched = true;
       LookupCtx = DC;
       isDependent = false;
-    } else if (DC && isa<CXXRecordDecl>(DC)) {
-      LookAtPrefix = false;
+    } else if (auto *RD = dyn_cast_or_null<CXXRecordDecl>(DC)) {
+      if ((RD->hasDefinition() && RD->hasSimpleDestructor()) ||
+          !RD->hasDefinition())
+        LookAtPrefix = false;
       LookInScope = true;
     }
 
diff --git a/clang/test/SemaCXX/pseudo-destructor-name.cpp b/clang/test/SemaCXX/pseudo-destructor-name.cpp
new file mode 100644 (file)
index 0000000..cc7c22b
--- /dev/null
@@ -0,0 +1,26 @@
+// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
+// expected-no-diagnostics
+
+struct AAA
+{
+    struct BBB
+    {
+        ~BBB() {}
+    };
+
+    typedef BBB BBB_alias;
+};
+
+typedef AAA::BBB BBB_alias2;
+
+int
+main()
+{
+    AAA::BBB_alias *ptr1 = new AAA::BBB_alias();
+    AAA::BBB_alias *ptr2 = new AAA::BBB_alias();
+
+    ptr1->AAA::BBB_alias::~BBB_alias(); // Now OK
+    ptr2->AAA::BBB_alias::~BBB();       // OK
+    ptr1->~BBB_alias2();                // OK
+    return 0;
+}