
John, I think that the problem is at regex_traits_defaults.hpp line 191: static const character_pointer_range<charT>* ranges_end = ranges + (sizeof(ranges)/sizeof(ranges[0])); Your algorithm doesn't allow for compiler data alignment. With 8-byte data alignment (now the default with VC8) sizeof(ranges) == ((19*4)/8+1)*8 == 80. The compiler warning is correct get_default_class_id() may return a value between -1 and 20. Add 1 to this return value and you get a range of 0-21 which exceeds the size of masks in lookup_classname_imp(). Note that similar code at win32_regex_traits.hpp line 536 is not affected because the size of masks is 8-byte aligned (for now at least). 64-bit compilers require 8-byte alignment so I assume that this code will not compile correctly on those platforms as well. If you must use this construct ("sizeof(ranges)/sizeof(ranges[0]") then static assert that this formula yields the same size as your array. I see that there are a few other non-trivial warnings in my build of the regex library. My examples were not intended to be exhaustive but to illustrate the utility of incorporating this into boost's QA. Regards, George.