typedef enum { BadFirst, BadSecond, BadThird } BadEnum; typedef enum { NestedFirst, NestedSecond } NestedBadEnum; typedef enum { GoodFirst, GoodSecond, GoodLast } GoodEnum; enum RawEnum { RawFirst, RawLast }; enum class ClassEnum { ClassFirst, ClassLast }; template struct ParamTraits; // Simplified EnumSerializer etc. from IPCMessageUtils.h template struct EnumSerializer { typedef E paramType; }; template class ContiguousEnumValidator {}; template struct ContiguousEnumSerializer : EnumSerializer> {}; // Typical ParamTraits implementation that should be avoided template<> struct ParamTraits // expected-error {{Custom ParamTraits implementation for an enum type}} expected-note {{Please use a helper class for example ContiguousEnumSerializer}} { typedef ClassEnum paramType; }; template<> struct ParamTraits // expected-error {{Custom ParamTraits implementation for an enum type}} expected-note {{Please use a helper class for example ContiguousEnumSerializer}} { typedef enum RawEnum paramType; }; template<> struct ParamTraits // expected-error {{Custom ParamTraits implementation for an enum type}} expected-note {{Please use a helper class for example ContiguousEnumSerializer}} { typedef BadEnum paramType; }; // Make sure the analysis catches nested typedefs typedef NestedBadEnum NestedDefLevel1; typedef NestedDefLevel1 NestedDefLevel2; template<> struct ParamTraits // expected-error {{Custom ParamTraits implementation for an enum type}} expected-note {{Please use a helper class for example ContiguousEnumSerializer}} { typedef NestedDefLevel2 paramType; }; // Make sure a non enum typedef is not accidentally flagged typedef int IntTypedef; template<> struct ParamTraits { typedef IntTypedef paramType; }; // Make sure ParamTraits using helper classes are not flagged template<> struct ParamTraits : public ContiguousEnumSerializer {};