labath accepted this revision.
labath added a comment.
This revision is now accepted and ready to land.

This looks good to me, though I can't say I'm that familiar with thread plan 
intricacies.



================
Comment at: lldb/include/lldb/Target/ThreadPlanStack.h:118
+
+  void Update(ThreadList &current_threads);
+
----------------
Delete the dangling declaration as the current patch does not implement this.


================
Comment at: lldb/include/lldb/Target/ThreadPlanStack.h:126-130
+    auto result = m_plans_list.find(tid);
+    if (result == m_plans_list.end())
+      return false;
+    result->second.ThreadDestroyed(nullptr);
+    m_plans_list.erase(result);
----------------
Any chance of calling `ThreadDestroyed` from ThreadPlanStack destructor, so 
this can just be `m_plan_list.erase(tid)` ?


================
Comment at: lldb/source/Target/ThreadPlanStack.cpp:373
+  }
+}
----------------
jingham wrote:
> labath wrote:
> > jingham wrote:
> > > labath wrote:
> > > > This is the usual place where one would add a llvm_unreachable. Some 
> > > > compilers do not consider the above switch to be fully covered (and if 
> > > > we are to be fully pedantic, it isn't) and will complain about falling 
> > > > off of the end of a non-void function.
> > > I added a default, but what do you mean by "if we are to be fully 
> > > pedantic, it isn't"?  It's an enum with 3 cases, all of which are listed. 
> > >  How is that not fully covered?
> > The first sentence of [[ https://en.cppreference.com/w/cpp/language/enum | 
> > cppreference enum definition ]] could be helpful here:
> > ```
> > An enumeration is a distinct type whose value is restricted to a range of 
> > values (see below for details), which may include several explicitly named 
> > constants ("enumerators").
> > ```
> > What exactly is the "range of values" of an enum is a complex topic, but 
> > suffice to say it usually includes more than the named constants one has 
> > mentioned in the enum definition (imagine bitfield enums).
> > Clang takes the "common sense" approach and assumes that if one does a 
> > switch over an enum, he expects it to always have one of the named 
> > constants. Gcc follows a stricter interpretation and concludes that there 
> > are execution flows which do not return a value from this function and 
> > issues a warning. Which behavior is more correct is debatable...
> > 
> > Unfortunately adding a default case is not the right solution here (though 
> > I can see how that could be understood from my comment -- sorry), because 
> > clang will then warn you about putting a default statement in what it 
> > considers to be a fully covered switch. The right solution is to put the 
> > llvm_unreachable call *after* the switch statement, which is the layout 
> > that will make everyone happy. You don't need (or shouldn't) put the return 
> > statement because the compilers know that the macro terminates the progream.
> > 
> > I'm sorry that this turned into such a lesson, but since you were using the 
> > macro in an atypical way, I wanted to illustrate what is the more common 
> > use of it.
> The "may" in that sentence is apparently the crucial bit, but it didn't 
> explain why an enum specified only by named constants might have other 
> possible values.  I read a little further on, but didn't get to the part 
> where it explains that.  Seems to me in this case the compiler shouldn't have 
> to to guess about the extent of the valid values of this enum and then be 
> conservative or not in handling the results of its guess.  I don't see the 
> point of an enum if a legally constructed enum value (not cast from some 
> random value) isn't exhausted by the constants used to define it.  That just 
> seems weird.
> 
> But arguing with C++ compiler diagnostics isn't a productive use of time, and 
> I feel like too deep an understanding of the C++ type system's mysteries is 
> not good for one's mental stability.  So I'm more than content to cargo cult 
> this one...
The rough rule is that for enums without a fixed underlying type, the range of 
valid values is those that are representable by the smallest bitfield capable 
of holding all enumerators of that enum. For a fixed underlying type, the range 
is the whole type.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D75880/new/

https://reviews.llvm.org/D75880



_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to