1*e5dd7070Spatrick//===-- cxx_proto.proto - Protobuf description of C++ ---------------------===// 2*e5dd7070Spatrick// 3*e5dd7070Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*e5dd7070Spatrick// See https://llvm.org/LICENSE.txt for license information. 5*e5dd7070Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*e5dd7070Spatrick// 7*e5dd7070Spatrick//===----------------------------------------------------------------------===// 8*e5dd7070Spatrick/// 9*e5dd7070Spatrick/// \file 10*e5dd7070Spatrick/// This file describes a subset of C++ as a protobuf. It is used to 11*e5dd7070Spatrick/// more easily find interesting inputs for fuzzing Clang. 12*e5dd7070Spatrick/// 13*e5dd7070Spatrick//===----------------------------------------------------------------------===// 14*e5dd7070Spatrick 15*e5dd7070Spatricksyntax = "proto2"; 16*e5dd7070Spatrick 17*e5dd7070Spatrickmessage VarRef { 18*e5dd7070Spatrick required int32 varnum = 1; 19*e5dd7070Spatrick} 20*e5dd7070Spatrick 21*e5dd7070Spatrickmessage Lvalue { 22*e5dd7070Spatrick required VarRef varref = 1; 23*e5dd7070Spatrick} 24*e5dd7070Spatrick 25*e5dd7070Spatrickmessage Const { 26*e5dd7070Spatrick required int32 val = 1; 27*e5dd7070Spatrick} 28*e5dd7070Spatrick 29*e5dd7070Spatrickmessage BinaryOp { 30*e5dd7070Spatrick enum Op { 31*e5dd7070Spatrick PLUS = 0; 32*e5dd7070Spatrick MINUS = 1; 33*e5dd7070Spatrick MUL = 2; 34*e5dd7070Spatrick DIV = 3; 35*e5dd7070Spatrick MOD = 4; 36*e5dd7070Spatrick XOR = 5; 37*e5dd7070Spatrick AND = 6; 38*e5dd7070Spatrick OR = 7; 39*e5dd7070Spatrick EQ = 8; 40*e5dd7070Spatrick NE = 9; 41*e5dd7070Spatrick LE = 10; 42*e5dd7070Spatrick GE = 11; 43*e5dd7070Spatrick LT = 12; 44*e5dd7070Spatrick GT = 13; 45*e5dd7070Spatrick }; 46*e5dd7070Spatrick required Op op = 1; 47*e5dd7070Spatrick required Rvalue left = 2; 48*e5dd7070Spatrick required Rvalue right = 3; 49*e5dd7070Spatrick} 50*e5dd7070Spatrick 51*e5dd7070Spatrickmessage Rvalue { 52*e5dd7070Spatrick oneof rvalue_oneof { 53*e5dd7070Spatrick VarRef varref = 1; 54*e5dd7070Spatrick Const cons = 2; 55*e5dd7070Spatrick BinaryOp binop = 3; 56*e5dd7070Spatrick } 57*e5dd7070Spatrick} 58*e5dd7070Spatrick 59*e5dd7070Spatrickmessage AssignmentStatement { 60*e5dd7070Spatrick required Lvalue lvalue = 1; 61*e5dd7070Spatrick required Rvalue rvalue = 2; 62*e5dd7070Spatrick} 63*e5dd7070Spatrick 64*e5dd7070Spatrick 65*e5dd7070Spatrickmessage IfElse { 66*e5dd7070Spatrick required Rvalue cond = 1; 67*e5dd7070Spatrick required StatementSeq if_body = 2; 68*e5dd7070Spatrick required StatementSeq else_body = 3; 69*e5dd7070Spatrick} 70*e5dd7070Spatrick 71*e5dd7070Spatrickmessage While { 72*e5dd7070Spatrick required Rvalue cond = 1; 73*e5dd7070Spatrick required StatementSeq body = 2; 74*e5dd7070Spatrick} 75*e5dd7070Spatrick 76*e5dd7070Spatrickmessage Statement { 77*e5dd7070Spatrick oneof stmt_oneof { 78*e5dd7070Spatrick AssignmentStatement assignment = 1; 79*e5dd7070Spatrick IfElse ifelse = 2; 80*e5dd7070Spatrick While while_loop = 3; 81*e5dd7070Spatrick } 82*e5dd7070Spatrick} 83*e5dd7070Spatrick 84*e5dd7070Spatrickmessage StatementSeq { 85*e5dd7070Spatrick repeated Statement statements = 1; 86*e5dd7070Spatrick} 87*e5dd7070Spatrick 88*e5dd7070Spatrickmessage Function { 89*e5dd7070Spatrick required StatementSeq statements = 1; 90*e5dd7070Spatrick} 91*e5dd7070Spatrick 92*e5dd7070Spatrickpackage clang_fuzzer; 93