The current C++ grammar allows an anonymous bit-field with an attribute, but this is ambiguous (the attribute in that case could appertain to the type instead of the bit-field). The current thinking in the Core Working Group is that it's better to disallow attributes in that position at the grammar level so that the ambiguity resolves in favor of applying to the type. During discussions about the behavior of the attribute, the Core Working Group also felt it was better to disallow anonymous bit-fields from specifying a default member initializer. This implements both sets of related grammar changes.
20 lines
850 B
C++
20 lines
850 B
C++
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++20 %s
|
|
|
|
// Test various bit-field member declarations.
|
|
constexpr int foo() { return 1; }
|
|
struct A {
|
|
int a [[]] : 1;
|
|
int b, [[]] : 0; // expected-error {{an attribute list cannot appear here}}
|
|
int [[]] : 0; // OK, attribute applies to the type.
|
|
int [[]] c : 1; // OK, attribute applies to the type.
|
|
int : 2 = 1; // expected-error {{anonymous bit-field cannot have a default member initializer}}
|
|
int : 0 { 1 }; // expected-error {{anonymous bit-field cannot have a default member initializer}}
|
|
int : 0, d : 1 = 1;
|
|
int : 1 = 12, e : 1; // expected-error {{anonymous bit-field cannot have a default member initializer}}
|
|
int : 0, f : 1 = 1;
|
|
int g [[]] : 1 = 1;
|
|
int h [[]] : 1 {1};
|
|
int i : foo() = foo();
|
|
int j, [[]] k; // expected-error {{an attribute list cannot appear here}}
|
|
};
|