summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZahira Ammarguellat <zahira.ammarguellat@intel.com>2020-11-06 06:38:22 -0800
committerZahira Ammarguellat <zahira.ammarguellat@intel.com>2020-12-01 10:33:12 -0800
commit37340798ccb00b9c3a53e8a5f1b6430e85870338 (patch)
tree8b0ddd372e29370c7184f0f5e566ad7535e7f48c
parenta5309438fe8d4f1212ae645bc0aaf71fdf73d028 (diff)
downloadllvm-37340798ccb00b9c3a53e8a5f1b6430e85870338.tar.gz
Argument dependent lookup with class argument is recursing into base
classes that haven't been instantiated. This is generating an assertion in DeclTemplate.h. Fix for Bug25668.
-rw-r--r--clang/lib/Sema/SemaLookup.cpp2
-rw-r--r--clang/lib/Sema/SemaOpenMP.cpp1
-rw-r--r--clang/test/OpenMP/template-specialization.cpp16
3 files changed, 19 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaLookup.cpp b/clang/lib/Sema/SemaLookup.cpp
index 16dd8f510596..34065a5a212a 100644
--- a/clang/lib/Sema/SemaLookup.cpp
+++ b/clang/lib/Sema/SemaLookup.cpp
@@ -2576,6 +2576,8 @@ namespace {
bool addClassTransitive(CXXRecordDecl *RD) {
Classes.insert(RD);
+ if (InstantiationLoc.isInvalid())
+ InstantiationLoc = RD->getLocation();
return ClassesTransitive.insert(RD);
}
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index 63ea297493ff..dece57bb060a 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -17549,6 +17549,7 @@ static void checkMappableExpressionList(
auto &DeclNames = SemaRef.getASTContext().DeclarationNames;
MapperId.setName(DeclNames.getIdentifier(
&SemaRef.getASTContext().Idents.get("default")));
+ MapperId.setLoc(StartLoc);
}
// Iterators to find the current unresolved mapper expression.
diff --git a/clang/test/OpenMP/template-specialization.cpp b/clang/test/OpenMP/template-specialization.cpp
new file mode 100644
index 000000000000..714fbf4a2011
--- /dev/null
+++ b/clang/test/OpenMP/template-specialization.cpp
@@ -0,0 +1,16 @@
+// RUN: %clang_cc1 -verify -fopenmp -fsyntax-only %s
+
+// expected-no-diagnostics
+
+template <typename T>
+struct z {
+ static void aj() {
+ T f;
+#pragma omp target map(f)
+ ;
+ }
+};
+
+template <typename> class ar {};
+template <int> struct as {};
+template class z<ar<as<4>>>;