Index: src/AST/Expr.cpp
===================================================================
--- src/AST/Expr.cpp	(revision 45d0e65f1d08fcf0261d27f5521433a2d272e884)
+++ src/AST/Expr.cpp	(revision 366f5cd47f06469e6c39617fdc1be75acd3f4943)
@@ -11,5 +11,5 @@
 // Last Modified By : Peter A. Buhr
 // Created On       : Wed May 18 13:56:00 2022
-// Update Count     : 12
+// Update Count     : 18
 //
 
@@ -46,7 +46,6 @@
 // --- ApplicationExpr
 
-ApplicationExpr::ApplicationExpr( const CodeLocation & loc, const Expr * f,
-	std::vector<ptr<Expr>> && as )
-: Expr( loc ), func( f ), args( std::move(as) ) {
+ApplicationExpr::ApplicationExpr( const CodeLocation & loc, const Expr * f,	std::vector<ptr<Expr>> && as )
+		: Expr( loc ), func( f ), args( std::move(as) ) {
 	// ensure that `ApplicationExpr` result type is `FuncExpr`
 	const PointerType * pt = strict_dynamic_cast< const PointerType * >( f->result.get() );
@@ -103,6 +102,5 @@
 }
 
-UntypedExpr * UntypedExpr::createCall( const CodeLocation & loc,
-		const std::string & name, std::vector<ptr<Expr>> && args ) {
+UntypedExpr * UntypedExpr::createCall( const CodeLocation & loc, const std::string & name, std::vector<ptr<Expr>> && args ) {
 	return new UntypedExpr( loc,
 			new NameExpr( loc, name ), std::move( args ) );
@@ -111,9 +109,7 @@
 // --- VariableExpr
 
-VariableExpr::VariableExpr( const CodeLocation & loc )
-: Expr( loc ), var( nullptr ) {}
-
-VariableExpr::VariableExpr( const CodeLocation & loc, const DeclWithType * v )
-: Expr( loc ), var( v ) {
+VariableExpr::VariableExpr( const CodeLocation & loc ) : Expr( loc ), var( nullptr ) {}
+
+VariableExpr::VariableExpr( const CodeLocation & loc, const DeclWithType * v ) : Expr( loc ), var( v ) {
 	assert( var );
 	assert( var->get_type() );
@@ -130,6 +126,5 @@
 }
 
-VariableExpr * VariableExpr::functionPointer(
-		const CodeLocation & loc, const FunctionDecl * decl ) {
+VariableExpr * VariableExpr::functionPointer( const CodeLocation & loc, const FunctionDecl * decl ) {
 	// wrap usually-determined result type in a pointer
 	VariableExpr * funcExpr = new VariableExpr{ loc, decl };
@@ -178,7 +173,5 @@
 }
 
-AddressExpr::AddressExpr( const CodeLocation & loc, const Expr * a ) :
-	Expr( loc, addrExprType( loc, a ) ), arg( a )
-{}
+AddressExpr::AddressExpr( const CodeLocation & loc, const Expr * a ) : Expr( loc, addrExprType( loc, a ) ), arg( a ) {}
 
 // --- LabelAddressExpr
@@ -191,5 +184,5 @@
 
 CastExpr::CastExpr( const CodeLocation & loc, const Expr * a, GeneratedFlag g, CastKind kind )
-: Expr( loc, new VoidType{} ), arg( a ), isGenerated( g ), kind( kind ) {}
+		: Expr( loc, new VoidType{} ), arg( a ), isGenerated( g ), kind( kind ) {}
 
 bool CastExpr::get_lvalue() const {
@@ -213,5 +206,5 @@
 
 MemberExpr::MemberExpr( const CodeLocation & loc, const DeclWithType * mem, const Expr * agg )
-: Expr( loc ), member( mem ), aggregate( agg ) {
+		: Expr( loc ), member( mem ), aggregate( agg ) {
 	assert( member );
 	assert( aggregate );
@@ -249,17 +242,13 @@
 
 ConstantExpr * ConstantExpr::from_bool( const CodeLocation & loc, bool b ) {
-	return new ConstantExpr{
-		loc, new BasicType{ BasicKind::Bool }, b ? "1" : "0", (unsigned long long)b };
+	return new ConstantExpr{ loc, new BasicType{ BasicKind::Bool }, b ? "1" : "0", (unsigned long long)b };
 }
 
 ConstantExpr * ConstantExpr::from_int( const CodeLocation & loc, int i ) {
-	return new ConstantExpr{
-		loc, new BasicType{ BasicKind::SignedInt }, std::to_string( i ), (unsigned long long)i };
+	return new ConstantExpr{ loc, new BasicType{ BasicKind::SignedInt }, std::to_string( i ), (unsigned long long)i };
 }
 
 ConstantExpr * ConstantExpr::from_ulong( const CodeLocation & loc, unsigned long i ) {
-	return new ConstantExpr{
-		loc, new BasicType{ BasicKind::LongUnsignedInt }, std::to_string( i ),
-		(unsigned long long)i };
+	return new ConstantExpr{ loc, new BasicType{ BasicKind::LongUnsignedInt }, std::to_string( i ), (unsigned long long)i };
 }
 
@@ -274,33 +263,28 @@
 
 ConstantExpr * ConstantExpr::null( const CodeLocation & loc, const Type * ptrType ) {
-	return new ConstantExpr{
-		loc, ptrType ? ptrType : new PointerType{ new VoidType{} }, "0", (unsigned long long)0 };
+	return new ConstantExpr{ loc, ptrType ? ptrType : new PointerType{ new VoidType{} }, "0", (unsigned long long)0 };
 }
 
 // --- SizeofExpr
 
-SizeofExpr::SizeofExpr( const CodeLocation & loc, const Type * type )
-: SizeofExpr( loc, type, nullptr ) {}
-
-SizeofExpr::SizeofExpr( const CodeLocation & loc, const Type * type, const Type * result )
-: Expr( loc, result ), type( type ) {}
+SizeofExpr::SizeofExpr( const CodeLocation & loc, const Type * type ) : SizeofExpr( loc, type, nullptr ) {}
+
+SizeofExpr::SizeofExpr( const CodeLocation & loc, const Type * type, const Type * result ) : Expr( loc, result ), type( type ) {}
 
 // --- AlignofExpr
 
-AlignofExpr::AlignofExpr( const CodeLocation & loc, const Type * type )
-: AlignofExpr( loc, type, nullptr ) {}
-
-AlignofExpr::AlignofExpr( const CodeLocation & loc, const Type * type, const Type * result )
-: Expr( loc, result ), type( type ) {}
+AlignofExpr::AlignofExpr( const CodeLocation & loc, const Type * type, const Alignment kind ) : AlignofExpr( loc, type, nullptr, kind ) {}
+
+AlignofExpr::AlignofExpr( const CodeLocation & loc, const Type * type, const Type * result, const Alignment kind )
+		: Expr( loc, result ), type( type ), kind( kind ) {}
 
 // --- CountofExpr
 
-CountofExpr::CountofExpr( const CodeLocation & loc, const Type * t )
-: Expr( loc ), type( t ) {}
+CountofExpr::CountofExpr( const CodeLocation & loc, const Type * t ) : Expr( loc ), type( t ) {}
 
 // --- OffsetofExpr
 
 OffsetofExpr::OffsetofExpr( const CodeLocation & loc, const Type * ty, const DeclWithType * mem, const Type * res )
-: Expr( loc, res ), type( ty ), member( mem ) {
+		: Expr( loc, res ), type( ty ), member( mem ) {
 	assert( type );
 	assert( member );
@@ -309,6 +293,5 @@
 // --- OffsetPackExpr
 
-OffsetPackExpr::OffsetPackExpr( const CodeLocation & loc, const StructInstType * ty )
-: Expr( loc ), type( ty ) {
+OffsetPackExpr::OffsetPackExpr( const CodeLocation & loc, const StructInstType * ty ) : Expr( loc ), type( ty ) {
 	assert( type );
 }
@@ -316,7 +299,6 @@
 // --- LogicalExpr
 
-LogicalExpr::LogicalExpr(
-	const CodeLocation & loc, const Expr * a1, const Expr * a2, LogicalFlag ia )
-: Expr( loc, new BasicType{ BasicKind::SignedInt } ), arg1( a1 ), arg2( a2 ), isAnd( ia ) {}
+LogicalExpr::LogicalExpr( const CodeLocation & loc, const Expr * a1, const Expr * a2, LogicalFlag ia )
+		: Expr( loc, new BasicType{ BasicKind::SignedInt } ), arg1( a1 ), arg2( a2 ), isAnd( ia ) {}
 
 // --- CommaExpr
@@ -330,6 +312,5 @@
 // --- ConstructorExpr
 
-ConstructorExpr::ConstructorExpr( const CodeLocation & loc, const Expr * call )
-: Expr( loc ), callExpr( call ) {
+ConstructorExpr::ConstructorExpr( const CodeLocation & loc, const Expr * call ) : Expr( loc ), callExpr( call ) {
 	// allow resolver to type a constructor used as an expression if it has the same type as its
 	// first argument
@@ -342,6 +323,5 @@
 // --- CompoundLiteralExpr
 
-CompoundLiteralExpr::CompoundLiteralExpr( const CodeLocation & loc, const Type * t, const Init * i )
-: Expr( loc ), init( i ) {
+CompoundLiteralExpr::CompoundLiteralExpr( const CodeLocation & loc, const Type * t, const Init * i ) : Expr( loc ), init( i ) {
 	assert( t && i );
 	result = t;
@@ -354,11 +334,9 @@
 // --- TupleExpr
 
-TupleExpr::TupleExpr( const CodeLocation & loc, std::vector<ptr<Expr>> && xs )
-: Expr( loc, Tuples::makeTupleType( xs ) ), exprs( xs ) {}
+TupleExpr::TupleExpr( const CodeLocation & loc, std::vector<ptr<Expr>> && xs ) : Expr( loc, Tuples::makeTupleType( xs ) ), exprs( xs ) {}
 
 // --- TupleIndexExpr
 
-TupleIndexExpr::TupleIndexExpr( const CodeLocation & loc, const Expr * t, unsigned i )
-: Expr( loc ), tuple( t ), index( i ) {
+TupleIndexExpr::TupleIndexExpr( const CodeLocation & loc, const Expr * t, unsigned i ) : Expr( loc ), tuple( t ), index( i ) {
 	const TupleType * type = strict_dynamic_cast< const TupleType * >( tuple->result.get() );
 	assertf( type->size() > index, "TupleIndexExpr index out of bounds: tuple size %d, requested "
@@ -374,8 +352,6 @@
 // --- TupleAssignExpr
 
-TupleAssignExpr::TupleAssignExpr(
-	const CodeLocation & loc, std::vector<ptr<Expr>> && assigns,
-	std::vector<ptr<ObjectDecl>> && tempDecls )
-: Expr( loc, Tuples::makeTupleType( assigns ) ), stmtExpr() {
+TupleAssignExpr::TupleAssignExpr( const CodeLocation & loc, std::vector<ptr<Expr>> && assigns, std::vector<ptr<ObjectDecl>> && tempDecls )
+		: Expr( loc, Tuples::makeTupleType( assigns ) ), stmtExpr() {
 	// convert internally into a StmtExpr which contains the declarations and produces the tuple of
 	// the assignments
@@ -392,6 +368,5 @@
 // --- StmtExpr
 
-StmtExpr::StmtExpr( const CodeLocation & loc, const CompoundStmt * ss )
-: Expr( loc ), stmts( ss ) { computeResult(); }
+StmtExpr::StmtExpr( const CodeLocation & loc, const CompoundStmt * ss ) : Expr( loc ), stmts( ss ) { computeResult(); }
 
 void StmtExpr::computeResult() {
@@ -411,6 +386,5 @@
 unsigned long long UniqueExpr::nextId = 0;
 
-UniqueExpr::UniqueExpr( const CodeLocation & loc, const Expr * e, unsigned long long i )
-: Expr( loc, e->result ), expr( e ), id( i ) {
+UniqueExpr::UniqueExpr( const CodeLocation & loc, const Expr * e, unsigned long long i ) : Expr( loc, e->result ), expr( e ), id( i ) {
 	assert( expr );
 	if ( id == -1ull ) {
Index: src/AST/Expr.hpp
===================================================================
--- src/AST/Expr.hpp	(revision 45d0e65f1d08fcf0261d27f5521433a2d272e884)
+++ src/AST/Expr.hpp	(revision 366f5cd47f06469e6c39617fdc1be75acd3f4943)
@@ -11,5 +11,5 @@
 // Last Modified By : Peter A. Buhr
 // Created On       : Fri May 10 10:30:00 2019
-// Update Count     : 8
+// Update Count     : 24
 //
 
@@ -495,7 +495,8 @@
 public:
 	ptr<Type> type;
-
-	AlignofExpr( const CodeLocation & loc, const Type * t );
-	AlignofExpr( const CodeLocation & loc, const Type * t, const Type * r );
+	enum Alignment { Alignof, __Alignof } kind;
+
+	AlignofExpr( const CodeLocation & loc, const Type * t, const Alignment kind );
+	AlignofExpr( const CodeLocation & loc, const Type * t, const Type * r, const Alignment kind );
 
 	const Expr * accept( Visitor & v ) const override { return v.visit( this ); }
Index: src/CodeGen/CodeGenerator.cpp
===================================================================
--- src/CodeGen/CodeGenerator.cpp	(revision 45d0e65f1d08fcf0261d27f5521433a2d272e884)
+++ src/CodeGen/CodeGenerator.cpp	(revision 366f5cd47f06469e6c39617fdc1be75acd3f4943)
@@ -10,6 +10,6 @@
 // Created On       : Tue Oct 17 15:54:00 2023
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Mar 11 11:13:10 2026
-// Update Count     : 28
+// Last Modified On : Tue Jun 23 13:42:15 2026
+// Update Count     : 34
 //
 
@@ -778,7 +778,6 @@
 
 void CodeGenerator::postvisit( ast::AlignofExpr const * expr ) {
-	// Using the GCC extension to avoid changing the std to C11.
-	extension( expr );
-	output << "__alignof__(";
+	extension( expr );
+	output << (expr->kind ? "__alignof__(" : "_Alignof(");
 	if ( auto type = expr->type.as<ast::TypeofType>() ) {
 		type->expr->accept( *visitor );
@@ -790,5 +789,5 @@
 
 void CodeGenerator::postvisit( ast::CountofExpr const * expr ) {
-	assertf( !options.genC, "CountofExpr should not reach code generation." );
+	assertf( ! options.genC, "CountofExpr should not reach code generation." );
 	extension( expr );
 	output << "countof(";
Index: src/GenPoly/Box.cpp
===================================================================
--- src/GenPoly/Box.cpp	(revision 45d0e65f1d08fcf0261d27f5521433a2d272e884)
+++ src/GenPoly/Box.cpp	(revision 366f5cd47f06469e6c39617fdc1be75acd3f4943)
@@ -10,6 +10,6 @@
 // Created On       : Thr Oct  6 13:39:00 2022
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Dec 14 17:42:17 2023
-// Update Count     : 7
+// Last Modified On : Tue Jun 23 12:31:47 2026
+// Update Count     : 9
 //
 
@@ -265,5 +265,5 @@
 			kids.emplace_back( makeAlignTo( location,
 				derefVar( location, sizeofParam ),
-				new ast::AlignofExpr( location, ast::deepCopy( memberType ) )
+				new ast::AlignofExpr( location, ast::deepCopy( memberType ), ast::AlignofExpr::Alignof )
 			) );
 		}
@@ -285,5 +285,5 @@
 		kids.emplace_back( makeAssignMax( location,
 			derefVar( location, alignofParam ),
-			new ast::AlignofExpr( location, ast::deepCopy( memberType ) ) ) );
+			new ast::AlignofExpr( location, ast::deepCopy( memberType ), ast::AlignofExpr::Alignof ) ) );
 	}
 	// Make sure the type is end-padded to a multiple of its alignment.
@@ -343,5 +343,5 @@
 		kids.emplace_back( makeAssignMax( location,
 			derefVar( location, alignofParam ),
-			new ast::AlignofExpr( location, ast::deepCopy( memberType ) )
+			new ast::AlignofExpr( location, ast::deepCopy( memberType ), ast::AlignofExpr::Alignof )
 		) );
 	}
@@ -807,5 +807,5 @@
 			new ast::SizeofExpr( expr->location, ast::deepCopy( concrete ) ) );
 		extraArgs.emplace_back(
-			new ast::AlignofExpr( expr->location, ast::deepCopy( concrete ) ) );
+			new ast::AlignofExpr( expr->location, ast::deepCopy( concrete ), ast::AlignofExpr::Alignof ) );
 	}
 }
@@ -1723,5 +1723,5 @@
 		alignofName( typeName ), getLayoutCType( transUnit() ),
 		new ast::SingleInit( decl->location,
-			new ast::AlignofExpr( decl->location, deepCopy( base ) )
+			new ast::AlignofExpr( decl->location, deepCopy( base ), ast::AlignofExpr::Alignof )
 		)
 	);
@@ -2199,5 +2199,5 @@
 				new ast::SizeofExpr( location, ast::deepCopy( param ) ) );
 			args.emplace_back(
-				new ast::AlignofExpr( location, ast::deepCopy( param ) ) );
+				new ast::AlignofExpr( location, ast::deepCopy( param ), ast::AlignofExpr::Alignof ) );
 		}
 	}
Index: src/Parser/ExpressionNode.cpp
===================================================================
--- src/Parser/ExpressionNode.cpp	(revision 45d0e65f1d08fcf0261d27f5521433a2d272e884)
+++ src/Parser/ExpressionNode.cpp	(revision 366f5cd47f06469e6c39617fdc1be75acd3f4943)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 13:17:07 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri May  1 11:07:48 2026
-// Update Count     : 1128
+// Last Modified On : Mon Jun 22 16:30:56 2026
+// Update Count     : 1129
 //
 
@@ -591,5 +591,5 @@
 static const char * OperName[] = {						// must harmonize with OperKinds
 	// diadic
-	"SizeOf", "AlignOf", "OffsetOf", "?+?", "?-?", "?\\?", "?*?", "?/?", "?%?", "||", "&&",
+	"SizeOf", "AlignOf", "__alignof", "OffsetOf", "?+?", "?-?", "?\\?", "?*?", "?/?", "?%?", "||", "&&",
 	"?|?", "?&?", "?^?", "Cast", "?<<?", "?>>?", "?<?", "?>?", "?<=?", "?>=?", "?==?", "?!=?",
 	"?=?", "?@=?", "?\\=?", "?*=?", "?/=?", "?%=?", "?+=?", "?-=?", "?<<=?", "?>>=?", "?&=?", "?^=?", "?|=?",
Index: src/Parser/ParseNode.hpp
===================================================================
--- src/Parser/ParseNode.hpp	(revision 45d0e65f1d08fcf0261d27f5521433a2d272e884)
+++ src/Parser/ParseNode.hpp	(revision 366f5cd47f06469e6c39617fdc1be75acd3f4943)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 13:28:16 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Dec  9 17:39:34 2023
-// Update Count     : 945
+// Last Modified On : Tue Jun 23 07:43:13 2026
+// Update Count     : 947
 //
 
@@ -94,5 +94,5 @@
 enum class OperKinds {
 	// diadic
-	SizeOf, AlignOf, OffsetOf, Plus, Minus, Exp, Mul, Div, Mod, Or, And,
+	SizeOf, AlignOf, __AlignOf, OffsetOf, Plus, Minus, Exp, Mul, Div, Mod, Or, And,
 	BitOr, BitAnd, Xor, Cast, LShift, RShift, LThan, GThan, LEThan, GEThan, Eq, Neq,
 	Assign, AtAssn, ExpAssn, MulAssn, DivAssn, ModAssn, PlusAssn, MinusAssn, LSAssn, RSAssn, AndAssn, ERAssn, OrAssn,
Index: src/Parser/lex.ll
===================================================================
--- src/Parser/lex.ll	(revision 45d0e65f1d08fcf0261d27f5521433a2d272e884)
+++ src/Parser/lex.ll	(revision 366f5cd47f06469e6c39617fdc1be75acd3f4943)
@@ -10,6 +10,6 @@
  * Created On       : Sat Sep 22 08:58:10 2001
  * Last Modified By : Peter A. Buhr
- * Last Modified On : Thu Jun  5 22:38:35 2025
- * Update Count     : 885
+ * Last Modified On : Tue Jun 23 07:44:07 2026
+ * Update Count     : 888
  */
 
@@ -56,6 +56,6 @@
 string * build_postfix_name( string * name );
 
-char *yyfilename;
-string *strtext;										// accumulate parts of character and string constant value
+char * yyfilename;
+string * strtext;										// accumulate parts of character and string constant value
 
 #define RETURN_LOCN(x)		yylval.tok.loc.file = yyfilename; yylval.tok.loc.line = yylineno; return( x )
@@ -225,8 +225,8 @@
 alignas			{ KEYWORD_RETURN(ALIGNAS); }			// CFA
 _Alignas		{ KEYWORD_RETURN(ALIGNAS); }			// C11
-alignof			{ KEYWORD_RETURN(ALIGNOF); }			// CFA
+alignof			{ KEYWORD_RETURN(ALIGNOF); }			// C23
 _Alignof		{ KEYWORD_RETURN(ALIGNOF); }			// C11
-__alignof		{ KEYWORD_RETURN(ALIGNOF); }			// GCC
-__alignof__		{ KEYWORD_RETURN(ALIGNOF); }			// GCC
+__alignof		{ KEYWORD_RETURN(__ALIGNOF); }			// GCC
+__alignof__		{ KEYWORD_RETURN(__ALIGNOF); }			// GCC
 and				{ QKEYWORD_RETURN(WAND); }				// CFA
 asm				{ KEYWORD_RETURN(ASM); }
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 45d0e65f1d08fcf0261d27f5521433a2d272e884)
+++ src/Parser/parser.yy	(revision 366f5cd47f06469e6c39617fdc1be75acd3f4943)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri May  1 11:01:45 2026
-// Update Count     : 7320
+// Last Modified On : Tue Jun 23 12:37:08 2026
+// Update Count     : 7350
 //
 
@@ -393,5 +393,5 @@
 %token DISABLE ENABLE TRY THROW THROWRESUME AT			// CFA
 %token ASM												// C99, extension ISO/IEC 9899:1999 Section J.5.10(1)
-%token ALIGNAS ALIGNOF GENERIC STATICASSERT				// C11
+%token ALIGNAS ALIGNOF __ALIGNOF GENERIC STATICASSERT	// C11/C23
 
 // names and constants: lexer differentiates between identifier and typedef names
@@ -432,5 +432,5 @@
 %type<expr> constant
 %type<expr> tuple						tuple_expression_list
-%type<oper> ptrref_operator				unary_operator				assignment_operator			simple_assignment_operator	compound_assignment_operator
+%type<oper> ptrref_operator				alignof_operator			unary_operator				assignment_operator			simple_assignment_operator	compound_assignment_operator
 %type<expr> primary_expression			postfix_expression			unary_expression
 %type<expr> cast_expression_list		cast_expression				exponential_expression		multiplicative_expression	additive_expression
@@ -933,8 +933,10 @@
 	| SIZEOF '(' attribute_list type_no_function ')'
 		{ $$ = new ExpressionNode( new ast::SizeofExpr( yylloc, maybeMoveBuildType( $4->addQualifiers( $3 ) ) ) ); }
-	| ALIGNOF unary_expression							// GCC, variable alignment
-		{ $$ = new ExpressionNode( new ast::AlignofExpr( yylloc, new ast::TypeofType( maybeMoveBuild( $2 ) ) ) ); }
-	| ALIGNOF '(' type_no_function ')'					// GCC, type alignment
-		{ $$ = new ExpressionNode( new ast::AlignofExpr( yylloc, maybeMoveBuildType( $3 ) ) ); }
+	| alignof_operator unary_expression						// GCC, variable alignment
+		{ $$ = new ExpressionNode( new ast::AlignofExpr( yylloc, new ast::TypeofType( maybeMoveBuild( $2 ) ),
+					$1 == OperKinds::AlignOf ? ast::AlignofExpr::Alignof : ast::AlignofExpr::__Alignof ) ); }
+	| alignof_operator '(' type_no_function ')'					// GCC, type alignment
+		{ $$ = new ExpressionNode( new ast::AlignofExpr( yylloc, maybeMoveBuildType( $3 ),
+					$1 == OperKinds::AlignOf ? ast::AlignofExpr::Alignof : ast::AlignofExpr::__Alignof ) ); }
 
 		// Cannot use rule "type", which includes cfa_abstract_function, for sizeof/alignof, because of S/R problems on
@@ -942,7 +944,7 @@
 	| SIZEOF '(' cfa_abstract_function ')'
 		{ $$ = new ExpressionNode( new ast::SizeofExpr( yylloc, maybeMoveBuildType( $3 ) ) ); }
-	| ALIGNOF '(' cfa_abstract_function ')'				// GCC, type alignment
-		{ $$ = new ExpressionNode( new ast::AlignofExpr( yylloc, maybeMoveBuildType( $3 ) ) ); }
-
+	| alignof_operator '(' cfa_abstract_function ')'			// GCC, type alignment
+		{ $$ = new ExpressionNode( new ast::AlignofExpr( yylloc, maybeMoveBuildType( $3 ),
+					$1 == OperKinds::AlignOf ? ast::AlignofExpr::Alignof : ast::AlignofExpr::__Alignof ) ); }
 	| OFFSETOF '(' type_no_function ',' identifier ')'
 		{ $$ = new ExpressionNode( build_offsetOf( yylloc, $3, build_varref( yylloc, $5 ) ) ); }
@@ -956,4 +958,9 @@
 	| COUNTOF '(' type_no_function ')'
 		{ $$ = new ExpressionNode( new ast::CountofExpr( yylloc, maybeMoveBuildType( $3 ) ) ); }
+	;
+
+alignof_operator:
+	ALIGNOF										{ $$ = OperKinds::AlignOf; }
+	| __ALIGNOF									{ $$ = OperKinds::__AlignOf; }
 	;
 
Index: src/ResolvExpr/CandidateFinder.cpp
===================================================================
--- src/ResolvExpr/CandidateFinder.cpp	(revision 45d0e65f1d08fcf0261d27f5521433a2d272e884)
+++ src/ResolvExpr/CandidateFinder.cpp	(revision 366f5cd47f06469e6c39617fdc1be75acd3f4943)
@@ -10,6 +10,6 @@
 // Created On       : Wed Jun 5 14:30:00 2019
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Sep  9 11:30:11 2024
-// Update Count     : 5
+// Last Modified On : Tue Jun 23 11:41:24 2026
+// Update Count     : 7
 //
 
@@ -1496,7 +1496,5 @@
 		const ast::Type * type = resolveTypeof( alignofExpr->type, context );
 		const ast::Type * sizeType = context.global.sizeType.get();
-		addCandidate(
-			new ast::AlignofExpr( alignofExpr->location, type, sizeType ),
-			tenv );
+		addCandidate( new ast::AlignofExpr( alignofExpr->location, type, sizeType, alignofExpr->kind ), tenv );
 	}
 
Index: src/Virtual/Tables.cpp
===================================================================
--- src/Virtual/Tables.cpp	(revision 45d0e65f1d08fcf0261d27f5521433a2d272e884)
+++ src/Virtual/Tables.cpp	(revision 366f5cd47f06469e6c39617fdc1be75acd3f4943)
@@ -9,7 +9,7 @@
 // Author           : Andrew Beach
 // Created On       : Mon Aug 31 11:11:00 2020
-// Last Modified By : Andrew Beach
-// Last Modified On : Fri Mar 11 10:40:00 2022
-// Update Count     : 3
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Jun 23 12:31:00 2026
+// Update Count     : 4
 //
 
@@ -115,5 +115,5 @@
 		} else if ( std::string( "align" ) == field->name ) {
 			inits.push_back( new ast::SingleInit( location,
-				new ast::AlignofExpr( location, objectType )
+				new ast::AlignofExpr( location, objectType, ast::AlignofExpr::Alignof )
 			) );
 		} else {
