[clang] 5f2c554 - Fix assert on valid due to incorrect assumption that a field name must
Richard Smith via cfe-commits
cfe-commits at lists.llvm.org
Wed Nov 18 14:04:19 PST 2020
Author: Richard Smith
Date: 2020-11-18T14:04:02-08:00
New Revision: 5f2c5541f78750c21004e0172f13db4632966fd3
URL: https://github.com/llvm/llvm-project/commit/5f2c5541f78750c21004e0172f13db4632966fd3
DIFF: https://github.com/llvm/llvm-project/commit/5f2c5541f78750c21004e0172f13db4632966fd3.diff
LOG: Fix assert on valid due to incorrect assumption that a field name must
be unique in its scope.
Added:
clang/test/SemaTemplate/default-member-init.cpp
Modified:
clang/lib/Sema/SemaDeclCXX.cpp
Removed:
################################################################################
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index d31d2e32547a..9d2090dfd8eb 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -15082,24 +15082,14 @@ ExprResult Sema::BuildCXXDefaultInitExpr(SourceLocation Loc, FieldDecl *Field) {
DeclContext::lookup_result Lookup =
ClassPattern->lookup(Field->getDeclName());
- // Lookup can return at most two results: the pattern for the field, or the
- // injected class name of the parent record. No other member can have the
- // same name as the field.
- // In modules mode, lookup can return multiple results (coming from
- //
diff erent modules).
- assert((getLangOpts().Modules || (!Lookup.empty() && Lookup.size() <= 2)) &&
- "more than two lookup results for field name");
- FieldDecl *Pattern = dyn_cast<FieldDecl>(Lookup[0]);
- if (!Pattern) {
- assert(isa<CXXRecordDecl>(Lookup[0]) &&
- "cannot have other non-field member with same name");
- for (auto L : Lookup)
- if (isa<FieldDecl>(L)) {
- Pattern = cast<FieldDecl>(L);
- break;
- }
- assert(Pattern && "We must have set the Pattern!");
+ FieldDecl *Pattern = nullptr;
+ for (auto L : Lookup) {
+ if (isa<FieldDecl>(L)) {
+ Pattern = cast<FieldDecl>(L);
+ break;
+ }
}
+ assert(Pattern && "We must have set the Pattern!");
if (!Pattern->hasInClassInitializer() ||
InstantiateInClassInitializer(Loc, Field, Pattern,
diff --git a/clang/test/SemaTemplate/default-member-init.cpp b/clang/test/SemaTemplate/default-member-init.cpp
new file mode 100644
index 000000000000..5615d11e33d6
--- /dev/null
+++ b/clang/test/SemaTemplate/default-member-init.cpp
@@ -0,0 +1,12 @@
+// RUN: %clang_cc1 -std=c++20 -verify %s
+// expected-no-diagnostics
+
+struct Q { enum F { f }; };
+
+template<typename T> struct A : Q {
+ enum E { e } E = e;
+
+ using Q::F;
+ Q::F F = f;
+};
+A<int> a = {};
More information about the cfe-commits
mailing list