[PATCH] D12686: Add support for GCC's '__auto_type' extension.
Richard Smith via cfe-commits
cfe-commits at lists.llvm.org
Mon Nov 9 13:09:30 PST 2015
rsmith added a comment.
Sorry for the long delay. This looks to be in good shape.
================
Comment at: include/clang/AST/Type.h:1210
@@ +1209,3 @@
+/// Which keyword(s) were used to create an AutoType.
+enum class AutoTypeKeyword : unsigned char {
+ /// \brief auto
----------------
The explicit underlying type here doesn't seem necessary.
================
Comment at: include/clang/AST/Type.h:1438
@@ -1429,1 +1437,3 @@
+ /// Was this placeholder type spelled as 'auto', 'decltype(auto)', or '__auto_type'?
+ AutoTypeKeyword Keyword : 2;
};
----------------
Use `unsigned` not `AutoTypeKeyword`. MSVC struct layout inserts extra padding if your bit-fields don't all have the same type.
================
Comment at: include/clang/Basic/DiagnosticSemaKinds.td:1678
@@ -1674,3 +1677,3 @@
"|in template argument|in typedef|in type alias|in function return type"
- "|in conversion function type|here|in lambda parameter}1">;
+ "|in conversion function type|here|in lambda parameter|in 'new' argument}1">;
def err_auto_not_allowed_var_inst : Error<
----------------
How about "in type allocated by `new`" or similar? The type operand isn't really an argument.
================
Comment at: lib/Sema/SemaTemplateDeduction.cpp:4007-4012
@@ -4006,4 +4006,8 @@
InitListExpr *InitList = dyn_cast<InitListExpr>(Init);
if (InitList) {
+ if (!getLangOpts().CPlusPlus) {
+ Diag(Loc, diag::err_auto_init_list_from_c);
+ return DAR_Failed;
+ }
for (unsigned i = 0, e = InitList->getNumInits(); i < e; ++i) {
----------------
Move this bailout to before we build the template parameter and substitute it into the type.
================
Comment at: lib/Sema/SemaTemplateDeduction.cpp:4011
@@ +4010,3 @@
+ Diag(Loc, diag::err_auto_init_list_from_c);
+ return DAR_Failed;
+ }
----------------
Should be `DAR_FailedAlreadyDiagnosed` so the caller doesn't diagnose it again.
================
Comment at: lib/Sema/SemaType.cpp:1481
@@ -1479,3 +1480,3 @@
// being analyzed (which tracks the invented type template parameter).
if (declarator.getContext() == Declarator::LambdaExprParameterContext) {
sema::LambdaScopeInfo *LSI = S.getCurLambda();
----------------
Can you move the `auto_type` case label lower to make this more obvious? (Put a `break` into the `if` and replace the `else` with fallthrough to avoid putting the label inside the `else`.)
================
Comment at: lib/Sema/SemaType.cpp:1517
@@ +1516,3 @@
+ Result = Context.getAutoType(QualType(),
+ /*Keyword*/ AutoTypeKeyword::DecltypeAuto,
+ /*IsDependent*/ false);
----------------
The `/*Keyword*/` comment here doesn't add anything, thanks to your enumeration. Remove it and clang-format this line?
================
Comment at: lib/Sema/SemaType.cpp:2621
@@ -2620,3 +2620,3 @@
// C++14 In generic lambdas allow 'auto' in their parameters.
- if (ContainsPlaceholderType &&
+ if (D.getDeclSpec().containsPlaceholderType() &&
(!SemaRef.getLangOpts().CPlusPlus11 || !D.isFunctionDeclarator())) {
----------------
Does this still do the right thing for the `IK_ConversionFunctionId` case? It doesn't look like it will: in that case, the `auto` is in the //declarator-id//, not in the //decl-specifier-seq//.
================
Comment at: lib/Sema/SemaType.cpp:2626-2627
@@ -2625,4 +2625,4 @@
switch (D.getContext()) {
case Declarator::KNRTypeListContext:
llvm_unreachable("K&R type lists aren't allowed in C++");
case Declarator::LambdaExprContext:
----------------
This is now reachable.
================
Comment at: lib/Sema/SemaType.cpp:3756-3760
@@ -3743,2 +3755,7 @@
}
+ } else if (D.getDeclSpec().getTypeSpecType() == DeclSpec::TST_auto_type) {
+ S.Diag(D.getDeclSpec().getTypeSpecTypeLoc(),
+ diag::err_auto_not_allowed)
+ << 2 << 13 << D.getDeclSpec().getSourceRange();
+ D.setInvalidType(true);
}
----------------
Please deal with this in the "checking for auto" block at the top rather than repeating the diagnostic code here with magic numbers; maybe change
(!SemaRef.getLangOpts().CPlusPlus11 || !D.isFunctionDeclarator())) {
to
(!SemaRef.getLangOpts().CPlusPlus11 || !D.isFunctionDeclarator() || D.getDeclSpec().getTypeSpecType() == DeclSpec::TST_auto_type)) {
up there.
http://reviews.llvm.org/D12686
More information about the cfe-commits
mailing list