diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index 8f3b359fde18e..e323b31f8e753 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -7868,8 +7868,9 @@ static QualType getDecltypeForExpr(Sema &S, Expr *E) { if (const ValueDecl *VD = dyn_cast(DRE->getDecl())) return VD->getType(); } else if (const MemberExpr *ME = dyn_cast(E)) { - if (const FieldDecl *FD = dyn_cast(ME->getMemberDecl())) - return FD->getType(); + if (const ValueDecl *VD = ME->getMemberDecl()) + if (isa(VD) || isa(VD)) + return VD->getType(); } else if (const ObjCIvarRefExpr *IR = dyn_cast(E)) { return IR->getDecl()->getType(); } else if (const ObjCPropertyRefExpr *PR = dyn_cast(E)) { diff --git a/clang/test/CXX/dcl.dcl/dcl.spec/dcl.type/dcl.type.simple/p4-cxx0x.cpp b/clang/test/CXX/dcl.dcl/dcl.spec/dcl.type/dcl.type.simple/p4-cxx0x.cpp index 53227ea37ce9e..ee952aeaf0c92 100644 --- a/clang/test/CXX/dcl.dcl/dcl.spec/dcl.type/dcl.type.simple/p4-cxx0x.cpp +++ b/clang/test/CXX/dcl.dcl/dcl.spec/dcl.type/dcl.type.simple/p4-cxx0x.cpp @@ -12,13 +12,18 @@ struct is_same { const int&& foo(); int i; -struct A { double x; }; +struct A { + double x; + static int y; +}; const A* a = new A(); static_assert(is_same::value, ""); static_assert(is_same::value, ""); static_assert(is_samex), double>::value, ""); static_assert(is_samex)), const double&>::value, ""); +static_assert(is_samey), int>::value, ""); +static_assert(is_samey)), int&>::value, ""); static_assert(is_same(i)), int&&>::value, ""); int f0(int); // expected-note{{possible target}}