Better fix to avoid void pointer arithmetic in ConfigDescriptor.h to regain C++ compa...
authorDean Camera <dean@fourwalledcubicle.com>
Wed, 2 Jun 2010 15:28:07 +0000 (15:28 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Wed, 2 Jun 2010 15:28:07 +0000 (15:28 +0000)
LUFA/Drivers/USB/HighLevel/ConfigDescriptor.h
LUFA/ManPages/ChangeLog.txt

index 87610c7..5aa8f3c 100644 (file)
                        uint8_t USB_GetNextDescriptorComp(uint16_t* BytesRem, void** const CurrConfigLoc, ConfigComparatorPtr_t const ComparatorRoutine);
 
                /* Inline Functions: */
-                       #if !defined(__DOXYGEN__)
-                       static inline void USB_GetNextDescriptorST(uint16_t* const BytesRem, uint8_t** CurrConfigLoc)
-                       {
-                               uint16_t CurrDescriptorSize = DESCRIPTOR_CAST(*CurrConfigLoc, USB_Descriptor_Header_t).Size;
-                               
-                               *CurrConfigLoc += CurrDescriptorSize;
-                               *BytesRem      -= CurrDescriptorSize;
-                       }                       
-                       #endif
-               
                        /** Skips over the current sub-descriptor inside the configuration descriptor, so that the pointer then
                            points to the next sub-descriptor. The bytes remaining value is automatically decremented.
                         *
                                                                 ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);                                                                       
                        static inline void USB_GetNextDescriptor(uint16_t* const BytesRem, void** CurrConfigLoc)
                        {
-                               /* Horrible workaround for a bug in GCC - in some circumstances, the code generated for the strongly-typed
-                                * (uint8_t**) cast to avoid void pointer arithmetic (which is not allowed in C++) causes incorrect code to
-                                * be generated. Performing the cast and using a secondary inline routine show here seems to avoid the
-                                * problem.
-                                */
-                               USB_GetNextDescriptorST(BytesRem, (uint8_t**)CurrConfigLoc);
+                               uint16_t CurrDescriptorSize = DESCRIPTOR_CAST(*CurrConfigLoc, USB_Descriptor_Header_t).Size;
+                               
+                               *CurrConfigLoc += ((uint8_t*)*CurrConfigLoc) + CurrDescriptorSize;
+                               *BytesRem      -= CurrDescriptorSize;
                        }
                
        /* Disable C linkage for C++ Compilers: */
index c123116..03e55b9 100644 (file)
@@ -31,6 +31,7 @@
   *  - Fixed XPLAINBridge project not correctly reading the XMEGA's supply voltage when reporting back to the host
   *  - Fixed incorrect signature for the ATMEGA32U2 in the DFU bootloader (thanks to Axel Rohde)
   *  - Fixed internal device serial not being accessible on the ATMEGAXXU2 AVRs (thanks to Axel Rohde)
+  *  - Fixed void pointer arithmetic in ConfigDescriptor.h breaking C++ compatibility (thanks to Michael Hennebry)
   *
   *  \section Sec_ChangeLog100513 Version 100513
   *  <b>New:</b>