Skip to content
Snippets Groups Projects
Commit 6d22a00e authored by Dean Camera's avatar Dean Camera
Browse files

Better fix to avoid void pointer arithmetic in ConfigDescriptor.h to regain...

Better fix to avoid void pointer arithmetic in ConfigDescriptor.h to regain C++ compatibility (thanks to Michael Hennebry).
parent 23a94a71
No related branches found
No related tags found
No related merge requests found
......@@ -257,16 +257,6 @@
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.
*
......@@ -277,12 +267,10 @@
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: */
......
......@@ -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>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment