From: Richard Smith Date: Thu, 9 May 2019 22:22:48 +0000 (+0000) Subject: Remember to decay arrays to pointers before checking whether the X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e2a670386967259ce269ca963a1b90c44a63a05a;p=clang Remember to decay arrays to pointers before checking whether the left-hand side of an -> operator is a pointer to class type. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@360387 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp index 6af59d5c43..683fc5b319 100644 --- a/lib/Sema/SemaExprCXX.cpp +++ b/lib/Sema/SemaExprCXX.cpp @@ -6790,9 +6790,12 @@ ExprResult Sema::ActOnStartCXXMemberReference(Scope *S, Expr *Base, FirstIteration = false; } - if (OpKind == tok::arrow && - (BaseType->isPointerType() || BaseType->isObjCObjectPointerType())) - BaseType = BaseType->getPointeeType(); + if (OpKind == tok::arrow) { + if (BaseType->isPointerType()) + BaseType = BaseType->getPointeeType(); + else if (auto *AT = Context.getAsArrayType(BaseType)) + BaseType = AT->getElementType(); + } } // Objective-C properties allow "." access on Objective-C pointer types, diff --git a/test/Parser/cxx-class.cpp b/test/Parser/cxx-class.cpp index fe9c1ac95b..e672c45068 100644 --- a/test/Parser/cxx-class.cpp +++ b/test/Parser/cxx-class.cpp @@ -283,6 +283,19 @@ struct C {} decltype(D())::c; // expected-error {{'decltype' cannot be used to n #endif } +namespace ArrayMemberAccess { + struct A { + int x; + template int f() const; + }; + void f(const A (&a)[]) { + // OK: not a template-id. + bool cond = a->x < 10 && a->x > 0; + // OK: a template-id. + a->f(); + } +} + // PR11109 must appear at the end of the source file class pr11109r3 { // expected-note{{to match this '{'}} public // expected-error{{expected ':'}} expected-error{{expected '}'}} expected-error{{expected ';' after class}}