diff options
| -rw-r--r-- | clang/include/clang/AST/Decl.h | 4 | ||||
| -rw-r--r-- | clang/lib/AST/Decl.cpp | 6 | ||||
| -rw-r--r-- | clang/test/SemaCXX/enum-scoped.cpp | 10 |
3 files changed, 15 insertions, 5 deletions
diff --git a/clang/include/clang/AST/Decl.h b/clang/include/clang/AST/Decl.h index ecb87941743..aafb27e8ab4 100644 --- a/clang/include/clang/AST/Decl.h +++ b/clang/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/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp index d5e048a7c4a..63f1f16ea65 100644 --- a/clang/lib/AST/Decl.cpp +++ b/clang/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<UsingShadowDecl>(D)) D = cast<UsingShadowDecl>(D)->getTargetDecl(); diff --git a/clang/test/SemaCXX/enum-scoped.cpp b/clang/test/SemaCXX/enum-scoped.cpp index 8938c8229c2..94cccb28fdd 100644 --- a/clang/test/SemaCXX/enum-scoped.cpp +++ b/clang/test/SemaCXX/enum-scoped.cpp @@ -174,3 +174,13 @@ namespace N2764 { } enum class N2764::B {}; + +namespace PR12106 { + template<typename E> struct Enum { + Enum() : m_e(E::Last) {} + E m_e; + }; + + enum eCOLORS { Last }; + Enum<eCOLORS> e; +} |

