LLVM Bugzilla is read-only and represents the historical archive of all LLVM issues filled before November 26, 2021. Use github to submit LLVM bugs

Bug 42396 - Alignment not respected in containers for over-aligned enumeration types
Summary: Alignment not respected in containers for over-aligned enumeration types
Status: RESOLVED INVALID
Alias: None
Product: libc++
Classification: Unclassified
Component: All Bugs (show other bugs)
Version: unspecified
Hardware: PC All
: P normal
Assignee: Unassigned Clang Bugs
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2019-06-25 14:45 PDT by Marshall Clow (home)
Modified: 2019-06-25 15:41 PDT (History)
5 users (show)

See Also:
Fixed By Commit(s):


Attachments
Reproducer (915 bytes, text/x-csrc)
2019-06-25 14:45 PDT, Marshall Clow (home)
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Marshall Clow (home) 2019-06-25 14:45:33 PDT
Created attachment 22140 [details]
Reproducer

Inspired by: https://stackoverflow.com/questions/56760874/discrepancy-in-c-between-over-aligned-struct-and-enum-within-container

Given an enumeration type with a specified alignment, the elements in a vector of such a type should be aligned correctly. This appears not to be the case - and can lead to UBSAN going off.


In the reproducer, I also check the size of a 16-element array of these two types.
Clang says they're different sizes - that suggests to me that there's a clang problem here. 

The alignment in the containers bit could be related to https://bugs.llvm.org/show_bug.cgi?id=22634. (might even be the same bug)
Comment 1 Marshall Clow (home) 2019-06-25 15:05:22 PDT
Now I'm very confused.

====
struct alignas(16) byte_struct {std::uint8_t value;};
enum alignas(16) byte_enum : std::uint8_t { one=1, two, three };

int main() {
	std::cout << "struct:     " << sizeof(byte_struct) << std::endl;
	std::cout << "enum:       " << sizeof(byte_enum  ) << std::endl;
	std::cout << "01 structs: " << sizeof(byte_struct[1]) << std::endl;
	std::cout << "01 enums:   " << sizeof(byte_enum  [1]) << std::endl;
	std::cout << "02 structs: " << sizeof(byte_struct[2]) << std::endl;
	std::cout << "02 enums:   " << sizeof(byte_enum  [2]) << std::endl;
	std::cout << "16 structs: " << sizeof(byte_struct[16]) << std::endl;
	std::cout << "16 enums:   " << sizeof(byte_enum  [16]) << std::endl;
	}
====

prints (with a reasonably recent clang):
====
struct:     16
enum:       1
01 structs: 16
01 enums:   16
02 structs: 32
02 enums:   16
16 structs: 256
16 enums:   16
====
Comment 2 Marshall Clow (home) 2019-06-25 15:41:04 PDT
Richard pointed out (on SO) that this is core issue 2354. Extended alignment and object representation, which was resolved in Kona by removing the ability to put 'alignas' on enumeration types.

Closing as invalid.