<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Feb 24, 2015 at 5:38 PM, Davide Italiano <span dir="ltr"><<a href="mailto:davide.italiano@gmail.com" target="_blank">davide.italiano@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Richard.<br>
<br>
Building the following testcase<br>
 % cat blah.cpp<br>
struct {<br>
  struct A <struct A {<br>
<br>
results in a crash in Sema, namely:<br>
<br>
% clang blah.cpp -o blah<br>
[...]<br>
Invalid access specifier!<br>
UNREACHABLE executed at<br>
/usr/src/lib/clang/libclangast/../../../contrib/llvm/tools/clang/lib/AST/DeclCXX.cpp:2145!<br>
<br>
I would like to propose the following patch to fix that up.<br>
Rather than crashing, if we don't have informations about the previous<br>
declaration access specifier, we can just throw an error.<br>
<br>
diff --git a/lib/Sema/SemaAccess.cpp b/lib/Sema/SemaAccess.cpp<br>
index 37240c2..7433c8c 100644<br>
--- a/lib/Sema/SemaAccess.cpp<br>
+++ b/lib/Sema/SemaAccess.cpp<br>
@@ -45,6 +45,11 @@ bool Sema::SetMemberAccessSpecifier(NamedDecl *MemberDecl,<br>
     return false;<br>
   }<br>
<br>
+  // If a previous member declaration exists, and the access specifier<br>
+  // is not valid, just error out.<br>
+  if (PrevMemberDecl->getAccess() == AS_none)<br></blockquote><div><br></div><div>(As discussed on IRC) Please assert that the previous declaration is marked invalid here, and mark the new member declaration as invalid in this case.</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+    return true;<br>
+<br>
   // C++ [class.access.spec]p3: When a member is redeclared its access<br>
   // specifier must be same as its initial declaration.<br>
   if (LexicalAS != AS_none && LexicalAS != PrevMemberDecl->getAccess()) {</blockquote></div></div></div>