[PATCH] D45412: [Sema] Fix PR22637 - IndirectFieldDecl's discard qualifiers during template instantiation.
Eric Fiselier via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Sat Apr 7 20:57:08 PDT 2018
EricWF created this revision.
EricWF added reviewers: rsmith, lebedev.ri, aaron.ballman, bkramer, rjmccall.
Currently Clang fails to propagate qualifiers from the `CXXThisExpr` to the rebuilt `FieldDecl` for IndirectFieldDecls. For example:
template <class T> struct Foo {
struct { int x; };
int y;
void foo() const {
static_assert(__is_same(int const&, decltype((y))));
static_assert(__is_same(int const&, decltype((x)))); // assertion fails
}
};
template struct Foo<int>;
The fix is to delegate rebuilding of the MemberExpr to `BuildFieldReferenceExpr` which correctly propagates the qualifiers.
Repository:
rC Clang
https://reviews.llvm.org/D45412
Files:
lib/Sema/TreeTransform.h
test/SemaCXX/PR22637.cpp
test/SemaCXX/cxx0x-nontrivial-union.cpp
Index: test/SemaCXX/cxx0x-nontrivial-union.cpp
===================================================================
--- test/SemaCXX/cxx0x-nontrivial-union.cpp
+++ test/SemaCXX/cxx0x-nontrivial-union.cpp
@@ -110,7 +110,7 @@
}
explicit operator bool() const { return has; }
- T &operator*() const { return value; }
+ T &operator*() { return value; }
};
optional<non_trivial> o1;
Index: test/SemaCXX/PR22637.cpp
===================================================================
--- /dev/null
+++ test/SemaCXX/PR22637.cpp
@@ -0,0 +1,40 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+// expected-no-diagnostics
+
+void check(int&) = delete;
+void check(int const&) { }
+
+template <typename>
+struct A {
+ union {
+ int b;
+ };
+ struct {
+ int c;
+ };
+ union {
+ struct {
+ union {
+ struct {
+ struct {
+ int d;
+ };
+ };
+ };
+ };
+ };
+ int e;
+ void foo() const {
+ check(b);
+ check(c);
+ check(d);
+ check(d);
+ check(e);
+ }
+};
+
+int main(){
+ A<int> a;
+ a.foo();
+}
Index: lib/Sema/TreeTransform.h
===================================================================
--- lib/Sema/TreeTransform.h
+++ lib/Sema/TreeTransform.h
@@ -2249,12 +2249,11 @@
FoundDecl, Member);
if (BaseResult.isInvalid())
return ExprError();
- Base = BaseResult.get();
- ExprValueKind VK = isArrow ? VK_LValue : Base->getValueKind();
- MemberExpr *ME = new (getSema().Context)
- MemberExpr(Base, isArrow, OpLoc, Member, MemberNameInfo,
- cast<FieldDecl>(Member)->getType(), VK, OK_Ordinary);
- return ME;
+
+ CXXScopeSpec EmptySS;
+ return getSema().BuildFieldReferenceExpr(
+ Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
+ DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo);
}
CXXScopeSpec SS;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D45412.141520.patch
Type: text/x-patch
Size: 2043 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180408/5fb622e8/attachment.bin>
More information about the cfe-commits
mailing list