From: Douglas Gregor Date: Thu, 8 Mar 2012 02:08:05 +0000 (+0000) Subject: Loosen the precondition of isCXXInstanceMember() to simply return X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5bc37f6e0c932e7a8e0af92b6266372dc7b94cd9;p=clang Loosen the precondition of isCXXInstanceMember() to simply return "false" for declarations that aren't members of classes. Fixes PR12106. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@152284 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/Decl.h b/include/clang/AST/Decl.h index ecb8794174..aafb27e8ab 100644 --- a/include/clang/AST/Decl.h +++ b/include/clang/AST/Decl.h @@ -205,8 +205,8 @@ public: return DC->isRecord(); } - /// \brief Given that this declaration is a C++ class member, - /// determine whether it's an instance member of its class. + /// \brief Determine whether the given declaration is an instance member of + /// a C++ class. bool isCXXInstanceMember() const; class LinkageInfo { diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index d5e048a7c4..63f1f16ea6 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -997,9 +997,9 @@ NamedDecl *NamedDecl::getUnderlyingDecl() { } bool NamedDecl::isCXXInstanceMember() const { - assert(isCXXClassMember() && - "checking whether non-member is instance member"); - + if (!isCXXClassMember()) + return false; + const NamedDecl *D = this; if (isa(D)) D = cast(D)->getTargetDecl(); diff --git a/test/SemaCXX/enum-scoped.cpp b/test/SemaCXX/enum-scoped.cpp index 8938c8229c..94cccb28fd 100644 --- a/test/SemaCXX/enum-scoped.cpp +++ b/test/SemaCXX/enum-scoped.cpp @@ -174,3 +174,13 @@ namespace N2764 { } enum class N2764::B {}; + +namespace PR12106 { + template struct Enum { + Enum() : m_e(E::Last) {} + E m_e; + }; + + enum eCOLORS { Last }; + Enum e; +}