On Jan 15, 2009, at 9:05 AM, Douglas Gregor wrote:

>
> On Jan 14, 2009, at 11:41 PM, Chris Lattner wrote:
>
>> On Jan 14, 2009, at 3:24 PM, Douglas Gregor wrote:
>>>>> +/// @brief Determine the result of name lookup.
>>>>> +Sema::LookupResult::LookupKind Sema::LookupResult::getKind()  
>>>>> const {
>>>>> +  switch (StoredKind) {
>>>>> +  case SingleDecl:
>>>>> +    return (reinterpret_cast<Decl *>(First) != 0)? Found :  
>>>>> NotFound;
>>>>> +
>>>>> +  case OverloadedDeclFromIdResolver:
>>>>> +  case OverloadedDeclFromDeclContext:
>>>>> +    return FoundOverloaded;
>>>>> +
>>>>> +  case AmbiguousLookup:
>>>>> +    return Ambiguous;
>>>>> +  }
>>>>> +
>>>>> +  // We can't get here, but GCC complains nonetheless.
>>>>> +  return Ambiguous;
>>>>> +}
>>>>>
>>>>
>>>> I believe our standard way of handling this is by having a default
>>>> case
>>>> that asserts.
>>>>
>>>> switch (StoredKind) {
>>>> default: assert(false && "Bad StoredKind");
>>>
>>> IIRC, I was getting bogus "function does not return a value"  
>>> warnings
>>> from GCC when I've done this.
>>
>> Make sure the default case is at the start of the switch (Before  
>> the first case) not at the end.
>
>
> My complaint about putting a default: in there still stands: it  
> suppresses a useful warning, where we've omitted a case, and turns  
> it into a run-time failure.

Does GCC produce a warning for cases like:

int foo() {
   switch (someenum) {
   case <all possible enums>:
     return 0;
   }
   // no return
}

About falling off the end of the function?

-Chris
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to